SIP話機經NAT註冊有哪些常見問題?
辦公室把實體或雲端電話系統放在總公司或電訊商機房,分店與家中的SIP話機需經路由器NAT向伺服器註冊。這種「穿過NAT註冊」的架構經常出現註冊後失聯、來電無鈴聲、話音只出無入等現象,原因往往與NAT如何改寫位址埠號、以及SIP訊息如何攜帶位址有關。本文整理經NAT註冊的常見故障、成因與標準對策,並說明香港常見網絡環境下的處理方法。
NAT如何干擾SIP信令:兩個位址不一致
NAT(網絡地址轉換)讓多部內網裝置共用一個公網地址上網,路由器會把內網的來源位址與埠號改寫為公網位址與暫用埠號,並在記憶中保留轉換對應。問題在於SIP訊息承載的是「內文位址」——Via標頭、Contact標頭與SDP描述中的IP位址與埠號由話機自行填寫,填的往往是內網的私有位址,例如192.168.1.10。封包外層經NAT改寫後,伺服器看到的封包來源是公網位址,但訊息內文仍然寫着私有位址,兩者不一致,伺服器便無法把回應送往正確位置。
回應方向同樣受影響。RFC 3581(Symmetric Response Routing)在開頭說明,SIP用戶代理在Via標頭填入自身的位址與埠號,伺服器會照該位址回送回應;文件並指出「這種行為在許多情況下並不理想,最明顯的是當用戶端位於網絡地址轉換器(NAT)之後」。若話機未啟動rport機制,伺服器把註冊回應送往內文中的私有位址,封包在NAT上找不到對應的轉換記錄,會被丟棄,結果是話機發出註冊請求後一直等不到回應。
由此可歸納經NAT註冊的第一類常見問題:註冊請求有去無回。徵狀包括話機螢幕長時間停留在註冊中狀態、定時重試、系統記錄出現逾時錯誤。處理這類問題不能只看防火牆是否放通埠號,還要確認話機是否以伺服器看到的公網位址為回應目的地,即是否支援rport等機制。
註冊後定時斷線:NAT映射時效與保活機制
第二類常見問題是註冊看似成功,卻每隔一段時間失聯,之後自動恢復。註冊成功代表伺服器已記錄話機的公網位址與埠號,但NAT的路由器只會保留轉換記錄一段時間,不同型號的時效由數十秒至數分鐘不等;超過時效而沒有新封包經過,路由器便會刪除對應記錄,伺服器其後把來電或NOTIFY訊息送往該公網位址與埠號時,封包會被丟棄,話機便「消失」於伺服器眼中。
保持映射存活的標準做法是保活封包(keep-alive)。RFC 5389(STUN)在摘要中說明STUN「可用作保持存活的協定以維持NAT綁定」,顯示定期送出輕量封包以延長NAT映射時效,是網絡層早已設想的應用方式。SIP話機與伺服器普遍支援透過OPTIONS請求或空UDP封包定期刷新綁定,間隔應短於路由器映射時效,一般設為30至60秒。
註冊到期時間(expiry)是另一個影響因素。SIP註冊本身設有有效期,伺服器會在到期時把綁定視為失效;若話機的註冊到期設定與NAT映射時效不匹配,或話機在到期前沒有如期續註冊,便會出現斷續失聯。排解時應同時核對話機的保活間隔、NAT映射時效與伺服器的註冊到期設定,並在系統記錄中找出「註冊成功」與「綁定失效」之間的時間差距。
來電接不通與單向通話:RTP媒體流的路徑問題
第三類問題發生在通話階段:註冊正常、電話可打出,但來電不響或通話只有單向話音。原因與信令無關,而是媒體流(即語音封包)的路徑問題。SIP信令只負責建立通話,實際話音由RTP承載,而RTP使用的是一組在信令協商時各自告知的埠號。話機在SDP描述中填寫的接收媒體位址,若寫成內網私有位址,對端把語音封包送往該位址,封包無法穿過NAT,通話便只有出聲沒有入聲。
RTP埠號亦是常見失誤點。SIP信令預設走5060埠,RFC 3261在傳輸部分列出該預設值;但RTP媒體流通常使用額外開放的埠範圍,並非固定一埠。若防火牆只放通5060而未放通媒體埠範圍,或媒體埠沒有對應的NAT轉換規則,通話建立後語音封包便會被丟棄,表現為單向通話或通話數秒後靜音。RFC 3550(RTP)定義了RTP的運作方式,媒體封包以使用者資料報協定傳送,且來源埠號在通話期間保持不變,這意味着NAT轉換記錄必須在整通通話期間維持有效。
應對方法有兩類。其一是讓話機使用「對稱式RTP」並依賴NAT保活,使媒體封包的來源埠號與信令一致,路由器毋須另行設定即可讓回應與媒體流經同一條轉換記錄往返;其二是由系統伺服器協調媒體中繼,把RTP導向位於公網的中繼節點再轉送,避開話機位址不可達的問題。兩種做法各有適用場景,取決於話機型號與伺服器架構。
標準對策:rport、STUN與埠轉發的定位
應對經NAT註冊的問題,業界有一組標準化的技術,各自的定位不同。rport由RFC 3581定義,是Via標頭的參數,容許用戶端要求伺服器把回應送往請求的真正來源位址與埠號;同一文件並要求伺服器以收到請求時相同的位址與埠號回送回應,以便穿過對稱式NAT。rport解決的是「回應送不回」的問題,由話機與伺服器共同支援。
STUN由RFC 5389定義,是供其他協定使用的工具,可讓終端得知NAT分配給它的公網位址與埠號,亦可用以檢查兩端之間的連通性,以及作為保活協定維持NAT綁定。對SIP而言,STUN的典型用途是讓話機得知自己在公網上的外觀位址,並把該位址填入SDP描述,使對端的媒體封包能送往正確目的地。STUN需要話機與路由器配合:若路由器是對稱式NAT,STUN所偵測到的位址未必適用於所有目的地,此時效果會打折扣。
埠轉發(port forwarding)是另一種傳統做法:在路由器上把特定埠固定轉往話機的內網位址,令伺服器的回應與來電可以直接進入。這種做法適合內網只有一部SIP話機或閘道的情況,在多部話機或話機分散於不同位置時難以逐部設定,亦會把話機的媒體埠直接暴露於公網。實際部署常是三者並用:話機啟用rport與STUN,路由器設定恰當的保活時效,特殊情況再加埠轉發。維基百科〈NAT traversal〉條目對各類穿越技術的適用範圍有系統性說明。
香港網絡環境下的常見情況與排解步驟
香港辦公室常見兩種經NAT註冊的環境。其一是多據點公司:總公司或電訊商機房內有電話伺服器,各分店SIP話機經路由器NAT向外註冊。其二是電訊商提供「公網上網」的商業寬頻,辦公室直接以動態公網位址上網,話機看似沒有NAT,但部分服務商採用電訊商層級的NAT(營運商級NAT,CGNAT),多個客戶共用同一公網位址,話機實際仍位於NAT之後,無法直接接收入向連線。這種情況下,即使辦公室內沒有路由器做轉換,話機仍可能出現回應送不回的問題。
市區寫字樓網絡環境複雜亦加劇問題。同一層辦公室可能有多間公司共用上網線路,或大廈提供共享寬頻再經住戶路由器分配;分租寫字樓與服務式辦公室的網絡尤其常見多層NAT,話機後面可能疊加兩三層轉換。此外,香港不少公司在家居辦公室或分店使用消費級路由器,其NAT行為(是否對稱式、映射時效長短)參差,話機經其註冊時表現亦不相同。
遇到問題時的排解順序可參考:先在話機上確認伺服器位址可達,檢查註冊請求與回應的封包內容,看伺服器實際收到與回覆的位址埠號;其次核對話機是否已啟用rport與STUN,並與伺服器端的支援設定一致;再檢查路由器的映射時效與防火牆是否放通信令與媒體埠;最後向網絡供應商確認線路是否屬於營運商級NAT。逐項排除後,多數經NAT註冊的失聯問題可定位到其中一環。
部署建議:如何在設計階段避開NAT問題
經NAT註冊的問題,若在系統設計階段便處理,可省去日後大量排解時間。多據點部署時,話機數量少的分店可讓話機直接向總公司伺服器註冊,並統一話機的rport與STUN設定;話機數量多或對穩定度要求高的分支,可考慮在當地放置閘道或中繼節點,由閘道向總公司註冊,分店內話機只連往閘道,把NAT穿越的複雜度集中在單一設備上。
選用雲端電話服務時,應向服務商確認其伺服器對NAT客戶的支援方式,包括是否支援rport、是否提供STUN或媒體中繼、以及註冊保活的建議間隔。服務商若能提供專用閘道裝置或VPN連線,話機流量可繞過公網NAT穿越,穩定度通常較高,代價是額外的設備與線路成本。
最後是安全與監察層面。話機經NAT註冊時,伺服器端看到的是話機的公網位址,難以判斷話機的實際位置;多據點公司宜為每部話機建立明確的識別資訊,並在伺服器記錄登入來源,方便日後排查。香港辦公室租用的線路或會中途變更(搬遷、轉台、線路升級),屆時話機的公網位址會改變,若註冊依賴固定位址或已綁定舊地址的設定,需一併更新,避免搬遷後話機集體失聯。