我有 3 台计算机:192.168.2.1、192.168.2.2、192.168.2.4 连接到无线 ad-hoc 网络。我希望来自 192.168.2.1 的所有流量在与 192.168.2.3 通信时都经过 192.168.2.2。基本上
192.168.2.1 <---> 192.168.2.2 <---> 192.168.2.3
如何更改路由表?
我试过:
[email protected]: sudo ip route add 192.168.2.3 via 192.168.2.2 dev wlan0
[email protected]: sudo ip route add 192.168.2.1 via 192.168.2.2 dev wlan0
我在 192.168.2.2 上启用转发并且它有效。但是当我从 192.168.2.1 进行跟踪路由时,看起来它直接转到 192.168.2.3。现在,我又添加了几个节点(请参见下面的 192.168.2.1 的路由表),当我执行 Traceroute 时,我仍然得到一跳。但如果我登录 192.192.2.2 并跟踪路由 192.168.2.5,它会给出正确的跳数。
**ROUTE TABLE OF 192.168.2.1**
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 202 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 303 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
192.168.2.3 192.168.2.2 255.255.255.255 UGH 0 0 0 wlan0
192.168.2.4 192.168.2.2 255.255.255.255 UGH 0 0 0 wlan0
192.168.2.5 192.168.2.2 255.255.255.255 UGH 0 0 0 wlan0
**ROUTE TABLE OF 192.168.2.2**
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 303 0 0 wlan0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
192.168.2.4 192.168.2.3 255.255.255.255 UGH 0 0 0 wlan0
192.168.2.5 192.168.2.3 255.255.255.255 UGH 0 0 0 wlan0
节点是否可以进行一些缓存?
编辑;我现在总共有 10 个节点,这是我的跟踪路由的输出
traceroute -4 192.168.2.10
traceroute to 192.168.2.10 (192.168.2.10), 30 hops max, 60 byte packets
1 192.168.2.2 (192.168.2.2) 10.140 ms 10.324 ms 10.398 ms
2 192.168.2.3 (192.168.2.3) 17.292 ms 17.483 ms 17.564 ms
3 192.168.2.4 (192.168.2.4) 25.646 ms 25.708 ms 26.110 ms
4 192.168.2.5 (192.168.2.5) 34.156 ms 34.416 ms 34.501 ms
5 192.168.2.6 (192.168.2.6) 44.131 ms 44.479 ms 44.560 ms
6 192.168.2.7 (192.168.2.7) 51.382 ms 43.074 ms 46.144 ms
7 192.168.2.8 (192.168.2.8) 46.129 ms 43.374 ms 53.956 ms
8 192.168.2.9 (192.168.2.9) 58.156 ms 83.625 ms 83.642 ms
9 192.168.2.10 (192.168.2.10) 83.565 ms 84.008 ms 89.355 ms
答案1
您的路由器可能会告诉其他路由器直接发送 ICMP 重定向数据包。由于它们都位于同一网络上,因此它知道这应该是可能的。
我在三台 Linux 机器 (mach1 <-> mach3 <-> mach2) 之间设置了像您一样的路由,并使用 ping 进行了测试:
mach1# ping mach2
PING mach2 (x.x.x.237) 56(84) bytes of data.
From mach3 (x.x.x.238): icmp_seq=1 Redirect Host(New nexthop: mach2 (x.x.x.237))
64 bytes from mach2 (x.x.x.237): icmp_seq=1 ttl=63 time=0.537 ms
mach3 和 mach2 上的 Tcpdump 显示 mach3 发送重定向到 mach1,之后所有流量直接在 mach1 和 mach2 之间传输。
重定向可能被认为有点可疑,因为可以以相反的方式使用重定向:通过第三台机器(中间人)发送流量。参见例如https://askubuntu.com/questions/118273/what-are-icmp-redirects-and-should-they-be-blocked
发送和接收重定向可以通过一些 sysctl 来控制:
net.ipv4.conf.*.accept_redirects
net.ipv4.conf.*.send_redirects
在路由器上将 net.ipv4.conf.eth0.send_redirects 设置为零并重置路由后,我让所有流量都通过 mach3。
现在,我在交换网络(以及虚拟机)上对此进行了测试,因此我不确定在 WLAN 上是否会改变情况。如果机器只处理发往其以太网地址的帧,我认为不应该这样做。但从理论上讲,有可能从空中摘取每一帧。
答案2
首先,这听起来像是一个XY问题。你想做什么?我确信以这种方式路由网络流量不太可能成为解决您的问题的好方法。
话说回来,
您的路由表仍然有 的路由192.168.2.0/24
。这意味着192.168.2.1
有两条路由到达192.168.2.2
,因此内核路由子系统会考虑这两条路由,发现一条是直接路由,另一条不是,并使用直接路由(因为这应该更便宜)。
如果您不希望这样,您有两种选择:
- 删除 的路由表条目
192.168.2.0/24
。这确实意味着您必须为以下内容创建路由表条目全部网络上的主机——包括您想要直接访问的主机。 - 创建两个 /24 网络范围,并为当前属于这两个范围的 IP 地址的主机提供
192.168.2.2
(不需要单独的网络接口)。然后,您可以让所有其他主机通过该主机路由数据包。
不过,我再次不确定这是最好的前进方式。请解释一下您想要实现的目标是什么。