这要从一个问题说起
公司有一台设备,在联网并从同一个cdn节点上获取数据,发现用着用着从cdn节点上获取数据就失败了,但是这时设备在ping百度以及上其它网还是正常的,在当时这还是很令人费解的。在分析app,设备网络特性以及公司网络架构后发现了这一问题的原因是icmp redirect导致的问题。
ICMP重定向消息是路由器发现主机针对某个目的ip有一个更好的路由策略,其使用ICMP redirect方式通知主机。icmp redirect 能避免带宽的不必要浪费。公司网络架构把不是同一个网段地址作为redirect,这导致了问题。
公司的网络架构如下。
设备在开始访问公网的一个cdn节点时,通过默认网关192.168.1.1发送网络,数据包到达公司出口路由器后,发现要访问的是外网,于是通过.66端口发送给.65,这一流程走的是红色路线,但是随着访问同一cdn节点量变大,路由器发现针对该机器的请求有一个更优的路径,
原本的路径是(红色)
机器1---》交换机(进)--》交换机(出)---》路由器1(进)---》路由器1(出)--》交换机(进)----》交换机(出)---》路由器2(进)------
更优路径是(绿色):
机器1--》交换机(进)---》交换机(出)---》路由器2(进)---
这时将会发送icmp重定向包
知道其下一跳是.65后,其发送ARP包,请求.65的MAC地址以期望进行封包,但是由于不在同一个网段,ARP包无法被.65收到,这就导致了访问失败。
Linux是如何处理ICMP redirect
linux路由分三种:
1,根据本机ip获取同一个网段作为路由一种
2.手工命令指定
3.网上协议指定,如dhcp,icmp redirect等
可以发现arp请求失败后其mac地址的信息是不知道的,所以显示incomplete状态。
路由cache里的信息
路由cache里包含了该路由信息,
路由表信息是正确的,关闭cache是一种解决方法,当然还有接口是关闭redirect功能
将其删除ip route flush cache,后可以上网