用程式取得對外連線 IP 的正確姿勢
| | | 0 | |
在當代網路架構中,電腦主機很少會用公開 IP 連上 Internet,一則 255.255.255.255 的 IPv4 數量有限,不夠分給全世界所有要上網的裝置,二來江湖險惡,把電腦直接推出去面對惡意程式及駭客,實屬下略。故常見做法都會架個路由器或防火牆,電腦設成私有網段 IP (如 10.*、172.16.* - 172.31.*、192.168.* 透過路由器上網,連線時使用 NAT 網路位址轉譯技術將私有 IP 換成對外 IP。
有些時侯我們需要知道自己的對外 IP,例如要設定存取白名單、調查異常登入確認來源、架設伺服器對外服務... 等。我家接的光世代是走非固定 IP,每隔幾天會輪換成動態分配新 IP,方案包含一個固定 IP,但我覺得 IP 經常變更反而是好事,可避免 IP 被鎖定被長期滲透攻擊,同時也有利於匿蹤保護隱私。不過,我有架 OpenVPN Server 方便連回家,IP 不固定便成了挑戰,用過路由器的內建 DDNS,但有陣子常故障,氣到決定自己來。最後我的解法是設定排程定期查詢對外 IP,自動更新 DNS,簡單解決問題。
但這個機制前幾天出了問題,程式是用 https://ipconfig.io/ip API 取得對外 IP,為什麼用它已不可考,印象中早期曾用過 ipinfo.io,某次遇到狀況,忘記是爬文還是 Copilot 建議改用的。總之,昨天 ipconfig.io 服務故障了一段時間,我的程式容錯沒寫好,後續便爆炸惹。
這讓我決定認真研究:該怎麼做好「用程式取得對外連線 IP」這件事?
之前沒細想過,查詢對外 IP 服務很多,應該優先選擇穩定可靠的! 第二是要有備援,首選服務壞了,由備援頂上讓任務完成,如果全部備援都壞掉就是天命,坦然接受為上,不宜逆天。
請 AI 整理 API 選項:
| 推薦序 | 服務網址 | 優點 | 缺點 |
|---|---|---|---|
| 1 | icanhazip.com | 由 Cloudflare 維運,極速且穩定,輸出最純淨 | 無進階地理資訊 |
| 2 | ifconfig.me | 老版服務,指令好記,支援多種輸出格式 (如 JSON, XML) | 偶爾在高負載時反應較慢 |
| 3 | api.ipify.org | 專為 API 設計,穩定度極佳,支援 IPv4/v6 切換 | 網址較長,僅限 IP 查詢 |
| 4 | checkip.amazonaws.com | AWS 官方服務,穩定性與品質無虞 | 僅支援純文字,無其他功能 |
| 5 | ipinfo.io/ip | 提供詳盡的 ISP 與地理位置資訊 (若不加 /ip) | 若需大量查詢或進階資訊有付費門檻 |
我只需要 IP 不用地理資訊,考量速度、穩定度與口碑,結合備援觀念,寫成 bash 如下:
# 取得對外公開 IP 位址
# 依序使用三組備用服務
# 1. icanhazip.com - 第一優先
# 2. api.ipify.org - 第二優先
# 3. ifconfig.io - 第三優先
# 每個請求的逾時時間設為 10 秒
# 使用 tr 命令移除返回結果中的所有空白字符(如換行、空格等)
PUBLIC_IP=$(curl -s -m 10 https://icanhazip.com \
|| curl -s -m 10 https://api.ipify.org \
|| curl -s -m 10 https://ifconfig.io)
PUBLIC_IP=$(echo "$PUBLIC_IP" | tr -d '[:space:]')
MESSAGE="IP = $PUBLIC_IP"
若是 C# 可以這樣寫:
string? publicIp = null;
string[] ipServices = [
"https://icanhazip.com",
"https://api.ipify.org",
"https://ifconfig.io"
];
using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(10) };
foreach (var service in ipServices)
{
try
{
publicIp = (await httpClient.GetStringAsync(service))?.Trim();
if (!string.IsNullOrEmpty(publicIp)) break;
}
catch
{
// 忽略,嘗試下一個
}
}
Explores reliable ways to programmatically obtain a public IP behind NAT. Compares popular IP lookup APIs, emphasizes stability and fallback strategies, and demonstrates resilient implementations in Bash and C# after a real outage caused by a single-point dependency.
Comments
Be the first to post a comment