Reenvío de IP desde un servidor a través de la ruta predeterminada

Reenvío de IP desde un servidor a través de la ruta predeterminada

Tengo un dispositivo (IP 10.110.1.3) con la siguiente regla configurada:

$ ip route
default via 10.110.1.4 dev wlan0 onlink

Tengo habilitado el reenvío ipv4 en ambas máquinas. Ambas máquinas pueden comunicarse entre sí.

Aquí están mis iptables. Quiero enrutar desde la interfaz wlp0s20u1 a wlp3s0:

$ iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

$ iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -o wlp3s0 -j MASQUERADE

Rutas en el dispositivo de "enrutamiento" 10.110.1.4:

$ ip route
default via 192.168.1.1 dev wlp3s0  proto static 
10.110.1.0/24 dev wlp0s20u1  proto kernel  scope link  src 10.110.1.4 
192.168.1.0/24 dev wlp3s0  proto kernel  scope link  src 192.168.1.110  metric 600 

Usando la ruta get "si interfaz", está claro que esto nunca funcionará:

$ ip route get to 192.168.1.1 from 10.110.1.3 iif wlp0s20u1
RTNETLINK answers: No route to host

$ ip route get to 8.8.8.8 from 10.110.1.3 iif wlp0s20u1
RTNETLINK answers: No route to host

Noté el error src 192.168.1.110en la 192.168.1.0ruta e intenté agregar la siguiente ruta para solucionar este problema:

$ sudo ip route add 192.168.1.1/32 dev wlp3s0

Pero esto tampoco ayudó.

Utilicé tcpdump para analizar icmp y poder ver hacia dónde van mis pings.

$ tcpdump -i wlp0s20u1 -n icmp
listening on wlp0s20u1, link-type EN10MB (Ethernet), capture size 262144 bytes
18:13:19.355166 IP 10.110.1.3 > 8.8.8.8: ICMP echo request, id 32366, seq 1, length 64
18:13:20.359770 IP 10.110.1.3 > 8.8.8.8: ICMP echo request, id 32366, seq 2, length 64

y

tcpdump -i wlp3s0 -n icmp                                             
listening on wlp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes

Nada en la interfaz wlp3s0 a menos que haga ping desde la computadora "enrutador".

Claramente el problema aquí es que el kernel no sabe enrutar paquetes de wlp0s20u1 a wlp3s0. Pero no estoy seguro de cómo hacer que haga esto. Intenté agregar rutas explícitamente para indicarle que haga esto, pero no parece funcionar.

Si envío spam con lo siguiente, solo aumentan los contadores de paquetes de preenrutamiento (mientras se intenta hacer ping);

$ iptables -t nat -v -L -n

Chain PREROUTING (policy ACCEPT 775 packets, 50740 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 24 packets, 1920 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 95 packets, 23073 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 5 packets, 1000 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   90 22073 MASQUERADE  all  --  *      wlp3s0  0.0.0.0/0            0.0.0.0/0 

¡Cualquier ayuda es muy apreciada!

EDITAR: Explicación simplificada

Tengo tres dispositivos:

  • R: enrutador WiFi en 192.168.1.1
  • B: Computadora con dos tarjetas wifi: wlp3s0 en la red 192.168.1.1 y wlp0s20u1 en la red 10.110.1.0/24.
  • C: Computadora únicamente en la red WiFi 10.110.1.0/24.

Estoy intentando permitir que C se comunique con Internet (0.0.0.0/0) con dos saltos, primero con B, luego con A y luego con Internet.

El problema es lograr que B enrute paquetes de wlp3s20u1 a wlp3s0.

Respuesta1

La solución fue habilitar el reenvío en la interfaz específica. No estaba habilitado por algún motivo.

sudo sysctl net.ipv4.conf.wlp3s0.forwarding=1
sudo sysctl net.ipv4.conf.wlp0s20u1.forwarding=1

información relacionada