Сума уже схожу...
#!/bin/sh
IPTABLES="/sbin/iptables"
external="eth0"
SSH_PORT="54521"
#Очистка цепочек
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -F INPUT
$IPTABLES -F FORWARD
#$IPTABLES -P INPUT ACCEPT
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#Локально разрешаем всё.
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
# Пропускать все уже инициированные соединения, а также дочерние от них
$IPTABLES -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Пропускать новые, а так же уже инициированные и их дочерние соединения
$IPTABLES -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Разрешить форвардинг для новых, а так же уже инициированных и их дочерних соединений
$IPTABLES -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Включаем фрагментацию пакетов. Необходимо из за разных значений MTU
$IPTABLES -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса.
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
$IPTABLES -A INPUT -m conntrack --ctstate INVALID -j DROP
$IPTABLES -A FORWARD -m conntrack --ctstate INVALID -j DROP
# ICMP - перенаправление:
$IPTABLES -A INPUT --fragment -p icmp -j DROP
$IPTABLES -A FORWARD --fragment -p icmp -j DROP
$IPTABLES -A OUTPUT --fragment -p icmp -j DROP
# Приводит к связыванию системных ресурсов, так что реальный обмен данными становится не возможным.
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
#Ограничиваем ICMP
#$IPTABLES -A INPUT -i $external -m psd -j REJECT
$IPTABLES -I INPUT -p icmp --icmp-type echo-request -m limit --limit 180/minute -j ACCEPT
$IPTABLES -I INPUT -p icmp ! --icmp-type echo-request -m limit --limit 180/minute -j ACCEPT
# Разрешаем ICMP соединение. Значительная часть ICMP используется для передачи сообщений о
# том, что происходит с тем или иным UDP или TCP соединением.
$IPTABLES -A INPUT -i $external -p icmp -m icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A OUTPUT -o $external -p icmp -m icmp --icmp-type source-quench -j ACCEPT
# запрещаем устанавливать новые исходящие соединения юзеру (uid 33) с правами которого работает web сервер.
$IPTABLES -A OUTPUT -p tcp -m owner --uid-owner 33 -m state --state NEW -j DROP
#Вводим ограничения для новых подключений по WWW (не более 5 в секунду)
$IPTABLES -A INPUT -p tcp --dport 80 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 5/sec --limit-burst 5 -j ACCEPT
#Запираем netbios
$IPTABLES -A INPUT -p udp ! -i $external --dport 137:138 -j DROP
############ NAT CONFIG #########################
$IPTABLES -t nat -A PREROUTING -i $external -p tcp --dport 411 -j REDIRECT --to-ports 4111
$IPTABLES -t nat -A PREROUTING -i $external -p tcp --dport 2011 -j REDIRECT --to-ports 4111
$IPTABLES -t nat -A PREROUTING -i $external -p tcp --dport 1111 -j REDIRECT --to-ports 4111
#
$IPTABLES -t nat -A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE
##################################################
# Правила против сканирования портов.
###################### Null scan ( nmap -sN <target> )
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Log attack
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 3/m --limit-burst 5 -j LOG --log-prefix "Firewall Null scan "
# Drop and blacklist for 60 seconds IP of attacker
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -m recent --name blacklist_60 --set -m comment --comment "Drop/Blacklist Null scan" -j DROP
#################### Xmas scan (nmap -sX <target>)
# Log attacks
$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -m limit --limit 3/m --limit-burst 5 -j LOG --log-prefix "Firewall> XMAS scan "
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 3/m --limit-burst 5 -j LOG --log-prefix "Firewall XMAS-PSH scan "
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 3/m --limit-burst 5 -j LOG --log-prefix "Firewall XMAS-ALL scan "
# Drop and blacklist for 60 seconds IP of attacker
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m recent --name blacklist_60 --set -m comment --comment "Drop/Blacklist Xmas/PSH scan" -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -m recent --name blacklist_60 --set -m comment --comment "Drop/Blacklist Xmas scan" -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -m recent --name blacklist_60 --set -m comment --comment "Drop/Blacklist Xmas/All scan" -j DROP
#################### FIN scan (nmap -sF <target)
#Log attack
$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN -m limit --limit 3/m --limit-burst 5 -j LOG --log-prefix "Firewall FIN scan "
# Drop and blacklist for 60 seconds IP of attacker
$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN -m recent --name blacklist_60 --set -m comment --comment "Drop/Blacklist FIN scan" -j DROP
#################### ACK scan (nmap -sA <target>)
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -m comment --comment "Drop TCP connection not starting by SYN" -j DROP
################### UDP scan (nmap -sU <target>)
$IPTABLES -A INPUT -p udp -m limit --limit 6/h --limit-burst 1 -m length --length 0:28 -j LOG --log-prefix "Firewall 0 length udp "
$IPTABLES -A INPUT -p udp -m length --length 0:28 -m comment --comment "Drop UDP packet with no content" -j DROP
#$IPTABLES -A INPUT -i eth0 -m psd -j DROP
#Открываем порты:
# FTP (Passive Mode)
#$IPTABLES -A INPUT -m conntrack --ctstate NEW -p tcp --sport 1024:65535 --dport 20:21 -j ACCEPT
#$IPTABLES -A INPUT -p tcp --sport 1024:65535 --dport 49000:49500 -j ACCEPT
#Даём доступ к вебсерверу:
$IPTABLES -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT
#Даём доступ к DC-хабам
$IPTABLES -A INPUT -p tcp -m tcp -m multiport --dports 4111,2011,1111,6850 -j ACCEPT
# Разрешаем работу UDP пакетов на порту 1209
$IPTABLES -A INPUT -i $external -p udp --sport 1209 -j ACCEPT
$IPTABLES -A OUTPUT -o $external -p udp --dport 1209 -j ACCEPT
#Разрешаем ICQ
$IPTABLES -A INPUT -p tcp -i $external --dport 5190 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 5190 -m state --state NEW -j ACCEPT
#Jabber
$IPTABLES -A INPUT -p tcp -i $external --dport 5222 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 5222 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i $external --dport 5280 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 5280 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i $external --dport 5269 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 5269 -m state --state NEW -j ACCEPT
#Разрешаем SMTP
$IPTABLES -A INPUT -p tcp -i $external --dport 465 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 465 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i $external --dport 587 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 587 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i $external --dport 25 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 25 -m state --state NEW -j ACCEPT
#Разрешаем POP3/POP3S
$IPTABLES -A INPUT -p tcp -i $external --dport 110 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 110 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i $external --dport 995 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 995 -m state --state NEW -j ACCEPT
#Разрешаем imap
$IPTABLES -A INPUT -p tcp -i $external --dport 143 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 143 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i $external --dport 993 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o $external --sport 993 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p udp -i $external --dport 993 -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p udp -o $external --sport 993 -m state --state NEW -j ACCEPT
#Разрешаем DNS
$IPTABLES -A INPUT -i $external -p udp --sport 53 -j ACCEPT
$IPTABLES -A OUTPUT -o $external -p udp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -i $external -p tcp --sport 53 -j ACCEPT
$IPTABLES -A OUTPUT -o $external -p tcp --dport 53 -j ACCEPT
#SSH
$IPTABLES -A INPUT -m tcp -p tcp --dport $SSH_PORT -j ACCEPT
$IPTABLES -A OUTPUT -m tcp -p tcp --dport $SSH_PORT -j ACCEPT
#SKYPE
$IPTABLES -A INPUT -p TCP -i $external --dport 11553 -j ACCEPT
$IPTABLES -A OUTPUT -p TCP -o $external --dport 11553 -j ACCEPT
$IPTABLES -A OUTPUT -p UDP -o $external --sport 11553 -j ACCEPT
# Torrent
$IPTABLES -A INPUT -p TCP -i $external --dport 51413 -j ACCEPT
$IPTABLES -A INPUT -p UDP -i $external --dport 51413 -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $external --dport 6881 -j ACCEPT
$IPTABLES -A INPUT -p UDP -i $external --dport 6881 -j ACCEPT
$IPTABLES -A INPUT -p UDP -i $external --dport 29292 -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $external --dport 29292 -j ACCEPT
# IGMP (IPTV)
$IPTABLES -I INPUT -p igmp -j ACCEPT
$IPTABLES -I OUTPUT -p igmp -j ACCEPT
$IPTABLES -I INPUT -p udp -m udp -d 224.0.0.0/240.0.0.0 --dport 1234 -j ACCEPT
$IPTABLES -I INPUT -p udp -m udp -d 224.0.0.0/240.0.0.0 --dport 9875 -j ACCEPT
BLOCKDB="/usr/local/etc/firewall/ip-all.blocked"
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
$IPTABLES -A INPUT -p tcp -i $external -s $i -j DROP
$IPTABLES -A INPUT -p udp -i $external -s $i -j DROP
done
BLOCKDB2="/usr/local/etc/firewall/ranges.bans"
RANGES=$(grep -Ev "^#" $BLOCKDB2)
for i in $RANGES
do
$IPTABLES -A INPUT -p tcp -i $external -s $i -j DROP
$IPTABLES -A INPUT -p udp -i $external -s $i -j DROP
done
BAD_CCDB="/usr/local/etc/firewall/country"
CCs=$(grep -Ev "^#" $BAD_CCDB)
for i in $CCs
do
$IPTABLES -I INPUT -m geoip --src-cc $i -j DROP
done
BAD_CCDB2="/usr/local/etc/firewall/country_hub"
CCs2=$(grep -Ev "^#" $BAD_CCDB2)
for i in $CCs2
do
$IPTABLES -I INPUT -m geoip -p tcp --dport 4111 --src-cc $i -j DROP
done
Описаные флаги сканирования в комментариях работают. Если просто
nmap host/ip- сканирование удаётся..