Cómo incluir en la lista negra o blanca lotes o pocos rangos de IP con ipset e iptables + fail2ban

Cómo incluir en la lista negra o blanca lotes o pocos rangos de IP con ipset e iptables + fail2ban

EDITAR:

Es sorprendente cómo la necesidad de encontrar una solución a veces es suficiente para conducirnos lenta pero constantemente hacia ella. Además, cuanto más releo mi pregunta para aclararla, me doy cuenta de que esta "pregunta" excede el alcance de una pregunta "simple" o la idea de que esta comunidad responda las cosas.

Redefiniré la estructura de esta pregunta en las próximas horas a medida que entienda cada vez mejor los conceptos operativos de iptables. El proceso de comprensión también generó preguntas mucho más específicas que pronto proporcionaré a esta comunidad y vincularé a esta pregunta.


En una palabra: Mi problema es encontrar el conjunto correcto de reglas para hacer:

  • mis propias reglas
  • falla2ban
  • La lista negra de DNS adicional funciona en conjunto, mientras que "mis reglas" también implica incluir mi país en la lista blanca para ssh y, por lo tanto, bloquear todos los demás países para ssh,PEROpermitiendotodopaíses/rangos/IP para consultas DNS, excepto un conjunto de aquellos incluidos en la lista negra.

En números:

  • para ssh: lista blanca de 50 rangosOlista negra aprox. 620.000 rangos (compuestos a través de ipdeny.com, etc.)
  • entradas de la lista negra para DNS: aprox. 140 (conjunto de reglas u32,guiones))
  • 25+/- reglas para los servicios adicionales (ver más abajo)

Versión lírica: Estoy luchando con la implementación de una solución para mis necesidades: el escenario es el siguiente. Tengo un servidor (supongamos DNS por ahora). Además de vincular ssh, se deben tener en cuenta sendmail, https y munin:

En general, esto fue fácil de lograr. Además, instalé fail2ban porque me enfrentaba a algunos ataques (d)dos de todo el mundo. Mi objetivo principal era bloquear el servidor tanto como fuera posible.

Mi idea era incluir en la lista blanca solo algunos rangos de IP de mi país que coincidan con posibles asignaciones dinámicas de DNS de los ISP a los que tengo acceso, es decir, DSL y dispositivos móviles. De esa manera no me bloquearé.

Busqué todos los rangos netos de mis ISP, lo que resultó en el siguiente script/conjunto de reglas:

#ports:
#  22: SSH (#4,#5) (ssh)
#  25: SMTP (#20) (outgoing, sendmail for f2b report)
#  53: DNS (!!#16!! see end of #16 as differs for ns1&2) (outgoing, bind)
# 443: HTTPS (#10) (outgoing, dns-blacklist update)
#4949: munin (#26) (outgoing, sending client stats to server)

# Modify this file accordingly for your specific requirement.
# http://www.thegeekstuff.com: http://www.thegeekstuff.com/scripts/iptables-rules
# 1. Delete all existing rules
#iptables -F

# 2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# 4. Allow ALL incoming SSH
#iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# 5. Allow incoming SSH only from a sepcific network (kabelBW/Unitymedia, Telekom, Accelerated)
# note: Using '-I' instead of '-A' to insert to top of INPUT chain to put rule in front of fail2ban!
iptables -A INPUT -i eth0 -p tcp -s 5.10.48.0/20    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.10.160.0/19   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.176.0/20   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.192.0/18   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.146.0.0/15    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.158.128.0/18  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 24.134.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 31.16.0.0/14    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.4.0.0/15     --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.24.0.0/16    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.49.0.0/17    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.114.96.0/19  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.201.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.209.0.0/17   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.5.0.0/16     --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.223.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.237.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.252.128.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 62.143.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 77.20.0.0/14    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.42.0.0/15    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.94.0.0/16    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 80.69.96.0/20   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 81.210.128.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.211.0.0/18   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.212.0.0/18   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 83.169.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.200.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.201.0.0/18   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 85.216.0.0/17   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.134.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.152.0.0/15   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.64.0.0/14    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.89.0.0/16    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 92.50.64.0/18   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 94.79.128.0/18  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.88.0.0/14    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.208.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.222.0.0/15   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.90.0.0/15   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.192.0.0/15  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 130.180.0.0/17  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 134.3.0.0/16    --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 146.52.0.0/16   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 149.172.0.0/16  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 176.198.0.0/15  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.24.0.0/14   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.200.0.0/14  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 188.192.0.0/14  --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 217.8.48.0/20   --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

service fail2ban restart


# 10. Allow outgoing HTTPS
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

# 12. Ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# 13. Ping from outside to inside
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

# 14. Allow loopback access
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 16. Allow outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

#Allow inbound DNS

iptables -A INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT


# 20. Allow Sendmail or Postfix
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

# 26. Allow Munin Stats
iptables -A INPUT -p tcp --dport 4949 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 4949 -j ACCEPT

service munin-node restart
sh /root/update_domain_blacklist.sh

Reiniciar fail2ban antes del conjunto de reglas n.° 10 es para garantizar que las cadenas estén (re)configuradas correctamente después de ser purgadas de iptable (eliminadas por -F al comienzo del script. Lo mismo se aplica a munin, que se quejó de no poder acceder a su servidor si no reiniciado después de aplicar reglas de excepción).

Tengo la intención de aplicar las reglas a través de /etc/rc.local. Eso implica que ya se crearon cadenas para fail2ban y munin.

El flujo de verificación del firewall que me gustaría lograr es: ¿la solicitud es DNS? -> (un); ¿ssh? -> (b); ¿Uno de mis otros servicios? -> (c); ¿algo más? -> (d):

  • (a): servir, si no está en la lista negra, script de lista negra de DNS
  • (b): servir, si no está en la lista negra O si está en la lista blanca de acuerdo con mi rango neto establecido
  • (c): servir, según mis reglas definidas
  • (d): DROP/TARPIT/cualquier mejor práctica
  • Si (b), pase adicionalmente fail2ban

Problemascon las reglas anteriores:

  • fail2ban se activa antes de la verificación de la lista blanca -bienpor mi parte ssh,maloPor mi parte DNS: mi suposición

Luego intenté usar ipset para bloquear/poner en lista negra "el mundo entero", excepto mis 50 rangos. Teóricamente posible, pero el análisis de los rangos de 620k dura más de 10 minutos; Cancelé la operación y volví a mis rangos de lista blanca. Siguiente idea: seguir usando ipset para los 50 rangos y bloquear/lista negra elinversode esa lista para ssh:

!/bin/bash
#Script to process ip ranges to ban using IPSet and IPTables

# 10. Allow outgoing HTTPS
iptables -I OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

# 12. Ping from inside to outside
iptables -I OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# 14. Allow loopback access
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT

# 16. Allow outbound DNS
iptables -I OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -I INPUT -p udp -i eth0 --sport 53 -j ACCEPT

#Allow inbound DNS
iptables -I INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT

# 20. Allow Sendmail or Postfix #to mail.awib.it (82.211.19.134)
iptables -I OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -I INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

# 26. Allow Munin Stats
iptables -I INPUT -p tcp --dport 4949 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 4949 -j ACCEPT

#iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
ipset create countryblock hash:net
while read line; do ipset add countryblock $line; done < blocklist.txt
iptables -A INPUT -m set ! --match-set countryblock src -j DROP

mientras que 'blocklist.txt' contiene mis 50 rangos para incluirlos en la lista blanca o lo contrario de incluirlos en la lista negra. Pero lo inverso de ese conjunto también implica que TODO el tráfico DNS se bloquee, etc. ¡Esto me vuelve loco! :-D

Pero por alguna razón no tuve acceso a mi servidor en absoluto, o lo contrario no funcionó (probé algunos subprogramas web2ssh solo para verificar si había un mensaje ssh).

También encontré las definiciones de reglas de creación de acción de fail2ban correspondientes en sus configuraciones; pero para reducir los gastos generales, realmente me encantaría dejar las reglas predeterminadas de munin y f2b como están y aplicar las modificaciones necesarias a mis propias reglas y tal vez al script dns-blacklist.

Sé que esta pregunta/solicitud puede no ser la más fácil y usted podría preguntarse por qué no simplemente usar fail2ban. Me gusta saber si hay acciones sospechosas y, por lo tanto, es bueno recibir un informe de host bloqueado. Aunque no quiero tener esto para todos los hosts extranjeros (diez veces más, ya que estoy ejecutando fail2ban en más de 10 servidores).

Otro enfoque tal vez sería un servidor/enrutador de firewall dedicado, que maneje todo el tráfico. Pero esta sería una configuración de reglas bastante compleja y no quiero bloquear accidentalmente TODOS mis servidores debido a una estúpida mala configuración/regla defectuosa o lo que sea. Además, esto superaría mi tráfico gratuito, que actualmente se divide entre los 10 servidores.

Espero que haya algún amigo experto y geek dispuesto a ayudarme a ordenar las reglas correctamente.

Antes de completar innecesariamente esta pregunta, ahora estoy en espera y proporciono la información solicitada.

PD:tal vez alguien pueda agregar la etiqueta "ipset", ya que no puedo crearla por falta de reputación. ¡Gracias!

Respuesta1

Parece tremendamente complicado....

Creo que puede encontrar un gran valor en seguridad y rendimiento con solo mudarse sshda munindiferentes puertos.

Ejecutar esos servicios en puertos que no coinciden con los predeterminados sofocará la mayor parte del tráfico de fuerza bruta/DOS. Fail2ban debería poder detectar cualquier valor atípico después de eso.

Al pasar a customlos puertos, básicamente crea lo siguiente:

iptables -A "Anyone that doesn't know the correct ssh port" -j DROP

Aún puedes registrar intentos de conectarte al puerto 22, pero creo que probablemente puedas encontrar mejores usos para el espacio en disco.

Respuesta2

ipset create banned_hosts hash:net family inet hashsize 524288 maxelem 800000 counters comment
ipset create whitelist hash:net family inet hashsize 524288 maxelem 800000 counters comment

iptables -I INPUT 1 -m set --match-set banned_nets src -j DROP
iptables -I INPUT 2 -m set --match-set whitelist src -j ACCEPT

ipset add banned_hosts 171.248.31.131
ipset add banned_hosts 191.185.207.16
ipset add banned_hosts 45.247.22.251
ipset add banned_hosts 82.98.162.90
ipset add banned_hosts 125.227.181.216
ipset add banned_hosts 122.117.163.44

guardar todo ipset

ipset save >all.txt

cargar todo listo

ipset load <all.txt

información relacionada