我是小型網路的管理員,我正在調查用戶抱怨的問題。他們抱怨的根源是traceroute
:有時路徑上的路由器根本不會回應traceroute
探測,使用者會看到逾時(這些*
逾時取代了 RTT)。
該網路由一些透過乙太網路/無線連接的 Linux 路由器組成。 Linux 路由器 99% 空閒,連結使用率 20 Mbit/s,2000 個資料包/秒。無線堅如磐石。路徑上所有路由器的 PING 時間為 10 毫秒,當然會有一些變化。對任何這些主機的 Flood PING 運行幾分鐘,沒有任何資料包遺失(我的意思是 0 個資料包遺失)。透過網路下載一些大檔案:平均 10.2 MB/s。
這個例子正確的 traceroute
看起來像這樣:
# traceroute -nI 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
1 192.168.0.1 3.919 ms 3.866 ms 4.117 ms
2 10.41.13.1 4.149 ms 6.714 ms 6.707 ms
3 10.41.1.11 8.475 ms 8.468 ms 8.705 ms
4 10.0.0.2 8.697 ms 9.428 ms 9.707 ms
這有問題的 traceroute
看起來像這樣:
# traceroute -nI 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
1 192.168.0.1 3.190 ms 3.140 ms 3.128 ms
2 10.41.13.1 3.119 ms 3.113 ms *
3 10.41.1.11 3.697 ms * 3.683 ms
4 10.0.0.2 4.531 ms 4.524 ms 5.171 ms
# traceroute -nI 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
1 192.168.0.1 3.471 ms 3.405 ms 3.388 ms
2 10.41.13.1 3.372 ms 3.359 ms 3.350 ms
3 10.41.1.11 5.039 ms * *
4 10.0.0.2 5.105 ms 5.484 ms 5.473 ms
我調查了一下tcpdump
,發現它的traceroute
工作原理是這樣的:
- 首先發送一堆TTL為1,2,3,4,5,6的ICMP請求。那是 18 個資料包:)
- 所有回覆都會等待一段時間 (
Time Exceeded
)。 - 當所有回復返回後,顯示結果。
- ..或等待超時並顯示缺少回應並標有星號的結果。
逾時的原因是 - 路由器收到所有 3 個相應的請求,但有時不回應,它們不發送 ICMP 逾時。
我懷疑有一些設定在路由器上設定了此行為。即icmp_速率限制,icmp_速率掩碼,icmp_msgs_per_sec和icmp_msgs_burst。一切都以某種方式描述在 kernel.org 文件中。這就是我失敗的地方。我沒有提供這些變數的任何值來traceroute
始終完成工作。
我嘗試在所有路由器上進行此設定:
icmp_ratelimit
設定為0
(不限制任何內容)icmp_msgs_per_sec
設定為10000
(應該足夠高)icmp_msgs_burst
設定為5000
(南高)
這對我沒有幫助,我看到了同樣的行為,隨機超時。我沒有搞亂icmp_ratemask
,因為我不完全理解如何Time Exceeded
從限制中排除 's 。
最後,問題是:
- 如果您熟悉此類
traceroute
問題,您是如何解決的? - 如果您熟悉上述內核設置,那麼什麼是“足夠好”值?
icmp_ratemask
修改不限制Time Exceeded
訊息以使traceroute
工作順利進行的正確方法是什麼?- 另外 - 更改這些(或任何相關)設定時是否存在任何安全漏洞?我不想受到 DoS 攻擊,也不想成為任何人的 DDoS 攻擊來源。
答案1
作為跳數控制平面策略的一部分,ICMP 探測大多被忽略。如果您想在指標和趨勢、歷史數據方面獲得更全面的信息,我建議您使用專門的本地吸煙實例。