通过默认路由从一台服务器转发 IP

通过默认路由从一台服务器转发 IP

我有一台设备(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 

任何帮助是极大的赞赏!

编辑:简化解释

我有三台设备:

  • 答: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

相关内容