Tutorial básico de IPTABLES


Hola buenas! Hoy vamos a hablar de IPTABLES, un must entre los administradores de sistemas.

¿Qué es IPTABLES?

Iptables es una potente herramienta de cortafuegos la cual suele venir instalada en los sistemas GNU/Linux y que nos permitirá filtrar, modificar, aceptar o denegar tráfico de red entre muchas otras funciones. Esta herramienta trabaja con tablas y dependerá de nuestro objetivo utilizar una u otra. A continuación vamos a mostrar un poco de su sintaxis y finalmente mostraremos usos sencillos de iptables con casos prácticos. Si no lo tenemos instalado ejecutar el siguiente comando:

sudo apt-get install iptables

Introducción a IPTABLES

Como anteriormente hemos dicho, iptables trabaja con tablas. Nosotros vamos a utilizar dos tablas:

Tabla NAT: la utilizaremos para cambiar un puerto o dirección IP de origen o destino.
Tabla FILTER: la utilizaremos para filtrar a nivel de paquete y negar o permitir su tráfico.

La tabla FILTER usa estas tres cadenas:

INPUT: se usa cuando el tráfico llega al firewall, es decir, el tráfico que recibe el firewall.
OUTPUT: se usa para el tráfico que sale del firewall, es decir, el tráfico que envía el firewall.
FORWARD: cuando el tráfico entra y sale del firewall.

La tabla NAT usa estas dos cadenas:

PREROUTING: la usamos para cambiar el puerto o dirección IP de destino.
POSTROUTING: la usamos para cambiar el puerto o dirección IP de origen.

Vamos a ver un poco de su sintaxis y a explicar unas reglas de iptables para entender su funcionamiento un poco mejor.

# -t para indicar la tabla a usar, si no ponemos nada usará la tabla filter, que es por defecto.
# -A para indicar la cádena que vamos a utilizar (input, output, etc).
# -p para indicar el protocolo del paquete (tcp, udp, etc).
# --dport para indicar el puerto de destino, - -sport para indicar el puerto de origen. Podemos usar rangos usando ":". Por ejemplo, para los well-known ports -> 1:1024.
# -d es la ip del destino, a su vez, -s es la ip de origen.
# -i es la interfaz por la que viene el tráfico a nosotros. -o es la interfaz de salida.
# -j para indicar la orden (accept, masquerade, drop, reject, dnat, etc)
# Si ponemos la IP 0.0.0.0 significa cualquier IP.
# Cabe destacar que iptables lee de arriba a abajo, y por lo tanto, hay que dejar las reglas más restrictivas para el final.
# iptables se usa con privilegios de administrador, la mayoría de las veces tendremos que usar sudo delante de los comandos de este artículo.
#Cabe destacar que cada vez que reiniciemos el firewall toda la configuración de iptables se borrará, por lo tanto si quieres mantener los cambios debemos usar un script que se ejecute al iniciar el equipo. Más informacion sobre scripting en este articulo.

Estos son unas reglas de ejemplo:

# El tráfico tcp que pasa por el firewall (que entra y sale) hacía el puerto 80 y que es enviado a la IP 211.34.149.2 será aceptado.
iptables -t filter -A FORWARD -p tcp --dport 80 -d 211.34.149.2 -j ACCEPT

# El tráfico que venga de la red 192.168.10.0/24 será enviado por la interfaz eth0 con la misma IP. Es decir, le daremos acceso a internet. (El ip4.forward debe estar activado y eth0 es la interfaz a la cual tendremos acceso a internet).
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

# El tráfico tcp que viene por la interfaz eth0 con destino 2022 será enviado a la IP 192.168.0.111 al puerto 22.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2022 -j DNAT --to 192.168.0.111:22

# No permitimos que al firewall lleguen paquetes que usamos al hacer ping. Es decir, no permitimos que hagan ping al firewall.
iptables -t filter -A INPUT -p ICMP --icmp-type echo-request -j DROP

# El ping llega pero no permitimos al firewall devolver el ping.
iptables -t filter -A OUTPUT -p ICMP --icmp-type echo-reply -j DROP

Casos prácticos


Caso 1

#Flush, borramos lo que anteriormente había en iptables
iptables -F
iptables -X
iptables -Z
# Establecer politicas por defecto (Política permisiva, aceptamos todo)
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
# Dejamos el localhost acepte sus propias peticiones
iptables -A INPUT -i lo -j ACCEPT
#Permitmimos peticiones desde nuestra IP (192.168.22.143)
iptables -A INPUT -s 192.168.22.143 -j ACCEPT
#Permitimos a nuestro amigo (231.45.34.234) adminsitrar el mysql
iptables -A INPUT -s 231.45.34.234 -p tcp --dport 3306 -j ACCEPT
#Permitimos a nuestro amigo (80.37.45.194) desarrollador conecte por FTP
iptables -A INPUT -s 80.37.45.194 -p tcp --dport 20:21 -j ACCEPT
#En mi maquina tengo un servidor web, aceptamos que la navegación desde fuera.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#Cerrar puertos bien conocidos
iptables -A INPUT -p tcp --dport 1:1024 DROP
iptables -A INPUT -p udp --dport 1:1024 DROP
# No permito la administración de mysql (sólo podrá nuestro amigo y porque se lo hemos permitido anteriormente).
iptables -A INPUT -p tcp --dport 3306 -j DROP
#No permitir la administración de phpmyadmin
iptables -A INPUT -p tcp --dport 10000 DROP
iptables -A INPUT -p udp --dport 10000 DROP


Caso 2

#Flush, borramos lo que anteriormente había en iptables
iptables -F
iptables -X
iptables -Z
#Todo lo que venga del exterior al puerto 80/443 del firewall redirigirlo al puerto 80/443 del host bastión (192.168.3.2)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.3.2:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to 192.168.3.2:443
#Aceptamos localhost
iptables -A INPUT -i lo -j ACCEPT
#Al firewall tenemos acceso desde la red local (192.168.10.0) que viene por eth1.
iptables -A INPUT -i eth1 -s 192.168.10.0/24 -j ACCEPT
#enmascaramiento de la dmz (192.168.3.0) y red local (192.168.10.0) para que salgan a Internet (eth0) y puedan navegar
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
#Habilitar forward en el firewall
echo 1 > /proc/sys/bnet/ipv4/ip-forward
#permitmos a la DMZ (192.168.3.2) pasar a la base de datos de la red local (192.168.10.3)
iptables -A FORWARD -s 192.168.3.2 -p tcp --dport 3306 -d 192.168.10.3:3036 -j ACCEPT
#permitimos otro sentido
iptables -A FORWARD -s 192.168.10.5 -d 192.168.3.2 -p tcp --sport 3306 -j ACCEPT
#permitir acceso remoto a la DMZ desde la LAN
iptables -A FORWARD -s 192.168.10.0/24 -d 192.168.3.0/24 -p tpc --sport 3389 -j ACCEPT
#cerrar todo el tráfico desde DMZ a la LAN
iptables -A FORWARD -s 192.168.3.0/24 -d 192.168.10.0/24 -j DROP
#cerrar acceso de la dmz al firewall
iptables -A INPUT -i eth2 -s 192.168.3.0/24 -j DROP
#cerrar accesos indeseados desde el exterior (eth0) en puertos indeseados
iptables -A INPUT -i eth0 -s 0.0.0.0 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -i eth0 -s 0.0.0.0 -p udp --dport 1:1024 -j DROP
#No permitir la administración de phpmyadmin
iptables -A INPUT -p tcp --dport 10000 -j DROP
iptables -A INPUT -p udp --dport 10000 -j DROP


Caso 3

#Flush
iptables -F
iptables -X
iptables -Z
# Establecer politicas por defecto
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
# Aceptamos localhost
iptables -A INPUT -i lo -j ACCEPT
# Desde internet al servidor web de la DMZ
iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 80 -j DNAT --to 192.168.11.80:80
# Desde internet a la ftp de la DMZ
iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 21 -j DNAT --to 192.168.11.21:21
# Acceso al firewall desde la red local
iptables -t filter -A INPUT -i eth1 -s 192.168.10.0/24 -j ACCEPT
# Permitir a la LAN y DMZ el acceso a internet
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth2 -j MASQUERADE
#Habilitar forward en el firewall
echo 1 > /proc/sys/bnet/ipv4/ip-forward
# Permitir a la DMZ pasar a la base de datos de la red local y a la inversa
iptables -A FORWARD -s 192.168.11.80 -p tcp --dport 3306 -d 192.168.10.89:3306 -j ACCEPT
iptables -A FORWARD -s 192.168.10.89 -p tcp --sport 3306 -d 192.168.11.80 -j ACCEPT
# Permitir que el administrador desde la red local acceda al ftp de la DMZ
iptables -A FORWARD -s 192.168.10.88 -p tcp --dport 20:21 -d 192.168.11.21:21 -j ACCEPT
iptables -A FORWARD -s 192.168.11.21 -p tcp --sport 20:21 -d 192.168.10.88 -j ACCEPT
# Cerramos acceso de la dmz a la red local
iptables -A FORWARD -s 192.168.11.0/24 -d 192.168.10.0/24 DROP
# Cerramos accesdo de la DMZ a la Firewall
iptables -A INPUT -i eth0 -s 192.168.11.0/24 -j DROP
# Cerrar todo el trafico de internet a la DMZ y en puertos conocidos
iptables -A INPUT -i eth2 -s 0.0.0.0 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -i eth2 -s 0.0.0.0 -p udp --dport 1:1024 -j DROP


Caso 4

#Filtrar toda petición web que pase por el cortafuegos que provenga de la red 192.168.57.0/24.
iptables -A FORWARD -s 192.168.57.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -s 192.168.57.0/24 -p tcp --dport 443 -j DROP
#El firewall podrá realizar todo tipo de petición web pero no admite peticiones web desde fuera.
iptables -A INPUT -s 192.168.56.0/24 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 192.168.57.0/24 -p tcp --dport 80 -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -d 192.168.56.101 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -d 192.168.57.101 -p tcp --dport 80 -j ACCEPT
#Sólo puede usar el servidor ftp que está en la red de windows esa red. El firewall no puede
iptables -A OUTPUT -d 192.168.57.101 -p tcp --dport 20:21 -j DROP
iptables -A FORWARD -s 0.0.0.0 -p tcp --dport 20:21 -j DROP
#Permitir que el firewall no se le puede hacer ping desde ningun lado.
iptables -A INPUT -s 192.168.56.0/24 -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -s 192.168.57.0/24 -p icmp --icmp-type 8 -j DROP
#Permitir ping de la red windows a la red linux, no permitir que la red linux haga ningun ping. El firewall puede hacer ping a cualquier sitio. Red windows puede hacer ping al firewall.
iptables -A FORWARD -d 192.168.57.0/24 -s 192.168.56.0/24 -p icmp –icmp-type 8 -j DROP
iptables -A INPUT -s 192.168.56.0/24 -p icmp –icmp-type 8 -j DROP
iptables -A FORWARD -d 192.168.56.0/24 -s 192.168.57.0/24 -p icmp –icmp-type 8 -j ACCEPT
#Si desde la red windows queremos acceder al servidor web (8081) del firewall nos enviará a la web de la red linux.
iptables -t nat -A PREROUTING -i vboxnet0 -p tcp --dport 8081 -j DNAT --to 192.168.56.101:80
iptables -t nat -A PREROUTING -i vboxnet1 -p tcp --dport 8080 -j DNAT --to 192.168.57.101:80
#Sólo se accede al servidor FTP desde el firewall
iptables -t nat -A PREROUTING -s 0.0.0.0/0 -p -tcp –dport 20:21 -j DNAT –to-destination 192.168.56.101:21
iptables -A FORWARD -d 192.168.56.101 -p tcp –dport 20:21 -j DROP
# Filtrar toda petición web dirigida al servidor web situado en la misma máquina que el cortafuegos,que venga de la interfaz vboxnet1.
iptables -A INPUT -d 192.168.22.143/24 -i vboxnet1 -p tcp --dport 80 -j DROP
iptables -A INPUT -d 192.168.22.143/24 -i vboxnet1 -p udp --dport 443 -j DROP
#Aceptar toda petición web dirigida al servidor web situado en la misma máquina que el cortafuegos,que venga de la interfaz vboxnet0
iptables -A INPUT -d 192.168.22.143/24 -i vboxnet0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -d 192.168.22.143/24 -i vboxnet0 -p tcp --dport 443 -j ACCEPT

Bueno, esto es todo en este artículo, espero que os sirva de ayuda. Por otra parte hay que decir que iptables aun tiene más funciones y más complejas, esto ha sido un uso básico. Aquí tenemos su manual oficial y en internet podremos encotrar miles de recursos sobre iptables. Hasta la próxima!

Deja un comentario

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