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 cadena 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 información 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 encontrar miles de recursos sobre iptables.
Hasta la próxima!
También te puede interesar:
- https://sospedia.net/iptables/
- https://sospedia.net/iptables-borrar-una-regla-unban-ip/
- https://sospedia.net/tutorial-basico-de-iptables/
- https://sospedia.net/vps-ubuntu-configuracion-sobre-un-dominio-2018/
- https://sospedia.net/script-php-para-obtener-los-dominios-que-nos-han-atacado/
- https://sospedia.net/fail2ban-iptables/
Pingback: Bonus Pack 2018: Recopilación de artículos de sospedia.net – Jose Blanco Vega
Pingback: Bonus Pack 2018: Recopilación de artículos de sospedia.net – Clases fp