Skip to main content

Firewall en entornos Linux con iptables

Defiende la entrada de datos en tu sistema configurando tu propio firewall

En el mundo de la seguridad, existen muchos métodos para implementar un firewall o cortafuegos en un sistema Linux. Desde el nivel de enlace, utilizando ebtables o arptables, o controlar el nivel de aplicaciones como podría ser mediante un sistema de cacheo y filtro por ejemplo, a través de Squid. En este caso vamos a utilizar iptables pero, en próximos post utilizaremos otras herramientas como las mencionadas anteriormente.

 

Qué es iptables

Iptables es una aplicación a nivel de usuario que permite la gestión y configuración del filtrado del tráfico de red en una máquina Linux. Para ello, iptables utiliza netfilter, que es un framework incluido en el núcleo de Linux, capaz de manipular paquetes de datos de red.

 

Cómo funciona iptables

El kernel de Linux posee la capacidad de hacer pasar los paquetes de red por una serie de reglas o filtros. Estas reglas se agrupan en cadenas y a su vez estas cadenas están compuestas por diferentes tablas. Para aquellos que no sepan que es una regla, una regla es un conjunto de parámetros con los que se trata de hacer que un paquete de red coincida atendiendo al protocolo, ip origen y destino, etc.

Por defecto al tener configurado iptables, cuando entra un paquete en el sistema, este paquete pasa por todas las tablas y cadenas configuradas por defecto. En el momento en que un paquete coincide con la condición de una de las reglas, se pasa a decidir qué hacer con ese paquete. Si por el contrario no existe ninguna regla que coincida con el paquete de red, se le aplicará la política por defecto para la cadena por la que esté pasando en ese momento.

 

Firewall en entornos Linux con iptables

En el esquema podemos ver el proceso completo que realiza un paquete cuando accede a un sistema configurado con iptables, a continuación se detallan cada una de las tablas y se explica con ellas cada uno de los elementos que vemos.

 

Tablas por defecto

Cuando un paquete coincide, la decisión se toma en base a las tablas de enrutamiento de la máquina. En iptables, existen cuatro tablas por defecto. Es posible añadir tablas extra mediante la carga de plugins pero, no vamos a explicarlos en este momento. Estas tablas son:

  • Filter -> Es la tabla encargada del filtrado de paquetes, es decir, en esta tabla se configura si los paquetes deben pasar o ser descartados dependiendo de las reglas contenidas en sus cadenas por defecto que son:
    • INPUT -> Es la cadena en la que se definen las reglas de entrada para los paquetes que recibe un proceso local de la máquina.
    • OUTPUT -> El mismo caso que INPUT pero, en este caso por esta cadena, pasarán los paquetes generados por un proceso local de la máquina.
    • FORWARD -> En esta cadena pasarán los paquetes que no van dirigidos a la máquina local, esta tabla se utilizaría en casos en los que la máquina se comportara como un router.
  • Nat -> En esta tabla se producen los procesos de NAT (Network Address Translation) que se configuren mediante iptables. Por defecto consta de tres cadenas:
    • PREROUTING -> En esta cadena se realiza el DNAT (Destination NAT). A través de él, pasarán los paquetes que entren al sistema, en este punto se decide a dónde se redirigirán dichos paquetes.
    • POSTROUTING -> En esta cadena se pasan los paquetes después de haber sido tomada la decisión de enrutado. Su principal uso es para hacer SNAT (Source NAT), es decir, enmascarar los paquetes con la IP de la interfaz de salida.
    • OUTPUT -> Esta cadena se usa para realizar operaciones de NAT para paquetes generados en un proceso local de la máquina.
  • Mangle -> En esta tabla se pueden manipular concretos aspectos de los paquetes. Entre estos aspectos, destaca la modificación del TTL (Time To Live), TOS (Type Of Service) y MARK (marcado de paquetes). Este proceso, establece una marca a cada paquete a nivel de Kernel. Estas marcas pueden ser utilizadas para tomar ciertas decisiones de enrutado dependiendo de los tipos de tráfico, etc. Un ejemplo sería para un balanceador de carga. La tabla Mangel posee las cadenas INPUT, OUTPUT, FORWARD, PREROUTING y POSTROUTING.
  • Raw -> Esta tabla tiene la finalidad de establecer una marca (NOTRACK) para evitar que netfilter realice un seguimiento del paquete, esto evitará que netfilter aplique un conntrack al paquete.

 

Además de estas tablas y, como ya se ha dicho anteriormente, se pueden crear tablas nuevas o añadir mediante plugins pero, también es posible crear nuevas cadenas y enlazarlas con otras cadenas como veremos a continuación.

Para poder ver las tablas en nuestro sistema, podemos hacerlo con el siguiente comando

Como vemos en el comando con la opción –t podemos especificar que tabla queremos utilizar. Con la opción –n mostramos los datos de direcciones y puertos de forma numérica, la opción –v sería un verbose de la aplicación (vista en detalle) y con la opción –L listaríamos las reglas establecidas. También podemos mostrar un número identificador de cada regla con la opción –line-numbers, haciendo mucho más fácil el trabajo a la hora de seleccionar una regla.

Al igual que en cualquier otro comando podemos ver una ayuda del mismo con

 

Ahora que ya sabemos cómo funciona iptables y que tablas lo forman, comenzamos a ver cómo podemos crear y eliminar reglas, así como aplicar una serie de políticas por defecto para las cadenas.

La sintaxis de iptables sería de la siguiente forma:

 

Como vemos en el ejemplo, lo primero sería el comando iptables, seguido de varios parámetros.

La opción –t se utiliza para especificar la tabla con la que queremos trabajar. Con el parámetro –A añadimos una cadena y le podemos pasar diferentes filtros que coincidan con algún puerto, protocolo, etc. Por último con la opción –j indicamos que queremos hacer si coincide la cadena con algún paquete.

Vamos a verlo con un ejemplo real, que haría la siguiente regla

 

En este ejemplo, descartamos la navegación web (sólo permite tráfico http) entre las máquinas de la red local que pasan por la máquina que ha ejecutado iptables y que tenga como entrada la interfaz interna eth1 y tenga como salida la interfaz externa eth0.

Vemos diferentes opciones nuevas como –i para indicar la interfaz de entrada (input), -o para indicar la interfaz de salida (output), -p para el protocolo o –dport para indicar el puerto de destino. Vamos a ver ahora como sería el proceso contrario, es decir, denegar toda respuesta de servidores http.

En este caso vemos como las interfaces de entrada y salida han cambiado, así como el uso de una nueva opción, –sport para indicar el puerto de origen (source port).

 

Cambiar política por defecto

Como hemos mencionado anteriormente, con iptables podemos cambiar su comportamiento en ciertas cadenas estableciendo una nueva política. El comando sería

Como vemos en el comando, especificaríamos la tabla, la cadena y posteriormente la política que queremos establecer. Veámoslo con un ejemplo

Por defecto, la tabla filter mantiene la política ACCEPT (aceptar). En el ejemplo cambiamos la política por defecto para la cadena INPUT de la tabla filter a DROP, descartando todo el tráfico entrante.

 

Eliminando reglas

Ahora ya sabemos cómo crear nuestras propias reglas pero, como las eliminamos. Podemos hacerlo de dos formas.

Modo selectivo

En ocasiones puede ser por un fallo o por una mejora o simplemente porque estamos haciendo pruebas y queremos, podemos eliminar un regla determinada de iptables. Para ello usaríamos la siguiente sintaxis

Deberemos indicar principalmente la tabla con la opción –t, la regla seleccionada con el parámetro –D y el número de la regla, como hemos comentado anteriormente, al visualizar la tabla podemos hacerlo con la opción –line-numbers

Limpieza completa

Habrá otras ocasiones en las que queramos hacer una limpieza completa de una tabla, para ello lo haríamos de la siguiente forma

Con la opción –F limpiaríamos por completo la tabla especificada. Debemos tener presente que esto no restablece la política por defecto de la tabla, esta deberemos especificarla de nuevo cambiando la política por defecto como se ha explicado un poco más arriba.

 

Reglas permanentes

Cuando hagamos un reinicio de nuestro sistema, por defecto toda la configuración de iptables vuelve a su configuración original. Para evitar perder esta información con cada reinicio existen varios métodos para guardar estas reglas.

Podemos hacerlo con los comandos iptables-save para guardar los cambios, iptables-apply para aplicarlos simplemente e iptables-restore para restaurar los valores originales.

Otra forma y, la más clásica, es guardar estos comandos en un script en bash y ejecutarlo desde /etc/rc.local obligándolo a ejecutarlo cada vez que arranque nuestro sistema.

 

Esto es todo por ahora, en futuros post realizaré diferentes prácticas con simulación de entornos para conocer a fondo todo lo que podemos hacer con iptables.

Cualquier duda inclúyanla en sus comentarios. Gracias por visitarnos.

 

2 thoughts on “Firewall en entornos Linux con iptables

    1. Hola Benji,

      Contando con que lo que necesitas es abrir el puerto (5555 en este caso) para comunicarte con el servicio no-ip (por defecto utiliza el 8245), necesitarías una regla que abriese dicho puerto, esto podrías hacerlo con el siguiente ejemplo:


      iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

      Con esta simple regla, lo que haríamos sería abrir el puerto 5555 a todo el mundo y poder conectar con el servicio no-ip. Pero por seguridad, sería mejor permitir que el puerto 5555 se comunique sólo con el puerto 8245 y a través de una única interface de red. Para ello utilizaríamos lo siguiente:


      iptables -A OUTPUT -o tu_interface -p TCP --dport 8245 --sport 5555 -j ACCEPT
      iptables -A INPUT -i tu_interface -p TCP --dport 5555 --sport 8245 -j ACCEPT

      Con estos dos comandos lo que hacemos es permitir la entrada y salida de información desde cualquier ip a través de la interface de red indicada y el puerto indicado.
      Si quisiéramos restringir este envío de información a una ip o un rango determinado, utilizaríamos además las opciones -s (origen) o -d (destino) para indicar la ip o rango permitido.

      Espero haber resuelto tu duda, cualquier cosa me dices.

      Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *