Linux en general y Debian en este caso nos permite un sin fin de opciones. En este ejemplo vamos a preparar un servidor Debian para que haga de proxy de salida de una oficina o de nuestra casa, para que haga las funciones de router principal haciendo NAT de salida.
El esquema de la red seria el siguiente:
eth0 del proxy (WAN): 192.168.8.2 / 30
eth1 del proxy (LAN): 10.0.0.1 / 24
gateway del proxy: 192.168.8.1
hostname: srv01
eth0 del PC (LAN): 10.0.0.50 / 24
gateway del PC: 10.0.0.1
hostname: srv02
Primero de todo, tenemos que habilitar el forwarding (reenvio) de paquetes entre diferentes targetas de red, para ello podemos hacer lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Primero miramos si está o no activado. (0=NO 1=SI) root@srv01:~# cat /proc/sys/net/ipv4/ip_forward 0 # Activamos inmediatamente el forwarding en producción. root@srv01:~# echo 1 > /proc/sys/net/ipv4/ip_forward root@srv01:~# cat /proc/sys/net/ipv4/ip_forward 1 # Activamos el forwarding en modo permanente por si se reinicia el proxy root@srv01:~# vi /etc/sysctl.conf net.ipv4.ip_forward=1 |
Ahora si lanzamos un ping desde srv02 hacia internet veremos que no funciona. Desde srv01 veremos como no se esta haciendo NAT de salida por la eth0 para su correcto funcionamiento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# No hay salida al DNS1 de Google desde el PC interno srv02. root@srv02:~# ping -c5 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. --- 8.8.8.8 ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4032ms # Desde el proxy srv01 vemos recibir los paquetes por la eth1 de LAN. root@srv01:~# tcpdump -n -i eth1 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 16:05:20.703420 IP 10.0.0.50 > 8.8.8.8: ICMP echo request, id 508, seq 6, length 64 16:05:21.711440 IP 10.0.0.50 > 8.8.8.8: ICMP echo request, id 508, seq 7, length 64 ^C 2 packets captured 3 packets received by filter 0 packets dropped by kernel # Desde el proxy srv01 vemos recibir los paquetes por la eth0 de WAN. root@srv01:~# tcpdump -n -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:05:53.967218 IP 10.0.0.50 > 8.8.8.8: ICMP echo request, id 508, seq 39, length 64 16:05:54.975310 IP 10.0.0.50 > 8.8.8.8: ICMP echo request, id 508, seq 40, length 64 ^C 2 packets captured 3 packets received by filter 0 packets dropped by kernel |
El problema está en que estamos enrutando por la WAN de nuestro ISP una IP privada del rango 10.0.0.0/24. Es aquí donde hace falta hacer NAT de salida en nuestro proxy firewall/router srv01.
Añadimos a la configuración de nuestra targeta de red LAN un post-up en: /etc/network/interfaces
1 2 3 4 5 |
auto eth1 iface eth1 inet static address 10.0.0.1 netmask 255.255.255.0 post-up /sbin/iptables -A POSTROUTING -t nat -o eth0 -s 10.0.0.0/24 -j MASQUERADE |
Debemos aplicar los cambios para que tengan efecto a partir de ya mismo.
1 2 3 4 5 6 7 8 9 10 |
root@srv01:~# ifdown eth1 # Bajamos red eth1 root@srv01:~# ifup eth1 # Subimos red eth1 con nueva configuración # Verificamos que efectivamente ya tenemos el NAT de salida. # Activado para la salida de eth0 (WAN) y únicamente con origen el rango de LAN (10.0.0.0/24) root@srv01:~# iptables -L POSTROUTING -v -n -t nat Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 1 84 MASQUERADE all -- * eth0 10.0.0.0/24 0.0.0.0/0 |
Por último verificamos que ya funciona todo correctamente desde la red LAN en el PC srv02 y desde el proxy/firewall srv01.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# Hay salida al DNS1 de Google desde el PC interno srv02. root@srv02:~# ping -c5 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=46 time=79.5 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=79.8 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=81.2 ms 64 bytes from 8.8.8.8: icmp_seq=4 ttl=46 time=79.5 ms 64 bytes from 8.8.8.8: icmp_seq=5 ttl=46 time=80.8 ms --- 8.8.8.8 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4006ms rtt min/avg/max/mdev = 79.529/80.200/81.274/0.724 ms # Desde el proxy srv01 vemos recibir y devoler los paquetes por la eth1 de LAN. root@srv01:~# tcpdump -n -i eth1 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 16:19:10.353655 IP 10.0.0.50 > 8.8.8.8: ICMP echo request, id 535, seq 8, length 64 16:19:10.432684 IP 8.8.8.8 > 10.0.0.50: ICMP echo reply, id 535, seq 8, length 64 16:19:11.355418 IP 10.0.0.50 > 8.8.8.8: ICMP echo request, id 535, seq 9, length 64 16:19:11.436498 IP 8.8.8.8 > 10.0.0.50: ICMP echo reply, id 535, seq 9, length 64 ^C 4 packets captured 4 packets received by filter 0 packets dropped by kernel # Desde el proxy srv01 vemos enviar y recibir los paquetes por la eth0 de WAN. root@srv01:~# tcpdump -n -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:19:38.397054 IP 192.168.8.2 > 8.8.8.8: ICMP echo request, id 535, seq 36, length 64 16:19:38.476692 IP 8.8.8.8 > 192.168.8.2: ICMP echo reply, id 535, seq 36, length 64 16:19:39.398272 IP 192.168.8.2 > 8.8.8.8: ICMP echo request, id 535, seq 37, length 64 16:19:39.477222 IP 8.8.8.8 > 192.168.8.2: ICMP echo reply, id 535, seq 37, length 64 ^C 4 packets captured 6 packets received by filter 0 packets dropped by kernel |
[…] Convertir un Debian en modo router y haciendo NAT […]