iptables advanced

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 сервера.


Автор

Report Page