同一內網兩台機器,各自透過外網 IP:Port 互發 UDP 包嘗試打洞,卻建立不了連線。核心原因在於 NAT 類型 與 測試拓撲。
NAT 類型決定打洞成敗
| NAT 類型 | 特徵 | 打洞可行性 |
| Full Cone | 外部任意 IP:Port 可向映射的公網 IP:Port 發包 | ✅ 易成功 |
| Restricted Cone | 僅允許內網主動連過的外部 IP 回包 | ⚠️ 需先主動發包 |
| Port Restricted Cone | 進一步限制外部 Port 必須匹配 | ⚠️ 較難 |
| Symmetric NAT | 每次不同目標分配不同公網 Port | ❌ 極難/不可預測 |
同內網測試的特殊問題
- Hairpin NAT / NAT Loopback:路由器需支援「內網機器訪問本網路公網 IP 回流到內網另一台」。許多家用路由器不支援或預設關閉。
- 即使支援,若兩台機器映射到同一公網 IP 的不同 Port,路由器可能無法正確轉發回內網對應主機。
- 防火牆/安全軟體可能攔截「來自外網 IP 但實際源自內網」的包。
正確驗證步驟
- 先在公網雙機 (雲主機/VPS) 測試打洞邏輯,排除代碼 Bug。
- 確認路由器 NAT 類型:用
STUN 工具 (如 stunclient) 檢測。
- 開啟路由器 UPnP 或手動配置 Port Forwarding / DMZ。
- 啟用 Hairpin NAT (若路由器支援,通常在 WAN 進階設定)。
- 同內網測試時,直接用內網 IP 通訊 驗證邏輯,再嘗試外網 IP 打洞。
工程建議
- 生產環境採用 TURN/RELAY 伺服器 (coturn) 作為後備,保證連通率。
- 整合 ICE 框架 (libnice, Pion WebRTC) 自動嘗試 STUN/TURN/直連。
- 不要假設所有 NAT 都能打洞,Symmetric NAT 必須中繼。
結論:同內網走外網測試受限於 Hairpin NAT 支援度,優先在公網環境驗證,生產必備 TURN 伺服器。
- 上一篇文章: C++ 字元陣列存字串常見錯誤:指向區域變數地址導致資料覆蓋
- 下一篇文章: Flex RichText 區域文字顏色修改:HTML 標籤與 TextFlow 方案
Copyright ©
程式碼之家 All Rights Reserved