Давно собирался настроить на своем десктопе фаервол (iptables), наконец дошли руки и до него Настроил, но теперь вот интересуют любые интересные правила, к примеру правила для защиты от разного вида атак и т.п. Интересно было бы посмотреть на правила/скрипты, которыми пользуетесь Вы. Возможно там найдутся какие-нибудь полезные строки . Кому не жалко, выкладывайте сюда. Начну с себя, вот мой стартовый скрипт инициализации фаервола, который я написал для удобства запуска/остановки фаервола(вообще,у меня он запускается во время загрузки системы INIT'ом, но иногда бывает нужно временно отключить его), все правила написаны исключительно по моим потребностям, немного переделав правила "под себя" (если, конечно, они вас не устраивают) можете использовать его для своих целей. Вот сам скрипт: Code: #!/bin/bash # iptables-control # Author: L0rd_Ha0S # Скрипт для запуска/остановки iptables # Правила построены по принципу "что не разрешено-то запрещено" # Charset for comments: UTF-8 # Date: Feb 12, 2007 # # Parameters IPTABLES="/sbin/iptables" INET_IFACE="ppp+" DNS1="`cat /etc/ppp/pppoe.conf|grep DNS1|grep -v "#"|sed 's/DNS1=//g'`" DNS2="`cat /etc/ppp/pppoe.conf|grep DNS2|grep -v "#"|sed 's/DNS2=//g'`" LAN_IFACE="eth0" LAN_IP="192.168.1.52" LAN_ADDR="192.168.1.0/24" LO_IFACE="lo" # Functions: stop_firewall, start_firewall stop_firewall() { echo -ne " \033[01;36m*\033[00m Stopping firewall" # Перенаправляем stdout и stderr в /dev/null exec 3>&1 4>&2 1>/dev/null 2>/dev/null # Сбрасываем все правила $IPTABLES -F # Удаляем все пользовательские цепочки $IPTABLES -X # Устанавливаем политику по умолчанию ACCEPT $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT # Восстанавливаем stdout и stderr exec 1>&3 2>&4 echo -e "\t\t\t\t\t\t\t\t\t\t\t\t\t \033[01;32m[ ok ]\033[00m" } start_firewall() { echo -e " \033[01;36m*\033[00m Starting firewall" # Перенаправляем stdout и stderr в /dev/null exec 3>&1 4>&2 1>/dev/null 2>/dev/null ## Загрузка модулей /sbin/depmod -a /sbin/modprobe ip_tables /sbin/modprobe ip_conntrack /sbin/modprobe iptable_filter /sbin/modprobe iptable_mangle /sbin/modprobe ipt_LOG /sbin/modprobe ip_conntrack_ftp ## Определяем правила фаервола # Устанавливаем политики по умолчанию $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP # Сбрасываем старые правила, чтобы они не смешивались с новыми $IPTABLES -F # Удаляем все пользовательские цепочки $IPTABLES -X ## Общие правила # Разрешаем руту доступ в сеть $IPTABLES -A OUTPUT -m owner --uid-owner root -j ACCEPT # Запрещаем nobody доступ в сеть $IPTABLES -A OUTPUT -m owner --uid-owner nobody -j DROP # icmp $IPTABLES -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT $IPTABLES -A INPUT -p icmp --icmp-type 13 -j DROP # Deny Timestamp request $IPTABLES -A INPUT -p icmp --icmp-type 15 -j DROP # Deny Information request $IPTABLES -A INPUT -p icmp --icmp-type 17 -j DROP # Deny Address mask request $IPTABLES -A INPUT -p icmp -j ACCEPT $IPTABLES -A OUTPUT -p icmp -j ACCEPT ## loopback # Разрешаем весь обмен данными через loopback $IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT $IPTABLES -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT ## Локальная сеть # Тут разрешаем необходимые порты # Заносим в лог все попытки соединения с 21,22,23,80 портами из сети $LAN_ADDR $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 21 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "FTP REQUESTS FROM LAN:" $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 22 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "SSH REQUESTS FROM LAN:" $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 23 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "TELNET REQUESTS FROM LAN:" $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 80 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "WEB REQUESTS FROM LAN:" # Заносим в лог и уничтожаем все пакеты, которые имеют статус NEW, но SYN-флаг в которых не установлен $IPTABLES -A INPUT -i $LAN_IFACE -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW NOT SYN FROM LAN:" $IPTABLES -A INPUT -i $LAN_IFACE -p tcp ! --syn -m state --state NEW -j DROP # Уничтожаем все пакеты, имеющие статус INVALID $IPTABLES -A INPUT -i $LAN_IFACE -p tcp -m state --state INVALID -j DROP $IPTABLES -A OUTPUT -o $LAN_IFACE -p tcp -m state --state INVALID -j DROP # Запрещаем все попытки установления соединения $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --syn -j REJECT # Что-то вроде политики по умолчанию для $LAN_IFACE $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_ADDR -d $LAN_IP -p ! icmp -j ACCEPT $IPTABLES -A OUTPUT -o $LAN_IFACE -s $LAN_IP -d $LAN_ADDR -p ! icmp -j ACCEPT ## Интернет # Тут разрешаем необходимые порты # Заносим в лог все попытки соединения с 21,22,23,80 и непривилегированными портами $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 21 -m state --state NEW -j ULOG --ulog-prefix "FTP REQUESTS FROM INET:" $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 22 -m state --state NEW -j ULOG --ulog-prefix "SSH REQUESTS FROM INET:" $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 23 -m state --state NEW -j ULOG --ulog-prefix "TELNET REQUESTS FROM INET:" $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 80 -m state --state NEW -j ULOG --ulog-prefix "WEB REQUESTS FROM INET:" $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 1024:65535 -m state --state NEW -j ULOG --ulog-prefix "ATTEMPT TO CONNECT TO UNPORT:" # Заносим в лог и уничтожаем все пакеты, которые имеют статус NEW, но SYN-флаг в которых не установлен $IPTABLES -A INPUT -i $INET_IFACE -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW NOT SYN FROM INET:" $IPTABLES -A INPUT -i $INET_IFACE -p tcp ! --syn -m state --state NEW -j DROP # Уничтожаем все пакеты, имеющие статус INVALID $IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state INVALID -j DROP $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m state --state INVALID -j DROP # Запрещаем все попытки установления соединения $IPTABLES -A INPUT -i $INET_IFACE -p tcp --syn -j DROP # Разрешаем пакеты из установленных соединений $IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT # принимаем DNS-ответы $IPTABLES -A INPUT -i $INET_IFACE -p udp --sport 53 -s $DNS1 -j ACCEPT $IPTABLES -A INPUT -i $INET_IFACE -p udp --sport 53 -s $DNS2 -j ACCEPT # Заносим в лог и разрешаем исходящие соединения только на эти порты $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 20,21,23,25,110,465,989,990,994,995 -m state --state NEW -j ULOG --ulog-prefix "OUTGOING REQUESTS" $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 1080,8080,1194,1433,1434,1723,3306,9999 -m state --state NEW -j ULOG --ulog-prefix "OUTGOING REQUESTS" $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 20,21,22,23,25,80,110,443,465,989,990,994,995 -j ACCEPT $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 1080,8080,1194,1433,1434,1723,3306,5190,9999 -j ACCEPT # Разрешаем DNS-запросы $IPTABLES -A OUTPUT -o $INET_IFACE -p udp --dport 53 -d $DNS1 -j ACCEPT $IPTABLES -A OUTPUT -o $INET_IFACE -p udp --dport 53 -d $DNS2 -j ACCEPT # Устанавливаем ловушки. Работает только при устновленном Patch-o-matic #$IPTABLES -A INPUT -p tcp -j TARPIT # Восстанавливаем stdout и stderr exec 1>&3 2>&4 echo -e "\t\t\t\t\t\t\t\t\t\t\t\t\t \033[01;32m[ ok ]\033[00m" } if [ $UID = 0 ]; then case "$1" in start) start_firewall exit 0 ;; restart|reload|force-reload) stop_firewall start_firewall exit 3 ;; stop) stop_firewall exit 0 ;; *) progname=`echo $0|sed 's/\/usr//g'|sed 's/\/local//g'|sed 's/\/sbin//g'|sed 's/\/bin//g'|sed 's/\///g'|sed 's/\.//g'` echo -e " Usage: $progname \033[01;32m{\033[00mstart\033[01;32m|\033[00mrestart\033[01;32m|\033[00mstop\033[01;32m}\033[00m" exit 1 ;; esac; else echo -e " \033[31mYou must be root!\033[00m"; fi exit 0
Я как-то особо не заморачивался серьезной настройкой iptables на домашней машине. Да и, думаю, это ни к чему. Наверное, топик получится весьма познавательный. Несколько весьма полезных руководств: Начальная настройка межсетевого экрана Iptables Руководство по iptables (Iptables Tutorial 1.1.19) Iptables Tutorial 1.2.2 (ENG)
Кому как, но мне так очень не понравилось бы если бы по моему компу кроме меня шарился кто-нибудь еще(я вообще немного параноик ), поэтому и заморачиваюсь с настройкой фаервола. За ссылки, конечно, спасибо, только я таких и множества подобных этим руководств начитался пока разбирался с iptables . Что можно я уже взял из них, поэтому и интересуюсь чужими правилами/скриптами, потому что в них можно найти что-нить поинтереснее чем в общих руководствах.
Советую почитать мою статью о расширенных возможностях iptables. Хотя писалась она давно (начало 2005 года) и большинство модулей перекачевали в стандартную поставку ядра без доустановки patch-o-matic (если кто помнит - было такое раньше извращение =)). http://hellknights.void.ru/articles/0x48k-Advanced_IpTables.htm Там множество интересных примеров. Кроме того привожу пример и пояснения из руководства gentoo, хотя он больше подходит для сервеной машины: Code: /etc/init.d/firewall #!/sbin/runscript IPTABLES=/sbin/iptables IPTABLESSAVE=/sbin/iptables-save IPTABLESRESTORE=/sbin/iptables-restore FIREWALL=/etc/firewall.rules DNS1=212.242.40.3 DNS2=212.242.40.51 #inside IIP=10.0.0.2 IINTERFACE=eth0 LOCAL_NETWORK=10.0.0.0/24 #outside OIP=217.157.156.144 OINTERFACE=eth1 opts="${opts} showstatus panic save restore showoptions rules" depend() { need net } rules() { stop ebegin "Setting internal rules" einfo "Setting default rule to drop" $IPTABLES -P FORWARD DROP $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP #default rule einfo "Creating states chain" $IPTABLES -N allowed-connection $IPTABLES -F allowed-connection $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \ "Bad packet from ${IINTERFACE}:" $IPTABLES -A allowed-connection -j DROP #ICMP traffic einfo "Creating icmp chain" $IPTABLES -N icmp_allowed $IPTABLES -F icmp_allowed $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ time-exceeded -j ACCEPT $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ destination-unreachable -j ACCEPT $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:" $IPTABLES -A icmp_allowed -p icmp -j DROP #Incoming traffic einfo "Creating incoming ssh traffic chain" $IPTABLES -N allow-ssh-traffic-in $IPTABLES -F allow-ssh-traffic-in #Flood protection $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ ALL RST --dport ssh -j ACCEPT $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ ALL FIN --dport ssh -j ACCEPT $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ ALL SYN --dport ssh -j ACCEPT $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT #outgoing traffic einfo "Creating outgoing ssh traffic chain" $IPTABLES -N allow-ssh-traffic-out $IPTABLES -F allow-ssh-traffic-out $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT einfo "Creating outgoing dns traffic chain" $IPTABLES -N allow-dns-traffic-out $IPTABLES -F allow-dns-traffic-out $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \ -j ACCEPT $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \ -j ACCEPT einfo "Creating outgoing http/https traffic chain" $IPTABLES -N allow-www-traffic-out $IPTABLES -F allow-www-traffic-out $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT #Catch portscanners einfo "Creating portscan detection chain" $IPTABLES -N check-flags $IPTABLES -F check-flags $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \ --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \ 5/minute -j LOG --log-level 1 --log-prefix "XMAS:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \ -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \ --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:" $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \ --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:" $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \ --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:" $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # Apply and add invalid states to the chains einfo "Applying chains to INPUT" $IPTABLES -A INPUT -m state --state INVALID -j DROP $IPTABLES -A INPUT -p icmp -j icmp_allowed $IPTABLES -A INPUT -j check-flags $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A INPUT -j allow-ssh-traffic-in $IPTABLES -A INPUT -j allowed-connection einfo "Applying chains to FORWARD" $IPTABLES -A FORWARD -m state --state INVALID -j DROP $IPTABLES -A FORWARD -p icmp -j icmp_allowed $IPTABLES -A FORWARD -j check-flags $IPTABLES -A FORWARD -o lo -j ACCEPT $IPTABLES -A FORWARD -j allow-ssh-traffic-in $IPTABLES -A FORWARD -j allow-www-traffic-out $IPTABLES -A FORWARD -j allowed-connection einfo "Applying chains to OUTPUT" $IPTABLES -A OUTPUT -m state --state INVALID -j DROP $IPTABLES -A OUTPUT -p icmp -j icmp_allowed $IPTABLES -A OUTPUT -j check-flags $IPTABLES -A OUTPUT -o lo -j ACCEPT $IPTABLES -A OUTPUT -j allow-ssh-traffic-out $IPTABLES -A OUTPUT -j allow-dns-traffic-out $IPTABLES -A OUTPUT -j allow-www-traffic-out $IPTABLES -A OUTPUT -j allowed-connection #Allow client to route through via NAT (Network Address Translation) $IPTABLES -t nat -A POSTROUTING -o $OINTERFACE -j MASQUERADE eend $? } start() { ebegin "Starting firewall" if [ -e "${FIREWALL}" ]; then restore else einfo "${FIREWALL} does not exists. Using default rules." rules fi eend $? } stop() { ebegin "Stopping firewall" $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -X $IPTABLES -P FORWARD ACCEPT $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT eend $? } showstatus() { ebegin "Status" $IPTABLES -L -n -v --line-numbers einfo "NAT status" $IPTABLES -L -n -v --line-numbers -t nat eend $? } panic() { ebegin "Setting panic rules" $IPTABLES -F $IPTABLES -X $IPTABLES -t nat -F $IPTABLES -P FORWARD DROP $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT eend $? } save() { ebegin "Saving Firewall rules" $IPTABLESSAVE > $FIREWALL eend $? } restore() { ebegin "Restoring Firewall rules" $IPTABLESRESTORE < $FIREWALL eend $? } restart() { svc_stop; svc_start } showoptions() { echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}" echo "start) will restore setting if exists else force rules" echo "stop) delete all rules and set all to accept" echo "rules) force settings of new rules" echo "save) will store settings in ${FIREWALL}" echo "restore) will restore settings from ${FIREWALL}" echo "showstatus) Shows the status" } Здесь следует пояснить следующее: Подключения к межсетевому экрану разрешены только через SSH (порт 22) Локальная сеть должна иметь доступ к HTTP, HTTPS и SSH (также должен быть разрешен DNS) ICMP может содержать постороннюю информацию и не должен быть разрешен. Конечно же, мы разрешаем некоторые ICMP-сообщения. Сканирование портов должно быть определено и зарегистрировано SYN-flood атаки должны быть пресечены Весь остальной трафик должен быть отброшен и запротоколирован. Вот несколько советов при создании правил для межсетевого экрана: Создайте политику межсетевого экрана до того, как ее реализуете Сделайте ее простой Знайте принцип работы каждого протокола (прочитайте подходящий RFC) Всегда помните, что межсетевой экран — это просто программа, запускаемая с правами администратора. Проверьте свой межсетевой экран Если вам кажется, что iptables труден для понимания или нужно слишком много времени для настройки межсетевого экрана, то вы можете попробовать Shorewall. Для генерации правил межсетевого экрана он использует iptables, но акцентируется на правилах и не указывает протокол. А вот у HaOS'a я не понял зачем сначала было делать так: Code: # Устанавливаем политику по умолчанию ACCEPT $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT Ставь сразу в DROP. А потом перебирать все модули. Поясни, pls =) А так я бы ему за работу "+" поставил, если б мог =)
Так ты ж посмотри в какой функции все это делается - stop_firewall() Политики по умолчанию устанавливаются в ACCEPT, потому что если я этого не сделаю, то при остановке фаервола они остануться в DROP, тогда получается, что ты остановил фаер, а он все равно все дропает Она и стоит в DROP в соответствующей функции И модули перебираются в той же функции. Тут проверяется, загружен ли указанный модуль, и если да, то он выгружается из оперативки. Этого конечно можно и не делать, просто мне вывод lsmod глаза мозолит(хоть и нечасто туда заглядываю ), не люблю когда много буковок выводит =) Статью твою обязательно прочитаю в ближайшее время. А в скрипте, который ты привел я уже нашел несколько интересных для меня вещей. Tnx
Кому интересно это то что у меня: Code: #!/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 p.s про TARPIT почитать можно здесь: Скрытые возможности iptables Скачать патч можно здесь: patch-o-matic-ng