sudo: Jack of all trades, master of some

Depurar scripts de iptables

Comentarios desactivados en Depurar scripts de iptables

Generalmente muchos de los scripts o sets de reglas que usamos para iptables son bastante largos, incluso en entornos más complicados pueden llegar a tener fácilmente centenas de líneas. A la hora de modificar los sets de reglas, seres humanos al fin, podemos cometer errores e indiscutiblemente iptables no es muy sencillo de depurar. Normalmente cuando ejecutaba un script de iptables y aparecían errores como: Bad argument `' Try `iptables -h' or 'iptables --help' for more information. lo que hacía para detectar el error era comentar varias líneas y volver a ejecutar el script, si no devolvía errores entonces ya tenía identificado el fragmento del script problemático.

Sin embargo este método aunque me funciona, no es my amigable que digamos y leyendo un buen documento de iptables encontré otro similar pero un tanto más flexible.

Supongamos que tenemos un script con el siguiente fragmento de reglas:

echo "INPUT"

### INPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT

echo "FORWARD"

### FORWARD
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.0.0/24 -d 192.168.200.0/24 --dport 80 ACCEPT
iptables -A FORWARD -p tcp -s 192.168.0.0/24 -d 192.168.200.0/24 --dport 443 -j ACCEPT

echo "OUTPUT"

### OUTPUT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p ALL -o eth0 -d 192.168.200.0/24 -j ACCEPT

echo "NAT"

### NAT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.100.1

Nótese las líneas que comienzan con el comando echo.

Si al ejecutar el script se imprime en pantalla:

INPUT
FORWARD
OUTPUT
NAT

Significa que el script se ejecutó correctamente.

Sin embargo si ocurre lo siguiente, como debe ocurrir en el ejemplo:

INPUT
FORWARD
Bad argument `ACCEPT'
Try `iptables -h' or 'iptables --help' for more information.
OUTPUT
NAT

Podemos decir que el error está después del mensaje ‘FORWARD’ y antes de ‘OUTPUT’ y de esta manera identificamos rápidamente el bloque de reglas problemático, en este caso se omitió -j.

Otra de las formas de depuración que podemos utilizar es precisamente el modo de depuración de bash. Simplemente agregamos la opción -x justo después del shebang: #!/bin/bash -x y ejecutamos el script. En caso de tener errores justo después de la línea problemática debe aparecer el mensaje de error de iptables:

...
+ iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
+ iptables -A FORWARD -p tcp -s 192.168.0.0/24 -d 192.168.200.0/24 --dport 80 ACCEPT
Bad argument `ACCEPT'
Try `iptables -h' or 'iptables --help' for more information.
+ iptables -A FORWARD -p tcp -s 192.168.0.0/24 -d 192.168.200.0/24 --dport 443 -j ACCEPT
...

En el ejemplo es muy sencillo de detectar el problema, pero como decía al inicio si tenemos más de 500 líneas ya se hace un tanto tedioso.
De otra forma, iptables simplemente nos devolvería el error sin especificar otra información para facilitarnos la corrección.

Espero que les resulte útil.