Traceroute 是一個很常用的網絡 debug 工具,它(應該)會列出你的資料包在到達最終目的地的路上經過的所有路由節點,如果你 traceroute 我的網站,你會得到看起來像這樣的內容:

traceroute透過 Time To Live或者 IPV6 下的 Hop Limit實現追蹤的效果
這個數值的用意是透過限制資料包能透過的最長「邏輯距離」(最多能透過幾個節點),防止資料包在網絡故障的情況下在網絡上被無限迴圈廣播。每當資料包經過一個節點,這個數值就會減少,這個值減小到0時,路由節點就會丟棄這個資料包:舉個例子,網絡故障的情況下,一個 IPV4 資料包的 TTL 為65,經過64個節點時,其TTL會等於65-64=1,經過第65個節點時,TTL 會降為0,那麼,第66個節點在發現這個資料包的 TTL 為0時就會將其直接丟棄。
但做到這一步並沒有解決所有問題:出於禮貌原因,當一個資料包丟失了,我們還要想辦法通知傳送這個資料包的人——既然一個資料包能夠從傳送者到達丟棄它的伺服器,那麼丟棄它的伺服器和傳送者之間一定是可以通訊的。
那麼 traceroute 的設計思想是:首先設定一個極低的 TTL,並向目標伺服器發包,小幅增加這個 TTL,再次向伺服器發包,重複這個步驟,直到可以到達目標伺服器為止,透過這個做法,traceroute就可以透過前面提到的,資料包被丟棄後的「回執」向我們展示我們與目標伺服器之間的「路徑」。
traceroute 工具通常還會貼心的幫你查詢好對應 IP 的反向 DNS,便於我們檢視途徑節點的相關資訊。儘管設定 IP 的反向 DNS 並非必須,大多數運營商都會設定反向 DNS 以方便用戶或者他們自己 Debug。
重要的是,如果買下一個 IP 區段,你便可以將這個區段內的 IP 的反向 DNS 改成 Whatever you want。於是乎,一位仁兄突發奇想,買下了一個 IP 區段,於是就有了下面的 TraceRoute 民謠:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| PS C:\Users\l3zc> tracert -h 100 bad.horse
透過最多 100 個躍點跟蹤
到 bad.horse [162.252.205.157] 的路由:
1 <1 毫秒 <1 毫秒 <1 毫秒 192.168.0.1
2 2 ms 1 ms 1 ms 192.168.1.1
3 5 ms 4 ms 4 ms 100.66.128.1
4 4 ms 4 ms 4 ms 58.20.125.137
5 5 ms 4 ms 4 ms 119.39.126.117
6 * 27 ms 27 ms 219.158.98.69
7 32 ms 30 ms 30 ms 219.158.5.158
8 29 ms 30 ms 31 ms 219.158.16.66
9 172 ms 175 ms 174 ms 219.158.98.10
10 179 ms 175 ms 174 ms ix-xe-8-2-5-0.tcore1.sqn-sanjose.as6453.net [63.243.205.93]
11 226 ms 225 ms 236 ms if-ae-1-2.tcore2.sqn-sanjose.as6453.net [63.243.205.2]
12 222 ms 222 ms * if-ae-51-2.tcore2.ct8-chicago.as6453.net [64.86.79.14]
13 224 ms 225 ms 225 ms if-ae-22-2.tcore1.ct8-chicago.as6453.net [64.86.79.2]
14 223 ms 223 ms 223 ms if-ae-8-2.tcore2.tnk-toronto.as6453.net [66.110.48.1]
15 223 ms 223 ms 223 ms if-ae-2-2.tcore1.tnk-toronto.as6453.net [64.86.33.89]
16 225 ms 224 ms 225 ms 64.86.33.58
17 223 ms 223 ms 223 ms 67.223.96.90 [67.223.96.90]
18 225 ms 224 ms 224 ms bad.horse [162.252.205.130]
19 228 ms 228 ms 229 ms bad.horse [162.252.205.131]
20 239 ms 237 ms 235 ms bad.horse [162.252.205.132]
21 244 ms 245 ms 248 ms bad.horse [162.252.205.133]
22 243 ms 243 ms 243 ms he.rides.across.the.nation [162.252.205.134]
23 248 ms 249 ms 249 ms the.thoroughbred.of.sin [162.252.205.135]
24 263 ms 259 ms 261 ms he.got.the.application [162.252.205.136]
25 267 ms 268 ms 267 ms that.you.just.sent.in [162.252.205.137]
26 266 ms 266 ms 266 ms it.needs.evaluation [162.252.205.138]
27 267 ms 266 ms 267 ms so.let.the.games.begin [162.252.205.139]
28 275 ms 274 ms 274 ms a.heinous.crime [162.252.205.140]
29 280 ms 280 ms 280 ms a.show.of.force [162.252.205.141]
30 292 ms 293 ms 292 ms a.murder.would.be.nice.of.course [162.252.205.142]
31 293 ms 290 ms 290 ms bad.horse [162.252.205.143]
32 301 ms 302 ms 302 ms bad.horse [162.252.205.144]
33 297 ms 296 ms 297 ms bad.horse [162.252.205.145]
34 308 ms 307 ms 307 ms he-s.bad [162.252.205.146]
35 309 ms 309 ms 308 ms the.evil.league.of.evil [162.252.205.147]
36 314 ms 314 ms 313 ms is.watching.so.beware [162.252.205.148]
37 322 ms 323 ms 322 ms the.grade.that.you.receive [162.252.205.149]
38 327 ms 326 ms 326 ms will.be.your.last.we.swear [162.252.205.150]
39 327 ms 329 ms 330 ms so.make.the.bad.horse.gleeful [162.252.205.151]
40 331 ms 331 ms 331 ms or.he-ll.make.you.his.mare [162.252.205.152]
41 339 ms 339 ms 339 ms o_o [162.252.205.153]
42 345 ms 346 ms 346 ms you-re.saddled.up [162.252.205.154]
43 348 ms 348 ms 348 ms there-s.no.recourse [162.252.205.155]
44 351 ms 350 ms 350 ms it-s.hi-ho.silver [162.252.205.156]
45 363 ms 363 ms 361 ms signed.bad.horse [162.252.205.157]
跟蹤完成。
PS C:\Users\l3zc>
|
這是這首民謠的原曲:
某位仁兄甚至用這個做了一份他的簡歷:

如何實現?
看起來很美好,但是這如何實現?
我們可以輕鬆的更改 Reverse DNS 的設定。最大的問題是,如何讓資料包按照我們希望的路線穿行。
在物理上將節點按順序連線顯然不現實,現在能被想到的有兩種辦法:要麼在單個節點上將很多虛擬的介面按順序分配 IP 並串聯起來並將他們用作「節點」,要麼在用戶網絡層上做手腳,生成假的「超限」訊息,憑空生成一條不存在的路由線路。
https://github.com/benjojo/traceroute-haiku
這個倉庫是 benjojo 進行實驗的專案,利用了第二種方法,用GO語言寫一個TUN/TAP,接管所有的網絡流量,並生成假的「超限」訊息。
自己動手
我們來寫一個程式,徹底理解這個專案。
我之前沒有使用過 Go 語言。已知的 Go 專案裏我最熟悉的是 Clash 的 Mac 版本。Clash 有強大的分流功能,以及為了相容性,編寫了一套 TUN 模式。用來作為切入點學習非常合適。
蔘考
https://blog.benjojo.co.uk/post/traceroute-haikus
評論已停用,直到您接受功能性 Cookie。