
Я пытаюсь установить сетевой маршрут от моего ноутбука к другому устройству. Признаю, что мой сетевой опыт недостаточен, поэтому извините за невежество. У меня следующая настройка:
[Устройство-A] <--WiFi--> [маршрутизатор] <--WiFi--> [Устройство-B] <--Ethernet--> [Устройство-C]
У меня есть следующие IP-адреса (которые были настроены автоматически):
Устройство-А:
- Wi-Fi: 192.168.0.155
Устройство-B:
- Wi-Fi: 192.168.0.121
- Ethernet: 10.42.0.1
Устройство-C:
- Ethernet: 10.42.0.134
Все устройства используют Ubuntu 20.04. Я настроил проводное соединение между Device-B и Device-C на Device-B с помощью графического интерфейса сетевого менеджера, установив метод IPv4 на «Share to other computers». Все остальные настройки были оставлены по умолчанию. На Device-A я попытался установить маршрут к Device-C с помощью:
sudo ip route add 10.42.0.0/24 via 192.168.0.121 dev wlo1
Устройство-C может пинговать Устройство-A, а Устройство-A может пинговать Устройство-B по адресам 192.168.0.121 и 10.42.0.1. Однако, когда я пытаюсь пинговать Устройство-C с Устройства-A, я получаю:
$ ping 10.42.0.134
PING 10.42.0.134 (10.42.0.134) 56(84) bytes of data.
From 192.168.0.121 icmp_seq=1 Destination Port Unreachable
Как настроить устройства так, чтобы Устройство-A могло общаться с Устройством-C? Это кажется чем-то довольно простым, но я не смог разобраться.
Обновлять
Пересылка включена на B
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Вот мои iptables
наборы правил для B:
$ sudo iptables -L -n -v
Chain INPUT (policy ACCEPT 20319 packets, 21M bytes)
pkts bytes target prot opt in out source destination
6 2236 ACCEPT udp -- eth0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
12 863 ACCEPT udp -- eth0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
193 33179 ACCEPT all -- * eth0 0.0.0.0/0 10.42.0.0/24 state RELATED,ESTABLISHED
201 19734 ACCEPT all -- eth0 * 10.42.0.0/24 0.0.0.0/0
0 0 ACCEPT all -- eth0 eth0 0.0.0.0/0 0.0.0.0/0
9 756 REJECT all -- * eth0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- eth0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 18275 packets, 2577K bytes)
pkts bytes target prot opt in out source destination
$ sudo iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 577 packets, 172K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 59 packets, 4904 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 476 packets, 67069 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 468 packets, 65733 bytes)
pkts bytes target prot opt in out source destination
178 14264 MASQUERADE all -- * * 10.42.0.0/24 !10.42.0.0/24
Я не настраивал никаких правил брандмауэра на B.
решение1
Проблема была в iptables
наборе правил на устройстве B (спасибо Томасу за помощь в комментариях).
Как показано в вопросе в выводе
sudo iptables -L -n -v
, вы можете видеть, что пакеты, проходящие через B, отклоняются вместо того, чтобы пересылаться на eth0 (показано как четвертая запись под "Chain FORWARD" в вопросе). Я смог вывести список всех правил пересылки с помощью команды iptables -S
:
$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT
-A FORWARD -d 10.42.0.0/24 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.42.0.0/24 -i eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth0 -j ACCEPT
-A FORWARD -o eth0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth0 -j REJECT --reject-with icmp-port-unreachable
Из вывода видно, что последние два правила создают проблему. Я удалил их, используя следующее:
sudo iptables -D FORWARD -o eth0 -j REJECT
sudo iptables -D FORWARD -i eth0 -j REJECT
Теперь я могу выполнить ping/ssh на Устройство-C с Устройства-A и наоборот.