LinuxForum.Fans
Тема

Iptables скрипт.

Автор: u_snif 3 сообщений 7209 просмотров
#162

В общем не так давно писал скрипт для небольшого сервера, думаю сгодиться кому-нибудь.

text

#!/bin/bash
IPT=iptables 
EC=echo
#############################################
$IPT -F
$IPT -X
$IPT -t filter -F
$IPT -t mangle -F
$IPT -t nat -X
$IPT -t filter -X
$IPT -t mangle -X
##############################################
$EC 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all #отключаем пинг
$EC 1 > /proc/sys/net/ipv4/tcp_syncookies #Для защиты от syn флуда
$EC 30 > /proc/sys/net/ipv4/tcp_fin_timeout #Сколько секунд ожидать приема FIN до полного закрытия сокета
$EC 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established # Время ожидания до закрытия соединения
$EC 0 > /proc/sys/net/ipv4/tcp_sack # Запрещаем selective acknowledgements, RFC2018
$EC 0 > /proc/sys/net/ipv4/tcp_timestamps # Запрещаем TCP timestamps, RFC1323
################################################
$IPT -P INPUT DROP #Что не разрешенно, то запрещенно
$IPT -t filter -A INPUT -i lo -j ACCEPT #Loop-back accept all
$IPT -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #any established or related conns are welcome
#Молчать на сканирование
$IPT -t filter -A INPUT -p icmp --icmp-type timestamp-request -j DROP 
$IPT -t filter -A OUTPUT -p icmp --icmp-type timestamp-reply -j DROP
$IPT -t filter -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # All of the bits are cleared
$IPT -t filter -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # SYN and FIN are both set
$IPT -t filter -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP # SYN and RST are both set
$IPT -t filter -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP # FIN and RST are both set
$IPT -t filter -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP #FIN is the only bit set,without the expected accompanying ACK
$IPT -t filter -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP #PSH is the only bit set,without the expected accompanying ACK
$IPT -t filter -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP #URG is the only bit set,without the expected accompanying ACK
$IPT -t filter -A INPUT -p tcp -m multiport --dports 137:139 -j DROP # netbios - ignore
$IPT -t filter -A INPUT -p udp -m multiport --dports 137:139 -j DROP # netbios - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 111 -j DROP #rpcbind - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 135 -j DROP #msrpc - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 136 -j DROP #profile - ignore
$IPT -t filter -A INPUT -p tcp -m tcp --dport 445 -j DROP #microsoft-ds - ignore
#Открытые порты
$IPT -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #апач
$IPT -t filter -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT #фтп
$IPT -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #ssh
$IPT -t filter -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT #bind
#992

Спасибо. Полезно.

#1262

Мой скрипт. Написан на основе найденных правил, потому все правила разъяснить не могу (ленюсь).

text
#!/bin/sh

ipt="/sbin/iptables -v" ip6t="/sbin/ip6tables -v"

# Непривилегированные порты upp="1024:65535" # Исходящие порты, которые надо открыть acp="21 22 25 80 443 587 993 873" # Входящие порты, которые надо открыть acip="21 22 80"

# Интерфейс, смотрящий наружу eif="eth1" eip="`ifconfig $eif | grep 'inet addr' | awk '{print $2}' | sed 's/^\w\+://g'`"

# Интерфейс, смотрящий в сеть iif="br0" iip="`ifconfig $iif | grep 'inet addr' | awk '{print $2}' | sed 's/^\w\+://g'`"

# Удалить все существующие правила $ipt -F $ipt -t nat -F $ipt -t mangle -F $ipt -X $ipt -t nat -X $ipt -t mangle -X

# По-умолчанию выбрасывать все пакеты $ipt -P INPUT DROP $ipt -P OUTPUT DROP $ipt -P FORWARD DROP

# Включить NAT. # Предварительно нужно включить net.ipv4.ip_forward в /etc/sysctl.conf $ipt -t nat -A POSTROUTING -o $eif -j MASQUERADE $ipt -A FORWARD -i $iif -o $eif -m state --state NEW,ESTABLISHED -j ACCEPT

# Разрешить любой трафик внутри сети и по обратной петле $ipt -A INPUT -i $iif -j ACCEPT $ipt -A OUTPUT -o $iif -j ACCEPT $ipt -A INPUT -d $iip -j ACCEPT $ipt -A OUTPUT -d $iip -j ACCEPT $ipt -A INPUT -i lo -j ACCEPT $ipt -A OUTPUT -o lo -j ACCEPT

# Разрешить пакеты, идущие по установленному соединению $ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $ipt -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Защита системы, не вникал $ipt -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $ipt -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP $ipt -A INPUT -p UDP -s 0/0 --destination-port 138 -j DROP $ipt -A INPUT -p UDP -s 0/0 --destination-port 113 -j REJECT $ipt -A INPUT -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT $ipt -A INPUT -p UDP -j RETURN $ipt -A OUTPUT -p UDP -s 0/0 -j ACCEPT $ipt -A INPUT --fragment -p ICMP -j DROP $ipt -A OUTPUT --fragment -p ICMP -j DROP $ipt -A INPUT -m state --state INVALID -j DROP $ipt -A FORWARD -m state --state INVALID -j DROP

# Разрешить исходящие эхо-сообщения $ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type source-quench -j ACCEPT $ipt -A OUTPUT -p icmp -m icmp -o $eif --icmp-type source-quench -j ACCEPT $ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type echo-reply -j ACCEPT $ipt -A OUTPUT -p icmp -m icmp -o $eif --icmp-type echo-request -j ACCEPT # Разрешить входящий ICMP-трафик #$ipt -A INPUT -p icmp -j ACCEPT #$ipt -A OUTPUT -p icmp -j ACCEPT

# Разрешить сообщения об ошибках через ICMP $ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type parameter-problem -j ACCEPT $ipt -A OUTPUT -p icmp -m icmp -o $eif --icmp-type parameter-problem -j ACCEPT

$ipt -A INPUT -p icmp -m icmp -i $eif --icmp-type source-quench -j ACCEPT $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 113 --sport $upp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 113 -j ACCEPT ! --syn $ipt -A INPUT -p tcp -m tcp -i $eif --dport 113 -j DROP

# Открыть исходящие порты for outp in $acp; do $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport $outp --sport $upp -j ACCEPT $ipt -A FORWARD -p tcp -m tcp -i $iif -o $eif --dport $outp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport $outp -j ACCEPT ! --syn done

# finger, whois, gorper, wais, traceroute $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 20 -j ACCEPT $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 20 --sport $upp -j ACCEPT ! --syn $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport $upp --sport $upp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport $upp -j ACCEPT ! --syn $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 23 --sport $upp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 23 -j ACCEPT ! --syn $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 79 --sport $upp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 79 -j ACCEPT ! --syn $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 43 --sport $upp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 43 -j ACCEPT ! --syn $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 70 --sport $upp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 70 -j ACCEPT ! --syn $ipt -A OUTPUT -p tcp -m tcp -o $eif --dport 210 --sport $upp -j ACCEPT $ipt -A INPUT -p tcp -m tcp -i $eif --dport $upp --sport 210 -j ACCEPT ! --syn $ipt -A OUTPUT -p udp -m udp -o $eif --dport 33434:33523 --sport 32769:65535 -j ACCEPT

# Открыть входящие порты for inp in $acip; do $ipt -A INPUT -p tcp -m tcp --dport $inp --sport $upp -i $eif -d $eip -j ACCEPT $ipt -A OUTPUT -p tcp -m tcp --sport $inp --dport $upp -o $eif -s $eip -j ACCEPT done

# Разрешить IPv6-трафик $ipt -I INPUT -p ipv6 -j ACCEPT $ipt -I OUTPUT -p ipv6 -j ACCEPT

# Очистить таблицы ip6tables $ip6t -F

# Разрешить все ICMPv6 $ip6t -A INPUT -p icmpv6 -j ACCEPT $ip6t -A OUTPUT -p icmpv6 -j ACCEPT

# И прочие разрешения. Пока IPv6 поддерживают полтора хоста, # о безопасности можно сильно не беспокоится. $ip6t -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $ip6t -A INPUT -i $iif -j ACCEPT $ip6t -A INPUT -i lo -j ACCEPT $ip6t -A INPUT -j REJECT

$ip6t -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $ip6t -A FORWARD -i $iif -j ACCEPT $ip6t -A FORWARD -j REJECT

$ip6t -A OUTPUT -j ACCEPT

Эти правила используются на домашнем роутере-сервере. Интернет с eth1 раздается в сеть через br0, открыты порты для ssh, ftp и http.

Войдите или зарегистрируйтесь, чтобы ответить.