Estoy intentando enrutar el tráfico entre diferentes redes y he seguido una guía que encontré aquí: https://devconnected.com/how-to-add-route-on-linux/
Aquí hay un diagrama que espero que represente adecuadamente el arreglo con el que estoy trabajando:
Windows 10 Ubuntu Linux
172.31.0.X <----------> 172.31.0.33 (eno1)
10.0.40.1 (enp2s0f0) <----------> 10.0.40.10
Tengo una ruta persistente configurada en la PC con Windows para enrutar cualquier tráfico para 10.0.40.0/24 a través de 172.31.0.33.
La máquina Ubuntu está configurada para enrutar el tráfico destinado a 10.0.40.0/24 a través de 10.0.40.1.
Hacer ping a 10.0.40.10 desde la máquina Ubuntu funciona como se esperaba.
Si hago ping a 10.0.40.10 desde la PC con Windows, puedo ver que los mensajes ICMP llegan a la interfaz 172.31.0.33 en la máquina Ubuntu usando tcpdump. No veo ningún tráfico en la interfaz 10.0.40.1 de esa máquina. Parece que la máquina Ubuntu no está enrutando el tráfico como era de esperar. ¿Alguien puede arrojar alguna luz sobre lo que me he perdido?
Añadiendo salida de:
iptables -S
para máquina Ubuntu:
sudo iptables -S
# Warning: iptables-legacy tables present, use iptables-legacy to see them
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -i eno1 -j ACCEPT
-A FORWARD -i enp2s0f0 -j ACCEPT
adi@LabBuildServer:~$ sudo iptables-legacy -S
[sudo] password for adi:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-e925d11be2da -m conntrack --ctstate RELATED,ESTABLISHED -j ACCE PT
-A FORWARD -o br-e925d11be2da -j DOCKER
-A FORWARD -i br-e925d11be2da ! -o br-e925d11be2da -j ACCEPT
-A FORWARD -i br-e925d11be2da -o br-e925d11be2da -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-e925d11be2da ! -o br-e925d11be2da -j DOCKER-IS OLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-e925d11be2da -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
Salida de:
ip route
en el host Linux:
ip route
default via 10.0.40.1 dev br-POE proto static
10.0.40.0/24 dev br-POE proto kernel scope link src 10.0.40.10
Máquina Ubuntu:
adi@LabBuildServer:~$ sudo iptables -t nat -L
[sudo] password for adi:
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
MASQUERADE all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Respuesta1
La solución está ahí:
-P FORWARD DROP
En su iptables-legacy
conjunto de reglas, la política predeterminada para reenviar paquetes está establecida en DROP, y no hay ninguna regla en ese conjunto de reglas que permita reenviar paquetes desde eno1
a enp2s0f0
, solo reenviar desde/hacia una interfaz puente...
Siempre es una muy mala idea mezclar diferentes iptables; usted mismo debe decidir si quiere usar iptables
o iptables-legacy
- cada paquete de red pasará por ambos conjuntos de reglas, lo que causará mucha confusión.
actualizar:
Mi respuesta no debería significar que deba instalar la política predeterminada como aceptar, solo estaba señalando el motivo. Por supuesto, puede agregar reglas para permitir el reenvío de tráfico solo a estas IP específicas, por ejemplo así:
-A FORWARD -i eno1 -s 172.31.0.0/24 -o enp2s0f0 -d 10.0.40.0/24 -j ACCEPT
-A FORWARD -i enp2s0f0 -s 10.0.40.0/24 -o eno1 -d 172.31.0.0/24 -j ACCEPT