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, enviado com o pacote oficial fail2ban apt para esta versão do sistema operacional.
Também tentei adicionar "blocktype=drop" em [sshd], mas não teve 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?
Responder1
Para fornecer algum parâmetro para a ação de prisão única, você deve definir action
todos os parâmetros (também normalmente fornecidos na seção padrão do jail.conf
) ou em caso de ação de banimento você pode usar algo assim:
[some_jail]
banaction = %(known/banaction)s[blocktype=DROP]
No que diz respeito 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, consultehttps://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516para detalhes.
Responder2
Aceitei a solução do @sebres mas gostaria de acrescentar algumas dicas.
Para a proibição iptables-allports, o tipo de bloco rejeitado pode conter espaços dentro. Você precisa citar isso.
Exemplo:
[sshd]
banaction=iptables-allports[blocktype="REJECT --reject-with icmp-port-unreachable"]
Segunda coisa interessante: tanto a configuração do banaction quanto a jail possuem um parâmetro chamado "protocol". Fiquei confuso pela primeira vez quando a configuração abaixo não gerou nenhum erro, mas não bloqueou solicitações UDP:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
Aconteceu porque estava faltando a configuração protocol=all da prisão. Você precisa especificar protocol=all no nível da prisão:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
protocol=all
A razão para isso é que a seçãonamed-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 prisão, a cadeia será definida assim:
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
É verdade que o banimento criará regras com proto=alldentro da cadeia, mas a cadeia em si não será usada para pacotes não TCP. A conclusão é que você precisa especificar protocol=all tanto no nível da prisão quanto no banaction (se for compatível), caso contrário não funcionará.