Iptables - Aplicando un gran conjunto de reglas

Rafa Morales 20 Diciembre 2013
3min
0
Linux

Cuando guardamos y restauramos una gran cantidad de reglas, los procesos comentados en el punto anterior se vuelven muy lentos para el sistema, ya que cada vez que se ejecuta un comando de Iptables en el script se procede en primer lugar a extraer el conjunto de reglas completo del espacio del núcleo de Netfilter, para a continuación, insertar, añadir o efectuar el cambio que sea necesario por el comando específico. Por último, devolverá el conjunto de reglas desde su propia memoria al espacio del núcleo. Imaginar este proceso si tuviéramos, por ejemplo, 30.000 reglas.

Para aligerar dicho problema, se utilizan los comando iptables-save e iptables-restore, que cargan y guardan el conjunto de reglas mediante una sola petición.

Aunque los inconvenientes son varios. El fichero de reglas difiere un poco del comentado anteriormente, y dichero fichero no es un script, por lo que no podremos insertar reglas dinámicas, por ejemplo, que consulten la IP dinámica asignada al servidor para realizar NAT.

 

Guardando las reglas

El comando iptables-save, muestra por pantalla todas las reglas de Iptables cargadas actualmente. Podemos redirigirlas a un fichero para almacenarlas:

iptables-save > /etc/iptables-save

Podemos exportar solamente las reglas de una determinada tabla:

iptables-save -t nat > /etc/iptables-save

Otra opción sería exportar también los valores existentes en los contadores de paquetes y bytes. Ésto puede ser útil si queremos reiniciar el cortafuegos sin perder los valores de estos contadores, que servirán, por ejemplo, para continuar con nuestras rutinas estadísticas sin problemas:

iptables-save -c > /etc/iptables-save

 

La salida de este comando tendrá el siguiente formato:

# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*filter
:INPUT DROP [1:229]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*mangle
:PREROUTING ACCEPT [658:32445]
:INPUT ACCEPT [658:32445]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [891:68234]
:POSTROUTING ACCEPT [891:68234]
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*nat
:PREROUTING ACCEPT [1:229]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
-A POSTROUTING -o eth0 -j SNAT --to-source 195.233.192.1 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002

Observamos cómo las reglas se dividen primeramente en tablas, y dentro de cada tabla se encontrarán agrupadas en cadenas. Las cadenas muestran su política por defecto y, entre corchetes, el contador de paquetes y bytes. Cada tabla termina con el comando COMMIT para aplicar dichas reglas en el núcleo.

 

Restaurando las reglas

El comando iptables-restore se utiliza para cargar en el núcleo las reglas Iptables que se hayan obtenido del comando iptables-save.

iptables-restore < /etc/iptables-save

Si queremos cargar las reglas, pero no sobreescribir las que se encuentren actualmente cargadas:

iptables-restore -n < /etc/iptables-save

Si queremos cargar los contadores de paquetes y bytes, si los habíamos exportado también:

iptables-restore -c < /etc/iptables-save

 

Basado en el artículo de Frozentux.net.