在天災人禍導致「台灣對外斷網」時,希望能盡量維持正常運作的重要網路服務。
情境: 2023年初,馬祖的對外海纜被中國的拖網漁船/挖沙船「意外」挖斷,因而斷網長達數個月。假設此一情境發生在台灣,台灣對外網路骨幹海纜斷了八九成(甚至完全中斷),有哪些服務,是維持基本生活品質必要的服務,應在「只有島內網路」的狀態下維持正常運作?
範疇: 國民第一線會使用的「網路服務」、「手機 APP」。
不納入實體離線服務如 7-11 店面與捷運⋯⋯等。也不列入各消費端服務的上游相關設施(如 EC 網站的物流,我們期待該網站能與其供應鏈上下游協作,推行進一步的韌性計畫)
目標: 對列舉的重要民生服務進行檢測,確認其相對台灣對外斷網時的韌性狀態
倡議: 民生必需的服務,應備有對外網路嚴重障礙的應變計劃,並且定期進行相關的演練。
-> 請查閱: 海纜斷掉時,網站會動嗎?
社群共同列舉民生上重要的數位服務,及基礎架構相關服務。
- 網站 hosting 主機
- 所在地 & API 所在地
- 位置:國內 / 國外
- 是否是 anycast,且提供國內節點
- 所在地 & API 所在地
- 網站頁面 & API 是否通過 CDN
- CDN 是否是已知有落地的單位
- 例如:cloudflare (TPE)、Akamai
- CDN 是否是已知有落地的單位
- 網站使用的 library (jquery, anguler, vue... etc)
- 是否使用公共的 CDN
- 是否已知有落地
- cdnjs (over cloudflare)
- jsdelivr?
- 是否與網站一起 serve
- 是否使用公共的 CDN
以 Pchome 產品頁 https://24h.pchome.com.tw/prod/DCAYAD-A900BIAMV 為例(檢測過程紀錄)
-
先打開 adblock / adguard,把不必要的元素都預先擋掉
-
打開瀏覽器開發工具,停用快取,載入頁面
-
切到 network,用 HAR 檔存下完整的 request 紀錄
-
資料清理
- vscode 搜索 HAR
"url": "(.*)"抓出所有的 requests - 按照 hostname 排序,同一個 sub-domain 只留一條
-
可直接丟掉的 requests 們
可參考擋廣告軟體的效果(例:假設被 ublock 阻擋)就可以直接丟棄
- analytics:
analytics.google.complay.google.com/logwww.google-analytics.com
- fb:
connect.facebook.netwww.facebook.com
- 字體:
fonts.gstatic.com
- ad:
*.doubleclick.netwww.google.com.tw/ads*.scupio.comjscdn.appier.net
- 其他:
www.youtube.com/embed/*
- analytics:
- vscode 搜索 HAR
-
檢視 HAR entries 下的每一個 request 項目是否有境內可用性
以第一項
https://24h.pchome.com.tw/prod/DCAYAD-A900BIAMV為例a. 確認該資源資訊
➜ ~ ipinfo 24h.pchome.com.tw Core - IP 34.149.253.14 - Anycast true - Hostname 14.253.149.34.bc.googleusercontent.com - City Kansas City - Region Missouri - Country United States (US) - Currency USD ($) - Location 39.0997,-94.5786 - Organization AS396982 Google LLC - Postal 64106 - Timezone America/Chicagob. 檢視 Anycast / 地理位置狀態
b-1. 假設無 Anycast,則參考該 ip 的地理位置,紀錄到表格上。如位置在島內,則在「是否可及」內打 O,在島外則打 X。
b-2. 假設有 Anycast,如果該地理位置不在島內,可檢查「該服務是否是已知有台灣節點者」,如上述範例 hostname 為GCP,對照 雲端平台--IaaS,確認其有台灣節點,則在「是否可及」內紀錄
-c. 最終以
X與-的數字評估該網頁的耐受度。以 pchome 產品頁 為例,共 7 個O位於境內、10 個-使用雲端服務可能有耐受性,沒有任何X非雲端的境外節點。
https://github.com/irvin/digital-service-resilience
git clone https://github.com/irvin/digital-service-resilience.git
cd digital-service-resilience
npm installexport IPINFO_TOKEN=your_token_here # Linux/Mac
set IPINFO_TOKEN=your_token_here # Windows CMD
$env:IPINFO_TOKEN="your_token_here" # Windows PowerShellnpm run check https://example.com
# 或
node no-global-connection-check.js https://example.com使用自訂 DNS 伺服器
node no-global-connection-check.js --dns 8.8.8.8 https://example.com儲存檢測結果
node no-global-connection-check.js --save https://example.com指定 IPinfo Token
node no-global-connection-check.js --ipinfo-token your_token https://example.comAdblock 清單選項
工具預設會自動載入 EasyList 和 EasyPrivacy 清單,用於過濾廣告和追蹤相關的網域。
- 使用預設 adblock 清單(預設行為):
node no-global-connection-check.js https://example.com- 不使用 adblock 清單:
node no-global-connection-check.js --adblock false https://example.com- 使用自訂 adblock 清單:
node no-global-connection-check.js --adblock-url https://filter.futa.gg/hosts_abp.txt https://example.com- 使用多個自訂清單(用逗號分隔):
node no-global-connection-check.js --adblock-url https://filter.futa.gg/hosts_abp.txt,https://filter.futa.gg/nofarm_abp.txt https://example.com- 開啟 debug 模式(顯示詳細資訊):
node no-global-connection-check.js --debug https://example.comDebug 模式會顯示:
-
所有收集到的請求列表
-
清理後的域名列表
-
被忽略的域名列表
-
每個域名的 IP 檢查過程
-
Adblock 清單載入資訊
-
錯誤堆疊資訊(發生錯誤時)
-
不使用快取(強制重新下載 adblock 清單和 IPinfo 資料):
node no-global-connection-check.js --cache false https://example.com- Headless 模式選項:
# 使用 headless 模式(預設,不顯示瀏覽器視窗)
node no-global-connection-check.js --headless true https://example.com
# 使用非 headless 模式(顯示瀏覽器視窗)
node no-global-connection-check.js --headless false https://example.com注意: 當測試失敗時,工具會自動嘗試以下重試流程:
- 一般版本(headless)
- 一般版本 prefix www
- 非 headless 版本
- 非 headless 版本 prefix www
使用 batch-test.js 可以批次測試多個網站。測試清單必須是 JSON 格式,包含 website、url 和 rank 欄位。
node batch-test.js --limit 10 top-traffic-list-taiwan/merged_lists_tw.json測試清單檔案路徑必須放在命令列的最後一個參數。
- 指定測試數量:
node batch-test.js --limit 50 top-traffic-list-taiwan/merged_lists_tw.json- 從指定位置開始測試:
node batch-test.js --limit 50 --start-from 10 top-traffic-list-taiwan/merged_lists_tw.json- 設定請求延遲(單位:毫秒):
node batch-test.js --delay 3000 --limit 10 top-traffic-list-taiwan/merged_lists_tw.json- 組合使用多個參數(支援所有單一測試的參數):
node batch-test.js --debug --adblock-url https://filter.futa.gg/hosts_abp.txt --adblock false --cache false --headless false --limit 10 --delay 2000 top-traffic-list-taiwan/merged_lists_tw.json批次測試支援的參數(與單一測試相同):
--adblock true/false:是否使用 adblock 清單(預設:true)--cache true/false:是否使用快取(預設:true)--headless true/false:是否使用 headless 模式(預設:true)--adblock-url URL:自訂 adblock 清單 URL--dns IP:自訂 DNS 伺服器--ipinfo-token TOKEN:IPinfo API token--debug:開啟 debug 模式--timeout N:頁面載入 timeout(秒)
批次測試會:
- 為每個網站產生獨立的檢測結果檔案,儲存在
test-results/目錄 - 在根目錄產生總結報告
batch_summary_<timestamp>.json,包含:- 測試參數
- 統計資訊(總數、成功、失敗、跳過)
- 所有測試結果摘要
測試清單 JSON 檔案格式如下:
[
{
"website": "example.com",
"url": "https://example.com",
"rank": 1
},
{
"website": "another.com",
"url": "https://another.com",
"rank": 2
}
]- O:服務位於台灣境內
- ?:使用具有台灣節點的雲端服務(如 Google Cloud、AWS 等)
- X:位於境外且非雲端服務
當你想要測試一個新的網站並將結果加入到結果庫時,可以按照以下步驟進行:
npm run check --save https://www.example.com說明:
--save參數會將檢測結果儲存到test-results/目錄- 結果會以 JSON 格式儲存,檔名格式為
{domain}.json - 例如:測試
https://www.article19.org會產生test-results/www.article19.org.json
可選參數:
--debug:顯示詳細的檢測過程資訊--adblock false:不使用 adblock 清單過濾--timeout N:設定頁面載入 timeout(秒,預設 120)
執行以下指令更新 statistic.tsv:
node generate_statistic.js說明:
- 此腳本會讀取
test-results/目錄下的所有 JSON 檔案 - 生成或更新
test-results/statistic.tsv統計檔案 - 統計資料會按照
top-traffic-list-taiwan/merged_lists_tw.json的順序排序
test-results/ 是一個 Git submodule,需要將結果提交並推送:
cd test-results
git add .
git commit -m "新增網站測試結果: example.com"
git push如果 test-results 是 submodule,在主專案中也需要更新引用:
git add test-results
git commit -m "更新 test-results submodule"
git push如果要測試的網站不在自動清單中,可以編輯 manual_curated_list_tw.json 加入該網站:
[
{
"website": "example.com",
"url": "https://www.example.com"
},
{
"website": "another-site.org",
"url": "https://another-site.org"
}
]說明:
website:網站的主要域名(用於識別)url:要測試的完整 URL(可以是首頁或特定頁面)- 編輯後,執行
generate_statistic.js時會自動包含這些網站
- 檔案命名:結果檔案會根據 URL 自動命名,通常會移除
https://和尾隨的/ - 重複測試:如果同一個網站已經有測試結果,新的結果會覆蓋舊的檔案
- 統計資料順序:
generate_statistic.js會優先按照merged_lists_tw.json的順序排列,不在清單中的網站會附加在最後 - Submodule 管理:
test-results/是一個獨立的 Git repository(submodule),需要分別提交和推送
開始檢測網站: https://example.com
收集到 X 個請求
清理後剩餘 Y 個唯一域名
檢測結果:
-------------------
境內服務 (O): 3
雲端服務 (?): 5
境外服務 (X): 1
詳細資訊:
example.com: O (TW (HiNet))
cdn.example.com: - (US (GOOGLE))
api.example.com: X (US (Amazon))
This project is licensed under the CC BY-NC-ND 4.0 International. See the LICENSE file for details.
This work was supported by a grant from the APNIC Foundation, via the Information Society Innovation Fund (ISIF Asia).