使用tracert命令時,在一個節點後所有的節點都沒有數據,這是為什麼?
想tracert一個國內的網站,但是出了一個節點全是星號,這是為什麼,是運營商的問題嗎?
先說觀點:運營商封了UDP某些不知名埠,導致程序失效!
在Traceroute之前,你肯定ping通過這個網站,否則你也不會提這個問題。
然後你才嘗試著去trace一下,可是除了你本地路由器有響應之外,怎麼其它路由器沒有反應?
這個問題你可以反向推理,既然可以ping通,說明雙向路由是通的,說明ICMP Echo Request/Reply 端到端路徑沒有被Blocked。既然沒有Blocked,為何traceroute 無法正常工作?
初學網路者沒有好好研究traceroute的工作原理,才會有類似的困惑。
Traceroute實現方式
Traceroute程序outgoing 方向使用UDP包,而incoming方向使用ICMP TTL-Expired / Port Unreachable 來報告錯誤。
運營商不會封PING
在運營商的路由器上,UDP與ICMP的待遇可不一樣,為了利於troubleshooting,ICMP Echo Request/Reply是不會封的,所以你可以ping 得通。
運營商會封不知名埠
而UDP則不同,UDP常被用來做網路攻擊,因為UDP包無需連接,換句話說,沒有任何狀態約束它,想發多少就發多少,攻擊者可以通過偽造源IP、偽造目的埠發送任意多的UDP包,長度自定義。所以運營商為安全考慮,對於UDP埠肯定採用白名單ACL,直白地說,就是只有ACL允許的埠才可以通過,沒有明確允許的則統統丟棄。比如允許 DNS/DHCP/SNMP等。
通過以上分析,你的traceout 使用的UDP報文在outgoing 方向被ACL丟棄,而丟棄是默默地丟,不會告訴你的traceroute 程序,所以會顯示超時。
@朱曉飛
很好,我就喜歡愛學習的同學,一定要給你說清楚。你的思路很好,即第一跳(運營商)可能關閉ICMP報錯功能,所以會出現三個*,那第二跳呢?也關閉了?第三跳呢?第N跳呢?不可能全部都關閉了吧,總有回應的吧?所以這種可能性比較小。所以對於基於ICMP的tracert 最大的可能是第一跳設置了這樣ACL,customer-facing interface(outbound 方向):
Deny ICMP any any type 3 5 10 11
Permit IP any any
以上會造成 全是 * 的狀況。
以下會造成部分* 的狀況:
Deny ICMP host local_IP any type 3 5 10 11
Permit IP any any
哈,樓上的 @車小胖 不讓我評論,只好新開一個答案了
題主既然說了是tracert 命令,那顯然用的是windows 操作系統了
windows里的tracert和linux/unix之類操作系統里的traceroute雖然功能類似,但具體實現是不同的。
非windows的操作系統里使用traceroute時,發的是udp包,目標埠號是從32768+666 向上遞增的,所以確實存在所謂運營商封了這些埠號的可能。
但windows里的tracert 實現發的都只是icmp echo request包,跟ping命令使用的icmp類型一樣,所以題主說的過了一個節點之後全是*,說明這個節點的路由設備上不僅自己不會發出ttl exceeded 的icmp信息,而且可能還會禁止ttl exceeded的icmp通過,因為windows的tracert 命令完全不會使用udp報文,所以根本就不存在所謂「運營商封了某些不知名udp埠」 導致這個問題的可能。
@車小胖 說的可以ping得通但是tracert直到最後一跳時卻還是* 這種情況是不會出現的,因為最後一跳的目標地址因為不需要再將這個報文轉發所以無需發出ttl exceed的icmp報文,而是直接跟響應ping一樣的返回icmp echo reply報文的,所以不會出現ping得通但是tracert最後一跳也還是*的狀況(除非是windows默認的30跳還不夠達到目標地址,這種情況可以通過使用-h參數增加hop數來排除)運營商應該沒有封超大udp埠——至少我沒幹
如果是中間某一跳三*,應該是fw或路由器設置不應答icmp
如果某一跳以後全部為*,一般是防火牆設置了deny icmp all或者是其他應用層設備。
據我所知某知名遊戲cp就是這麼乾的,進了他家網路icmp就全部看不見了。放火牆屏蔽了,不想讓你看他的ip地址,而那些你可以tracert到的ip地址也不是真實的地址,洗洗睡吧!
因為有些路由節點不給你顯示信息,人為限制,不是trace這個命令的問題
題主所提到的這種情況是發生在tracert某個特定網站地址?如果去哪都是一跳time out,很可能本地路由器block掉了。
推薦閱讀:
※在具體的實現中 TCP 是如何處理失序的數據包?
※為什麼使用tcpdump觀察三次握手的過程,最後一次握手後,ack變為1而不是y+1?
※花生殼DDNS是什麼?
※表示層( presentation layer)和會話層(session layer)為什麼會被棄用?
※為何IP地址不設計得更長,讓用戶都使用公網IP,去掉路由器交換機,讓電腦的互連就像打電話一樣方便呢?