如图1-4的拓扑中, R1去往R4的10.1.1.0/24网段,可以配置静态路由并以R2的fa0/1接口的IP地址为下一跳,但当R2的fa0/1端口为down时,需手动把静态路由切换到R3的fa0/1接口的IP地址,反之亦然。
当链路数量很大时,在静态路由中关联直连网段中的下一跳地址,配置工作将非常巨大。此时可以在静态路由中关联非直连网段中的下一跳地址。例如当R1要访问R4上的直连网段10.1.1.0/24时,可以将R1的静态路由直接关联R4的fa0/0接口的IP地址 (ip route 10.1.1.0 255.255.255.0 fa0/0 200.2.2.4)。但是,R1上没有去往200.2.2.0/24网段的路由,所以关联200.2.2.2为下一跳地址的去往10.1.1.0/24的静态路由是无法使用的。
基本环境配置与分析
R1
conf t
hostname R1
int fa0/1
ip add 100.1.1.1 255.255.255.0
no shut
exit
ip route 10.1.1.0 255.255.255.0 fa0/1 200.2.2.4 /配置去往10.1.1.0/24网段的路由并直接关联R4的fa0/0接
口的IP地址
R2
conf t
hostname R2
int fa0/1
ip add 100.1.1.2 255.255.255.0
no shut
int fa0/0
ip add 200.2.2.2 255.255.255.0
no shut
exit
ip route 10.1.1.0 255.255.255.0 fa0/0 200.2.2.4 /配置去往10.1.1.0/24网段的静态路由
R3
conf t
hostname R3
int fa0/0
ip add 200.2.2.3 255.255.255.0
no shut
int fa0/1
ip add 100.1.1.3 255.255.255.0
no shut
exit
ip route 10.1.1.0 255.255.255.0 fa0/0 200.2.2.4
R4
conf t
hostname R4
int fa0/0
ip add 200.2.2.4 255.255.255.0
no shut
int lo0
ip add 10.1.1.1 255.255.255.0
no shut
exit
ip route 1.1.1.0 255.255.255.0 fa0/0 200.2.2.2 /配置去往1.1.1.0/24网段的静态路由
查看R1路由表
从路由表中可以得知,R1想要发送报文给10.1.1.0/24网段,则先需要把报文发给下一跳地址200.2.2.4,而下一跳地址所在的网段不与R1直连且R1没有去往200.2.2.0网段的路由条目。R1目前只知道想要把报文发送给下一跳地址所在的200.2.2.0网段需通过fa0/1接口发出。由于R1的fa0/1是在MA(多路访问)网段,当前发给哪一个下一跳地址可以到达200.2.2.0网段还处于未知状态,所以这时候路由器会发送ARP请求以获取200.2.2.4的MAC信息。
在R1,R2和R3上开启debug arp,以验证ARP请求是否从R1发出并分别被R2和R3成功接收:
在R1上ping 10.1.1.1
从图1-5可以得知,结果R1无法ping通10.1.1.1,但是伴随着ping包R1发送了ARP请求。原因是R1要访问目的地址10.1.1.1需要先拥有访问下一跳地址200.2.2.4所在的网段路由条目,而R1没有去往200.2.2.0/24网段的路由,所以需要发送ARP请求以获取下一跳地址200.2.2.4所对应的MAC地址:
图1-5
由于思科路由器默认情况下所有的接口是开启代理ARP的,所以R2和R3都能接收到来自于R1的ARP请求。疑问:在此环境中,R2和R3是否会给R1返还ARP应答?
分析:代理ARP满足下列条件时才会生效
当一个路由器的接口收到ARP请求时,请求者和被请求者不在同一个网段中(R1的f0/1接口和R4的f0/0接口不在同一网段中)
收到ARP请求的路由器需要拥有去往源和目的网段的路由条目 (R2和R3同时拥有100.1.1.0/24网段和200.2.2.0/24网段的路由条目)
接口的代理ARP功能为开启状态
结论:R2和R3都会给R1返还ARP应答,且用自己的fa0/1接口的MAC地址为R1作出相对的应答。
查看R2和R3的debug arp信息以验证:
从图中可以看出R2和R3分别用自己的fa0/1接口的MAC地址对R1所发出关于200.2.2.4的ARP请求作出应答。
查看R2和R3的fa0/1接口的MAC信息以验证以上的结论:
从接口的基本信息中发现R2和R3的fa0/1接口的MAC地址分别对应其ARP reply中所使用的MAC地址。
在跨网段的通信的环境中,当一台PC收到一条ARP应答,PC将无条件地接受此ARP应答且加入ARP缓存列表中,然后PC就利用ARP表项发送数据包给其他节点。
但是R1收到的ARP应答却被过滤,根据其debug输出结果原因为wrong cable,其实际原因是对于PC终端,如果收到了路由器传递的Proxy-ARP Reply,则该PC会无条件信任这个Reply,并且将其加入ARP表中。
而对于路由器,如果该设备收到了Proxy-ARP Reply, 则该路由器会优先判断该Reply中应答者IP地址所在的网段是否可达,如果是则接收,如果不是则直接丢弃。
虽然该ARP是由R2和R3代替R4应答R1,但应答者的源地址是200.2.2.4。由于R1没有去往200.2.2.0/24网段的路由条目,所以R1直接把收到的所有ARP应答丢弃。
假设R1能够接收由R2或R3发来的ARP Reply报文并加入其ARP表中,那么R1将可以ping通10.1.1.1
换言之,R1如果要能够使用ip route 10.1.1.0 255.255.255.0 fa0/1 200.2.2.4这条静态路由条目,那么首先要保证R1能够信任由R2和R3发送的ARP Reply并且加入ARP表。因为当R1发包给目的网段时,数据包将先发给R2或者R3,而R2和R3拥有去往下一跳地址所在网段的路由条目,可以帮助R1把报文转发至R4。
要让R1可以信任由R2和R3发来的ARP Reply,只有在R1上手工添加一条去往200.2.2.0/24网段的静态路由。
在R1上配置
ip route 200.2.2.0255.255.255.0 fa0/1 100.1.1.2
加了这条去往200.2.2.0/24网段的静态路由以后,R1就可以信任并接收R2和R3发来的ARP应答且加表。
验证:
在R1上ping 10.1.1.1
由于R1要发包给目的网段10.1.1.1之前需要先把数据包发送给下一跳地址200.2.2.4,但是R1没有200.2.2.4的ARP信息,所以R1先要发送ARP请求以获悉200.2.2.4的MAC地址,因此R1收到两条ARP应答,一条来自于R2,另外一条来自于R3。R1会把最后收到的ARP条目将加入缓存表,所以R1将会把下一跳地址200.2.2.4所对应的R2的fa0/1接口的MAC地址或者R3的fa0/1接口的MAC地址加入ARP表,查看R1的ARP缓存:
从R1的ARP缓存表中得知,R1收到的最后一个ARP应答包来自R2 (因为200.2.2.4所对应的MAC地址属于R2的fa0/1接口),当R1再次使用静态路由ip route 10.1.1.0 255.255.255.0 fa0/1 200.2.2.4发包时,交换机将一直把从R1的fa0/1接口发出的报文转发给R2,再由R2转发给R4。
查看R1的路由表:
静态路由200.2.2.0/24 [1/0] via 100.1.1.2 FastEthernet0/1是告知路由器怎样发包给静态路由10.1.1.0所关联的下一跳地址,如果去往10.1.1.0网段的静态路由 (10.1.1.0 [1/0] via 200.2.2.4, FastEthernet0/1)称为主路由,则静态路由200.2.2.0/24 [1/0] via 100.1.1.2FastEthernet0/1就是为了解析主路由的递归路由。
递归路由的主要作用就是为了让R1收到关于去往目的网络的下一跳地址的ARP应答时认为该ARP应答是可信任的。但是递归路由中所关联的下一跳地址并不影响R1发送报文给10.1.1.0/24目的网络的路径选择。正真影响R1去往R4上10.1.1.0/24网段的路径选择的是ARP表中所解析到的关于主路由中下一跳地址200.2.2.4所对应的ARP表项。换言之,如果收到的ARP Reply是对应R2的fa0/1接口的MAC地址,则数据包将往R2转发。如果收到的ARP Reply是对应R3的fa0/1接口的MAC地址,则数据包将往R3进行转发。当R1发送ARP请求时,R2和R3都会进行应答,R1将会把最后收到的那条ARP Reply条目加入ARP缓存表中。
结论:R1发包给主路由的下一跳地址是基于ARP表项而非递归路由中的下一跳。ARP条目存活时间为4小时。
验证:R1主路由10.1.1.0 [1/0] via 200.2.2.4 FastEhternet0/1的路径选择是基于ARP表项而非递归路由的下一跳地址。
关闭R2的fa0/0和fa0/1接口:
int fa0/0
shutdown
int fa0/1
shutdown
此时在R1上ping 10.1.1.1是无法ping通的,原因是R1去往10.1.1.0/24网段的路由走的是R2这条路径,查看R1的ARP表项:
之前从R2接收到的对应200.2.2.4的ARP条目依然存在。
现在先在R1上删除静态路由ip route 200.2.2.0 255.255.255.0 fa0/1 100.1.1.2,然后再添加一条以100.1.1.3为下一跳的去往200.2.2.0/24网段的静态路由,以验证R1发往R4直连的10.1.1.0/24网段的路径选择是否与递归路由中下一跳有关。
R1配置
ip route 200.2.2.0 255.255.255.0 fa0/1 100.1.1.3
然后再次在R1上ping 10.1.1.1
结果是R1并没有将去往10.1.1.0/24网段的数据包转发给R3,ping失败。
疑问:是否是因为R4没有在去往100.1.1.0/24网段的静态路由中关联下一跳地址200.2.2.3,造成R4无法回包给R3?
为了公平起见,在R4上新增一条去往100.1.1.0/24的静态路由,并关联200.2.2.3位下一跳地址:
ip route100.1.1.0 255.255.255.0 fa0/0 200.2.2.3
在R4上开启debug ip packet detail和debug ip icmp, 并且再次ping 10.1.1.1
如果在R4上没有弹出任何debug报文信息,则上述结论是正确的:
R4没有收到任何报文,则说明即使R1上的递归路由下一跳指向R3的fa0/1的IP地址,但由于ARP表项中下一跳地址200.2.2.4仍然对应R2的ARP Reply条目(即R2的fa0/1接口的MAC地址),所以R1仍然会选择通过R2转发报文至目的网段。因此静态路由中的递归路由的下一跳地址不会影响主路由的路径选择。
静态路由的链路冗余实例:以图1-4为网络环境,利用递归路由做R1去往10.1.1.0/24网段的冗余备份链路,当R2的链路为down,自动切换至R3。反之亦然。
分析
ARP请求的发送原理:一个路由器中如果已经拥有目标IP地址所对应的ARP表项,除非该表项消失,否则该路由器将不会再为该目标IP地址做ARP请求。
如果R1去往10.1.1.0/24网段所关联的下一跳IP是R2的f0/1接口的IP地址,即使R2的接口down了,也不会影响R1任何路由信息的改变。只要静态路由所在的R1路由器的出站接口fa0/1为up,该路由条目就会依然存在。即R1的主路由,递归路由和ARP表项都不会发生变化,R1会根据原始的ARP表项发包,将数据包发给R2。
即使之前将去往目的网段10.1.1.0/24的下一跳地址改为R3的fa0/1的IP地址100.1.1.3,R1仍然不会把数据包转发给R3。
只有当ARP条目失效(4小时以后),R1删除之前接收到的从R2发来的关于去往10.1.1.0/24网段的下一跳地址200.2.2.4对应的ARP表项。R1才会再次针对主路由重新开始发送ARP请求,由于R2已经down,所有只有R3回复ARP请求,R1将R3所发送过来的ARP Reply加入ARP表,此时才会将去往目的网络10.1.1.0/24转发给R3。R1的ARP表项中200.2.2.4所映射的MAC地址将会是R3的fa0/1接口的MAC地址。
要等待长达4小时才能实现路径切换,在现实应用环境中是无法接受的。
由于递归路由中的下一跳地址不影响主路由的选路,而影响选路的仅仅是ARP表项(使用最后接收到的ARP应答条目,若最后收到的是R2的ARP Reply,则往R2转发数据包。如果最后收到的是R3的ARP Reply,则往R3转发数据包)。为了加快冗余备份链路的切换,可以通过缩短ARP的失效时间来实现,在R1上配置如下:
(为了提高论证的准确性,最好将R1的递归路由下一跳仍然改为100.1.1.2:
ip route 200.2.2.0 255.255.255.0 fa0/1 100.1.1.2)
int fa0/1
arp timeout 10 /设置ARP条目在ARP表中失效时间为10秒
10秒以后查看R1的arp表
此时200.2.2.4所对应的arp表项已经消失。
在R1上打开debug arp,并且ping 10.1.1.1,将会再次触发R1发送关于200.2.2.4的ARP请求。由于此时R2已经down,所以R1只会收到R3发来的ARP Reply。
注:在边缘路由器R4上把ARP失效时间也改为较小的值,因为R4也需要依赖ARP缓存表回复R1的ping包。
查看R1的ARP表:
此时R1的ARP表中,200.2.2.4所对应的MAC地址为R3的fa0/1接口的MAC地址,且R1能够ping通10.1.1.1。
注:由于在GNS3的模拟环境中偶尔会出现BUG,导致路由器的ARP缓存表无法正常更新。此时,只需将所有的路由器配置进行保存(在特权模式下使用wr命令),然后在GNS3中重启所有的设备,再进行ping测试并观察ARP表项的变化。
总结:
要提高静态路由的冗余性和灵活性,在递归路由中不需要关联任何的下一跳地址。例如R1的主路由是ip route 10.1.1.0 255.255.255.0 fa0/1 200.2.2.4, 为了解析200.2.2.4, R1的递归路由只需写成ip route 200.2.2.0 255.255.255.0 fa0/1即可。
只要将路由器的ARP失效时间改为较小值,不管之前主路由使用是哪一条路径发包,只要该发包路径down了之后,备用路径将根据之前设定的ARP失效时间切换过去,这就实现了高效的静态路由倒换。