Cómo configurar una DMZ con Linux

Publicado el 09 noviembre 2016 por Drassill
Uno de los aspectos más preocupantes de la seguridad es la seguridad a nivel de red; ya que es el área en la que los equipos están más expuestos y en la que hay más probabilidades de que puedan tomar el control de nuestro equipo. Obviamente hay más "puertas" para acceder a un equipo; hay un dicho bastante popular que dice que la seguridad perfecta únicamente se puede lograr teniendo un equipo dentro de una jaula de Faraday sin conexión a Internet y rezando de que nadie te robe la llave para abrir dicha jaula... Pero es innegable que generalmente se trata de acceder a un equipo remotamente a nivel de red... Es por eso que a veces hay que considerar la posibilidad de que un equipo pueda ser vulnerado y de que de ahí traten de "saltar" a otros equipos con los que dicho equipo tenga comunicación; he ahí donde entra en juego un concepto muy importante y útil llamado DMZ.

Una DMZ (Demilitarized Zone) es una zona "especial" que está expuesta a la red que es propensa a recibir ataques de los cyber-criminales; esta "zona" esta compuesta por servidores de correo, DNS y web entre otros; es decir servidores que tienen que estar expuestos al público. Lo ideal es que jamás de los jamases puedan vulnerar ninguno de éstos, pero esta situación es utópica y no podemos simplemente esperar a que no ocurra nunca, ya sea debido a que pensamos nuestras medidas de seguridad son muy buenas o debido a que pensamos que nunca se van a fijar en nuestros servidores; es por eso que nos tenemos que poner en la peor situación posible; es decir la situación de que consigan acceder a uno de estos servidores... situación en la que cobra sentido el uso de las DMZ debido a que su función es tan sencilla como que permita el acceso desde el exterior a esta zona, que desde el interior de la red "corporativa" también se pueda acceder ésta, pero que desde la DMZ no se pueda acceder a la red corporativa; que esté aislada. Para entender mejor este ejemplo he aquí este pequeño esquema:

Como veis el objetivo es muy claro y a nivel gráfico es, en mi opinión, bastante entendible... La cuestión está que generalmente para lograr dicho propósito requeriríamos de un cortafuegos o un switch con estas capacidades... Cosa que generalmente requiere de una inversión económica importante y que a veces no nos es posible realizar. Afortunadamente podemos optar por realizar un DMZ con un equipo que simplemente tenga 3 tarjetas de red y Linux instalado. En concreto con la misma configuración que la mostrada en el esquema de arriba; es decir:
  • Una interfaz de red de nombre eth0 con ip 192.168.1.2 y máscara 255.255.255.0 que estaría conectada al router.
  • Una interfaz de red de nombre eth1 con ip 192.168.2,1 y máscara 255.255.255.0 que estaría conectada a la DMZ, es decir al área que va a recibir un tratamiento "especial".
  • Una interfaz de red de nombre eth2 con ip 192.168.3.1 y máscara 255.255.255.0 que estaría conectada a la red local.

Teniendo esta disposición de interfaces de red clara, tenemos que tener claro qué objetivo lograr y cómo realizarlo... Con el esquema de arriba y las interfaces de red claras, y a sabiendas del objetivo de una DMZ veríamos que el objetivo sería:
  • Que las peticiones a ciertos puertos de la interfaz eth0, sean redirigidos a eth1 (DMZ).
  • Que el tráfico que venga desde la interfaz eth0 hacia la interfaz eth1, pase sin ningún problema.
  • Que el tráfico que vaya desde la interfaz eth1 a eth0, sea únicamente el tráfico de respuesta a las peticiones que hayan realizado a los servidores de la DMZ.
  • Que el tráfico que provenga desde la interfaz eth2 hacia al interfaz eth1, pase también sin ningún problema.
  • Que el único tráfico que puede venir desde la DMZ (eth1) hasta la red local, sea el originado por respuestas a las peticiones realizadas desde la red local (eth2).

¿Todo esto como lo podríamos lograr? Con iptables por supuesto. Todo lo comentado arriba lo lograríamos con este simple script que únicamente habría que ejecutar para tener nuestra DMZ operativa. Hay que tener en cuenta que esta configuración estaría pensada para una DMZ que tenga un servidor web y uno de DNS; es decir que estaría preparado para redirigir las peticiones a los puertos 53 y 80. El script en cuestión podría llamarse DMZ.sh
  1. #!/bin/bash
  2. #PREPARAMOS LAS REGLAS BASICAS
  3. echo 1 > /proc/sys/net/ipv4/ip_forward
  4. iptables -F
  5. iptables -t nat -F
  6. iptables -A INPUT -j DROP
  7. iptables -A FORWARD -j DROP
  8. iptables -A OUTPUT -j ACCEPT
  9. #PREPARAMOS LAS REGLAS DE FORWARD
  10. #DE ETH0 A ETH1 DEJAMOS QUE PASE TODO EL TRAFICO
  11. iptables -A FORWARD -i eth0 -o eth1 -s state --state NEW,ESTABLISHED,RELATED -j ACCEPT
  12. #DE ETH1 A ETH0 DEJAMOS QUE SOLAMENTE PASEN LAS RESPUESTAS A LAS PETICIONES
  13. iptables -A FORWARD -i eth1 -o eth0 -s state --state ESTABLISHED,RELATED -j ACCEPT
  14. #DE ETH2 A ETH1 DEJAMOS QUE PASE TODO EL TRAFICO
  15. iptables -A FORWARD -i eth2 -o eth1 -s state --state NEW,ESTABLISHED,RELATED -j ACCEPT
  16. #DE ETH1 A ETH2 DEJAMOS QUE SOLAMENTE PASEN LAS RESPUESTAS A LAS PETICIONES
  17. iptables -A FORWARD -i eth1 -o eth2 -s state --state ESTABLISHED,RELATED -j ACCEPT
  18. #PREPARAMOS LAS REDIRECCIONES DESDE EL EXTERIOR A LA DMZ
  19. #PUERTOS REDIRIGIDOS 53 Y 80
  20. #IPS FICTICIAS PERO QUE ESTAN DENTRO DEL RANGO DE ETH1
  21. #PUERTO 53, TCP Y UDP
  22. iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to 192.168.2.4:53
  23. iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to 192.168.2.4:53
  24. #PUERTO 80 TCP: WEB
  25. iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.2.5:80

Con este pequeño script ya tendríamos el equipo preparado para actuar de "firewall" y para convertir la zona conectada a la interfaz eth1 en una DMZ.
Como veis la creación de este tipo de entornos no es excesivamente complicada, simplemente requiere tener ciertas bases de iptables para poder desenvolvernos con libertad; lo cual demuestra, una vez más, la enorme utilidad de esta herramienta.
Espero que os haya resultado útil.
Saludos.