通过Linux路由表ping不工作[OR]这是如何预期的?

总之问题很长:

ping r1-r4-r2路径使用10.0.1.*10.0.2.* IP地址,但如果我们使用1.0.0.*1.0.1.* IP将路径更改为r1-r3-r2 ,则失败地址为完全相同的数据包(除了数据包的srcdst IP字段分别从s1s210.*更改为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?

    下一篇: Is Content Security Policy forward compatible?