тонкая настройка 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