由于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
春秋十二月 閱讀(1976)
評論(0) 編輯 收藏 引用 所屬分類:
Network