¿Cómo hacer que las reglas de iptables caduquen?

18

Alguien me dijo que esto es posible, pero no puedo encontrar nada en google o en páginas man.

Necesito prohibir las direcciones IP durante un cierto período de tiempo y, luego, dejar de bloquearlas automáticamente.

HappyDeveloper
fuente

Respuestas:

18

Si quiere decir que iptables elimina completamente la regla por sí mismo, no puedo hacerlo, que yo sepa. ¿Cuál es el propósito de esto? Si necesita algún tipo de prohibición temporal automática, la solución estándar es fail2ban .

Alternativamente, puede usar un trabajo cron para eliminar la regla que está agregando, o, mejor si desea hacerlo de forma interactiva, un attrabajo:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

También eche un vistazo al recentmódulo de iptables. Esto con su --secondsopción puede ser de ayuda, dependiendo de sus necesidades reales. man iptablespara más información.

Eduardo Ivanec
fuente
oh wow, el trabajo 'at' se ve genial. ¿Puedo combinarlo con nohup y &? ¿Cómo?
HappyDeveloper
No es necesario usar nohup: el trabajo at se ejecuta independientemente del terminal que utilizó para crearlo. Esto significa que se ejecuta en un shell que no hereda las variables de entorno, por cierto, y es /bin/shpor defecto. Pero eso probablemente no será un problema en este caso.
Eduardo Ivanec
9

Ponga un comentario con una marca de tiempo (probablemente segundos desde la época) en las reglas. Periódicamente barrer las reglas caducadas.

Tenga en cuenta que el kernel de Linux más reciente es compatible con la carga dinámica de direcciones IP en un caché consultado por las reglas de iptable en lugar de las reglas de iptables directas.

Ejemplo:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

Por supuesto, puede en iptables -D INPUT $1lugar de imprimir el comando.

Seth Robertson
fuente
gran idea. Sin embargo, no estoy seguro de cómo hacer la parte de barrido, estaré pensando ...
HappyDeveloper
+1 Muy buena idea, quizás no sea la más simple pero definitivamente genial.
Kyle Smith
1
@HappyDeveloper: ejemplo proporcionado para agregar / barrer
Seth Robertson
1
Jaja, solo tenía que hacer esto también, usé awk para mi limpieza: iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'donde se hacen reglas como:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
Kyle Smith
Mis 2 centavos en perl:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
tuomassalo
5

iptables tiene un método para agregar automáticamente direcciones IP a una lista si se cumplen las condiciones definidas por el usuario. Utilizo lo siguiente para ayudar a evitar intentos de pirateo automático a mi puerto ssh:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

Esto ayuda a limitar los intentos automatizados de obtener acceso al servidor al limitar los intentos de conexión desde la misma dirección IP a uno cada 60 segundos.

Si desea permitir un número determinado de intentos en un período de tiempo, como 4 en 5 minutos, y en caso de falla, haga una lista negra durante un período más largo, como 24 horas, puede hacer algo como:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

En lo anterior, creamos 2 cadenas; "ssh" y "black", y 2 listas; "temporizador" y "lista negra".

Brevemente; la última cadena que se muestra arriba es la "puerta" hacia la cadena ssh.

  • La regla 1 en la cadena ssh verifica si la IP de origen está en la lista "lista negra". Si es así, se corta la conexión y se reinicia el temporizador de la lista negra de 24 horas. Si la regla 1 es falsa, entonces vamos a la regla 2.
  • La regla 2 en la cadena ssh verifica si la IP de origen ha realizado más de 4 intentos de conexión en 5 minutos. Si es así, envía el paquete a la cadena "negro", donde se agrega a la lista "lista negra". La cadena "negra" cae la conexión y terminamos.
  • La regla 3 en la cadena "ssh" solo se alcanza si las reglas 1 y 2 son falsas. Si es así, el paquete se ACEPTA y la IP de origen se agrega a la lista "temporizador" para que podamos monitorear la frecuencia del intento de conexión.

La opción "--reap" le dice al núcleo que busque en la lista y purgue cualquier elemento que sea anterior al límite de tiempo establecido; 5 minutos para la lista "temporizador" y 24 horas para la lista "lista negra".

nota: los espacios adicionales son para facilitar la lectura y son opcionales en su script de shell.

Cañada
fuente
3

IPTables tiene una función hecha expresamente para esto: IP Set. Establece la regla una vez y persiste como de costumbre, pero comprueba un conjunto de ips (o puertos) para encontrar coincidencias. Lo bueno es que este conjunto se puede actualizar de forma dinámica y eficiente sin molestar al resto del firewall.

El sitio web principal , ejemplos .

Entonces, para usarlo, aún tendría que usar ato cronprogramar la eliminación.

Allen
fuente
2

Puede usar fail2ban para prohibir las direcciones IP y configurar el tiempo durante el cual se prohibirá una dirección.

user9517 es compatible con GoFundMonica
fuente
2

Como alguien ya dijo: debe usar ipset para esta función.

ipset puede agregar una dirección IP con valor de tiempo de espera. Cuando finaliza el tiempo de espera, el registro se eliminará automáticamente de ipset.

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

Esta es la forma preferible de controlar este comportamiento.

Navern
fuente
0

Necesito prohibir las direcciones IP durante un cierto período de tiempo y, luego, dejar de bloquearlas automáticamente.

Puedes probar el siguiente

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
ALex_hha
fuente
0

Dependiendo de qué es exactamente lo que desea lograr, ya sea el netfilter reciente o los módulos de tiempo podrían usarse para lograr esto.

Ambos están documentados en la página del manual de iptables .

TimS
fuente