Traceroute俳句

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

image-20230110161809741

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>

這是這首民謠的原曲:

某位仁兄甚至用這個做了一份他的簡歷:

image-20230110161519369

如何實現?

看起來很美好,但是這如何實現?

我們可以輕鬆的更改 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

採用 CC BY-NC-SA 4.0 協議進行許可
上次改過於 2026 年 3 月 17 日 13:08 +0800