Рецепты iptables

Date April 1st, 2010 Author Vitaly Agapov

Знать и помнить все особенности iptables – это очень здорово. Но маловероятно. К тому же на просторах сети иногда попадаются интересные находки в плане обеспечения безопасности. Иногда сам что-то придумаешь и хочется записать. В общем, решил сделать подборку примеров использования iptables на будущее.
Ещё недавно была статья по главным концепциям iptables – Memento iptables. Буду считать, что это её логическое продолжение. Тем более, что изначально не было планов разделять информацию на два разных поста.

Имитация Microsoft Windows

С помощью Netfilter можно сделать так, чтобы сканеры портов (nmap и подобные) принимали сканируемую систему за Microsoft Windows. Для этого надо открыть порты NetBIOS, а при попытке обращения к ним отправлять соединения в TARPIT.

iptables -A INPUT -p tcp -m tcp -m multiport --dports 135,139,1025 -j TARPIT

Про модуль multiport и расширение TARPIT тоже можно прочитать в предыдущей статье.

Защита ssh и ftp от брут-форса

Это, наверное, одно из главных условий защиты сервера, смотрящего одним из соответствующих портов в сеть. Способы защиты любого из таких портов одинаковы.

Вариант 1.

iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j TARPIT
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT

Первое правило проверяет наличие в динамическом списке ip-адреса отправтеля, и запись об этом адресе должна быть “моложе” 20 секунд. Иначе – TARPIT. Второе правило разрешает обращение на 22-й порт и заносит IP-адрес в динамический список.

Вариант 2.

iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit 1/hour --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH --hashlimit-htable-expire 60000 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -j DROP

Первое правило разрешает два соединения на 22-й порт в течение часа, после чего начнёт срабатывать второе правило. Срок действия хэш-таблицы с ip-адресами – 60 секунд, после которых можно повторить попытку. Однако при срабатывании второго правила этот счетчик будет сбрасываться. При действии этих правил в /proc/net/ipt_hashlimit будет создаваться файл с именем, заданным параметром –hashlimit-name.

Закрытие всех портов кроме списка разрешённых

Бывает полезным определить, какие порты всё-таки должны бть доступны извне, а какие лучше запретить. Например, если надо запретить все порты кроме 80,25 и 110:

for port in 80 25 110; do
iptables -A INPUT -i eth0 -p tcp --dport $port -j ACCEPT
done
iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options
iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

Здесь попытки доступа на запрещенные порты будут логироваться, и их можно просмотреть в dmesg.

Фильтрация по содержанию

Если необходимо отфильтровать пакеты, содержащие внутри определённый набор символов и направленные, например, на 80-й порт на наш сервер, то можем воспользоваться правилом:

iptables -A INPUT -p tcp --dport 80 -m string --string 'wrong' --algo kmp -j DROP

Одно из возможных вариантов применения этой возможности – фильтрация по браузеру или операционной системе HTTP-запросов:

iptables -A INPUT -p tcp --dport 80 -m string --algo kmp --string "Mozilla" -j REJECT

Защита от DoS

Защита от SYN-flood:

iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

Защита от сканеров портов:

iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

Защита от Ping of death:

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Фильтрация по дате

Для добавления в критерии iptables логики, учитывающей время и дату, используется модуль time. С помощью него, например, можно запретить вход на HTTP-сервер с 6 до 7 утра по субботам и воскресеньям:

iptables -A INPUT -p tcp --dport 80 -m time --timestart 06:00 --timestop 07:00 --weekdays Sat,Sun -j REJECT

Tags: ,
Category: Linux, Security | No comments »

Comments

Leave a comment

 Comment Form