Используя Ubuntu 20.04 LTS, у меня в /etc/fail2ban/jail.local есть следующее:
[DEFAULT]
bantime = 3600
banaction = iptables
blocktype = drop
[sshd]
enabled = true
protocol = tcp
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Но вот что я вижу, когда просматриваю правила iptables:
╰─# iptables -L f2b-sshd -n -v
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
13 1356 REJECT all -- * * 222.187.232.205 0.0.0.0/0 reject-with icmp-port-unreachable
18 1516 REJECT all -- * * 221.181.185.153 0.0.0.0/0 reject-with icmp-port-unreachable
17 1064 REJECT all -- * * 222.186.180.130 0.0.0.0/0 777 55854 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Проблема в том, что он использует REJECT (с ICMP) вместо DROP.
Action.d/iptables.conf содержит следующее:
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
Это файл действий iptables по умолчанию, поставляемый с официальным пакетом fail2ban apt для этой версии ОС.
Также пробовал добавить «blocktype=drop» в [sshd], но это не дало эффекта.
Я не уверен, как это отладить, потому что служба fail2ban не регистрирует реальные команды iptables.
Что я упускаю?
решение1
Чтобы предоставить какой-либо параметр действию отдельной тюрьмы, вы должны задать action
все параметры (обычно также указанные в разделе по умолчанию jail.conf
) или, в случае действия запрета, вы можете использовать что-то вроде этого:
[some_jail]
banaction = %(known/banaction)s[blocktype=DROP]
Что касается темы DROP против REJECT, то эта дискуссия так же стара, как и сама подсистема сетевых фильтров, со множеством плюсов/минусов для обеих сторон.
Что касается вопросов запрета, см.https://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516для получения подробной информации.
решение2
Я принял решение @sebres, но хотел бы добавить несколько замечаний.
Для iptables-allports banaction, reject blocktype может иметь пробелы внутри. Вам нужно это заключить в кавычки.
Пример:
[sshd]
banaction=iptables-allports[blocktype="REJECT --reject-with icmp-port-unreachable"]
Вторая интересная вещь: и banaction, и jail config имеют параметр под названием "protocol". Я был сначала сбит с толку, когда конфигурация ниже не выдавала никаких ошибок, но и не блокировала UDP-запросы:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
Это произошло из-за того, что я пропустил настройку protocol=all из jail. Вам нужно указать protocol=all на уровне jail:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
protocol=all
Причина этого в том, что раздел named-ddos создает новую цепочку в iptables, а забаненные ip создают правила внутри этой цепочки. Если вы не укажете protocol=all на уровне jail, то цепочка будет определена следующим образом:
Chain INPUT (policy DROP 22 packets, 952 bytes)
pkts bytes target prot opt in out source destination
1371 229K named-ddos tcp -- * * 0.0.0.0/0 0.0.0.0/0
Это правда, что запрет создаст правила с proto=allвнутри цепи, но сама цепочка не будет использоваться для не-tcp пакетов. Вывод в том, что вам нужно указать protocol=all как на уровне jail, так и в banaction (если он поддерживает), иначе это не сработает.