由静态路由配置引起的ARP代理与路由迭代问题

由静态路由配置引起的ARP代理与路由迭代问题
lololowe1. 静态路由配置三要素
标准的静态路由配置需要手动指定三个要素: 目的网络、出接口和下一跳地址。
例如下面的拓扑图:
要使R1和到R3能相互通信,可以通过标准的静态路由配置实现:
1 | # R1 |
但也可以用简化的配置方式:
- 仅指定目的网络和出接口
- 仅指定目的网络和下-跳地址
两种方式都可以配置静态路由,但它们在路由表中的表现形式不同,因此对路由迭代和ARP代理的影响也不同。
2. 仅指定目的网络和出接口
1 | # R1 |
R1和R3完成上述配置后,再用ping命令测试二者的连通性,会发现R1和R3之间无法相互通信:
2.1. 分析
错误分析如下:
- R1配置了去往目的网络8.8.8.8/24的静态路由,出接口是G0/0/0,所以R1是知道如何转发目的地址是8.8.8.8的数据包的;
- R1向外发送ICMP报文,首先需要对报文进行封装,网络层中的源IP地址是6.6.6.6,目的IP地址是8.8.8.8,数据链路层中的源MAC地址是R1的G0/0/0的MAC,目的MAC地址不确定;
- 在静态路由的标准配置方式中,数据帧的目的MAC地址是静态路由下一跳地址对应的MAC。但是在上面的配置中,并没有配置下一跳地址,此时路由器会发送ARP Request报文,请求目的IP地址8.8.8.8对应的MAC地址;
- R2从G0/0/0接口收到R1的ARP Request报文后,由于G0/0/0接口的IP地址并不是ARP协议所请求的IP,因此R2会忽略这个请求(ARP不能跨网段查询MAC地址);
- 最终R1无法获取8.8.8.8对应的MAC,数据封装失败,通信无法建立。
2.2. ARP代理
在不修改静态路由的前提下,要解决这个问题,可以在R2的相关接口上开启ARP Proxy,使R2能将自己的MAC地址返回给请求方,使其能正常封装数据帧。
1 | int g0/0/0 |
完成上面的配置后,当R2收到ARP Request报文后,会查找路由表,如果请求的IP在自己的路由表项中,则使用自己的MAC地址作为该ARP请求的回应,使请求方能正常封装数据帧。如果请求的IP不在自己的路由表项中,则忽略该ARP请求,否则即使响应了自己的MAC地址,请求方将数据帧发送给R2后,R2也无法正确转发,因为R2没有去往目的网络的下一跳路由。
推荐阅读,Proxy ARP验证实验: https://blog.csdn.net/weixin_53220369/article/details/125275268
3. 仅指定目的网络和下一跳地址
取消R2的ARP Proxy配置,重新配置R1和R3的静态路由:
1 | # R1 |
完成上面的配置后再测试R1和R3的连通性,会发现R1和R3之间通信正常:
3.1. 路由迭代
上面的命令中没有指定出接口,但是R1和R3之间仍然能相互通信,这是为什么呢?原因是路由迭代在起作用。
查看R1或者R3的路由表中的静态路由条目:
可以看到,静态路由中出现了一个R标记(即Relay),代表路由迭代。也就是说,这条路由经过了路由迭代的处理过程,然后才进入了路由表中。
那么,什么是路由迭代?从静态路由的配置进行分析,由于在R1上配置的静态路由没有指定出接口,所以R1并不知道应该把匹配这条路由的数据包从哪个接口发出去,这时候,路由器会根据静态路由的下一跳地址进行迭代查询, 查询能够匹配下一跳地址的路由条目, 从而确定数据包的出接口,这个过程就叫做路由迭代。经过路由迭代处理的路由,均会带上标记R,这类路由也称为迭代路由。
在本实验中,R1根据下一跳地址6.6.6.7迭代查询到的是一条直连路由6.6.6.0/24,对应的出接口是G0/0/0,所以R1这条静态路由的出接口就是G0/0/0。
3.2. 多次路由迭代(下一跳地址非直连)
修改网络拓扑,给R3增加一个环回口,并配置IP地址9.9.9.9/32:
为了使R2能转发数据到R3的环回口,需要在R2上配置一条去往9.9.9.9/32的静态路由:
1 | ip route-static 9.9.9.9 32 G0/0/1 8.8.8.8 |
R1为了能和R3的环回口9.9.9.9通信,需要在R1上配置一条去往9.9.9.9/32的静态路由,但是这次的下一跳地址指定为8.8.8.8(R3的G0/0/0接口的IP地址),即下一跳地址非直连:
1 | ip route-static 9.9.9.9 32 8.8.8.8 |
测试R1和R3的环回口的连通性,可以看到R1和R3的环回口之间通信正常:
配置静态路由时,如果没有指定出接口,并且下一跳地址不是直连地址,则会进行多次路由迭代,直到计算出一个直连的下一跳和对应的出接口为止。而数据链路层封装的目的MAC地址是迭代查询获取到的最后一个下一跳地址对应的MAC,这个下一跳地址是路由器直连的对端,因此路由器无需启用arp-proxy功能:
注意: 实际上,这里非直连的下一跳地址不一定非得是R3的G0/0/0接口的IP地址,只要符合8.8.8.8/24这个网段即可,因为第一次迭代也是根据8.8.8.8/24这个网段进行迭代查询的,所以只要下一跳地址在这个网段中即可。