Necesito agregar una regla a iptables para bloquear las conexiones a un puerto TCP desde Internet.
Como mi secuencia de comandos se puede llamar varias veces y no hay una secuencia de comandos para eliminar la regla, quiero verificar si ya existe una regla de iptables antes de insertarla; de lo contrario, habrá muchas reglas duplicadas en la cadena INPUT.
¿Cómo puedo verificar si ya existe una regla de iptables?
Respuestas:
Hay una nueva
-C --check
opción en las versiones recientes de iptables.Para versiones anteriores de iptables, usaría la sugerencia de Garrett:
fuente
La nueva
-C
opción no es satisfactoria, porque está abierta a una condición de carrera de tiempo de verificación a tiempo de uso (TOCTTOU). Si dos procesos intentan agregar la misma regla aproximadamente al mismo tiempo,-C
no los protegerá de agregarla dos veces.Entonces, realmente no es mejor que la
grep
solución. Un trabajo de procesamiento de texto preciso sobre la salida deiptables-save
puede funcionar de manera tan confiable-C
, ya que esa salida es una instantánea confiable del estado de las tablas.Lo que se necesita es una
--ensure
opción que compruebe atómicamente y agregue una regla solo si aún no existe. Además, sería bueno si la regla se mueve a la posición correcta donde se insertaría una nueva regla si aún no existiera (--ensure-move
). Por ejemplo, siiptables -I 1
se usa para crear una regla en la cabeza de una cadena, pero esa regla ya existe en la séptima posición, entonces la regla existente debería moverse a la primera posición.Sin estas características, creo que una solución viable es escribir un bucle de script de shell basado en este pseudocódigo:
Este código podría girar; no garantiza que dos o más corredores salgan dentro de un número fijo de iteraciones. Se podrían agregar algunos retrasos exponenciales aleatorios para ayudar con eso.
fuente
Esto puede parecer un poco al revés, pero funciona para mí: intente eliminar la regla primero.
iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;
Debería recibir un mensaje similar a:
iptables: regla incorrecta (¿existe una regla coincidente en esa cadena?)
Luego simplemente agregue su regla como de costumbre:
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;
fuente
¿Solo listar y buscarlo?
... o como quiera que tenga la regla especificada. Si lo usa,
grep -q
no generará nada, y puede verificar el valor de retorno con$?
fuente
iptables-save|grep $ip
cambio, sugeriría que es un formato más fácil de analizar, especialmente en un script. También puede verificar la sintaxis exacta del comando si lo desea.iptables-save|grep $ip
podría muy bien coincidir con múltiples reglas. Posiblementeiptables-save
podría usarse para verificar la especificación de la regla completa , pero eso sigue siendo un poco complicado: el formato devuelto poriptables-save
puede no coincidir exactamente con la regla en el script.iptables-save
puede generar las opciones en un orden diferente, agregar elementos (como-m tcp
), etc.iptables --list
intentará resolver los puertos conocidos. Así que asegúrese de eso antes de buscar un puerto.¿Qué tal si primero agrega y luego elimina duplicados como se describe en https://serverfault.com/questions/628590/duplicate-iptable-rules . La más fácil (para líneas adyacentes) parece ser
fuente
Para evitar reglas duplicadas de su script, agregue la siguiente línea.
La primera vez que se ejecuta el comando anterior, observaríamos el siguiente mensaje
Esto es solo para información. Pero la segunda mitad del comando se aseguraría de agregar la regla.
fuente