最长前缀匹配问题

网络工程 路由 字首
2021-07-31 00:37:41

假设我们有两个网络 net1 = 192.24.0.0/18 和 net2 = 192.24.12.0/22 并且我们有一个目标 IP 为 192.24.12.8 的数据包。所以,根据最长前缀匹配规则,我们将这个数据包发送到net2。现在我怀疑所有与两个网络匹配的数据包都只发送到 net2,相反,可能有些实际上属于 net1。所以这不是不正确,因为我们没有发送到实际目的地吗?

3个回答

所以,根据最长前缀匹配规则,我们将这个数据包发送到net2。

那是对的。

现在我怀疑所有与两个网络匹配的数据包都只发送到 net2,相反,可能有些实际上属于 net1。

除非您有另一个更具体(更长)的路由表条目,否则这是不可能的。在任何情况下,这个问题都表明子网重叠,这是一个普遍的设计错误。

所以这不是不正确,因为我们没有发送到实际目的地吗?

路由器始终根据其路由表(或基于策略时的路由策略)进行转发。没有可能

如果您确实需要提供来自重叠网络的同时访问(包括特殊情况:两个不同但相等的网络),例如连接两个 RFC1918 网络,您将需要基于策略的路由和状态防火墙。使用有状态 fw,您可以根据接收数据包的接口标记源自这些网络的连接。使用 PBR,您可以向该接口发送响应(具体而言:您创建一个规则来将标记的数据包定向到适当的路由表,因为每个路由表都需要明确无误)。

根据您需要的连接性,即 - 如果您只想提供从重叠网络到您提供的服务的访问,或者如果您还需要向后连接,您可能还需要 NAT - 只需将其中一个网络映射到重叠范围;对于某些情况,无状态 NAT 可能就足够了。当然,从您的角度来看,其中一个网络可以在与本地实际分配不同的 IP 下访问。

(我的评论值得扩展)

IOS——至少你今天会发现的版本——不允许接口重叠:

rtr1841(config)#int loopback 10
rtr1841(config-if)#ip address 192.24.0.1 255.255.192.0
rtr1841(config-if)#int loopback 11                    
rtr1841(config-if)#ip address 192.24.12.1 255.255.252.0
% 192.24.12.0 overlaps with Loopback10

Linux——以及类似的系统(*BSD、Solaris等)——将允许它:

root@r610-b8:~# ip -4 addr
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.51.20/24 brd 192.168.51.255 scope global eno1
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.51.129/28 scope global eno2

启用 ip-forwarding 和 proxy-arp 后,此设置确实有效。该机器在桥接两个网段 (proxy-arp) 时充当路由器 (ip-forwarding)。较小网段内的节点使用 129 作为它们的路由器。较大网段内的节点将为整个 /24 的地址进行 ARP,因为网络掩码表明它是在线本地的;.20 将使用自己的 MAC 响应这些请求,并将流量转发到 /28,只要它有目的地的 MAC。

这是一个非常不受欢迎的设置™。这是 1970 年代的时代遗产结构。像这样划分和堆叠网络是不好的做法。我这样做是出于简单性和解决 openstack 开发的理智。(开发环境可能很乱)