Назад | Перейти на главную страницу

Как заблокировать FIN-WAIT-2 по iptables?

Мой сайт сейчас находится под ddos-атакой, "ss -ant" показывает много FIN-WAIT-2 (и немного FIN-WAIT-1) подключений с одного ip (и случайных портов), порядка 500-700 подключений:

FIN-WAIT-2 0      0         ::ffff:MY_IP:443                 ::ffff:ATTACKERS_IP:RANDOM_PORT   
.... 500-700 times

Я пытаюсь использовать

iptables -A INPUT -s ATTACKERS_IP -j DROP

и

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

и

echo "2" > /proc/sys/net/ipv4/tcp_fin_timeout

но это не помогает - новые соединения приходят с другими случайными портами.

Итак, как ПОЛНОСТЬЮ заблокировать определенный IP-адрес с помощью iptables (или, может быть, что-то еще), чтобы предотвратить флуд FIN-WAIT-2 по ip, который замораживает сервер?

Как объяснено на https://benohead.com/blog/2013/07/21/tcp-about-fin_wait_2-time_wait-and-close_wait/ (Увидеть ниже)

TCP fin-wait1 и finwait2 - это соединения, которые закрываются при обычном закрытии TCP. Они задерживаются на таймере под названием 2 MSL (Максимальный срок службы сегмента), который часто составляет 4 минуты на серверах с конфигурациями по умолчанию. Сами по себе они не вредны, но если их много, это означает, что на сервере наблюдается большой отток соединений. Это может быть из-за DDOS-атаки или из-за проблемы с сайтом, например отключения HTTP-сообщений поддержки активности. Обычно DDOS-атаки не закрывают сокет, а оставляют его зависшим.

Если есть один IP-адрес, который вас беспокоит, то удаление этого IP-адреса - лучший метод, предпочтительно на межсетевом экране или восходящем маршрутизаторе, чтобы снизить нагрузку на систему.

Fin-wait1 - это первый шаг активного закрытия (четырехстороннее рукопожатие). Локальная конечная точка отправила удаленной конечной точке запрос на завершение соединения.

Ваше правило выглядит правильным, есть ли перед ним другие, разрешающие подключения, которые правило должно блокировать? Вы можете проверить список правил и счетчики с помощью

iptables -nvL --line-numbers
iptables -t raw -nvL --line-numbers

Я бы изменил правило, чтобы использовать цепочку PREROUTING, чтобы удалить их раньше

iptables -A PREROUTING -s ATTACKERS_IP -j DROP

Вы можете очистить timw_waits быстрее, изменив переменные sysctl. Не зная вашей настройки, я бы предложил закрыть эти два только через 10 секунд и, если необходимо, повторно использовать сокеты, которые находятся в режиме ожидания, но не истекло время ожидания.

sudo sysctl -w net.ipv4.tcp_fin_timeout=10
sudo sysctl -w net.ipv4.tcp_tw_reuse=1

надеюсь, это поможет

FIN-WAIT-1: был выполнен первый шаг активного закрытия (четырехстороннее рукопожатие). Локальная конечная точка отправила удаленной конечной точке запрос на завершение соединения.

FIN-WAIT-2: удаленная конечная точка отправила подтверждение для ранее отправленного запроса на разрыв соединения. Локальная конечная точка ожидает активного запроса на завершение соединения от удаленной конечной точки.