Код:
#!/bin/sh
IPTABLES=/sbin/iptables
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP
$IPTABLES -A FORWARD -i ! lo -j DROP
#traffic count begin #правила для моей системы учета трафика состоящей из 2х скриптов.
$IPTABLES -A INPUT -i ppp+ -j LOG --log-prefix "count"
$IPTABLES -A OUTPUT -o ppp+ -j LOG --log-prefix "count"
#traffic count end
#разрешаю все коннекты на мой фтп в локальной сети
$IPTABLES -A INPUT -i eth+ -p tcp -m multiport --dport 21 -j ACCEPT
#устанавливаем в заголовке пакетов величину ttl (Time To Live): исходящие 64, входящие 128. Приведу цитату из мануала "Увеличение поля TTL может использоваться для того, чтобы сделать наш брандмауэр менее "заметным" для трассировщиков (traceroutes). Программы трассировки любят за ценную информацию при поиске проблемных участков сети, и ненавидят за это же, поскольку эта информация может использоваться крякерами в неблаговидных целях."
$IPTABLES -t mangle -A OUTPUT -j TTL --ttl-set 64
$IPTABLES -t mangle -A PREROUTING -m ttl --ttl-gt 128 -j TTL --ttl-set 128
$IPTABLES -t mangle -A PREROUTING -m ttl --ttl-lt 128 -j TTL --ttl-set 128
$IPTABLES -t mangle -A PREROUTING -p TCP --dport 33434:33542 -j TTL --ttl-inc 1
#TV begin #Здесь специфические правила, разрешающие прием радио и теле передач в локальной сети.
$IPTABLES -A INPUT -i eth+ -s 192.168.172.0/24 -j ACCEPT
$IPTABLES -A INPUT -i eth+ -d 225.10.10.0/28 -j ACCEPT
$IPTABLES -A INPUT -i eth+ -s 192.168.204.0/24 -j ACCEPT
$IPTABLES -A INPUT -i eth+ -d 192.168.204.0/24 -j ACCEPT
#TV end
#Запретить все входящие на локальные интерфейсы источником назначения которых не является мой ip
$IPTABLES -A INPUT -i eth+ -d ! 10.x.x.x -j DROP
#Запретить все входящие на порт 80,21,4662 из интернета.
$IPTABLES -A INPUT -i ppp+ -p tcp -m multiport --dport 80,21,4662 -j DROP
#icmp security begin #Настройка безопасности протокола icmp
#Эта строка блокирует icmp пакеты (тип 8) т.е запрос, которые превышают установленное количество в единицу времени. Т.о это позволяет избежать атаки вида пинг-флуд. на лишние пакеты отсылается ответ Destination host administratively prohibited
$IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
$IPTABLES -A INPUT -p icmp --icmp-type 8 -j DROP
#Эта строка блокирует icmp пакеты (тип 0) т.е ответ, эта нужно для того, чтобы когда я буду сам проводить атаку такого типа, ответы от атакуемого хоста не забивали мне канал :)
$IPTABLES -A INPUT -p icmp --icmp-type 0 -m limit --limit 1/second --limit-burst 1 -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 0 -j DROP
#Все остально пропускается тоже по принципу "количество в единицу времени"
$IPTABLES -A INPUT -p icmp -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
$IPTABLES -A INPUT -p icmp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
$IPTABLES -A INPUT -p icmp -j DROP
#icmp security end
#udp security begin# Настройка безопасности протокола udp
$IPTABLES -A INPUT -i lo -j ACCEPT
#Разрешаю все с адреса 10.y.y.y для игры в quake3 :) разрешаю все коннекты с адресов источником которых является 53й порт.
$IPTABLES -A INPUT -i eth+ -s 10.y.y.y -j ACCEPT
$IPTABLES -A INPUT -p udp --sport 53 -j ACCEPT
#Лимит в единицу времени, чтобы не зафлудили.
$IPTABLES -A INPUT -p udp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
$IPTABLES -A INPUT -p udp -j DROP
#udp security end
#tcp security begin #настройка tcp
#первые 2 строки логирование и сброс пакетов с флагами SYN,ACK SYN,ACK имеющими статус NEW
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j LOG --log-prefix "new_syn/ack " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ACK -j ACCEPT
$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,ACK -j ACCEPT
#(sync secure bgin) #TARPIT сейчас не использую.
#$IPTABLES -A INPUT -p tcp -m tcp --dport 22 -j TARPIT
#$IPTABLES -A INPUT -p tcp -m tcp --dport 79 -j TARPIT
#$IPTABLES -A INPUT -p tcp -m tcp --dport 81 -j TARPIT
#$IPTABLES -A INPUT -p tcp -m tcp --dport 1 -j TARPIT
#$IPTABLES -A INPUT -p tcp -m tcp --dport 8008 -j TARPIT
#$IPTABLES -A INPUT -p tcp -m tcp --dport 8080 -j TARPIT
#Защита от syn атак.
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -m limit --limit 15/minute --limit-burst 1 -j ACCEPT
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -j LOG --log-prefix "left_syn " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -j DROP
#(sync secure end)
#Далее те состояния о которых я знаю, разрешены, те состояния которых быть не может запрещены.
#(scan inherit secure begin)
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 15/minute --limit-burst 1 -j ACCEPT
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j LOG --log-prefix "left_rst " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP
#(scan inherit secure end)
$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "new_nesyn " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A INPUT -m state --state INVALID -j DROP
#$IPTABLES -A INPUT -p tcp -m tcp --dport 137:139 -j TARPIT
$IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
$IPTABLES -A INPUT -p tcp -j DROP
#tcp security end
#все что я упустил, записывается в лог, и блокируется.
#$ipt -A FORWARD -p tcp --syn -i eth1 -m connlimit --connlimit-above 15 -j REJECT
$IPTABLES -A INPUT -p ALL -j LOG --log-prefix "proto_left " --log-ip-options --log-tcp-options
$IPTABLES -A INPUT -p ALL -j DROP
$IPTABLES -A FORWARD -j DROP
$IPTABLES -A INPUT -j DROP