Ver destacados

Cómo utilizar iptables para filtrar paquetes en Linux

En este tutorial se verá cómo utilizar iptables en su función de firewall para poder bloquear y aceptar conexiones en sistemas Linux.
Escrito por
12.1K Visitas  |  Publicado jul 27 2016 13:00
Favorito
Compartir
Comparte esta pagina a tus Amigos y Contactos usando las siguientes Redes Sociales


En este tutorial vamos a hablar sobre iptables, el firewall o cortafuegos con el que contamos en Linux. Esta herramienta nos va a permitir filtrar paquetes (de lo que va a tratar el tutorial), generar un registro de logs, realizar traducciones NAT.

 

Gracias a iptables podremos generar reglas para filtrar los paquetes de manera bastante sencilla, aunque la primera vez que lo uses pueda parecerte algo confuso, verás que cuando lo utilices unos días no tiene ninguna complicación.

 

El uso de esta herramienta requiere de altos privilegios, es decir necesitaremos ser superusuarios para hacerla correr. Disponemos de muchas características dentro de iptables, el objetivo del tutorial es ver una aproximación de su uso mediante ejemplos. Es importante que una vez termines el tutorial sigas profundizando, ya que es muy útil.

 

A continuación dejamos la página web oficial por si es de interés:

 

 netfilter / iptables

 

Nota
Para IPv6 tenemos ip6tables.

 

Si queremos ver información sobre iptables ejecutaremos en una terminal lo siguiente:

man iptables
Veremos la siguiente información:

 

 

En la imagen se ve parte de la información que nos facilita el comando, para ir viendo toda, desplázate hacía abajo en la terminal. Como vimos al principio del tutorial una de las tareas que iptables nos permitirá es crear reglas o filtros para saber qué hacer con los paquetes que tienen como origen/destino nuestra máquina. Para esta tarea nos interesará saber para que utilizamos los siguientes conceptos:

 

Tablas

Iptables dispone de varias tablas pero para nuestro tutorial nos centramos solo en filter table, que es la encargada del filtrado, es utilizada por defecto en iptables.

 

Cadenas

Las cadenas que voy a poner aquí son las que pertenecen a la tabla comentada antes.
  • Input: Paquetes que tienen como destino nuestra máquina.
  • Output: Los paquetes que tienen como origen nuestro sistema.
  • Forward: Paquetes que pasan por nuestra máquina para ser encaminados a otra.

 

Reglas

Vamos a indicar las 2 que se usaran en el tutorial, pero existen más.
  • Accept: Se aceptan los paquetes.
  • Drop: Se descartan los paquetes.

 

Parámetros

Algunos de los parámetros que podemos utilizar son los que vienen a continuación.
  • -A regla: Para agregar una regla
  • -D regla: Para borrar la regla que indiquemos.
  • -L: Nos permite listar las reglas.
  • -F: Borra todas las reglas existentes.
  • -j objetivo: Establecer tipo de regla (Accept, Drop).
  • -t tabla: Indicara la tabla que se usa (por defecto filter table).
  • -p protocolo: Sirve para indicar el protocolo.
  • -i interface: Establecemos la interface para la regla.
  • -s: Para indicar el origen.
  • -d: Para indicar el destino.
  • -h: Muestra ayuda.

 

Existen bastantes más, como pueden ser --destination-port o --source-port. Para ver todas puedes ejecutar el comando que comentamos arriba:

man iptables
O también puedes ejecutar:
iptables -h
Nota
Hay que mirar bien las opciones que nos ofrece la herramienta, ya que distingue entre minúsculas y mayúsculas y nos podemos equivocar (no será lo mismo poner -p que -P).

 

Vamos a comenzar con los ejemplos, en total se pondrán 10, así se entenderá mejor y podremos ver cómo funciona iptables en modo cortafuegos. En los ejemplos no verás sudo, no será necesario en caso de que estés como root, si no deberás añadir al principio de cada ejemplo la palabra sudo.

 

1. Prohibir la salida a cualquier destino
Para empezar vamos a poner un ejemplo fácil, no dejar la salida a nigún lugar.
iptables -A OUTPUT -j DROP
Este es muy fácil, como se ha podido apreciar, el siguiente lo es aún más.

 

2. Borrar todas las reglas
Continuamos con un ejemplo muy sencillo, dejar nuestro iptables sin reglas, para ello ejecutaremos:
iptables -F
Bueno vamos a complicarlo un poco más en el siguiente.

 

3. Prohibir la salida por el puerto 80
Ahora nos encargamos de cerrar la salida por un puerto determinado, en este caso es el 80, por lo tanto no tendremos navegación web por el protocolo http (si navegamos a una página https, podremos navegar, aunque podríamos hacerle lo mismo que al 80).
iptables -A OUTPUT -p tcp --destination-port 80 -j DROP
Nota
Al usar un puerto destino u origen necesitaremos poner el parámetro -p para indicar protocolo.

 

Pasamos al cuarto ejemplo.


4. Prohibir la navegación hacía una página
En esta ocasión nos interesa prohibir el acceso a X página desde nuestro sistema, imaginemos que esa página es solvetic.com, para ello averiguamos su IP, muy fácil ejecutando un ping la obtendremos.

 

 

Y ahora ejecutaremos:

iptables -A OUTPUT -d 178.33.118.246 -j DROP
Cómo vemos basta con indicar su IP después del parámetro -d.

 

5. Listar las reglas que hay
Este ejemplo tratará de listar las reglas de filtrado que tenemos actualmente definidas:
iptables -L
Vemos una imagen, solo tenemos definidas dos reglas, como vemos a continuación:

 

 

Vamos a pasar al sexto ejemplo, en el que usaremos el listado de reglas de nuevo.

 

6. Borrar una regla determinada
Aquí, partiendo de las reglas que teníamos en el anterior ejemplo, vamos a borrar una de las reglas de salida, en este caso la primera que nos aparece, ejecutamos lo siguiente:
iptables -D OUTPUT 1
Y para comprobar que se efectivamente se borró hacemos uso del ejemplo 5:

 

 

Prosigamos con más.

 

7. Evitar que nos hagan ping
No queremos que nos puedan hacer ping, para ello vamos a bloquear la entrada para el protocolo ICMP.
iptables -A INPUT -p ICMP -j DROP
A continuación dejo una imagen de hacer ping antes de ejecutar el comando anterior y después:

 

 

Podemos ver que nuestra máquina no contesta, porque rechaza los paquetes de tipo ICMP. Si bloqueamos la salida en vez de la entrada ejecutaríamos:

iptables -A OUTPUT -p ICMP -j DROP
Volvería a pasar lo mismo que en la imagen anterior. Para probar he realizado 3 veces ping, si ejecutamos podemos ver el número de paquetes:
iptables -L -v

 

Vemos que efectivamente pone 3 en la imagen anterior.

 

8. Evitar que una IP nos envíe datos
Vamos a aplicar uno de entrada, no queremos que nos pueda conectar una determinada ip, así que ejecutaremos:
iptables -A INPUT -s 192.168.66.1 -j DROP
Veamos un ejemplo algo más largo.

 

9. Permitir salidas a un rango de IPs
Imagina que quieres solo aceptar salidas a un rango de direcciones IP, pero rechazar el resto de salidas, debemos ejecutar:
Iptables -A OUTPUT  -d 192.168.0.0/24  -j ACCEPT
Iptables -A OUTPUT -j DROP
Nota
El orden de ejecución de las reglas importa, prueba este ejemplo con la red que deseas permitir y haz una conexión, verás que funciona, luego borra todas las reglas y ejecuta las 2 sentencias al revés, ahora te rechazaría las conexiones.

 

Pasemos a ver el décimo y último ejemplo.

 

10. Abrir el puerto 143 (imap)
Vamos a abrir un puerto para la entrada de todos los paquetes tcp, en este caso el 143 (sería igual para el resto).
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
En este ejemplo se ha querido usar --dport, para que veas que podemos usar esto o --destination-port, también podríamos usar --sport en vez de --source-port.

 

Hasta aquí llega el tutorial, ahora prueba tu a aplicar otras reglas, cuanto más practiques, más rapidez tendrás a la hora de aplicar reglas, y menos te costará. Para terminar dejamos un tutorial que puede ser de tu interés, abrir y cerrar puertos en Windows 10.

¿Te ayudó este Tutorial?

Ayuda a mejorar este Tutorial!
¿Quieres ayudarnos a mejorar este tutorial más? Puedes enviar tu Revisión con los cambios que considere útiles. Ya hay 0 usuario que han contribuido en este tutorial al enviar sus Revisiones. ¡Puedes ser el próximo!