С помощью 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