У меня есть устройство (IP 10.110.1.3) со следующим настроенным правилом:
$ ip route
default via 10.110.1.4 dev wlan0 onlink
У меня включена пересылка ipv4 на обеих машинах. Обе машины могут общаться друг с другом.
Вот мои iptables. Я хочу маршрутизировать от интерфейса wlp0s20u1 до 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
Маршруты на устройстве "маршрутизация" 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
При использовании маршрута "if interface" становится ясно, что это никогда не сработает:
$ 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
Я заметил src 192.168.1.110
на маршруте 192.168.1.0
и попытался добавить следующий маршрут, чтобы это исправить:
$ sudo ip route add 192.168.1.1/32 dev wlp3s0
Но это тоже не помогло.
Я использовал tcpdump для анализа icmp, чтобы видеть, куда идут мои пинги.
$ 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
а также
tcpdump -i wlp3s0 -n icmp
listening on wlp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes
Ничего на интерфейсе wlp3s0, если я не пинг с компьютера "маршрутизатора".
Итак, ясно, что проблема заключается в том, что ядро не знает, как маршрутизировать пакеты от wlp0s20u1 до wlp3s0. Но я не уверен, как заставить это сделать это. Я попытался явно добавить маршруты, чтобы сказать это сделать, но, похоже, это не работает.
Если я рассылаю спам по следующему вопросу, только счетчики пакетов с предварительной маршрутизацией увеличиваются (пока выполняется попытка пинга);
$ 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
Любая помощь очень ценится!
РЕДАКТИРОВАТЬ: упрощенное объяснение
У меня есть три устройства:
- A: WiFi роутер на 192.168.1.1
- B: Компьютер с двумя картами Wi-Fi: wlp3s0 в сети 192.168.1.1 и wlp0s20u1 в сети 10.110.1.0/24.
- C: компьютер только в сети WiFi 10.110.1.0/24.
Я пытаюсь разрешить C общаться с Интернетом (0.0.0.0/0) двумя прыжками, сначала с B, затем с A, затем с Интернетом.
Проблема заключается в получении B для маршрутизации пакетов от wlp3s20u1 до wlp3s0.