
我有一個設備(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”路由 get,很明顯這永遠不會起作用:
$ 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
任何幫助是極大的讚賞!
編輯:簡化的解釋
我有三台設備:
- A:WiFi路由器192.168.1.1
- B:具有兩個 wifi 卡的電腦:192.168.1.1 網路上的 wlp3s0,以及 10.110.1.0/24 網路上的 wlp0s20u1。
- C:純粹使用 10.110.1.0/24 WiFi 網路的電腦。
我試圖允許 C 透過兩跳與互聯網 (0.0.0.0/0) 通信,首先到 B,然後到 A,然後到互聯網。
問題是讓 B 將封包從 wlp3s20u1 路由到 wlp3s0。
答案1
解決方案是在特定介面上啟用轉送。由於某種原因它沒有啟用。
sudo sysctl net.ipv4.conf.wlp3s0.forwarding=1
sudo sysctl net.ipv4.conf.wlp0s20u1.forwarding=1