Nat con iptables en Debian 12
¿Que es el nat?
El nat nos permite traducir direcciones IP y puertos de una red a otra. Es muy útil para compartir una conexión a internet con varios equipos.
Requisitos
- Sistema Debian 12 actualizado.
- Privilegios de root o sudo.
- Acceso a internet.
- Dos tarjetas de red.
Esceario de red
Tenemos dos máquinas virtuales con Debian 12, una con dos tarjetas de red, una hacia internet y otra hacia la red interna, y la otra máquina con una tarjeta de red hacia la red interna.
NAT
- eth0 (tarjeta de red hacia internet con configuración dhcp)
- eth1 (tarjeta de red hacia la red interna con configuración estática. address: 10.0.1.1/24)
Cli1-nat
- eth0 (tarjeta de red hacia la red interna con configuración estática. address: 10.0.1.2/24, gateway: 10.0.1.1)
- Actualmente no tiene acceso a internet pero si a la red interna.
Ping a red interna
root@cli1-nat:~# ping 10.0.1.1
PING 10.0.1.1 (10.0.1.1) 56(84) bytes of data.
64 bytes from 10.0.1.1: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.0.1.1: icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from 10.0.1.1: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 10.0.1.1: icmp_seq=4 ttl=64 time=0.049 ms
^C
--- 10.0.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3077ms
rtt min/avg/max/mdev = 0.033/0.043/0.049/0.006 ms
Ping a internet
root@cli1-nat:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
89 packets transmitted, 0 received, 100% packet loss, time 90109ms
Configuración
Lo primero que tenemos que hacer para que nuestra máquina pueda hacer nat es activar el forwarding. Para ello editamos el archivo /proc/sys/net/ipv4/ip_forward y cambiamos el valor de 0 a 1.
root@nat:~# nano /proc/sys/net/ipv4/ip_forward
o
root@nat:~# echo 1 > /proc/sys/net/ipv4/ip_forward
Ya tenemos el forwarding activado, pero cuando reiniciemos la máquina se desactivará, para que se mantenga activado tenemos que editar el archivo /etc/sysctl.conf y descomentar la línea net.ipv4.ip_forward=1.
root@nat:~# nano /etc/sysctl.conf
Para los siguientes pasos vamos a usar iptables y iptables-persistent, si no los tenemos instalados los instalamos con el comando:
- iptables: Herramienta para administrar las reglas de cortafuegos.
- iptables-persistent: Herramienta para guardar las reglas de iptables.
root@nat:~# apt install iptables iptables-persistent -y
Configuración de iptables
Para que nuestra máquina pueda hacer nat tenemos que añadir una regla de iptables que puede ser de dos tipos según nuestra configuración de red:
Nat estático: Si la tarjeta de red que tiene acceso a internet tiene una dirección IP estática, la regla de iptables sería:
root@nat:~# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j SNAT --to 73.64.4.19
- -t nat: Indica que la regla es de tipo nat.
- -A POSTROUTING: Añade la regla a la cadena POSTROUTING.
- -s 10.0.1.0/24: Indica que la regla se aplicará a los paquetes que vengan de la red 10.0.1.0/24.
- -o eth0: Indica que la regla se aplicará a los paquetes que salgan por la interfaz eth0.
- -j SNAT –to 73.64.4.19: Indica que se hará nat estático con la dirección IP 73.64.4.19.
Nat dinámico: Si la tarjeta de red que tiene acceso a internet tiene una dirección IP dinámica, la regla de iptables sería:
root@nat:~# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
- -t nat: Indica que la regla es de tipo nat.
- -A POSTROUTING: Añade la regla a la cadena POSTROUTING.
- -s 10.0.1.0./24: Indica que la regla se aplicará a los paquetes que vengan de la red 10.0.1.0/24.
- -o eth0: Indica que la regla se aplicará a los paquetes que salgan por la interfaz eth0.
- -j MASQUERADE: Indica que se hará nat dinámico.
Guardar las reglas de iptables
Una vez que tenemos las reglas de iptables configuradas, tenemos que guardarlas para que se carguen al reiniciar la máquina. Para ello usamos el comando:
root@nat:~# iptables-save > /etc/iptables/rules.v4
Prueba de conectividad
Una vez que tenemos las reglas de iptables configuradas, vamos a probar la conectividad desde la máquina cli1-nat.
Ping a la red interna
root@cli1-nat:~# ping 10.0.1.1
PING 10.0.1.1 (10.0.1.1) 56(84) bytes of data.
64 bytes from 10.0.1.1: icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from 10.0.1.1: icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from 10.0.1.1: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 10.0.1.1: icmp_seq=4 ttl=64 time=0.040 ms
^C
--- 10.0.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3058ms
rtt min/avg/max/mdev = 0.040/0.049/0.054/0.005 ms
Ping hacia internet
root@cli1-nat:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=10.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=10.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=10.0 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=119 time=9.77 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 9.769/10.109/10.527/0.272 ms
Como podemos ver en las pruebas de conectividad, la máquina cli1-nat ya tiene acceso a internet. Con esto ya tenemos configurado el nat con iptables en Debian 12.
Extra
Hemos finalizado la configuración del nat pero como apartado extra voy a hacer una pequeña desmostración de como acceder a la máquina cli1-nat desde internet.
Para esta desmostración he instalado un servidor web apache en la máquina cli1-nat.
Configuración regla iptables
Para acceder a la web de la máquina cli1-nat desde internet, tenemos que añadir una regla de iptables que redirija el tráfico del puerto 80 de la máquina nat al puerto 80 de la máquina cli1-nat.
root@nat:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.1.2
Como podemos ver en la siguiente imagen, si accedemos a la dirección IP de la máquina nat desde un navegador, nos muestra la web de la máquina cli1-nat:
- -t nat: Indica que la regla es de tipo nat.
- -A PREROUTING: Añade la regla a la cadena PREROUTING.
- -i eth0: Indica que la regla se aplicará a los paquetes que entren por la interfaz eth0.
- -p tcp: Indica que la regla se aplicará a los paquetes de tipo tcp.
- –dport 80: Indica que la regla se aplicará a los paquetes que vayan al puerto 80.
- -j DNAT –to 10.0.1.2 : Indica que se hará una redirección de puertos al puerto 80 de la máquina cli1-nat.
En este caso hemos utilizado el puerto 80 para acceder pero podemos utilizar cualquier otro puerto. Por ejemplo, si tenemos el servidor web alojado en el puerto 80 pero queremos acceder por el puerto 8080, la regla de iptables sería:
root@nat:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to 10.0.1.2:80
En la siguiente imagen podemos ver que si accedemos a la dirección IP de la máquina nat desde un navegador con el puerto 8080, nos muestra la web de la máquina cli1-nat:
- -t nat: Indica que la regla es de tipo nat.
- -A PREROUTING: Añade la regla a la cadena PREROUTING.
- -i eth0: Indica que la regla se aplicará a los paquetes que entren por la interfaz eth0.
- -p tcp: Indica que la regla se aplicará a los paquetes de tipo tcp.
- –dport 8080: Indica que la regla se aplicará a los paquetes que vayan al puerto 8080.
- -j DNAT –to 10.0.1.2:80 : Indica que se hará una redirección de puertos al puerto 80 de la máquina cli1-nat.
Con esto ya hemos terminado la desmostración de como acceder a la máquina cli1-nat desde internet.