由于traceroute只能诊断UDP通信的包路由,不能确定TCP通信的实际路由(可能变换),因此编写了本文。为方便描述,下面的IP、MAC和端口均为示例,实际诊断中可更换为具体的值
1. 如何判断客户端到服务器的TCP包,是否经过了网关
在客户端执行 tcpdump -i eno16777728 ether dst b0:b9:8a:69:65:3e and host 192.168.0.26 and tcp port 80 抓取经过网关且往返服务器的TCP端口为80的包
eno16777728 接口名称;ether 以太网链路,dst 目标(src表示源);b0:b9:8a:69:65:3e 网关MAC地址;192.168.0.26 服务器IP地址,80 监听端口
输出结果分析
● 有输出,则表示经过了网关
● 有部分输出而TCP通信还在进行,则表示先前的包经过了网关,后来路由表项缓存被重定向更新,没经过网关了
● 不断输出,则表示一直经过网关
2. 如何判断路由表项缓存被重定向更新
在客户端执行 tcpdump -i eno16777728 src 192.168.1.1 and dst 192.168.1.45 and icmp 抓取来自网关和到达客户端的所有icmp包
192.168.1.1 网关IP;192.168.1.45 客户端(出口)IP
输出结果分析
● 没有输出,则表示没有收到rerdirect包,路由表项缓存不变
● 有输出类似ICMP redirect 192.168.0.26 to host 192.168.0.26(前面一个IP表示到达服务器的直接路由IP,后一个表示服务器IP)
● 则表示收到了ICMP重定向包,内核会更新路由表项及缓存网关为192.168.0.26,下次通信时就直接发往192.168.0.26了
3. 如何控制接收ICMP重定向
● echo 0 | tee /proc/sys/net/ipv4/conf/*/accept_redirects 禁止所有网卡接收,可避免路由表项缓存被修改
● echo 1 | tee /proc/sys/net/ipv4/conf/*/accept_redirects 启用所有网卡接收ICMP重定向消息
4. 查看、刷新路由表项缓存
● ip route get 192.168.0.26 可以从输出中看到通住目标IP的实际路由
● ip route flush cache 清空路由表项缓存,下次通信时内核会查main表(即命令route输出的表)以确定路由
posted on 2017-12-29 17:24
春秋十二月 阅读(1954)
评论(0) 编辑 收藏 引用 所属分类:
Network