Usando o Ubuntu 20.04 LTS, tenho isso em /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
Mas é isso que vejo quando listo as regras do 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
O problema é que ele usa REJECT (com ICMP) em vez de DROP.
O action.d/iptables.conf contém isto:
# 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>
É o arquivo de ação padrão do iptables, fornecido com o pacote apt fail2ban oficial para esta versão do SO.
Também tentei adicionar "blocktype=drop" em [sshd], mas não tem efeito.
Não tenho certeza de como depurar isso, porque o serviço fail2ban não registra os comandos reais do iptables.
o que estou perdendo?
Para fornecer algum parâmetro para a ação de single jail, você deve definir
action
com todos os parâmetros (também normalmente fornecidos na seção padrão dejail.conf
) ou em caso de ação de banimento, você pode usar algo assim:Com relação ao tema DROP vs. REJECT, a discussão é tão antiga quanto o próprio subsistema net-filter, com muitos prós/contras para ambos os lados.
Relacionado a questões de banimento, consulte https://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516 para obter detalhes.
Eu aceitei a solução de @sebres, mas gostaria de adicionar algumas pegadinhas.
Para banaction iptables-allports, o tipo de bloco de rejeição pode ter espaços dentro. Você precisa citar isso.
Exemplo:
Segunda coisa interessante: tanto a configuração banaction quanto a jail config possuem um parâmetro chamado "protocol". Fiquei confuso pela primeira vez quando a configuração abaixo não estava gerando nenhum erro, mas não bloqueou solicitações UDP:
Isso aconteceu porque eu estava perdendo a configuração protocol=all da jail. Você precisa especificar protocol=all no nível de jail:
A razão para isso é que a seção named-ddos cria uma nova cadeia no iptables, e os ips banidos estão criando regras dentro dessa cadeia. Se você não especificar protocol=all no nível da jail, a cadeia será definida assim:
É verdade que a banaction criará regras com proto=all dentro da chain , mas a chain em si não será usada para pacotes não-tcp. A conclusão é que você precisa especificar protocol=all tanto no nível de jail quanto no banaction (se ele suportar), caso contrário não funcionará.