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 --checkopción en las versiones recientes de iptables.Para versiones anteriores de iptables, usaría la sugerencia de Garrett:
fuente
La nueva
-Copció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,-Cno los protegerá de agregarla dos veces.Entonces, realmente no es mejor que la
grepsolución. Un trabajo de procesamiento de texto preciso sobre la salida deiptables-savepuede 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
--ensureopció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 1se 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 -qno generará nada, y puede verificar el valor de retorno con$?fuente
iptables-save|grep $ipcambio, 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 $ippodría muy bien coincidir con múltiples reglas. Posiblementeiptables-savepodría usarse para verificar la especificación de la regla completa , pero eso sigue siendo un poco complicado: el formato devuelto poriptables-savepuede no coincidir exactamente con la regla en el script.iptables-savepuede generar las opciones en un orden diferente, agregar elementos (como-m tcp), etc.iptables --listintentará 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