Comentando con los alumnos de seguridad las IPTables, hace unos días rescaté unos cuantos scripts de los que tenía hechos cuando trabajaba con ellas en lugar de con UTM’s para pasárselas a un alumno interesado en el tema.
Eso me hizo recordar esos tiempos de «picar» todas y cada una de las reglas necesarias a mano. La verdad es que era un poco pesado configurar un router/firewall completo así, pero se conseguía un control total sobre todas las comunicaciones que entraban y salían de la empresa, así como de las redirecciones de puertos, NAT y demás configuraciones. Y además ¡¡lo habías hecho tu mismo!!
La costumbre era poner en monopuesto el router del proveedor de turno y colocar detrás un equipo con Linux con varias tarjetas de red (desde 2 el más simple hasta 5 o 6 dependiendo de la finalidad del mismo) que pasaría a ser el router/firewall de esa/esas ADSL. Podía haber más de una y poder hacer balanceo de carga, usarla como failover,…
De hecho, en una de las versiones más divertidas que hice, mediante comando ping controlaba las conexiones de las ADSL (con sus tiempos prudenciales y demás comprobaciones extras) y si detectaba la caída del enlace, los enrutaba a todos hacia un módem 3G USB. Seguía comprobando el estado de la línea y cuando se restauraba se volvía a enrutar el tráfico por las líneas convencionales. El enlace 3G no es que fuese una maravilla, pero podían navegar mientras se restauraba la conexión.
Otro ejemplo de las cosas interesantes que se podían hacer con estos equipos, es que hay una parte en la cuál se rebota el correo de un comercial que trabajaba en remoto al cuál su proveedor de Internet le tenía el puerto 25 «capado». Así conectando al puerto 8000 del equipo Linux, cambiado la IP de origen del paquete y reenviando hacia el puerto 25 del servidor de correo, se consigue que dicho servidor nos conteste el correo el cuál le pasamos al portátil sin problema.
Se hace algo parecido con un RDP que se conectaba a dicho Linux para ser rebotado mediante una MPLS a otra sede.
Importante la parte también de permitir las conexiones que se están estableciendo o ya están establecidas. Así cada vez que se agrega o modifica una nueva regla y se reinicia el script para que tome los cambios, no tira la conexión a los que ya están trabajando.
Os dejo el script completo por si os sirve para vuestras pruebas. Incluye también la cabecera necesaria para crear un servicio que autoarranque en el inicio una vez que haya arrancado la red y el sistema de archivos (necesarios para poder hacer correr dicho servicio de reglas IPTables).
He cambiado alguna IP pública por XXX.XXX.XXX.XXX, no me lo tengáis en cuenta ;-D.
También hay un detalle para los más puristas. En lugar de utilizar MASQUERADE para enmascarar la red interna, se utiliza un SNAT (source NAT) con la IP pública. ¿Sabríais decirme por qué?
Un saludo y hasta la próxima.
!/bin/sh # ### BEGIN INIT INFO # Provides: Reglas IPTables # Required-Start: $network $local_fs # Required-Stop: $network # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: Reglas IPTables # Description: Reglas IPTables ### END INIT INFO # . /etc/rc.status # Reset status of this service rc_reset case "$1" in start) echo "Iniciando Reglas IPTables " #Borrado de todas las reglas anteriores iptables -F iptables -X iptables -Z iptables -t nat -F #Politica por defecto DROP (Todo DENEGADO) iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT #Permitir el paso de las ip's de administradores hacia todos los sitios y al firewall iptables -A FORWARD -s 192.168.46.45 -j ACCEPT iptables -A FORWARD -d 192.168.46.45 -j ACCEPT iptables -A FORWARD -s 192.168.46.235 -j ACCEPT iptables -A FORWARD -d 192.168.46.235 -j ACCEPT iptables -A INPUT -s 192.168.46.45 -j ACCEPT iptables -A OUTPUT -d 192.168.46.45 -j ACCEPT iptables -A INPUT -s 192.168.46.235 -j ACCEPT iptables -A OUTPUT -d 192.168.46.235 -j ACCEPT #Permitimos ping iptables -A INPUT -p icmp -j ACCEPT iptables -A OUTPUT -p icmp -j ACCEPT iptables -A FORWARD -p icmp -j ACCEPT #Permitimos el forward echo 1 > /proc/sys/net/ipv4/ip_forward #Enmascaramos la red interna para salir al exterior iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to XXX.XXX.XX.X #Mantener abiertas las conexiones ya establecidas iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT #Acceso RDP Servidor XXXXXX iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3389 -j DNAT --to 192.168.46.58:3389 iptables -A FORWARD -p tcp -s 192.168.46.58 --sport 3389 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.58 --dport 3389 -j ACCEPT #Servidor Http iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 83 -j DNAT --to 192.168.46.72:83 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 82 -j DNAT --to 192.168.46.72:82 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 85 -j DNAT --to 192.168.46.72:85 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 86 -j DNAT --to 192.168.46.72:86 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 192.168.46.72:8080 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 87 -j DNAT --to 192.168.46.72:87 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 88 -j DNAT --to 192.168.46.72:88 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 89 -j DNAT --to 192.168.46.72:89 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 91 -j DNAT --to 192.168.46.72:91 iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 82 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 83 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 85 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 82 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 83 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 85 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 86 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 86 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 8080 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 8080 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 87 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 87 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 88 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 88 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 89 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 89 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 91 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 91 -j ACCEPT #Servidor Http iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 7015 -j DNAT --to 192.168.46.216:80 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 6405 -j DNAT --to 192.168.46.216:6405 iptables -A FORWARD -p tcp -s 192.168.46.216 --sport 80 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.216 --dport 80 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.216 --sport 6405 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.216 --dport 6405 -j ACCEPT #TS JMG iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 11850 -j DNAT --to 192.168.46.133:11850 iptables -A FORWARD -p tcp -s 192.168.46.133 --sport 11850 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.133 --dport 11850 -j ACCEPT #Soporte Remoto JMG iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 11800 -j DNAT --to 192.168.46.133:11800 iptables -A FORWARD -p tcp -s 192.168.46.133 --sport 11800 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.133 --dport 11800 -j ACCEPT #SSH J.Leal iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 62628 -j DNAT --to-destination 192.168.46.5:22 iptables -A FORWARD -p tcp -d 192.168.46.5 --dport 22 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.46.5 --sport 22 -j ACCEPT #Permitir envio de correos iptables -A FORWARD -s 192.168.46.216 -p tcp --dport 25 -j ACCEPT iptables -A FORWARD -d 192.168.46.216 -p tcp --sport 25 -j ACCEPT #Permitir consulta de DNS's iptables -A FORWARD -p udp --dport 53 -j ACCEPT iptables -A FORWARD -p udp --sport 53 -j ACCEPT #SQL TAREAS iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 1433 -j DNAT --to 192.168.46.45:1433 iptables -t nat -A PREROUTING -i eth1 -p udp --dport 1434 -j DNAT --to 192.168.46.45:1434 iptables -A FORWARD -p tcp -s 192.168.46.45 --sport 1433 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.46.45 --dport 1433 -j ACCEPT iptables -A FORWARD -p udp -s 192.168.46.45 --sport 1434 -j ACCEPT iptables -A FORWARD -p udp -d 192.168.46.45 --dport 1434 -j ACCEPT #REDIRECCION SERVIDOR DE CORREO iptables -A INPUT -p tcp --dport 8000 -j ACCEPT iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination IPSERVIDORCORREO:25 iptables -t nat -A POSTROUTING -p tcp -d IPSERVIDORCORREO --dport 25 -j SNAT --to-source IPPUBLICALINUX iptables -A FORWARD -p tcp -d IPSERVIDORCORREO --dport 25 -j ACCEPT #Routeo a sede Zaragoza route add -net 192.168.132.0 netmask 255.255.255.0 gw 192.168.46.1 #Conexión a RDP Zaragoza Rebotada iptables -A INPUT -p tcp --dport 13500 -j ACCEPT iptables -A OUTPUT -p tcp --dport 3389 -j ACCEPT iptables -t nat -A PREROUTING -p tcp --dport 13500 -j DNAT --to-destination 192.168.132.82:3389 iptables -t nat -A POSTROUTING -p tcp -d 192.168.132.82 --dport 3389 -j SNAT --to-source 192.1168.46.138 iptables -A FORWARD -p tcp -d 192.168.132.82 --dport 3389 -j ACCEPT #Abrimos puerto y protocolo GRE VPN iptables -A INPUT -p tcp --dport 1723 -j ACCEPT iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT iptables -A INPUT -p 47 -j ACCEPT iptables -A OUTPUT -p 47 -j ACCEPT iptables -A FORWARD -p 47 -j ACCEPT #Permitimos el paso de la subred de la vpn al 67 iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.67 -j ACCEPT iptables -A FORWARD -d 192.168.200.0/24 -s 192.168.46.67 -j ACCEPT #Permitimos web del 64 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.46.64:80 iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.64 -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -s 192.168.46.64 -d 192.168.200.0/24 -p tcp --sport 80 -j ACCEPT #Permitimos imprimir en impresora del 61 (192.168.200.2) iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p tcp --dport 139 -j ACCEPT iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p tcp --sport 139 -j ACCEPT iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p tcp --dport 445 -j ACCEPT iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p tcp --sport 445 -j ACCEPT iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p udp --dport 137 -j ACCEPT iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p udp --sport 137 -j ACCEPT iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p udp --dport 138 -j ACCEPT iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p udp --sport 138 -j ACCEPT iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p tcp --dport 135 -j ACCEPT iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p tcp --sport 135 -j ACCEPT #SERVIDOR DE ARCHIVOS #ENTRAR AL 61 PARA LAS BLACKBERRYS 8081 #OWNCLOUD PUERTO 444 iptables -A FORWARD -s 192.168.46.61 -j ACCEPT iptables -A FORWARD -d 192.168.46.61 -j ACCEPT iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8081 -j DNAT --to-destination 192.168.46.61:8081 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 444 -j DNAT --to-destination 192.168.46.61:444 #Oscar iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3397 -j DNAT --to-destination 192.168.46.45:3399 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 993 -j DNAT --to-destination 192.168.46.45:3399 iptables -A FORWARD -s 192.168.46.45 -p tcp --sport 3399 -j ACCEPT iptables -A FORWARD -d 192.168.46.45 -p tcp --dport 3399 -j ACCEPT #GATEWAY DE TERMINAL SERVER 192.168.46.110 iptables -A FORWARD -d 192.168.46.110 -p tcp --dport 443 -j ACCEPT iptables -A FORWARD -s 192.168.46.110 -p tcp --sport 443 -j ACCEPT iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to-destination 192.168.46.110:443 # Remember status and be verbose rc_status -v ;; stop) echo "Deteniendo Reglas IPTables " #Borrado de reglas anteriores iptables -F iptables -X iptables -Z iptables -t nat -F #Politica por defecto ACCEPT (Todo aceptado) iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT #No Detenemos el forward echo 1 > /proc/sys/net/ipv4/ip_forward # Remember status and be verbose rc_status -v ;; restart) ## Stop the service and regardless of whether it was ## running or not, start it again. $0 stop $0 start # Remember status and be quiet rc_status ;; status) echo "Mostrando Estado de Reglas IPTables " iptables -L rc_status -v ;; *) echo "Uso: $0 {start|stop|status|restart}" exit 1 ;; esac rc_exit