
Tenho um dispositivo (IP 10.110.1.3) com a seguinte regra configurada:
$ ip route
default via 10.110.1.4 dev wlan0 onlink
Tenho o encaminhamento IPv4 ativado em ambas as máquinas. Ambas as máquinas podem conversar entre si.
Aqui está meu iptables. Quero rotear da interface wlp0s20u1 para 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
Rotas no dispositivo de "roteamento" 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 a rota "if interface", fica claro que isso 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
Percebi isso src 192.168.1.110
na 192.168.1.0
rota e tentei adicionar a seguinte rota para corrigir isso:
$ sudo ip route add 192.168.1.1/32 dev wlp3s0
Mas isso também não ajudou.
Usei o tcpdump para analisar o icmp para poder ver para onde estão indo meus 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
e
tcpdump -i wlp3s0 -n icmp
listening on wlp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes
Nada na interface wlp3s0, a menos que eu faça ping no computador "roteador".
Então, claramente, o problema aqui é que o kernel não sabe rotear pacotes de wlp0s20u1 para wlp3s0. Mas não tenho certeza de como fazer isso. Tentei adicionar rotas explicitamente para solicitar isso, mas parece que não funciona.
Se eu enviar spam para o seguinte, apenas os contadores de pacotes de pré-roteamento aumentam (enquanto um ping está sendo tentado);
$ 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
Qualquer ajuda é muito apreciada!
EDITAR: Explicação Simplificada
Eu tenho três dispositivos:
- R: Roteador WiFi em 192.168.1.1
- B: Computador com duas placas wifi: wlp3s0 na rede 192.168.1.1 e wlp0s20u1 na rede 10.110.1.0/24.
- C: Computador exclusivamente na rede WiFi 10.110.1.0/24.
Estou tentando permitir que C fale com a internet (0.0.0.0/0) com dois saltos, primeiro para B, depois para A e depois para a internet.
O problema é fazer com que B roteie pacotes de wlp3s20u1 para wlp3s0.
Responder1
A solução foi habilitar o encaminhamento na interface específica. Não foi ativado por algum motivo.
sudo sysctl net.ipv4.conf.wlp3s0.forwarding=1
sudo sysctl net.ipv4.conf.wlp0s20u1.forwarding=1