上一个星期, 公司有一台服务器发生了慢请求(>3s)记录比其他台多一倍。查找了下原因,发现这台服务器的网关配置成同网段内其他服务器IP上了,导致ICMP重定向发生,后面将路由更正后,慢请求缓解很多了。 在这做一下记录分析一下
网络中的路由器通过相互之间的共同努力,将用户的数据包转发到目的地。通常情况下,主机都会将去往远程网络的数据包发送到路由器,路由器再尽最大努力转发数据。但是在某些情况下,收到数据包的路由器可能并不是去往目的地的最优选择,也就是说该路由器并不在源与目标的路径当中,或者说数据源应该将数据交给其它路由器来转发。如果某台路由器真的发现自己不应该为用户转发数据,而希望让用户选择其它路由器来转发数据,那么它就会通过向数据源发送ICMP重定向(ICMP Redirect)来告诉对方,让对方不要再将数据包发向自己,而应该发到其它路由器。
需要路由器向源发送ICMP重定向的情况有两种:
★ 1.当路由器从某个接口收到数据包后,还要将数据包从同一个接口发往目的地,就是路由器收到数据包的接口正是去往目的地的出口时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳即可,不要再发给自己。
★ 2.数据包的源IP和自己转发时的下一跳IP地址是同网段时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳。
注:路由器在向数据源发送ICMP重定向的同时,也会正常转发收到的数据包,并不会中断网络。
过程分析如下:
1). server2如果要与internet通讯,首先是要把报文发送给server1的,因为server2的网关指向server1的。
2). server1收到报文并检查它的路由表,发现router是发送改报文的下一跳。当它把报文发送给router时,server1检测到这个报文的发送出去的接口与接收到的接口是相同的,这样ICMP重定向就触发了。
3). server1认为server2应该把默认路由指向router,所以就发送ICMP重定向报文给server2,告诉它以后把报文发送给router。
server1报文如下:
server2报文如下:
ICMP重定向报文的接收者必须查看三个IP 地址
1). 导致重定向的IP地址,即ICMP重定向报文的数据位于IP数据报的首部
2). 发送重定向报文的路由器的IP地址,包含重定向信息的IP数据报中的源地址
3). 应该采用的路由器IP地址, 在ICMP报文中的4~7字节
发生ICMP重定向报文的必要条件:
1). 出接口必须等于入接口
2). 用于向外传送数据报的路由不能被ICMP重定向报文创建或修改过, 而且不能是路由器的默认路由
3). 数据报不能用源站选路来转发
4). 内核必须配置成可以发送重定向报文
linux禁止ICMP重定向报文方法: