
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.110
en la 192.168.1.0
ruta 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