SmartHostsTool:開源 GitHub Hosts 測速工具,用測速把被汙染的 DNS 指向最快可用 IP

SmartHostsTool 是一支用測速把 GitHub 等網站的最快 IP 寫進系統 hosts 檔的開源 Windows 工具,主要解中國大陸網路環境下的 DNS 汙染問題。台灣直連 GitHub 就通暢,這個工具的主要場景幾乎用不到;而 hosts 最佳化也有明確邊界,它不等於 VPN,不加密、不換對外 IP。

用 AI 摘要這篇文章:

先給結論:SmartHostsTool 解的是一個很特定的問題,就是 GitHub 這類網站在中國大陸的網路環境下被 DNS 汙染、但 IP 本身還連得通時,要怎麼挑一個最快的 IP 寫進 hosts 檔。對台灣大多數讀者來說,GitHub 直連就通暢,這個工具的主要場景根本用不到。它也不是 VPN 的替代品,這是本文想先拆掉的誤解。

我沒有實際執行這支程式,底下的判斷來自讀它的原始碼(config.py、services.py)、README、LICENSE,以及 GitHub 上的 issues、releases 與 commit 中繼資料。這是認識一個工具的層級,不是效果實測,所以我不會告訴你「它跑起來多快」這種我沒有測過的事,只會把原始碼實際怎麼做、跟 README 哪裡對不上講清楚。

換 hosts 跟掛 VPN,是兩件不相干的事

很多人把「改 hosts」跟「翻牆」當成同一件事,其實兩個機制完全沒有關係。hosts 檔是作業系統本機的 DNS 覆寫表,你寫了「185.199.108.153 github.com」,作業系統就跳過對外的 DNS 查詢,直接用這個 IP 去連線。它做的事只有一件:把網域名稱對到一個你指定的 IP。

這代表:如果這個 IP 在你的網路環境連得通(沒有被 IP 層封鎖),你就連上了;如果連不通,改 hosts 一點用也沒有。它不會加密你的流量、不會換你的對外 IP、也繞不過深度封包檢查(DPI)。換句話說,hosts 最佳化只在「DNS 被汙染、但 IP 本身還可達」這個窄條件下有效,SmartHostsTool 做的,就是把這個窄條件的判斷自動化:幫你測多個候選 IP 的延遲,把最快的那個寫進 hosts。

這裡說的 DNS 汙染,是你查 github.com 這個網域名稱時,中間的 DNS 回應被竄改,回給你一個連不到、或被導去別處的 IP,但 GitHub 伺服器真正的 IP 其實是連得通的。改 hosts 等於繞過這個被竄改的查詢,直接指定要用哪個 IP 連線。所以這招有沒有用,完全取決於「IP 本身到底通不通」:通,換個 IP 就能連;不通,改 hosts 也救不回來,那就要換成 VPN 或代理這類會把流量整個繞道的工具。這條界線畫清楚,你才會知道什麼時候該用哪一種。

底下這張表把三種常被搞混的機制拆開,你會看出 hosts 工具的位置其實很邊緣:

機制解什麼問題不解什麼加密流量換對外 IP要管理員權限
改 hosts(本工具)DNS 被汙染但 IP 仍可達IP 封鎖、DPI、隱藏來源是(改系統檔)
VPN整體流量加密與繞道不會改寫本機 hosts 檔視實作而定
代理(HTTP/SOCKS)指定應用程式的流量繞道不走的應用程式不受影響是(取決於協定)通常不用
三種機制的原理比較,呈現各自的作用層級與涵蓋範圍,而非任何單一產品的規格。

候選 IP 從哪來,怎麼測、怎麼寫進 hosts

從 config.py 和 services.py 看,流程大致是三件事:取得候選 IP、並行測速、把結果寫進系統 hosts 檔的專屬區塊。候選 IP 有兩個來源,差很多。

第一個來源是社群維護的遠端 hosts 清單。config.py 列了 7 個網址,包括 tinsfox、GitHub520(521xueweihan)、ineo6 等社群專案,這些專案長期追蹤「GitHub 哪些 IP 在中國大陸網路環境還連得通」並整理成 hosts 格式。但 config.py 的註解寫得很明白:「遠端 Hosts 功能目前僅針對 GitHub」,意思是這條一鍵取清單的快速路,只對 github.com 這個預設網域生效,蓋不到你自己加的其他網站。

這裡有個容易被忽略的事實:這支工具的 GitHub 加速能力,其實是架在那些社群專案之上。tinsfox 與 GitHub520 這些上游清單才是會每天更新的活水源頭,工具本身只是個取清單、測速、寫入的客戶端。萬一哪天上游停止維護,工具的一鍵功能就會跟著失效,這是它的單點依賴。

第二個來源是你自己輸入別的網域名稱(例如 google.com),程式用本機的 socket DNS 解析出所有 A 紀錄當候選,再由 UI 層開一個執行緒池並行測速(執行緒數上限 60,實際數量視候選 IP 多寡而定)。測的是 TCP 連線延遲,TCP 不通就退回 ICMP ping,測完按延遲排序。你按一鍵,程式就把每個網域延遲最低的 IP 寫進 hosts。

寫入是用 # === SmartHostsTool Start ===# === SmartHostsTool End === 的標記區塊管理,只動這一段,不會影響你手動寫的其他 hosts 設定,寫入前還會自動備份原檔。這個設計本身是合理的:UI 不直接碰系統檔,交給 hosts_file.py 統一處理;services.py 不依賴任何 UI 框架,可以獨立測試。我讀到的程式結構是乾淨的。

SmartHostsTool 主介面,左側是遠端 Hosts 與自訂預設的標籤頁,右側是測速結果清單,頂部有測速與一鍵寫入按鈕(官方倉庫截圖)Pin
SmartHostsTool 主操作介面:左側選來源、右側看測速結果、底部一鍵寫入 hosts。

config.py 還開了兩個進階指標:measure_jitter 與 calculate_stability,也就是除了延遲,還會量同一個 IP 多次測速的抖動(jitter)與穩定度(stability),結果列表會把這幾欄一起顯示出來。這兩個數字其實比單次延遲更值得看,因為一個偶爾很快、偶爾很慢的 IP,平均延遲可能漂亮,實際用起來卻會卡。不過它們一樣只是連線層的訊號,量的是這個 IP 到不到了不了、穩不穩,量不出你從 GitHub 拉一個 repo 下來的實際吞吐。

SmartHostsTool 測速結果列表,顯示每個 IP 的延遲、抖動與穩定度三個欄位,並按延遲由低到高排序(官方倉庫截圖)Pin
測速結果會顯示延遲、抖動與穩定度三個欄位,抖動與穩定度其實比單次延遲更值得看。

README 跟原始碼對不上的四個地方

讀原始碼的時候,我發現 README 有幾個地方跟程式實際的行為不一致。這幾個落差會直接影響你想驗證或重現它的測試,值得逐項指出:

  • 測速用的 port:README 的「測速技術細節」寫走 TCP 80 連接埠,但 config.py 設的是 443(HTTPS 標準埠),services.py 的程式邏輯也是「網址是 https 就用 443」。你想照 README 自己重現測試,會用錯 port。
  • 測試次數與統計量:README 寫「三次取平均」,config.py 設的是 5 次,services.py 的註解寫「多次取中位數」。次數和統計量(平均 vs 中位數)都不一樣,中位數其實對極端值更抗噪,文件卻落後於實作。
  • 跨平台:README 徽章掛 Windows、macOS、Linux,但 Releases 只發 Windows 可執行檔。config.py 雖有三平台的 hosts 路徑,自動提權(ctypes)是 Windows 專屬,macOS 與 Linux 要用原始碼跑、自己處理 sudo 提權。
  • TLS 驗證預設是寬鬆的:config.py 裡 TLS 的 strict=Falseverify_hostname=False,意思是 TCP 通了就保留這個 IP,TLS 握手失敗也不會把它淘汰。README 把「TLS/SNI 驗證」當亮點,但預設行為不嚴格,想要嚴格驗證得自己去設定裡打開 strict。

把這幾點挑出來的重點是:README 是行銷與文件混合體,當它跟原始碼對不上時,以原始碼為準。這也是讀原始碼比讀 README 更能認識一支工具的原因。

沒有遙測,是這工具少數能說清楚的好事

services.py 裡找不到任何 analytics、telemetry、Sentry、PostHog、UMeng 之類的回報端點。程式對外發出的請求只有三類:抓 config.py 列的那 7 個遠端 hosts 源、用 socket 做 DNS 解析、對目標 IP 做 TCP 與 TLS 與 ICMP 探測。requirements.txt 的依賴也乾淨,只有 ttkbootstrap、requests、Pillow、pystray、platformdirs,沒有夾帶任何遙測 SDK。

對在意隱私的讀者,這是正向訊號:工具確實只做它說的事,沒有背景偷偷回報。它改的是本機的 hosts 檔,資料不落任何外部伺服器。在一堆同類工具會夾帶統計回呼的時代,這點值得記下。

誰會真的用到,誰可以直接跳過

先講台灣讀者最需要的答案:如果你人在台灣、用中華電信之類的主流 ISP、純粹想加速 GitHub,這工具大概用不到。台灣直連 GitHub 一般就通暢,不存在它主要對付的那種 DNS 汙染。我沒有實測數字佐證,這是編輯對台灣網路環境的一般觀察,標為推論,你可以在自己的網路上輕易驗證。

它真正能幫到的人,是身處中國大陸網路環境、或會跨境切換網路的開發者。例如在對岸工作、出差、返鄉,遇到 GitHub 偶爾連不穩,又不想為了一個網站就常駐 VPN,這種情境下測速選 IP 寫 hosts 是合理的小工具。這和 isChinaUser 這類地區偵測工具是同一個網路語境下的不同需求:一個偵測你身在什麼網路環境,一個在你確實身處那個環境時幫你把 DNS 指到可用的 IP。

如果你要的是把對外連線整個加密、換 IP 出去,那要找的是 穿隧工具或代理服務,不是 hosts 工具。如果你想合併多條網路的下載頻寬,那也是完全不同的問題,可以看 HypoMux 那類頻寬聚合工具。把這幾種需求分清楚,才不會裝錯工具。

要管理員權限、只有 Windows 版、而且半年沒更新

  • 改的是系統層的 hosts 檔:要管理員(Windows)或 root(macOS、Linux)權限,而且改動會影響機器上所有應用程式的 DNS 解析,不只瀏覽器或 Git。README 也寫它在 Windows 啟動時會自動請求管理員權限(透過 ctypes 提權),這代表你每次開它都會跳一次 UAC 提示。這是系統層的變更,不是只影響單一瀏覽器的小調整,要評估自己能不能接受這種權限範圍。
  • 實際裝得起來的只有 Windows:Releases 只有 Windows 可執行檔,其他平台要用原始碼自行安裝。README 也自承 Windows Defender 可能在首次執行時誤報,這是 PyInstaller 打包的 exe 常見的狀況,不是判定惡意的依據,但你要自己衡量風險。
  • 客戶端已經停滯:最後一次 commit 是 2026 年 1 月 31 日,commit 訊息是「Remove future development plans section from README」(移除未來計畫段),3 個 issue 全部仍未關單(作者只回覆過其中一則,問題也沒解決),releases 集中在 2025 年 12 月。對一個要追蹤會快速變動的封鎖動態的工具來說,客戶端半年沒更新是決策變數。好在底層的 hosts 清單由上游社群專案維護,只要上游還在更新,工具本身舊一點還能跑。
  • 延遲不等於下載速度:測速量的是 TCP 或 TLS 握手延遲,這跟 clone 一個 repo 的實際下載吞吐不是一回事。GitHub 的內容走的是它自己的 CDN 網段(185.199.108.x 到 111.x 這段),同一個 IP 對你延遲低,不代表它對你頻寬開得大,因為 CDN 的邊節點分配、你的 ISP 路由、甚至當下時段都會影響吞吐。把延遲當成「下載速度」是這類工具最容易被誤解的地方。

裝之前,先花一分鐘確認你到底有沒有這個問題

大多數不需要這工具的人,是栽在自己根本沒有 DNS 汙染、卻以為有。你可以先開終端機,用 nslookup github.com(Windows、macOS 都內建)查一下,看看解析出來的 IP 是不是 GitHub 官方的 CDN 網段(185.199.108.x 到 111.x 這段);再 ping github.com 看延遲多少、封包到不到。如果解析出來的是正常的 CDN IP、延遲也低(台灣通常在個位數到幾十毫秒),你根本不需要改 hosts,裝了也不會有感覺。

反過來說,如果你看到解析出來的是 10.x 或 127.x 這類私有網段、或是某個跟 GitHub 毫無關係的電信業者在用的大陸網段,那大概率就是 DNS 被改寫了;如果直接 ping 不通、或連得上卻被導到一個奇怪的頁面,那才是這類工具派得上用場的情境。先做這一步確認,比直接裝工具更能幫你判斷問題出在哪。

判斷標準很簡單:看見正常的 GitHub IP、連線也通,就跳過這個工具;看見解析被導到奇怪的 IP、或根本連不到,再來考慮。把這個判斷邏輯學起來,比決定裝不裝 SmartHostsTool 更值得,因為同一套邏輯也適用於任何 hosts 工具,換一支工具你還是會需要先確認這件事。

SmartHostsTool 採 MIT 授權、機制清楚、沒有遙測,是一支做對了一件事(把 DNS 汙染下的 IP 測速選優自動化)的小工具,只是這件事主要解的是另一個網路環境的問題。看清那條機制邊界,你會知道自己到底需不需要它,也能在未來看到任何一款 hosts 工具時,立刻判斷它能解你的問題、還是只是看起來像能解。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 756

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...