В последнее время на мой сервер резко возросло количество атак, что заставило меня перейти на более агрессивную политику блокировки fail2ban. В попытке уменьшить количество входящих соединений я также перенастроил nginx (для явно вредоносных запросов):
keepalive_requests 0;
keepalive_timeout 0;
return 444;
(...)
error_page 400 500 502 503 504 =444 /444.html;
location /444.html {
return 444;
}
так что без ответа следующее соединение или запрос не будут отправлены немедленно, и nginx не вернет ничего полезного для злоумышленника.
Поскольку они часто сканируют порты, я также добавил фильтр в fail2ban, который блокирует их для всех портов и протоколов, избегая дальнейших подключений:
enabled = true
maxretry = 1
bantime = 1d
port = all
banaction = %(banaction_allports)s[blocktype=DROP,protocol=all]
Но теперь я замечаю, что nginx собирает все большее количество установленных соединений, не закрывая их. Все это соединения, которые заблокированы fail2ban.
С одной стороны, это эффективно уменьшило количество попыток (отслеживаемых до DROPed), с другой стороны, мне нужно время от времени перезапускать nginx, чтобы очистить все эти заблокированные, но открытые соединения.
Я ищу лучший способ сделать это, разорвать эти соединения без перезапуска службы или какой-либо подобной идеи. Использование nginx / 1.14.2 в сочетании с fail2ban / 0.11.1 в Debian Buster.
Заранее спасибо!
Изменить 1:
Чтобы уточнить: существует довольно много соединений FIN-WAIT-1, LAST-ACK, а также ESTAB-подключений IP-адресов, которые запрещены fail2ban. Связи с ESTAB, кажется, остаются там довольно долго (может, даже до снятия запрета?). Моя общая идея заключалась в том, чтобы не допустить, чтобы они тратили дополнительное время на этом IP-адресе, имитируя отсутствующий хост, и уменьшить использование моих сетевых ресурсов на сервере.
Я попытался conntrack -D -s <ip>
как предлагается в ссылке на комментарий @Danila Vershinin, но переключился на ss -K dst <ip>
как дополнительное действие fail2ban. Но это работает только с установленными связями и загадочным образом не удаляет все из них.
Для начала настоятельно рекомендую настроить ваш iptables
Если эти боты сканируют порты, вы должны ОТКЛЮЧИТЬ весь трафик, кроме определенных портов, например 22,80,443 и т. Д.
с другой стороны, мне время от времени приходится перезапускать nginx, чтобы очистить все эти заблокированные, но открытые соединения.
Мне это не кажется проблемой nginx или fail2ban.
Думаю, есть не открытые, а скорее полузакрытые установленные соединения. Обычно они исчезают после некоторого системного тайм-аута (связанного с конфигурацией вашей сетевой подсистемы), но это действительно может стать проблемой, если их станет много.
Вы можете попытаться перенастроить свою сетевую подсистему, чтобы лучше обрабатывать состояния TIME-WAIT, например, отрегулируйте некоторые значения sysctl (keepidle
, keepinittime
, keepintvl
), отключить задержку сокета, повторно использовать или повторно использовать запланированные соединения TW и т. д. pp), например, см. Как справиться с состоянием TCP TIME-WAIT на загруженных серверах Linux.
Вы также можете попробовать изменить способ отклонения соединений в fail2ban, например, попробуйте REJECT --reject-with tcp-reset
вместо того DROP
(см. этот комментарий для темы DROP против REJECT или мой PoC FW.IDS-DROP-vs-REJECT).
Я ищу лучший способ сделать это, разорвать эти соединения без перезапуска службы или какой-либо подобной идеи.
Вы также можете продлить действие тюрьмы fail2ban с помощью tcpkill или cutter.
Видеть https://github.com/fail2ban/fail2ban/issues/2107#issuecomment-379722469 например.