
Ich habe ein Gerät (IP 10.110.1.3) mit der folgenden Regel eingerichtet:
$ ip route
default via 10.110.1.4 dev wlan0 onlink
Ich habe auf beiden Rechnern die IPv4-Weiterleitung aktiviert. Beide Rechner können miteinander kommunizieren.
Hier sind meine iptables. Ich möchte von der Schnittstelle wlp0s20u1 zu wlp3s0 routen:
$ 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
Routen auf dem „Routing“-Gerät 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
Wenn Sie die Route „if interface“ abrufen, ist klar, dass dies nie funktionieren wird:
$ 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
Mir ist das src 192.168.1.110
auf der 192.168.1.0
Route aufgefallen und ich habe versucht, die folgende Route hinzuzufügen, um das Problem zu beheben:
$ sudo ip route add 192.168.1.1/32 dev wlp3s0
Aber auch das hat nichts geholfen.
Ich habe TCPdump zur ICMP-Analyse verwendet, damit ich sehen kann, wohin meine Pings gehen.
$ 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
Und
tcpdump -i wlp3s0 -n icmp
listening on wlp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes
Auf der wlp3s0-Schnittstelle passiert nichts, sofern ich nicht vom „Router“-Computer aus pinge.
Das Problem hier ist also eindeutig, dass der Kernel nicht weiß, wie er Pakete von wlp0s20u1 an wlp3s0 weiterleiten soll. Aber ich bin nicht sicher, wie ich ihn dazu bringen kann. Ich habe versucht, explizit Routen hinzuzufügen, um ihm dies mitzuteilen, aber es scheint nicht zu funktionieren.
Wenn ich Folgendes spamme, steigen nur die Prerouting-Paketzähler (während ein Ping-Versuch unternommen wird);
$ 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
Jede Hilfe wird sehr geschätzt!
EDIT: Vereinfachte Erklärung
Ich habe drei Geräte:
- A: WLAN-Router unter 192.168.1.1
- B: Computer mit zwei WLAN-Karten: wlp3s0 im Netzwerk 192.168.1.1 und wlp0s20u1 im Netzwerk 10.110.1.0/24.
- C: Computer ausschließlich im WLAN-Netzwerk 10.110.1.0/24.
Ich versuche, C die Kommunikation mit dem Internet (0.0.0.0/0) über zwei Hops zu ermöglichen, zuerst mit B, dann mit A und dann mit dem Internet.
Das Problem besteht darin, B dazu zu bringen, Pakete von wlp3s20u1 an wlp3s0 weiterzuleiten.
Antwort1
Die Lösung bestand darin, die Weiterleitung auf der entsprechenden Schnittstelle zu aktivieren. Aus irgendeinem Grund war sie nicht aktiviert.
sudo sysctl net.ipv4.conf.wlp3s0.forwarding=1
sudo sysctl net.ipv4.conf.wlp0s20u1.forwarding=1