Home Linux Linux – Firewall Completo con estados 1ª Parte

Linux – Firewall Completo con estados 1ª Parte

by José Luis Sánchez Borque
firewall

En este Post demostraremos como configurar un enrutador linux que actúe como firewall entre dos redes. La idea es proporcionar las herramientas básicas para que luego se pueda adaptar al entorno particular de cada instalación.

Objetivos

  • Montar un laboratorio como simulación de un entorno real
  • Configurar una máquina Linux Ubuntu 16.04 LTs como enrutador y firewall
  • Aprender conceptos de POSTROUTING y PREROUTING
  • Utilizar nmap para verificar puertos abiertos
  • Trabajar con estados
  • Utilizar Kfsensor como Windows HoneyPot para simular aplicaciones y protocolos abiertos

Prerequisitos

Leer los anteriores Post al respecto de IPtables y firewalls en general

  1. Tutorial IPTABLES I – Un firewall fiable
  2. Tutorial IPTABLES II – Entendiendo el flujo de paquetes
  3. Tutorial IPTABLES III – Firewall simple entre redes

Descripción del escenario

Virtualizaremos una red Interna (192.168.50.0/24) con acceso a Internet mediante un firewall linux.  La salida a Internet se realiza a través de la conexión típica de cualquier hogar. En nuestro caso ISP ORANGE

P10_Esquema_laboratorio

Es clave entender que la RED-LOCAL está detrás del enrutador, y NO es conocida por ninguna máquina de la red 192.168.1.0/24.

Desde la máquina wsrv12.profe.local podemos ver que no tenemos conectividad con dicha máquina

C:\>tracert -d -h 3 192.168.1.212

Tracing route to 192.168.1.212 over a maximum of 3 hops

1 <1 ms <1 ms <1 ms 192.168.50.254
 2 * * * Request timed out.
 3 * * * Request timed out.

Trace complete.

C:\>ping 192.168.1.212 -n 1

Pinging 192.168.1.212 with 32 bytes of data:
Request timed out.

Ping statistics for 192.168.1.212:
 Packets: Sent = 1, Received = 0, Lost = 1 (100% loss),

Si reflexionamos el esquema, los paquetes realmente llegan al PC con ip 192.168.1.212, pero este no tiene ninguna ruta en su tabla de enrutamiento que le indique como volver. Podemos ver, filtrando la tabla de enrutamiento del PC, como no hay entrada apuntando a la red 192.168.50.0 que le permita volver.

C:\Users\usuario>route print | find /i "192.168.50.0"
... sin ningún resultado ...
C:\Users\usuario>

Solo a modo ejemplo, y para aprender más, añadiremos una entrada apuntando a la red 192.168.50.0/24 y veremos que todo funciona. Luego la borramos, y vemos que ya no la tenemos

C:\Windows\system32>ROUTE ADD 192.168.50.0 MASK 255.255.255.0 192.168.1.216
 Correcto

C:\Windows\system32>ROUTE PRINT | FIND /I "192.168.50.0"
 192.168.50.0 255.255.255.0 192.168.1.216 192.168.1.212 51

C:\Windows\system32>ping 192.168.50.1 -n 1

Haciendo ping a 192.168.50.1 con 32 bytes de datos:
Respuesta desde 192.168.50.1: bytes=32 tiempo<1m TTL=127

Estadísticas de ping para 192.168.50.1:
 Paquetes: enviados = 1, recibidos = 1, perdidos = 0
 (0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
 Mínimo = 0ms, Máximo = 0ms, Media = 0ms

C:\Windows\system32>ROUTE DELETE 192.168.50.0 MASK 255.255.255.0
 Correcto

C:\Users\usuario>PING 192.168.50.1 -n 1

Haciendo ping a 192.168.50.1 con 32 bytes de datos:

Tiempo de espera agotado para esta solicitud.

Estadísticas de ping para 192.168.50.1:
 Paquetes: enviados = 1, recibidos = 0, perdidos = 1
 (100% perdidos),

Recordemos habilitar el protocolo icmpv4 en el firewall de Windows, sin desactivar TODO, que luego decimos que el Windows no es seguro.. Ya os vale!!!

Detallamos a continuación las reglas que queremos activar en nuestro firewall.

Especificaciones firewall

  1. Política por defecto DROP
  2. Permitir apt-get..
  3. Permitir consultas DNS a la red interna
  4. Permitir administrar vía ssh desde red externa
  5. Permitir acceso a Webmin desde red interna
  6. Permitir icmp al firewall, y desde red interna hacía fuera
  7. Mapear los puertos smtp (tpc/25), pop3 (tcp/110) y http (tcp/50) contra el servidor interno
  8. Los puertos 25, 110 y 80 estarán simulados vía honeypot kfsensor
  9. Trabajar con estados solo en TCP, aunque es posible en icmp y udp también… Próximo Post 🙂

Dedicaremos más adelante un Post a utilizar kfsensor como Honeypot para la detección de intrusos. De momentos os pongo los puertos configurados en entorno simulación:

Recordar que en el Post Tutorial iptables II entendiendo el flujo de paquetes encontraremos los pasos para activar el enrutamiento en el router. Así mismo como convertir el fichero rules.fw en ejecutable y hacer que se ejecute al principio lo tenemos en el post Firewall Simple Entre redes

Veamos el script de iptables:

administrador@ubuntu:/etc/fw$ cat ./rules.fw

# Definicion de variables

RedInterna=192.168.50.0/24
 NicInt=ens34
 NicExt=ens33

# Inicializamos el Firewall

iptables -F
iptables -X
iptables -t nat -F
iptables -Z

# Polítca por defecto DROP

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Permitimos todo para el interface de blucle local loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# ACTIVAMOS NAT EN IP ORIGEN SOBRE INTERFACE EXTERNA, PARA TENER ENRUTAMIENTO

iptables -t nat -A POSTROUTING -s $RedInterna -o $NicExt -j MASQUERADE

# PUERTO + REGLAS HTTP 80 MAPEADO A MAQUINA INTERNA

iptables -t nat -A PREROUTING -i $NicExt -s 192.168.1.0/24 -p tcp --dport 80 -j DNAT --to-destination 192.168.50.1:80

iptables -A FORWARD -s 192.168.1.0/24 -i $NicExt -d 192.168.50.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.50.1 -i $NicInt -d 192.168.1.0/24 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

# PUERTO + REGLAS POP3 110 MAPEADO A MAQUINA INTERNA

iptables -t nat -A PREROUTING -i $NicExt -s 192.168.1.0/24 -p tcp --dport 110 -j DNAT --to-destination 192.168.50.1:110

iptables -A FORWARD -s 192.168.1.0/24 -i $NicExt -d 192.168.50.1 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.50.1 -i $NicInt -d 192.168.1.0/24 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

# PUERTO + REGLA SMTP 25 MAPEADO A MAQUINA INTERNA

iptables -t nat -A PREROUTING -i $NicExt -s 192.168.1.0/24 -p tcp --dport 25 -j DNAT --to-destination 192.168.50.1:25

iptables -A FORWARD -s 192.168.1.0/24 -i $NicExt -d 192.168.50.1 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.50.1 -i $NicInt -d 192.168.1.0/24 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

# PROTOCOLO ICMP DESDE Y HACIA EL ROUTER

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# PROTOCOLO ICMP DESDE RED INTERNA HACIA EL EXTERIOR

iptables -A FORWARD -i $NicInt -s $RedInterna -o $NicExt -p icmp --icmp-type echo-request -j ACCEPT
iptables -A FORWARD -i $NicExt -d $RedInterna -o $NicInt -p icmp --icmp-type echo-reply -j ACCEPT

# PROTOCOLO DNS UDP TANTO PARA EL ROUTER COMO PARA LA RED INTERNA
# NECESARIO PARA apt-get update... etc

iptables -A OUTPUT -o $NicExt -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i $NicExt -p udp --sport 53 -j ACCEPT

iptables -A FORWARD -i $NicInt -s $RedInterna -o $NicExt -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $NicExt -d $RedInterna -o $NicInt -p udp --sport 53 -j ACCEPT

# PERMITIMOS EL PROTOCOLO HTTP Y HTTPS DESDE LA RED INTERNA

iptables -A FORWARD -i $NicInt -o $NicExt -s $RedInterna -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $NicExt -o $NicInt -d $RedInterna -p tcp -m multiport --sports 80,443 -m state --state ESTABLISHED -j ACCEPT

# PERMITIMOS HTTP Y HTTPS DESDE EL PROPIO SERVIDOR. PARA TEMAS DE apt-get...

iptables -A OUTPUT -o $NicExt -p tcp -m multiport --dports 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $NicExt -p tcp -m multiport --sports 80 -m state --state ESTABLISHED -j ACCEPT

# PERMITIMOS ADMINISTRAR POR SSH EL SERVER DESDE LA RED EXTERNA

iptables -A INPUT -i $NicExt -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o $NicExt -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# PERMITIMOS ADMINISTRAR POR WEBMIN EL SERVER DESDE LA RED INTERNA.

iptables -A INPUT -i $NicInt -p tcp --dport 10000 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o $NicInt -p tcp --sport 10000 -m state --state ESTABLISHED -j ACCEPT

Verifiquemos desde la máquina PC (192.168.1.212)  los puertos abiertos del router detectados desde fuera con nmap ( Zenmpa ):

Verifiquemos el funcionamiento mapeo del puerto 80 desde la máquina PC ( .1.212)

Verifiquemos desde máquina PC (1.212) POP3 y SMTP desde línea de comandos mediante telnet ( podría ser Putty )

c:\windows>telnet 192.168.1.216 110

+OK Microsoft Windows POP3 Service Version 2.0 <7838610@profe.local> ready.
quit
+OK Microsoft Windows POP3 Service Version 2.0 <7838610@profe.local> signing off.

Se ha perdido la conexión con el host.

 

c:\windows>telnet 192.168.1.216 25

220 profe.local Microsoft ESMTP MAIL Service, Version: 6.0.3790.0 ready at Tue, 11 Jul 2017 17:27:06 +0200
quit
221 2.0.0 profe.local Service closing transmission channel

Se ha perdido la conexión con el host.

Veamos desde kfsensor como se detectan dichos accesos. Vemos solamente smtp (tcp/25) para no alargar demasiado el Post

 

Ahora veremos la conexión desde la red interna (máquina  192.168.50.1)  hacía el exterior, icmp, dns, http y webmin:

C:\>ping 8.8.8.8 -n 1

Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=21ms TTL=55

Ping statistics for 8.8.8.8:
 Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
 Minimum = 21ms, Maximum = 21ms, Average = 21ms
C:\>nslookup www.cocacola.com
Server: localhost
Address: 127.0.0.1

Non-authoritative answer:
Name: a1128.g2.akamai.net
Addresses: 84.53.133.80
 84.53.133.67
Aliases: www.cocacola.com
 globalcokesites.edgesuite.net

 

En la segunda parte del Post trabajaremos a fondo los estados …. no seáis impacientes…

You may also like

2 comments

Marc August 31, 2017 - 10:13 am

“Recordemos habilitar el protocolo icmpv4 en el firewall de Windows, sin desactivar TODO, que luego decimos que el Windows no es seguro.. Ya os vale!!!”
Jajajajajaj. Eres terrible JL.

Marc Illescas.

Reply
José Luis Sánchez Borque October 17, 2017 - 8:19 am

Ya sabes, el botón desactivar firewall de Windows es propio de técnicos que nos saben.

Reply

Leave a Comment