Usando Ubuntu 20.04 LTS, tengo esto en /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
Pero esto es lo que veo cuando enumero las reglas de 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
El problema es que usa REJECT (con ICMP) en lugar de DROP.
El archivo action.d/iptables.conf contiene esto:
# 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>
Es el archivo de acción predeterminado de iptables, que se envía con el paquete oficial fail2ban apt para esta versión del sistema operativo.
También intenté agregar "blocktype=drop" en [sshd] pero no tiene ningún efecto.
No estoy seguro de cómo depurar esto, porque el servicio fail2ban no registra los comandos reales de iptables.
¿Qué me estoy perdiendo?
Respuesta1
Para proporcionar algún parámetro a la acción de cárcel única, debe configurar action
todos los parámetros (normalmente también se proporcionan en la sección predeterminada de jail.conf
) o en caso de acción de prohibición, puede usar algo como esto:
[some_jail]
banaction = %(known/banaction)s[blocktype=DROP]
En cuanto al tema DROP versus REJECT, la discusión es tan antigua como el propio subsistema de filtro de red, con muchos pros y contras para ambas partes.
En relación con las preocupaciones sobre la prohibición, consultehttps://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516para detalles.
Respuesta2
Acepté la solución de @sebres pero me gustaría agregar algunos errores.
Para la prohibición de iptables-allports, el tipo de bloque rechazado puede tener espacios en su interior. Necesitas citar eso.
Ejemplo:
[sshd]
banaction=iptables-allports[blocktype="REJECT --reject-with icmp-port-unreachable"]
Segunda cosa interesante: tanto la configuración banaction como la jail tienen un parámetro llamado "protocolo". La primera vez que me confundí fue que la siguiente configuración no arrojaba ningún error, pero no bloqueaba las solicitudes UDP:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
Sucedió porque me faltaba la configuración protocolo=todo de la cárcel. Debes especificar protocolo=todo en el nivel de cárcel:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
protocol=all
La razón de esto es que la sección nombrada-ddos crea una nueva cadena en iptables, y las ips prohibidas están creando reglas dentro de esa cadena. Si no especifica protocolo=all en el nivel de cárcel, entonces la cadena se definirá así:
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
Es cierto que la prohibición creará reglas con proto=alldentro de la cadena, pero la cadena en sí no se utilizará para paquetes que no sean TCP. La conclusión es que necesitas especificar protocolo=all tanto en el nivel de cárcel como en la prohibición (si lo admite), de lo contrario no funcionará.