
次のルールが設定されたデバイス (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 を分析し、ping がどこに送信されているかを確認しました。
$ 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
「ルーター」コンピュータから ping を実行しない限り、wlp3s0 インターフェイスには何も表示されません。
したがって、ここでの問題は、カーネルが wlp0s20u1 から wlp3s0 へのパケットのルーティングを認識していないことです。しかし、これをどのように実行すればよいかわかりません。明示的にルートを追加してこれを実行するように指示してみましたが、うまくいかないようです。
次のようにスパムすると、事前ルーティング パケット カウンターのみが増加します (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
どのような助けでも大歓迎です!
編集: 簡略化された説明
私は3つのデバイスを持っています:
- A: 192.168.1.1 の WiFi ルーター
- B: 2 つの Wi-Fi カードを搭載したコンピューター: 192.168.1.1 ネットワーク上の wlp3s0 と 10.110.1.0/24 ネットワーク上の wlp0s20u1。
- C: 10.110.1.0/24 WiFi ネットワークにのみ接続されたコンピューター。
私は、C が最初に B、次に A、そしてインターネットの 2 つのホップでインターネット (0.0.0.0/0) と通信できるようにしようとしています。
問題は、B が wlp3s20u1 から wlp3s0 にパケットをルーティングすることです。
答え1
解決策は、特定のインターフェースで転送を有効にすることでした。何らかの理由で有効になっていませんでした。
sudo sysctl net.ipv4.conf.wlp3s0.forwarding=1
sudo sysctl net.ipv4.conf.wlp0s20u1.forwarding=1