iptables advanced
Life-HackС введением в iptables можно ознакомиться тут и тут.
В этой заметке я расскажу как можно использовать iptables (а точнее netfilter) для защиты от некоторого вида атак.
Я приведу примеры правил в цепочках и дам краткие описания - для чего они нужны. Рекомендую, все же, ознакомиться с оригинальной документацией на netfilter для более глубокого понимания работы netfilter/iptables.
Сбросить все некорректные пакеты это хорошая мысль:
iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP
Сбросить все пакеты, устанавливающие новые соединения, но не имеющие флага SYN (читайте про TCP протокол):
iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
или так:
iptables -A INPUT -p tcp ! –syn -m state --state NEW -j DROP
А это защита от одного из видов DDoS атак - SYN Flood и логирование для раннего обнаружения:
iptables -t mangle -N syn-flood
iptables -t mangle -A syn-flood -m limit --limit 24/s --limit-burst 48 -j RETURN
iptables -t mangle -A syn-flood -m limit --limit 10/s --limit-burst 10 -j LOG --log-prefix "IPT: DOS (dropped): "
iptables -t mangle -A syn-flood -j DROP
iptables -t mangle -A PREROUTING -p tcp --syn -j syn-flood
В данном случае ограничение в 24 подключения за секунду (максимально разрешено 48 подключений).
А вот вам защита от любителей сканировать порты с ведением лога(сначала логируем, потом REJECT с отправкой ответа - сбросить подключение:
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST ALL -j LOG --log-prefix "IPT: Scan: XMAS0: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST ALL -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "IPT: Scan: XMAS1: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL FIN,URG,PSH -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "IPT: Scan: XMAS2: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL SYN,RST,ACK,FIN,URG -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL ALL -j LOG --log-prefix "IPT: Scan: XMAS2: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL ALL -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "IPT: Scan: SYN-RST: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,RST SYN,RST -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST NONE -m limit --limit 10/minute --limit-burst 10 -j LOG --log-prefix "IPT: Scan: empty flags: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST NONE -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST FIN -m limit --limit 10/minute --limit-burst 10 -j LOG --log-prefix "IPT: Scan: only FIN: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST FIN -j REJECT --reject-with tcp-reset
Защита от brutforce для SSH:
iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
Ограничение для количества подключений с одного IP:
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP
Так можно "отслеживать" http запросы по "ключевым" словам:
iptables -A INPUT -p tcp --dport 80 -m string --string "string" --algo bm -j DROP
"string" это ключевое слово или строка. Действие может быть не обязательно DROP - возможны варианты - логирование, например. Тоже самое можно делать и в цепочке OUTPUT для отслеживания исходящих запросов, или в FORWARD...
И на последок - я не рекомендую все примеры бездумно мешать в кучу. К тому же, знайте, что iptables при большом количестве правил фильтрации достаточно много берет ресурсов CPU на себя. Поэтому выстраивая логику работы сетевого фильтра исходите из ральных задач, не пытаясь предусмотреть все возможные ситуации.
Фильтрация сетевого трафика, как я уже говорил, тема обширная. А все примеры выше не панацея. Любая защита - это комплекс мероприятий. Для построения отказоустойсивой системы, примеров выше будет не достаточно. Совершенно точно потребуется тюнинг и других составляющих этой системы. Например, в случае высоконагруженного Web сервера потребуется изменять параметры ядра, связанные с обработкой сетевого трафика, а так же эксперементировать с настройками вашего http сервера.