前言
前一阵子解决了一个困扰很久的一个问题,这个问题一直存在,终于下定决心去给解决了,解决完之后 觉得so easy , 不过如此。所以总结一下解决问题的过程,以后不一定遇到同样的问题,但是总结经验教训总是给有一些思考、启发。
问题
当初是做的一个SDWAN,客户的CPE有一个网段是169.254.X.X,需要通过 VPN、OSPF、BGP等组网。最终使我们的CPE设备能学到客户的LAN网段。这个组网之前在公司已经验证过好多遍了,不会有问题,但是一到客户的环境上客户CPE网段路由就学不过来。
当时也看了下没有头绪,配置完全正确,无奈之下,找了部门的技术领导,领导平时特别忙,研究很多项目,找他之后,也没时间好好看,他就给提供了下规避方法,在我们的CPE上去掉之前的默认路由(出接口是WAN),配置新的默认路由,出接口是VPN接口,这样测试业务时是通的。第一次测试就这样过去了。
测试完成就去忙其他项目了,半年之后开始第二次测试,这次测试,场景更完善一些,需要上网,也需要有VPN业务,这样我们之前配的默认路由就不行,后来就又配置了一条路由以及规则,就这样过去了。
第三次测试来了,要求设备邮寄到现场,人家自己测试,我一下子就慌了,觉得这个事情必须要解决了。自己搞了一番没有思路,去寻求了对其他部门动态路由协议比较熟悉的同事帮忙,通过日志,发现如果重发布169.254.X.X网络没有重发布过去,但是换成其他网段就正常。这就是为什么在公司答得环境一直没有问题,问题就出在客户的CPE LAN网段是169.254.x.x。
问题的解决
知道问题出在哪儿之后,就回去自己找为什么169.254.x.x没有发布过去。首先,这个网段是很特殊的:
169.254.x.x 网段是一个特殊的私有IP地址范围,通常用于自动配置IP地址的情况,特别是在没有DHCP服务器可用时。这个地址范围属于IPv4中的APIPA(Automatic Private IP Addressing)地址,也被称为“链接本地地址”或“零配置IP地址”。
以下是关于169.254.x.x 网段的一些特点和用途:
-
自动配置:当设备在网络上启动时,如果没有分配到有效的IP地址(例如,没有DHCP服务器可用),它会尝试自动配置一个169.254.x.x 地址,以便能够在本地网络中通信。
-
本地通信:这些IP地址通常只能在本地网络内部使用,无法直接连接到Internet或其他外部网络。它们被设计为一种局域网内的通信手段。
-
限制:这些IP地址范围内的地址不能被路由到Internet上,因此只能用于本地网络内部的通信。这也确保了它们不会与公共互联网上的其他设备产生冲突。
-
通信受限:设备使用APIPA地址进行通信时,其通信范围通常受限于本地网络。这意味着设备只能与同一子网内的其他设备进行通信。
总的来说,169.254.x.x 网段是一种用于本地网络自动配置的机制,确保设备在没有有效IP地址分配的情况下仍然能够在局域网内部通信。然而,请注意,这些地址不适用于连接到广域网或互联网上。
既然这个网段这么特殊,客户那边环境的CPE得lan就不应该是这个网段。然后开始跟客户协商,对接的是一个技术支持,他去咨询了他们的研发说,他们就会有这种情况,就得给重发布过去。
好吧,沟通失败,谁让人家是甲方呢,我就只能吭哧吭哧想办法让他能够重发布。查询FRR中关于重发布代码,啃了半天,发现果然有一个地方给过滤了:
if (IPV4_NET127(addr) || IN_CLASSD(addr) || IPV4_LINKLOCAL(addr))
return 0;
这个判断时ipv4是否为一个特殊的地址:
-
IPV4_NET127(addr):这个条件判断是否是IPv4地址的回环地址(Loopback address),也就是127.0.0.0/8地址范围内的地址。回环地址通常用于本地测试和通信。
-
IN_CLASSD(addr):这个条件判断是否是IPv4的组播地址(Multicast address)。IPv4的组播地址范围是224.0.0.0到239.255.255.255,用于多点通信,其中包括一些保留的组播地址用于特定目的。
-
IPV4_LINKLOCAL(addr):这个条件判断是否是IPv4的链路本地地址(Link-local address)。链路本地地址通常用于同一物理网络中的设备之间的通信,范围是169.254.0.0/16。
终于找到了祸根,就是IPV4_LINKLOCAL(addr)
这个玩意儿,看见它我气的牙痒痒,赶紧把他给解决了。解决掉了困扰了近一年的问题。
没有什么问题是不能通过分析问题原因,查看源码去解决的!!!
认知决定思维,思维决定行为,行为决定结果