Pull to refresh

TARPIT без патча ядра или patch-o-matic в прошлом

Нередко приходится видеть в логах брутфорс ssh или ftp или не менее назойливый скан httpd-директории. Иногда атаки совершаются не только с внешних адресов, но и с хостов с домашней локальной сети, где куча виндовых пользователей, подхвативших вирусы.
Есть масса способов защититься от этого, и я использую fail2ban. В сравнении с аналогичными программами он обладает более широкой функциональностью и гибкостью — позволяет использовать регексы для нестандартных сервисов и менять правила блокировки. Но хочется не просто защитить свой сервер от атак, а еще и слегка проучить атакующего.
Стандартными средствами iptables этого не сделать, но в расширенном варианте patch-o-matic, патче для ядра linux, есть расширенная цепочка TARPIT, позволяющая создать «ловушку» для нежелательных tcp-соединений. Работает это следующим образом: при обращении к порту, на котором стоит правило TARPIT, атакующий получает в ответ SYN-ACK (биты подтверждения на установление соединения), а так же принудительное установление размера tcp-окна, равным нулю. Это приводит к тому, что атакующая сторона не может передать никаких данных, а все ее попытки разорвать соединение игнорируются. Таким образом, соединение находятся в подвисшем состоянии до истечения тайм-аута (12-24 минут), что расходует ресурсы атакующей машины, но не атакуемой.
Узнав об этом, я сразу захотел прописать TARPIT вместо DROP в конфиг fail2ban и в запрещающие правила iptables, но при мысли, что для этого при каждом обновлении мне придется патчить ядро с patch-o-matic заново, просто опускались руки. И вообще, казалось очень странным и совсем не хотелось применять патч пятилетней давности к свежим исходникам. Оно и правильно, как оказалось, TARPIT теперь доступен без патча ядра в составе xtables-addons. Все уже есть в ядре, для его использовании надо лишь убедиться, что опция CONFIG_NETFILTER_XTABLES в конфиге ядра включена (y|m).
Xtables-addons представляет собой дополнительные расширения для iptables, ip6tables и ebtables. Среди интересных цепочек есть не только TARPIT, а так же DELUDE, CHAOS, DHCPMAC, ECHO, IPMARK, LOGMARK, STEAL, SYSRQ, TEE и др.
DELUDE отправляет ответ SYN-ACK на SYN, но RST на все остальные. Таким образом, сканер атакующей машины при SYN-сканировании показывает, что целевой порт открыт, в то время как на самом деле порт закрыт.
CHAOS создает запутывающий эффект для входящих соединений. Он рандомно может отвечать на соединения как REJECT и TARPIT или как REJECT и DELUDE.
ECHO отправляет назад все полученные пакеты :)
IPMARK позволяет помечать пакеты на основе их ip-адреса.
STEAL действует как DROP, но не вызывает ошибок, свойственных DROP в цепочке OUTPUT.
SYSRQ при попадании пакета в цепочку вызывает сигнал sysrq. Это полезно, если на машине, доступной только по сети, повисли жизненно важные части системы. И, конечно, в xtables для этого правила предусмотрена специальная защита по mac/ip или по паролю.
TEE клонирует пакет и перенаправляет его клон на другую машину сегмента локальной сети.
Дождавшись заветного TARPIT, сразу внес его в те правила, куда неплохо было бы прибавить «месть». Получилось вот что:

for port in 137:139 445; do
iptables -A INPUT -p tcp --dport $port -j TARPIT
iptables -A INPUT -p udp --dport $port -j DROP
done;

Сюда попадаются виндовые сканеры шар, например lanscope. Пока не тестил, но думаю, это выглядит как зависание на моем адресе при сканировании локальной сети.
for ip in 10.128.17.61 75.127.73.253 208.50.46.46; do
iptables -A INPUT -p tcp -s $ip -j TARPIT
iptables -A INPUT -s $ip -j DROP
done;

Под эти правила попали самые жесткие и самые назойливые нарушители, для них моя машина теперь как одна сплошная куча, куда они наступают.
for port in 22 21; do
iptables -A INPUT -p tcp -m state --state NEW --dport $port -m recent --update --seconds 20 -j TARPIT
iptables -A INPUT -p tcp -m state --state NEW --dport $port -m recent --set -j ACCEPT
done

А это очередная защита от брутфорса. Разрешает SYN на ssh и ftp не чаще одного раза в 20 секунд, иначе — TARPIT.

Пробовал тестировать telnet-соединение на правило TARPIT. Результат — терминал на долгое время ушел в аут, не реагируя ни на ctrl-c, ни на ^], пришлось закрывать вкладку.
Xtables-addons, как сообщается на оффициальном сайте, содержится в Alpine Linux, CRUX, Debian, Gentoo, PLD Linux, openSUSE, openWRT, Shorewall, Slackware и, возможно, других. От себя могу сказать, что с недавнего времени он доступен и в Arch Linux в виде PKGBUILD'a в AUR. Голосуйте, пусть такая вещь попадет в community.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.