通过Linux路由表ping不工作[OR]这是如何预期的?
总之问题很长:
ping r1-r4-r2
路径使用10.0.1.*
或10.0.2.*
IP地址,但如果我们使用1.0.0.*
或1.0.1.*
IP将路径更改为r1-r3-r2
,则失败地址为完全相同的数据包(除了数据包的src
和dst
IP字段分别从s1
和s2
从10.*
更改为1.*
,反之亦然)。 为什么?
问题详细:
我有一个小的拓扑如下
h1 -- s1 -- r1 -- r4 -- r2 -- s2 -- h2
/
/
/
r3
在s
的是OpenvSwitch情况而r
的是Ubuntu的16台Linux机器。
IP地址是:
h1-eth0 - 10.0.1.10/24
s1 - 10.0.1.50/24
h2-eth0 - 10.0.2.10/24
s2 - 10.0.2.50/24
r1-eth0 - 10.0.1.1/24
r1-eth1 - 10.0.11.2/24
r1-eth2 - 10.0.12.2/24
r2-eth0 - 10.0.2.1/24
r2-eth1 - 10.0.13.1/24
r2-eth2 - 10.0.5.1/24
r3-eth0 - 10.0.12.1/24
r3-eth1 - 10.0.5.2/24
r4-eth0 - 10.0.11.1/24
r4-eth1 - 10.0.13.2/24
如您所见,r1和r2之间有两条相似的路径。 我添加下面的静态条目。
R1
sudo ip route add 10.0.2.0/24 via 10.0.11.1
R2
sudo ip route add 10.0.1.0/24 via 10.0.13.2
R4
sudo ip route add 10.0.1.0/24 via 10.0.11.2
sudo ip route add 10.0.2.0/24 via 10.0.13.1
h1和h2之间的ping按预期工作。 现在,由于交换机是OVS(因此支持OpenFlow),我在s1中安装条目以将目标IP映射到不同的子网。
即IP 10.0.1.10将映射到1.0.0.10,而IP 10.0.2.10映射到1.0.1.10时,在s1接收到这样的数据包,而目标IP将在s2映射回原来的数据。
(我已经检查过这些条目确实是正确的,并且按照预期工作,并且我已经添加了这个条目只是为了匹配ICMP数据包)。 当h1发送ping回复时,将执行类似的过程。
除此之外,我在路由器中安装静态路由以路由这些IP。
R1
sudo ip route add 1.0.0.0/24 via 10.0.1.50
sudo ip route add 1.0.1.0/24 via 10.0.12.1
R2
sudo ip route add 1.0.0.0/24 via 10.0.5.2
sudo ip route add 1.0.1.0/24 via 10.0.2.50
R3
sudo ip route add 1.0.0.0/24 via 10.0.12.2
sudo ip route add 1.0.1.0/24 via 10.0.5.1
现在,如果我从h2 ping h1,数据包从目标IP 10.0.1.10开始,它在s2映射到1.0.0.10,r2路由此并将其发送到r3,r3将其路由并发送到r1。 但是r1,即使在一个接口上接收到数据包并且在Linux路由表中具有匹配条目后,也不会路由和转发数据包。
即使ip route get
也会输出数据包应该转发到的正确端口。 ip tables
中也没有防火墙条目。
一些额外的信息:
如果我更改新添加的路由条目以使用r1-r4-r2
的原始路径(即,我们使用映射IP的路径在此路径上),它将按预期运行,并且ping按预期工作。
或者,如果我在r1和更改10.0.2.0/24的旧路由条目
在r2中的10.0.1.0/24(现在理想情况下甚至不需要与新分组匹配,因为它们的目的地IP在1.0.0。*范围或仅1.0.1。*中)使用新路径r1-r3-r4
以及这个映射的IP数据包,r2和r1之间的ping按预期工作。
可能需要的详细信息:
最终的路由表如下:
R1
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.11.1 0.0.0.0 UG 0 0 0 eth1
1.0.0.0 10.0.1.10 255.255.255.0 UG 0 0 0 eth0
1.0.1.0 10.0.12.1 255.255.255.0 UG 0 0 0 eth2
10.0.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
10.0.2.0 10.0.11.1 255.255.255.0 UG 0 0 0 eth1
10.0.11.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
10.0.12.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
R2
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.13.2 0.0.0.0 UG 0 0 0 eth1
1.0.0.0 10.0.5.2 255.255.255.0 UG 0 0 0 eth1
1.0.1.0 10.0.2.50 255.255.255.0 UG 0 0 0 eth0
10.0.1.0 10.0.13.2 255.255.255.0 UG 0 0 0 eth1
10.0.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
10.0.5.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
10.0.13.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
R3
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.5.1 0.0.0.0 UG 0 0 0 eth1
1.0.0.0 10.0.12.2 255.255.255.0 UG 0 0 0 eth0
1.0.1.0 10.0.5.1 255.255.255.0 UG 0 0 0 eth1
10.0.1.0 10.0.12.2 255.255.255.0 UG 0 0 0 eth0
10.0.2.0 10.0.5.1 255.255.255.0 U 1 0 0 eth1
10.0.5.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
10.0.12.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
R4
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth4
1.0.0.0 10.0.11.2 255.255.255.0 UG 0 0 0 eth0
1.0.1.0 10.0.13.1 255.255.255.0 UG 0 0 0 eth1
10.0.1.0 10.0.11.2 255.255.255.0 UG 0 0 0 eth0
10.0.2.0 10.0.13.1 255.255.255.0 UG 0 0 0 eth1
10.0.11.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
10.0.13.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
192.168.0.0 0.0.0.0 255.255.255.0 U 1 0 0 eth4
注意:192.168.0。*是连接到外部Internet的子网。
你认为是什么问题? 我完全不解这个问题。
这里的Linux路由行为和预期的一样。
反向路径过滤器的标志
即默认情况下/proc/sys/net/ipv4/conf/<interfacename>/rp_filter
已打开(通过将值设置为1)。
提供反向路径过滤器作为Linux内核的安全功能。 一个常见的例子是私有IP空间逃到互联网上。 如果你有一个路由为195.96.96.0/24的接口,你不希望212.64.94.1的数据包到达那里。 因此,如果标志被设置为1,那么内核会丢弃这样的数据包。
更正式地说,
反向路径过滤是Linux内核采用的一种机制,用于检查接收到的数据包的源IP地址是否可路由。
换句话说,当启用了反向路径过滤的机器接收到一个数据包时,机器将首先检查接收数据包的源是否可以通过它所进入的接口到达。
最新的内核提供了更多的选项值2.这个选项在接受流量方面稍微宽松一些。
如果接收到的数据包的源地址可通过机器上的任何接口进行路由,则机器将接受数据包。
首先你的拓扑细节不完整,你缺少r3和r4的细节,但可以推断它们。
我只是试图解释需要发生的事情,而不是试图解决你的问题。 然而,如果你只是使用像OSPF这样的路由协议,设计这个路由协议可以让这个过程变得简单,所以你不必亲自去做。
每个路由设备都需要知道如何访问其他每个子网。 因此,这意味着您可以添加默认路由(即匹配0.0.0.0/0的路由),也可以在每个子网中输入相应的next-ip到每个路由器(见下文)。 通常,您不需要为连接的子网添加路由(IE在该子网中的该路由器上具有IP)
R1路线
10.0.13.0/24 -> 10.0.11.1
10.0.5.0/24 -> 10.0.11.1
10.0.2.0/24 -> 10.0.11.1
R2路线
10.0.1.0/24 -> 10.0.13.2
10.0.12.0/24 -> 10.0.13.2
10.0.11.0/24 -> 10.0.13.2
R3路线
10.0.1.0/24 -> 10.0.12.2
10.0.11.0/24 -> 10.0.12.2
10.0.13.0/24 -> 10.0.5.1
10.0.2.0/24 -> 10.0.5.1
R4路线
10.0.1.0/24 -> 10.0.11.2
10.0.12.0/24 -> 10.0.11.2
10.0.2.0/24 -> 10.0.13.1
10.0.5.0/24 -> 10.0.13.1
对于设备H1,S1,H2和S2,它们应具有指向网关10.0.1.1和10.0.2.1的默认路由。
要做到这一点,请在所有机器上使用它:
# for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
> echo 0 > $i
> done
或者在/etc/sysctl.conf
输入以下内容
net.ipv4.conf.all.rp_filter = 0
rp_filter会以三种模式过滤数据包:0禁用,1严格和2松散。
例
Client A - 192.168.2.10 - connected to router via eth0
Router
eth0 - 192.168.2.150
routes - 192.168.2.0/24
eth1 - 10.42.43.1
routes - 10.42.43.0/24
注意:没有默认路由
Client C - 10.42.43.50 - connected to router via eth1
在设置为“松散模式”的路由器上使用此设置和rp_filter(2)将阻止从1.2.3.4到10.42.43.50的eth0上的数据包。
如果路由器上的rp_filter设置为“严格模式”(1),来自源地址10.42.43.2的eth0上的数据包将被阻止。
当设置为“禁用”(0)时,两个数据包都会通过。
链接地址: http://www.djcxy.com/p/94185.html上一篇: Ping via linux routing table not working [OR] how is this expected?