Comandos para funcionar como router en Linux / Redireccion ICMP
Activar forward.
sysctl -w net.ipv4.ip_forward=1 #echo 1 > /proc/sys/net/ipv4/ip_forward
Activar “ip_forward” en el kernel de linux nos permite poder aceptar paquetes para posteriormente trabajar con ellos con herramientas tipo iptables. Cuando simplemente está activado el forward en el kernel de un host (denominado “Y”) y se recibe un paquete de un origen “X”, se le notifica automáticamente con un paquete de redirección ICMP el salto (ruta) más próximo/óptimo. A la vez ese paquete recibido es reenviado desde “Y” al router usando como origen la IP de “X”. Persiguiendo que la respuesta sea recibida desde el router directamente por Y.
[X:192.158.1.222]-------[Y:192.158.1.50]--------[Router:192.158.1.1]--------[Internet]
Al recibir el paquete ICMP el host origen guarda la ruta en su cache durante 5 minutos, que dado el ejemplo será el gateway configurado en “Y”.
Borrar / Consultar la cache de rutas en Linux. (No es posible obtener una lista, se debe especificar destino).
# Consultar toda las rutas de la cache (Kernels antiguos !!). ip route show cache # En kernels actuales (usan FIB) se puede consultar por destino la ruta cacheada, pero no listar todas las rutas cacheadas. ip route get to 8.8.8.8 8.8.8.8 via 192.168.178.1 dev enp2s0 src 192.168.178.50 uid 1000 cache <redirect> expires 300sec <---- Redirección. # Borrar la ruta en cache. ip route flush cache to 8.8.8.8
NOTA: La “cache de rutas” actualmente es llamada FIB (forwarding information base). Más información
Resumiendo, si se está dentro de la misma red, y activamos el forward, cualquier otro host de la red que configure nuestra IP como puerta de enlace, podrá navegar a base de corregirles las rutas mediante ICMP y reenviarles los primeros paquetes de cada conexión nueva a un destino.
Como medida de seguridad, Linux solo acepta paquetes de reenvío cuando la redirección viene de la puerta de enlace configurada y el salto propuesto se realiza sobre una IP de la red.
Configurar Linux como router (SNAT / MASQUERADE).
Con esta configuración tanto “X” como “Z” tendrán salida a Internet de la misma manera. Lógicamente “Y” debe tener una IP dentro de la red donde está “X”, pudiendo usarse incluso la misma interfaz para las tres conexiones si se usa un switch.
[X:192.168.2.222]-------[Y:192.168.2.50] [Z:192.168.1.111]-------[Y:192.168.1.50]--------[Router:192.168.1.1]--------[Internet]
Con el comando “ip” es perfectamente factible asignar varias IPs a una interfaz sin tener que crear dispositivos virtuales.
ip address add 192.168.2.50/24 dev enp2s0
Veamos ahora como configurar el enrutamiento con Linux de manera simple.
# Activar ip_forward. sysctl -w net.ipv4.ip_forward=1 ## Enrutamiento opción 1. (SNAT) iptables -t nat -A POSTROUTING -o enp2s0 -j SNAT --to 192.168.178.50 ## Enrutamiento opción 2. (MASQUERADE) iptables --append FORWARD --in-interface enp2s0 -j ACCEPT # Entrada iptables --table nat --append POSTROUTING --out-interface enp2s0 -j MASQUERADE # Salida. # Si se tienen dos o más interfaces, es cuestión de configurar la entrada y la salida, como por ejemplo de la siguiente manera. # iptables --append FORWARD --in-interface eth0 -j ACCEPT # iptables --table nat --append POSTROUTING --out-interface eth1 -j MASQUERADE
Redireccionar un puerto
El puerto 2222 de “Y” redirige las solicitudes al puerto 22 de “X”.
iptables -t nat -D PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.2.222:22