
圖片來(lái)自于互聯(lián)網(wǎng)
我們一說(shuō)到NAT問(wèn)題,讀者馬上就會(huì )聯(lián)想到路由器配置或者路由器的地址轉換方面的內容。今天,我們針對應用層的NAT-ALG進(jìn)行一個(gè)比較完整的詳解介紹,幫助讀者進(jìn)一步加深對SIP中的ALG配置,和其帶來(lái)的影響。
1、ALG背景介紹
大部分的讀者可能已經(jīng)了解了網(wǎng)絡(luò )OSI的架構,這里不再做過(guò)多介紹。ALG全稱(chēng)是Application-level gateway。其應用包括很多。我們使用的SIP是其中一種。

圖片來(lái)自于互聯(lián)網(wǎng)
ALG支持4種功能,其中一個(gè)比較重要的功能就是“防火墻”功能。注意,這里的防火墻是加了引號的,因為在當前針對SIP的部署環(huán)境中,SBC承擔了SIP防火墻的功能。關(guān)于SBC的完整的介紹,讀者可以查閱筆者的歷史文檔,筆者對SBC部署發(fā)布了大量的技術(shù)資料,因此,這里不再重復。
如何搭建一個(gè)完整免費的邊界會(huì )話(huà)控制器(SBC)測試場(chǎng)景
ALG可以把網(wǎng)絡(luò )層的地址公網(wǎng)地址和內網(wǎng)地址進(jìn)行NAT處理轉換,實(shí)現內外網(wǎng)進(jìn)行互聯(lián)互通。在具體的實(shí)際應用中,ALG會(huì )重寫(xiě)一些SIP修改的消息內容來(lái)保證SIP服務(wù)器端和SIP終端之間地址的統一,保證其連接正常。這里,讀者一定要注意幾個(gè)需要注意到提示:
- ALG僅對應用層(SIP/SDP)的消息進(jìn)行重寫(xiě)
- ALG僅針對NAT規則進(jìn)行處理,如果沒(méi)有NAT問(wèn)題,無(wú)需ALG
- 在NAT后面的SIP設備不會(huì )感覺(jué)ALG的存在
因為大部分的SIP網(wǎng)絡(luò )應用基本上都涉及了外網(wǎng)用戶(hù)注冊的問(wèn)題,設備在NAT后,或者SIP服務(wù)器是公網(wǎng)部署。所以部署方案會(huì )帶來(lái)很多潛在的問(wèn)題。很多時(shí)候,在一些中小型企業(yè)通信的部署環(huán)境中,通過(guò)修改路由器的ALG配置可以解決一定的問(wèn)題。但是,隨著(zhù)部署環(huán)境越來(lái)越復雜,客戶(hù)對網(wǎng)絡(luò )使用的靈活性要求越來(lái)越高,因此VOIP解決方案部署和NAT問(wèn)題一直處于一種并存狀態(tài),這種狀態(tài)給客戶(hù)帶來(lái)很多呼叫問(wèn)題,包括單通,呼叫掉線(xiàn),呼叫后無(wú)語(yǔ)音等問(wèn)題。通過(guò)ALG開(kāi)啟或者關(guān)閉的設置,一些簡(jiǎn)單的問(wèn)題都可以被輕松處理。接下來(lái),我們具體介紹一下ALG針對SIP和SDP到底做了哪些處理。
2、ALG到底做了哪些處理
首先說(shuō)明,ALG可以做NAT轉換同樣的工作,但是,ALG僅在第七層中進(jìn)行處理。因為ALG是路由器的內置功能,因此,ALG主要做以下幾個(gè)方面的工作:
- ALG是在消息離開(kāi)路由器之前修改SIP/SDP應用的必要的消息
- ALG替換使用公網(wǎng)地址和端口替換SIP設備的內網(wǎng)地址和端口
簡(jiǎn)單示例說(shuō)明,如果一個(gè)在內網(wǎng)的SIP終端需要和公網(wǎng)的SIP服務(wù)器連接,它首先需要通過(guò)路由器出局,并且告訴公網(wǎng)SIP服務(wù)器其SIP終端的公網(wǎng)地址。否則,SIP公網(wǎng)服務(wù)器不能和一個(gè)私人網(wǎng)IP的終端進(jìn)行通信。那怎么辦呢?只能通過(guò)路由器的ALG轉換一個(gè)公網(wǎng)地址,然后和SIP服務(wù)器連接互通,返回時(shí),路由器再通過(guò)這個(gè)綁定消息返回到內網(wǎng)SIP終端。這就是ALG簡(jiǎn)單的工作原理。在A(yíng)LG處理中,SIP和SDP都需要進(jìn)行修改處理:
- IP地址和端口修改
- 超時(shí)設置,媒體轉發(fā)設置
- ALG修改SIP頭中的Via和Contact,有的路由器也可能修改Route和Record- Route頭。
- ALG修改SDP消息體中的m=,c=和o=,有時(shí)也修改a=。這些參數的具體內容,參考RFC4566-5章節
注意,在七層協(xié)議中,ALG和proxy服務(wù)器的地址轉換有所不同。ALG設置無(wú)需SIP用戶(hù)端進(jìn)行配置,而proxy則需要用戶(hù)端或者SIP服務(wù)器進(jìn)行適當配置。以下示例就是一個(gè)典型的在路由器上開(kāi)啟ALG功能設置以后,SIP內網(wǎng)終端連接外網(wǎng)SIP服務(wù)器時(shí)的一個(gè)呼叫請求,在這個(gè)呼叫請求,SIP終端的Via,Contact發(fā)生轉換的流程,ALG把Via和Contact通過(guò)公網(wǎng)地址進(jìn)行了修改,替換為路由器公網(wǎng)地址,然后發(fā)送到SIP服務(wù)器。

圖片來(lái)自于互聯(lián)網(wǎng)
我們討論了關(guān)于A(yíng)LG處理的一些參數。為了解決NAT問(wèn)題,其實(shí)很多終端或者服務(wù)器端已經(jīng)增加了針對NAT的功能支持,可以非常友好地解決NAT問(wèn)題。但是,還有一部分產(chǎn)品沒(méi)有支持NAT檢測功能。因此,有時(shí)需要ALG開(kāi)啟,有時(shí)又需要ALG關(guān)閉。接下來(lái),我們將討論開(kāi)啟或者關(guān)閉ALG的必要性。
3、開(kāi)啟ALG功能設置
現在NAT問(wèn)題非常普遍,很多SIP終端設備已經(jīng)具備了NAT檢測功能。但是市場(chǎng)上一些SIP終端(可能思科話(huà)機和比較老的品牌的話(huà)機有一部分不支持NAT檢測)仍然沒(méi)有支持NAT檢測。不支持NAT檢測功能的SIP終端對七層應用中消息寫(xiě)入一個(gè)私網(wǎng)IP地址。遠端SIP服務(wù)器就會(huì )根據這個(gè)私網(wǎng)地址返回SIP響應。因為這個(gè)SIP終端是在NAT背后的私網(wǎng)地址,所以,SIP服務(wù)器端返回的消息永遠不會(huì )抵達SIP終端。這樣的話(huà),類(lèi)似這樣的SIP終端就需要路由器開(kāi)啟ALG支持,通過(guò)ALG來(lái)修正到正確的IP地址上。如果SIP終端是在NAT背后的話(huà),并且此SIP終端沒(méi)有支持NAT檢測,那么,這些設備就需要開(kāi)啟路由器的ALG功能設置。過(guò)路由器以后,沒(méi)有開(kāi)啟ALG功能。路由器出局的IP地址仍然是一個(gè)私網(wǎng)地址。如下示例:

開(kāi)啟路由器的ALG功能以后,SIP服務(wù)器/IPPBX收到的SIP和SDP地址則修改為其公網(wǎng)地址,包括SIP header和SDP消息體內容。在下面的示例中,我們在路由器開(kāi)啟了ALG設置,SIP服務(wù)器可以收到其帶公網(wǎng)地址的SIP/SDP消息。這樣的話(huà),不支持NAT檢測的SIP終端如果路由器開(kāi)啟了ALG設置的話(huà),則可以成功修改相關(guān)IP地址,可以保證和外網(wǎng)SIP服務(wù)器進(jìn)行正常互通。

因此,如果是不帶NAT檢測功能的終端,如果在NAT環(huán)境下,大部分情況下需要開(kāi)啟ALG功能。
4、關(guān)閉ALG的設置
前面我們討論了在一些必要的SIP終端缺乏支持NAT檢測功能的時(shí)候,需要開(kāi)啟ALG功能來(lái)解決公網(wǎng)IP地址的問(wèn)題。但是,在很多場(chǎng)景中,SIP呼叫業(yè)務(wù)又不需要開(kāi)啟ALG功能。很多時(shí)候,我們經(jīng)常聽(tīng)到技術(shù)人員說(shuō)“檢測路由器,關(guān)閉ALG設置”。確實(shí),關(guān)閉ALG設置可以解決很多問(wèn)題。但是,我們在什么時(shí)候需要關(guān)閉ALG呢?通常情況下,有幾種情況需要讀者考慮關(guān)閉ALG功能:
- SIP設備支持NAT檢測功能
- SIP服務(wù)器是在NAT背后的網(wǎng)絡(luò )環(huán)境中, SIP終端通過(guò)外網(wǎng)呼叫內網(wǎng)SIP服務(wù)器
- SIP服務(wù)器部署在公網(wǎng)環(huán)境,SIP終端在帶NAT的環(huán)境中
在當前的部署環(huán)境中,我們看到的環(huán)境大部分是SIP服務(wù)器端支持NAT檢測,SIP終端很少需要NAT檢測的設置。所以,很多廠(chǎng)家,包括一些開(kāi)源的SIP軟交換或媒體服務(wù)器都能夠支持NAT檢測設置。如果是一個(gè)能夠檢測NAT的SIP服務(wù)器,它可以檢測到自己的公網(wǎng)IP地址,并且發(fā)送SIP消息之前,會(huì )把自己的公網(wǎng)地址寫(xiě)入到SIP和SDP消息中。NAT檢測可以綁定某些外網(wǎng)的分機,通過(guò)修改地址的方式發(fā)送到NAT環(huán)境以外的SIP終端。現在,我們討論兩個(gè)基本點(diǎn)使用場(chǎng)景。一種是SIP服務(wù)器或者IPPBX在NAT背后場(chǎng)景。如果此SIP服務(wù)器在NAT背后的話(huà)是這樣處理的,ALG關(guān)閉以后,在內網(wǎng)的SIP服務(wù)器或者IPPBX會(huì )自動(dòng)檢測NAT設置,在發(fā)送SIP消息前修改SIP/SDP中的內網(wǎng)地址為公網(wǎng)地址,然后發(fā)送到外網(wǎng)的SIP終端,SIP終端就會(huì )收到一個(gè)帶公網(wǎng)地址的SIP服務(wù)器的SIP/SDP消息,這樣就會(huì )保證其互通成功。如果這種環(huán)境下開(kāi)啟ALG設置的話(huà),可能會(huì )干擾SIP/SDP地址的發(fā)送。

另外一種情況是SIP服務(wù)器或者IPPBX部署在公網(wǎng)環(huán)境或者云平臺,SIP分機在帶NAT的內網(wǎng)環(huán)境中。通常的處理方式可以是這樣的:在SIP 服務(wù)器創(chuàng )建分機時(shí),其分機屬性設置支持NAT=yes以后,內網(wǎng)的SIP終端對SIP服務(wù)器端發(fā)送消息,路由器的ALG是關(guān)閉狀態(tài),SIP服務(wù)器收到SIP終端的消息后,包括其SIP終端的內網(wǎng)地址和SDP消息,看到分機設置為NAT=yes的設置,SIP服務(wù)器就會(huì )意識到有一個(gè)來(lái)自帶NAT處理請求的SIP終端,這個(gè)終端要求修改SIP/SDP的內網(wǎng)地址為發(fā)送消息的公網(wǎng)地址。外網(wǎng)的SIP 服務(wù)器或者IPPBX就會(huì )替換掉Via中的SIP內網(wǎng)地址為一個(gè)Receivedd IP地址。SIP服務(wù)器通過(guò)這個(gè)Via 中的IP地址返回到公網(wǎng)地址和SIP終端。以下是一個(gè)FreePBX中關(guān)于NAT=yes的設置策略,這個(gè)參數設置比較智能地解決了NAT問(wèn)題,同時(shí)也不需要開(kāi)啟路由器的ALG設置。
這里,路由器的ALG是關(guān)閉狀態(tài),因此SIP終端的內網(wǎng)IP地址就會(huì )發(fā)送到SIP服務(wù)器端,根據NAT=yes的設置選項,SIP服務(wù)器端修改了Via此SIP的公網(wǎng)地址,然后返回到此公網(wǎng)。這樣的設置可以解決大部分的NAT問(wèn)題。注意,有一些路由器也會(huì )干擾消息的處理,如果關(guān)閉ALG不能工作的話(huà),技術(shù)人員需要開(kāi)啟ALG設置做進(jìn)一步的測試。

因此,如果SIP服務(wù)器/IPPBX那個(gè)智能支持一個(gè)NAT=yes的選項,SIP服務(wù)器端自己首先進(jìn)行NAT處理,無(wú)需開(kāi)啟路由器的ALG,可以幫助用戶(hù)能夠快速智能地解決大部分的問(wèn)題。
提醒讀者,開(kāi)源Asterisk或者FreeSWITCH都能非常智能地支持類(lèi)似的功能,具體的設置語(yǔ)法包括:
FreeSWITCH撥號規則中使用 <condition field="${sip_nat_detected}" expression="true">
Asterisk中的PJSIP配置文件中的local_net 和external_media_address等參數
如果通過(guò)FreePBX界面配置的話(huà),參考www.freepbx.org.cn 的技術(shù)資料
5、ALG超時(shí)設置和媒體轉發(fā)討論
除了我們剛才討論的是否開(kāi)啟ALG NAT功能以外,關(guān)于A(yíng)LG設置還有兩個(gè)比較重要的功能,它們分別是ALG超時(shí)設置和ALG媒體轉發(fā)功能(sip-direct-media)。相對ALG地址的轉換以外,這兩個(gè)功能使用的場(chǎng)景可能相對比較少,但是它們有時(shí)仍然可能對呼叫產(chǎn)生一定的影響。在SIP會(huì )話(huà)處理過(guò)程中,一個(gè)呼叫可能涉及了多個(gè)定時(shí)器,包括最底層的路由器的UDP超時(shí)設置和SIP服務(wù)器/IPPBX端的SIP終端的會(huì )話(huà)的超時(shí)設置。但是,這些超時(shí)設置取值的大小會(huì )引起相互之間的沖突。例如,如果路由器的UDP超時(shí)設置是60秒的話(huà),SIP服務(wù)器的SIP終端超時(shí)設置為120秒,那么,路由器中ALG的這個(gè)UDP超時(shí)會(huì )首先啟動(dòng),超時(shí)后,UDP端口可能就會(huì )關(guān)閉,SIP服務(wù)器仍然多關(guān)閉的端口發(fā)送SIP呼叫的話(huà),最終呼叫就會(huì )失敗。因此,路由器的ALG超時(shí)設置一定要高于SIP服務(wù)器的各種會(huì )話(huà)超時(shí)設置-keepalive(注冊超時(shí),option超時(shí),呼叫超時(shí)設置)的最低值,這樣可以保證SIP服務(wù)器端的SIP終端可能始終獲得開(kāi)放的UDP端口。
在一些特殊情況下或者SIP服務(wù)提供商為了節省帶寬費用,SIP呼叫需要支持媒體轉發(fā)功能,繞過(guò)了SIP服務(wù)器的媒體處理能力支持,直接轉發(fā)到其他媒體服務(wù)器。通常情況下,如果需要支持類(lèi)似的功能的話(huà),技術(shù)人員需要在SIP服務(wù)器/IPPBX端進(jìn)行設置,現在的PBX都有類(lèi)似的功能支持。這樣的可以降低直接對接的SIP媒體服務(wù)器的負載,降低了帶寬資源的耗費,提高了點(diǎn)對點(diǎn)呼叫的效率提高,但是會(huì )導致SIP服務(wù)器錄音丟失,CDR記錄缺乏,缺乏呼叫控制等其他問(wèn)題。路由器的ALG也可以支持類(lèi)似的功能(sip-direct-media),如果用戶(hù)在路由器端的ALG上設置了類(lèi)似的功能,那么,呼叫的媒體轉發(fā)就會(huì )直接在A(yíng)LG上進(jìn)行處理。

6、ALG相關(guān)工具
目前很多工具可以排查ALG的問(wèn)題。Wireshark是首選的排查工具,用戶(hù)可以通過(guò)對路由器抓包來(lái)觀(guān)察進(jìn)入路由器和離開(kāi)路由器期間地址的變化。路由器開(kāi)啟ALG以后,抓包測試SIP服務(wù)器地址,或者終端地址的變化。有時(shí),一些用戶(hù)如果不能直接訪(fǎng)問(wèn)路由器的設置的話(huà),也可以下載測試工具來(lái)檢查自己的路由器是否開(kāi)啟或者關(guān)閉了ALG設置。如下示例,如果筆者的網(wǎng)絡(luò )中支持了ALG開(kāi)關(guān),ALG檢測工具可以檢測到true或者false的設置。

測試結果可以參照此說(shuō)明來(lái)對照檢查:
- If the results = False then a SIP ALG was not detected by the client.
- If the results = True then a SIP ALG is active and must be turned off.
ruby sip-alg-detector-daemon.rb -i 99.88.77.66
具體使用方式參考:
sip-alg-detector
https://github.com/ibc/sip-alg-detector
7、路由器ALG功能的局限性
當前的SIP呼叫業(yè)務(wù)的要求越來(lái)越復雜,本身路由器針對ALG功能支持相對比較簡(jiǎn)單,它天生具有一定的局限性。所以,如果使用SIP呼叫時(shí),很多用戶(hù)一般都關(guān)閉了ALG功能,通過(guò)SBC來(lái)處理SIP呼叫業(yè)務(wù)。現在,我們討論幾個(gè)關(guān)于A(yíng)LG功能局限性話(huà)題:
根據目前市場(chǎng)上,用戶(hù)對ALG的反饋,一些路由器廠(chǎng)家針對ALG或者SIP設置功能的支持不友好,帶來(lái)一些不穩定的因素,所以很多用戶(hù)一般選擇關(guān)閉ALG功能。
ALG在NAT處理過(guò)程中替換一些必要的地址,有可能會(huì )替換掉SIP消息中的Call-ID的IP地址參數。如果修改了call-id的話(huà),就會(huì )導致整個(gè)SIP會(huì )話(huà)管理出現問(wèn)題,同一呼叫中系統出現了不同的會(huì )話(huà)消息,呼叫就會(huì )失敗。
一些兼容性不好的路由器針對ALG的語(yǔ)法構建支持不好,很多時(shí)候在重寫(xiě)SIP消息時(shí),可能會(huì )出現一些非法的字符,ALG處理以后的SIP內容格式破壞了SIP語(yǔ)法格式,SIP服務(wù)器端解析消息出現問(wèn)題。
ALG僅支持了SDP的Payload,缺少針對SIP的其他支持,例如加密的SDP,TLS,FQDN解析處理,SIP認證處理機制,IPv6環(huán)境中對SIP的支持比較弱等問(wèn)題。
針對SIP終端支持的BLF功能,其ALG兼容性相對比較弱(ALG僅支持3000-byte SIP 消息數據)。因為BLF需要產(chǎn)生大量的Notify消息,這些消息數據會(huì )超過(guò)ALG所限定的數據量。大家可以想象一下,如果幾百臺SIP話(huà)機都開(kāi)啟了BLF功能的話(huà),都需要經(jīng)過(guò)ALG處理的話(huà),它們之間相互交互交互就會(huì )導致路由器負載很高。如果因為大量數據交換引起系統的穩定性問(wèn)題,也可能最終導致其他的消息格式錯誤。因為UDP數據損壞導致的問(wèn)題已經(jīng)是SIP呼叫的一個(gè)大的問(wèn)題。UDP Fragmentation Breaks SIP in Today's IP-PBXs
http://blog.tmcnet.com/third-screen/2009/03/udp_fragmentation_breaks_sip_in_todays_ip-pbxs.html
ALG缺少針對SIP methods和安全,其他SIP拓展的支持。市場(chǎng)上,大部分的路由器缺少專(zhuān)門(mén)針對SIP應用等功能比較完善的支持,一些廠(chǎng)家也針對ALG增加了一些針對SIP協(xié)議場(chǎng)景的拓展功能,因此,ALG功能得到了一定的提升。但是,其功能仍然很難完全滿(mǎn)足運營(yíng)級SIP呼叫的業(yè)務(wù)需求。畢竟,路由器的產(chǎn)品定位和會(huì )話(huà)邊界控制器(SBC)的定位是不一樣的。因此,如果需要非常專(zhuān)業(yè)的專(zhuān)門(mén)針對SIP和媒體處理的業(yè)務(wù)需求,強烈建議用戶(hù)使用SBC來(lái)管理SIP呼叫和其他相關(guān)的業(yè)務(wù)功能。

通過(guò)SBC實(shí)現SIP分機的外網(wǎng)注冊功能
8、總結
路由器的ALG配置一直是用戶(hù)非常關(guān)心的話(huà)題。筆者認為,通過(guò)本文章完整的介紹,讀者可以基本上了解了關(guān)于A(yíng)LG的功能,啟用/關(guān)閉ALG的條件場(chǎng)景,以及ALG目前的局限性。
首先,筆者介紹了ALG的使用背景和技術(shù)特點(diǎn),然后筆者針對具體的場(chǎng)景分別做了不同的說(shuō)明。用戶(hù)需要在什么時(shí)候開(kāi)啟ALG功能,什么時(shí)候關(guān)閉ALG功能。通過(guò)非常細節的拓撲圖示例說(shuō)明了工作的流程。然后,筆者介紹了幾款關(guān)于A(yíng)LG檢測的實(shí)用工具,用戶(hù)可以直接通過(guò)本地根據來(lái)檢查路由器開(kāi)啟狀態(tài)。最后,筆者討論了ALG的一些局限性,幫助讀者能夠對ALG有一個(gè)完整專(zhuān)業(yè)的認識,也幫助用戶(hù)能夠了解針對SIP的部署的解決方案-SBC。通過(guò)SBC部署滿(mǎn)足越來(lái)越復雜的SIP相關(guān)技術(shù)需求。
最后,筆者這里再次說(shuō)明,本人沒(méi)有可能耗費太多精力去測試多臺路由器的ALG功能,因此不會(huì )針對每一款產(chǎn)品做出非常準確的評價(jià),因此,在文章編寫(xiě)過(guò)程中可能出現一些錯誤的表述,望讀者諒解。因為路由器廠(chǎng)家對ALG功能支持的力度有所不同,可能導致不同的設置結果。因此,強烈建議讀者自己親自在自己的環(huán)境中,通過(guò)不同配置,然后使用排查工具來(lái)進(jìn)行實(shí)驗驗證。
參考資料:
https://tools.ietf.org/html/rfc2663
https://github.com/ibc/sip-alg-detector
https://tools.ietf.org/html/rfc4566#section-5
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ipaddr_nat/configuration/xe-3s/nat-xe-3s-book/iadnat-fw-sip-alg-hardng.html
https://wiki.asterisk.org/wiki/display/AST/Configuring+res_pjsip+to+work+through+NAT
https://www.researchgate.net/publication/291299719_Firewall-friendly_VoIP_secure_gateway_and_VoIP_security_issues/link/56c54e3a08ae736e704719a1/download
https://support.ringlogix.com/index.php?/Knowledgebase/Article/View/167/38/sip-alg-detector
https://fortinetweb.s3.amazonaws.com/docs.fortinet.com/v2/attachments/01b12c6d-1a17-11e9-9685-f8bc1258b856/fortigate-sip-60.pdf
https://www.juniper.net/documentation/en_US/junos/topics/topic-map/security-sip-alg.html
https://www.ecg.co/blog/125-sip-and-fragments-together-forever


關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的Asterisk/SIP技術(shù)和行業(yè)分享
權威Asterisk freepbx FreeSBC技術(shù)文檔: www.freepbx.org.cn
完整企業(yè)融合通信商業(yè)解決方案:www.hiastar.com
如何使用FreeSBC+FreeSWITCH/Asterisk,qq技術(shù)分享群:334023047