Esta receta explica los usos más habituales de iptables. No trata de ser un manual de uso, sólo son unos cuantos comandos que solucionan problemas frecuentes.

Introducción

Lo más normal para un usuario medio es utilizar iptables para definir reglas de firewall en su router. Para simplificar la explicación de los ejemplos que aparecen en la receta voy a suponer una configuración concreta. Es importante tenerla en cuenta cuando tengas que hacer los cambios pertinentes para aplicarla a tu configuración concreta. Es ésta:

  • Una conexión a Internet (eth0).
    Debe ser algún tipo de conexión a Internet, que puede ser RTC, ADSL, cable-modem, etc. Supondremos para esta receta que usas un modem ADSL con conexión Ethernet.
  • Una conexión a tu red local (eth1):
    Será una tarjeta de red Ethernet 10/100. Esto permitirá que puedas enchufarle un conmutador y conectar “cienes y cienes” de ordenadores si quieres. Esta interfaz debes configurarla de forma estática, con una dirección IP privada, por ejemplo 192.168.0.1.

Esta configuración se corresponde con nuestra otra receta sobre compartir la conexión, de modo que es más sencillo seguir aquí desde aquella.

Tablas y reglas

Hay 3 tablas (o cadenas), que indican qué tipo de operación puede hacer el router con los paquetes.

  • FILTER: En esta tabla hay reglas que dicen qué hacer con los paquetes, pero sin modificarlos. Esta es la tabla por defecto, si no se indica otra.
    Se puede definir 3 tipos de reglas:
    • INPUT: Para paquetes cuyo destino es un socket de la propia máquina.
    • OUTPUT: Para paquetes generados por la propia máquina.
    • FORWARD: Para paquetes que llegan a la máquina, pero cuyo destino es una máquina distinta.
  • NAT: Implica a los paquetes que requieren crear nuevas conexiones. Normalmente implica algún tipo de traducción de dirección, ya sea dirección o puerto (modifican el paquete). También se puede definir 3 tipos de reglas:
    • PREROUTING: El paquete se modifica en cuanto llega a la máquina.
    • POSTROUTING: El paquete se modifica después de decidir su destino (una vez rutado).
    • OUTPUT: El paquete se ha generado en la propia máquina y se modifica antes de decidir su destino.
  • MANGLE: Implica modificaciones más sofisticadas del paquete, que van más allá de su dirección. Excede el alcance de esta receta.

Además de éstas que vienen de serie, el usuario puede crear otras.

Políticas

Existen dos políticas básicas para administrar un firewall.

  • Restrictiva(DROP). Todo lo que no está explícitamente permitido, está prohibido.
  • Permisiva(ACCEPT). Todo lo que no está explícitamente prohibido, está permitido. Es la política por defecto en iptables.

La política se determina para cada tipo de regla por separado. Por ejemplo, para establecer una política restrictiva para FORWARD sería:

 # iptables -P FORWARD DROP 

Evidentemente, iptables tienes muchas opciones que dan mucho juego, mucho más de lo que cualquier mortal pueda imaginar, no es tan complejo y sofisticado como CISCO IOS pero tampoco le falta tanto. Por eso vamos a acotar un poco el asunto y vamos a hablar sólo de 3 “esquemas” que se suelen usar para configuraciones sencillas:

  1. Utilizar política por defecto (permisiva) y denegar explícitamente cada servicio que NO se desea.
  2. Utilizar política restrictiva y aceptar explícitamente cada servicio que se desea.
  3. Utilizar política por defecto, indicar qué servicios se desean explícitamente y POR ÚLTIMO denegar todo lo demás. Este esquema, a pesar de usar una política permisiva, prohibe todo lo que no esté explícitamente aceptado.

Lógicamente los esquemas 1 y 3 son iguales salvo porque en el 3 no tienen sentido reglas de denegación específicas.

Es importante tener en cuenta que las reglas se aplican secuencialmente. Una vez que el paquete coincide con una regla de la lista ya no se le aplica ninguna más. Eso significa que si se prohibe un servicio, después el inútil permitir un subconjunto de lo prohibido.

Comandos básicos

Este es un resumen de comandos habituales simplificados.

Ver la configuración

 # iptables -L [-t tabla] [-v]

Borrar todas las reglas de una tabla

 # iptables -F [-t tabla] 

Configuración de un router (con esquema 3)

Esta es una configuración sencilla pero completa de un router, utilizando el esquema 3.

Enrutar tráfico de la red local a Internet aplicando NAT. Recuerda activar también el forwarding.

 # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

Aceptar todo el tráfico ICMP.

 # iptables -A INPUT -p ICMP -j ACCEPT 

Aceptar todo el tráfico de conexiones ya establecidas (ESTABLISHED) o relacionado con otras conexiones (RELATED).

 # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

Aceptar cualquier conexión que proceda de la red interna:

 # iptables -A INPUT -p tcp -i eth1 -j ACCEPT 

Aceptar conexiones web (80) desde cualquier origen:

 # iptables -A INPUT -p tcp --dport 80 -j ACCEPT 

Aceptar todo el tráfico desde el loopback:

 # iptables -A INPUT -i lo -j ACCEPT 

Descartar el resto:

 # iptables -A INPUT -j DROP 

Si quieres permitir algo más debes insertar la nueva regla antes del DROP. Por ejemplo: Aceptar conexiones HTTPS desde cualquier sitio:

 # iptables *-I INPUT 7* -p tcp --dport https -j ACCEPT 

Por supuesto también puedes editar directamente el fichero en el que guardes la configuración de iptables (ver guardar configuración). El contenido de dicho fichero para la configuración fijada con estos comandos sería (no se muestran las tablas vacías):

*filter
:INPUT ACCEPT [696743:123302283]
:FORWARD ACCEPT [591745:477869546]
:OUTPUT ACCEPT [801266:279702677]
-A INPUT -p ICMP -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport https -j ACCEPT
-A INPUT -j DROP
COMMIT
*nat
:PREROUTING ACCEPT [64615:3723067]
:POSTROUTING ACCEPT [101:14282]
:OUTPUT ACCEPT [10260:530443]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

Bloquear un puerto (en esquema 1)

Esto es útil si el router da un servicio a la red local que no quieres que se vea desde Internet, por ejemplo, el servidor FTP.

# iptables -A INPUT -i eth0 -p tcp --dport 20:21 -j DROP

Redireccionar un puerto del router hacia otro host (interno o externo)

Esto se conoce comúnmente como Port forwarding. Por ejemplo, al conectar al puerto 80 del router, se accederá realmente al servidor web de una máquina de la red interna:

# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80  -j DNAT --to-destination 192.168.0.15:80

Guardar la configuración de iptables

Para guardar las reglas activas (las que has ido poniendo hasta ahora) ejecuta:

Router:~# iptables-save > /etc/iptables.up.rules 

Y ahora hay que hacer que esa configuración se cargue automáticamente al levantar la interfaz de red principal (la externa). Para ello, edita de nuevo el fichero /etc/network/interfaces para que la entrada de eth0 quede así:

auto eth0
iface eth0 inet dhcp
      pre-up iptables-restore < /etc/iptables.up.rules

Referencias



blog comments powered by Disqus