Linux como router con IP Forwarding — scripts para convertir un equipo Linux (Debian/Ubuntu) en un router / puerta de enlace (gateway) capaz de reenviar tráfico entre redes, con soporte de NAT (enmascaramiento) y una utilidad de comprobación remota.
- ¿Qué es IP Forwarding?
- Esquema de red
- Tabla resumen de scripts
- Descripción detallada de cada script
- Flujo de un paquete a través del router
- Instalación y uso
- Requisitos
- Verificación manual
- Persistencia de las reglas de NAT
- Solución de problemas
- Consideraciones de seguridad
- Licencia
IP Forwarding (reenvío de IP) es una función del kernel de Linux que permite que un equipo con más de una interfaz de red reenvíe paquetes que no van dirigidos a él mismo, sino a otra red distinta a la que está conectado.
Por defecto, un Linux "de escritorio" o servidor normal descarta cualquier paquete que reciba y que no esté destinado a una de sus propias IPs. Al activar ip_forward, el kernel empieza a comportarse como un router: recibe el paquete por una interfaz, consulta su tabla de rutas y lo reenvía por la interfaz correspondiente hacia su destino final.
Sin IP Forwarding: Con IP Forwarding:
Red A Red A
│ │
▼ ▼
┌───────┐ ┌───────────┐
│ Linux │ paquete no es para mí │ Linux │ reenvía el paquete
│ (X) │ ─────────► DESCARTADO │ (Router) │ ─────────► Red B
└───────┘ └───────────┘
Esta capacidad es la base de:
- Routers/Gateways que conectan dos o más redes (LAN ↔ Internet, LAN ↔ VLAN, etc.).
- NAT / Masquerading, para que varios equipos de una red privada salgan a Internet compartiendo una única IP pública.
- Escenarios de pentesting (pivoting, redirección de tráfico) donde se usa un host Linux como puente entre segmentos de red.
Escenario típico que estos scripts ayudan a construir: un equipo Linux con dos interfaces de red actuando de puerta de enlace entre una red interna (LAN) y la red externa (Internet / WAN).
INTERNET / WAN
│
│ IP pública (o red externa)
┌────┴────┐
│ eth0 │
┌─────┴─────────┴─────┐
│ │
│ Linux Router │ <-- ipforward.sh / router.sh / nat.sh
│ (ip_forward = 1) │
│ MASQUERADE eth0 │
│ │
└─────┬─────────┬─────┘
│ eth1 │
└────┬────┘
│ Red interna 192.168.1.0/24
┌────────────────┼────────────────┐
│ │ │
┌────┴────┐ ┌─────┴────┐ ┌─────┴────┐
│ Host A │ │ Host B │ │ Host C │
│192.168.1.10 │192.168.1.11 │192.168.1.12
└──────────┘ └──────────┘ └──────────┘
eth0: interfaz "externa" (hacia Internet o hacia la red que se quiere alcanzar). Sobre ella se aplica elMASQUERADE.eth1(o la interfaz interna que corresponda): conecta con la LAN cuyos equipos usarán este Linux como puerta de enlace por defecto.- Cada host interno debe tener configurada como gateway la IP del Linux en su interfaz interna.
| Script | Líneas | Función principal | Modifica el sistema | Requiere sudo/root |
Persistente tras reinicio |
|---|---|---|---|---|---|
ipforward.sh |
16 | Activa IP Forwarding (IPv4 e IPv6) a nivel de kernel y sysctl.conf |
Sí (/etc/modules, /etc/sysctl.conf) |
Sí | Sí (vía sysctl.conf) |
router.sh |
35 | Igual que ipforward.sh + banner informativo + reinicio de servicios de red + reglas NAT |
Sí (/etc/modules, /etc/sysctl.conf, iptables) |
Sí | Parcial (kernel sí, iptables no) |
nat.sh |
4 | Aplica únicamente el enmascaramiento NAT (MASQUERADE) sobre eth0 |
Sí (tabla nat de iptables) |
Sí | No (se pierde al reiniciar) |
test.sh |
9 | Comprueba desde un equipo remoto si una lista de IPs actúan correctamente como gateway con forwarding activo | No (solo lectura/red) | No (recomendable sí, para route add) |
N/A |
Script mínimo cuyo único objetivo es activar el reenvío de paquetes IPv4 e IPv6 en el kernel de Linux, tanto en caliente (sysctl -w) como de forma persistente (editando /etc/sysctl.conf).
#!/bin/bash
echo ipv4 >> /etc/modules
echo ipv6 >> /etc/modules
sysctl -w net.ipv4.ip_forward=1
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sed -i 's/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/g' /etc/sysctl.conf
sysctl -pcomo funciona
- Añade las cadenas
ipv4eipv6a/etc/modules(carga de módulos al arrancar). - Activa
net.ipv4.ip_forward=1en caliente consysctl -w(efecto inmediato, no persistente por sí solo). - Descomenta la línea
#net.ipv4.ip_forward=1en/etc/sysctl.confmediantesed, para que el ajuste sobreviva a un reinicio. - Hace lo mismo para IPv6 (
net.ipv6.conf.all.forwarding=1). - Recarga la configuración con
sysctl -p. - Muestra un aviso recomendando reiniciar el equipo.
Nota: el
sedsolo funciona si esas líneas ya existen comentadas ensysctl.conf(es el caso por defecto en Debian/Ubuntu). Si el fichero no contiene esa línea exacta, elsedno tendrá efecto y habrá que añadirla manualmente.
Versión "completa" y más vistosa del script anterior. Hace todo lo que hace ipforward.sh, pero además:
- Muestra un banner ASCII de bienvenida con colores.
- Reinicia el servicio de red (
service networking restart) y el pseudo-sistema de procesos (procps) para aplicar cambios sin reiniciar el equipo por completo. - Incluye directamente las reglas de
iptablespara el NAT/Masquerade sobreeth0, dejando el equipo listo como router en una sola ejecución.
#!/bin/bash
# Activa IP forwarding en Linux / NAT
# Convierte Linux en un enrutador/ puerta de enlace
echo ipv4 >> /etc/modules
echo ipv6 >> /etc/modules
sysctl -w net.ipv4.ip_forward=1
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sed -i 's/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/g' /etc/sysctl.conf
sysctl -p
service networking restart
sudo /etc/init.d/procps restart
iptables -L FORWARD -nv
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADEQué hace paso a paso:
- Muestra el banner y la cabecera informativa del script.
- Activa IP Forwarding igual que
ipforward.sh(kernel + persistencia ensysctl.conf). - Reinicia el servicio
networkingyprocpspara que los cambios de red y de kernel se apliquen sin necesidad de un reinicio completo del sistema. - Muestra las reglas actuales de la cadena
FORWARD(iptables -L FORWARD -nv), útil para verificar el estado antes de añadir la regla NAT. - Inserta una regla de MASQUERADE en la cadena
POSTROUTINGde la tablanat, para que todo el tráfico saliente poreth0se traduzca a la IP de esa interfaz (NAT dinámico, ideal cuandoeth0tiene IP dinámica/DHCP).
Es, en la práctica, la combinación de
ipforward.sh+nat.shen un solo script, con extras cosméticos y de reinicio de servicios.
Script muy pequeño centrado exclusivamente en la parte de NAT (enmascaramiento). Asume que el IP Forwarding ya está activo (por ejemplo, ejecutado previamente ipforward.sh o router.sh).
#!/bin/bash
# Nateo en la eth0
iptables -L FORWARD -nv
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADEQué hace paso a paso:
- Lista las reglas actuales de la cadena
FORWARDen formato numérico y con contadores (-n= no resolver nombres,-v= verbose). - Inserta (
-I, al principio de la cadena) una regla deMASQUERADEenPOSTROUTING, dentro de la tablanat, para la interfaz de salidaeth0.
Efecto: todo el tráfico que salga hacia Internet (o hacia la red al otro lado de eth0) desde los hosts de la LAN interna aparecerá con la IP de eth0 como origen, permitiendo que varias máquinas privadas compartan una única IP pública.
Esta regla no es persistente: se pierde al reiniciar
iptableso el equipo. Ver la sección Persistencia de las reglas de NAT.
Script de verificación remota, pensado para ejecutarse en un equipo distinto al router (por ejemplo, un host de la LAN o de una red externa), para comprobar si una lista de direcciones IP están funcionando correctamente como puerta de enlace con IP Forwarding activo.
#Test IP Forwarding esta activado en host remoto.
#!/bin/bash
for n in `cat ip.txt`
do route add default gw $n
if ping 8.8.8.8 -c 1 -W 1 > /dev/null
then echo $n "IP forwarding up"
fi
doneQue hace :
- Lee, línea a línea, el fichero
ip.txt(que el usuario debe crear con una IP candidata a gateway por línea). - Para cada IP
$n, la configura como puerta de enlace por defecto (route add default gw $n) en el equipo desde el que se ejecuta el test. - Lanza un único
ping(-c 1, con timeout-W 1segundo) contra8.8.8.8(DNS público de Google) para comprobar conectividad real a Internet a través de esa IP. - Si el
pingtiene éxito, imprime<IP> IP forwarding up, confirmando que ese host reenvía tráfico correctamente.
Requisito previo: crear un fichero ip.txt en el mismo directorio, con una IP por línea:
192.168.1.1
192.168.1.254
10.0.0.1
Este script modifica la tabla de rutas del equipo donde se ejecuta (
route add default gw) en cada iteración, sin eliminar la ruta anterior. En sistemas coniproute2moderno puede no existir el comandoroute(paquetenet-tools); instálalo conapt install net-toolssi es necesario, o adapta el script aip route replace default via $n.
Host LAN (192.168.1.10)
│
│ 1. Envía paquete a 8.8.8.8
▼
┌─────────────────────────────┐
│ Linux Router │
│ │
│ eth1 (in) │
│ │ │
│ ▼ │
│ [ ip_forward = 1 ] ───────►│ 2. El kernel decide reenviar
│ │ │ (en vez de descartar)
│ ▼ │
│ iptables: FORWARD │ 3. Reglas de filtrado (si existen)
│ │ │
│ ▼ │
│ iptables: nat/POSTROUTING │ 4. MASQUERADE: cambia IP origen
│ │ │ 192.168.1.10 → IP de eth0
│ ▼ │
│ eth0 (out) │
└──────────┬───────────────────┘
│ 5. Sale hacia Internet con IP pública
▼
Internet (8.8.8.8)
Al recibir la respuesta, el proceso es inverso: iptables recuerda (mediante conntrack) qué host interno originó la conexión y des-enmascara el paquete de vuelta hacia 192.168.1.10.
# 1. Clonar el repositorio
git clone https://github.com/hackingyseguridad/ipforward
cd ipforward
# 2. Dar permisos de ejecución
chmod +x ipforward.sh router.sh nat.sh test.sh
# 3a. Opción rápida: activar todo en un solo paso (forwarding + NAT)
sudo ./router.sh
# 3b. Opción por partes:
sudo ./ipforward.sh # solo activa IP forwarding
sudo ./nat.sh # solo aplica NAT/MASQUERADE sobre eth0
# 4. (Opcional) Verificar desde otro host que el router funciona
echo "192.168.1.1" > ip.txt
sudo ./test.shSustituye
eth0ennat.sh/router.shpor el nombre real de tu interfaz externa (comprueba conip a— en sistemas modernos suele llamarseenp0s3,ens33, etc., en lugar deeth0).
| Requisito | Detalle |
|---|---|
| Sistema operativo | Linux basado en Debian/Ubuntu (usa /etc/sysctl.conf y service networking) |
| Privilegios | root o sudo (modifican kernel, iptables y ficheros de sistema) |
| Paquetes | iptables, procps; opcionalmente net-tools para el comando route usado en test.sh |
| Interfaces de red | Al menos 2 interfaces (una interna, una externa) para actuar como router real |
Comandos útiles para comprobar el estado sin depender de los scripts:
# ¿Está activo IP forwarding?
cat /proc/sys/net/ipv4/ip_forward # 1 = activo, 0 = inactivo
sysctl net.ipv4.ip_forward
# ¿Qué reglas NAT hay activas?
sudo iptables -t nat -L POSTROUTING -nv
# ¿Qué reglas de forwarding hay activas?
sudo iptables -L FORWARD -nv
# Ver interfaces y sus IPs
ip anat.sh y la parte de iptables de router.sh no sobreviven a un reinicio. Para hacerlas persistentes:
sudo apt install iptables-persistent
sudo netfilter-persistent saveO, alternativamente, añadir la ejecución de nat.sh a un servicio systemd o a /etc/rc.local.
| Síntoma | Causa probable | Solución |
|---|---|---|
| Los hosts de la LAN no salen a Internet | ip_forward no activo o regla MASQUERADE no aplicada |
Verifica con cat /proc/sys/net/ipv4/ip_forward y iptables -t nat -L |
El sed de ipforward.sh no modifica sysctl.conf |
La línea comentada no existe tal cual en el fichero | Añade manualmente net.ipv4.ip_forward=1 al final de /etc/sysctl.conf |
route: command not found en test.sh |
Falta el paquete net-tools |
sudo apt install net-tools, o reescribe el script con ip route |
| Las reglas de NAT desaparecen al reiniciar | iptables no es persistente por defecto |
Instala iptables-persistent (ver sección anterior) |
router.sh falla al reiniciar networking |
Distribuciones modernas usan NetworkManager/systemd-networkd en vez de service networking |
Reinicia el servicio de red correspondiente a tu distro, o simplemente reinicia el equipo |
- Activar IP Forwarding convierte el equipo en un punto de tránsito de tráfico: revisa siempre las reglas
FORWARDdeiptablespara no dejar la red completamente abierta entre segmentos. - El
MASQUERADEoculta las IPs internas, pero no sustituye a un firewall: complementa estos scripts con reglas de filtrado (iptables -A FORWARD ...) según la política de seguridad de tu red. - En entornos de laboratorio o pentesting, recuerda desactivar el forwarding (
sysctl -w net.ipv4.ip_forward=0) y eliminar las reglas NAT al terminar, si el equipo no debe seguir actuando como router.
Este proyecto se distribuye bajo los términos indicados en el fichero LICENSE del repositorio.