Апр 082011
#!/bin/bash ######################### # CINFIG # Конфигурация устройств ######################### IPT="iptables" POLICY="DROP" LAN_IF="eth0" # внутренний интерфейс LAN_IP="192.168.1.2" # адрес на внутреннем интерфейсе LAN="192.168.1.0/24" # внутренняя сеть LO_IF="lo" # loopback-интерфейс LO_IP="127.0.0.1" # loopback-адрес LOOPBACK="127.0.0.0/8" # loopback-петля DNS="80.82.32.9" # DNS-провайдера DNS1="80.82.33.65" ########################## # MODULES # Подгружаем нужный модули ########################## modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe iptable_nat modprobe ip_nat_ftp ########################## # Продвигаем пакеты ########################## echo 1 > /proc/sys/net/ipv4/ip_forward #ядро должно знать что оно может продвигать пакеты depend() { before net use logger } ############################# # Поиция по умолчанию Запрет ############################# $IPT -P INPUT $POLICY $IPT -P FORWARD $POLICY $IPT -P OUTPUT $POLICY $IPT -N allowed $IPT -F allowed # "allowed" это просто имя, можно использовать что нибудь и другое:) # Разрешаем прохождение statefull трафика. Далее идет собственно сам список правил $IPT -A allowed -m state --state ESTABLISHED,RELATED -j ACCEPT # Журналируем все обращение к этому серверу от WAN-сетей :) Мы не ждем гостей ! $IPT -A allowed -i $LAN_IF -m limit --limit 1/second -j ULOG --ulog-prefix "Bad packet from $LAN_IF" $IPT -A allowed -j $POLICY $IPT -N com-allow $IPT -F com-allow $IPT -A com-allow -p tcp -j ACCEPT $IPT -A com-allow -p udp -j ACCEPT # 1. Разрешаем ICMP $IPT -N icmp_in $IPT -F icmp_in # здесь можно увидеть применения модуля "state" т.е. состояние. пропускаются пакеты со статусом NEW, # остальные нам не нужны $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT # Журналируем ICMP-пакеты, нам не нужны эти пакеты. $IPT -A icmp_in -p icmp -j ULOG --ulog-prefix "Bad ICMP" # 2. Входящий SSH трафик $IPT -N ssh-in $IPT -F ssh-in $IPT -A ssh-in -p tcp --dport 22 -j ACCEPT # Защита о флуда по SSH $IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport ssh -j ACCEPT $IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport ssh -j ACCEPT $IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport ssh -j ACCEPT $IPT -A ssh-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT # 1. Разрешаем исходящий ICMP трафик (функции диагностики) # 1. Необходимо чтобы мы пинговали всех. $IPT -N icmp_out $IPT -F icmp_out # Разрешаем icmp-reply во все сети в ответ на icmp-request'ы с сетей $IPT -A icmp_out -p icmp --icmp-type 8 -j ACCEPT $IPT -A icmp_out -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A icmp_out -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT # Проверка флагов. Обнаружение сканеров потров. Взято из руководства по Iptables 1.1.19 $IPT -N check_tcp $IPT -F check_tcp # Отбрасываем невалидные пакты $IPT -A allowed -m state --state INVALID -m limit --limit 3/minute -j ULOG --ulog-prefix "INVALID" $IPT -A allowed -m state --state INVALID -j DROP $IPT -A check_tcp -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset $IPT -A check_tcp -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW not --syn" $IPT -A check_tcp -p tcp ! --syn -m state --state NEW -j DROP $IPT -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j ULOG --ulog-prefix "NMAP-XMAS" $IPT -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A check_tcp -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS" $IPT -A check_tcp -p tcp --tcp-flags ALL ALL -j DROP $IPT -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS-PSH" $IPT -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP $IPT -A check_tcp -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j ULOG --ulog-prefix "NULL_SCAN" $IPT -A check_tcp -p tcp --tcp-flags ALL NONE -j DROP $IPT -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/RST" $IPT -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPT -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/FIN" $IPT -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP ################### # INPUT # # Входящий трафик # ################### # Проверяем пакеты. $IPT -A INPUT -p tcp -j check_tcp # FTP $IPT -A INPUT -p tcp --dport 21 -j ACCEPT $IPT -A INPUT -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Разрешаем входящие по SSH $IPT -A INPUT -p tcp --dport 22 -j ssh-in # Torrents $IPT -A INPUT -p tcp -m tcp --dport 59222 -j ACCEPT #Разрешить Samba From Specified Hosts $IPT -A INPUT -p tcp -i eth0 --dport 137:139 -j ACCEPT $IPT -A INPUT -p udp -i eth0 --dport 137:139 -j ACCEPT $IPT -A INPUT -p tcp -i eth0 --sport 137:139 -j ACCEPT $IPT -A INPUT -p udp -i eth0 --sport 137:139 -j ACCEPT # Разрешить input skype $IPT -A INPUT -p tcp --dport 13308 -j ACCEPT # Разрешить Mediatomb $IPT -A INPUT -p tcp --dport 49152 -j ACCEPT # Разрешаем входящие по DNS $IPT -A INPUT -s $LAN -p udp --dport domain -j com-allow # Разрешаем входящие по icmp $IPT -A INPUT -p icmp -j icmp_in # Разрешаем входящие на петлю, при его включении заметно улучшение отклика при ssh-авторизации $IPT -A INPUT -i $LO_IF -d $LOOPBACK -j ACCEPT # Ну, и разрешаем statefull-пекеты. $IPT -A INPUT -j allowed ##################### # FORWARD # # Транзитный трафик # ##################### # Отбрасываем плохие пакеты $IPT -A FORWARD -j check_tcp # Разрешаем SSH $IPT -A FORWARD -s $LAN -p tcp --dport 22 -j com-allow # Разрешаем прохождение icmp-пакетов $IPT -A FORWARD -p icmp -j icmp_in # Разрешаем прохождение асечных пакетов $IPT -A FORWARD -i $LAN_IF -s $LAN -p tcp --dport 5190 -j com-allow # Разрешаем веб-трафик, если у нас не стоит прокси сервер, можно раскоментить эту строку # Здесь же показано применения модуля "multiport" $IPT -A FORWARD -i $LAN_IF -s $LAN -p tcp -m multiport --dport 80,443,1080,8080 -j com-allow # Разрешаем прохождение почтовых пакетиков от POP и SMTP $IPT -A FORWARD -i $LAN_IF -s $LAN -p tcp -m multiport --dport 25,110 -j com-allow # Разрешаем входящие пакеты, являющиеся частью установленного соединения $IPT -A FORWARD -j allowed #################### # OUTPUT # # исходящий трафик # #################### $IPT -A OUTPUT -j check_tcp $IPT -A OUTPUT -o $LAN_IF -j ACCEPT $IPT -A OUTPUT -p icmp -j icmp_out $IPT -A OUTPUT -o $LO_IF -j ACCEPT $IPT -A OUTPUT -p tcp --dport 22 -j com-allow $IPT -A OUTPUT -p udp --dport domain -j com-allow $IPT -A OUTPUT -p tcp -m multiport --dport http,https -j com-allow $IPT -A OUTPUT -j allowed # Torrents $IPT -A OUTPUT -p tcp --source-port 59222 -j ACCEPT # Skype $IPT -A OUTPUT -p tcp -o $LAN_IF --dport 13308 -j ACCEPT $IPT -A OUTPUT -p udp -o $LAN_IF --sport 13308 -j ACCEPT # Разрешить Samba From Specified Hosts $IPT -A OUTPUT -p TCP -o eth0 --dport 137:139 -j ACCEPT $IPT -A OUTPUT -p UDP -o eth0 --dport 137:139 -j ACCEPT $IPT -A OUTPUT -p TCP -o eth0 --dport 445 -j ACCEPT $IPT -A OUTPUT -p UDP -o eth0 --dport 445 -j ACCEPT # Разрешить Mediatomb $IPT -A OUTPUT -p tcp --source-port 49152 -j ACCEPT
[…] готовый скрипт для домашних условий.fire.rules Разберем подробно, что мы сделали. $IPT -A INPUT -p tcp —dport 21 […]