1 NAT ALG簡介
普通NAT實現了對UDP或TCP報文頭中的的IP地址及端口轉換功能,但對應用層數據載荷中的字段無能為力,在許多應用層協議中,比如多媒體協議(H.323、SIP等)、FTP、SQLNET等,TCP/UDP載荷中帶有地址或者端口信息,這些內容不能被NAT進行有效的轉換,就可能導致問題。而NAT ALG(Application Level Gateway,應用層網關)技術能對多通道協議進行應用層報文信息的解析和地址轉換,將載荷中需要進行地址轉換的IP地址和端口或者需特殊處理的字段進行相應的轉換和處理,從而保證應用層通信的正確性。
例如,FTP應用就由數據連接和控制連接共同完成,而且數據連接的建立動態地由控制連接中的載荷字段信息決定,這就需要ALG來完成載荷字段信息的轉換,以保證后續數據連接的正確建立。
2 NAT ALG特點
NAT ALG為內部網絡和外部網絡之間的通信提供了基於應用的訪問控制,具有以下優點:
(1) ALG統一對各應用層協議報文進行解析處理,避免其它模塊對同一類報文應用層協議的重復解析,可以有效提高報文轉發效率。
(2) 可支持多種應用層協議:FTP、H.323(包括RAS、H.225、H.245)、SIP、DNS、ILS、MSN/QQ、NBT、RTSP、SQLNET、TFTP等。
3 NAT ALG技術實現
先介紹ALG涉及到的兩個概念:
會話:記錄了傳輸層報文之間的交互信息,包括源IP地址、源端口、目的IP地址、目的端口,協議類型和源/目的IP地址所屬的VPN實例。交互信息相同的報文屬於一條流,通常情況下,每個會話對應出方向和入方向的兩條流。
動態通道:當應用層協議報文中攜帶地址信息時,這些地址信息會被用於建立動態通道,后續符合該地址信息的連接將使用已經建立的動態通道來傳輸數據。
下面以多通道應用協議FTP在NAT組網環境中的ALG應用來具體說明報文載荷的轉換過程。
3.1 ALG與FTP的應用
FTP的兩種不同工作模式:PORT(主動模式)與PASV(被動模式)。
FTP需要用到兩個連接:控制連接與數據連接,控制連接專門用於FTP控制命令及命令執行信息傳送;數據連接專門用於傳輸數據(上傳/下載)。
3.1.1 主動模式(PORT)的連接過程
如圖1所示,位於內部網絡的客戶端以PORT方式訪問外部網絡的FTP服務器,經過中間的設備進行NAT轉換,該設備上使能了ALG特性。
圖1 FTP PORT方式報文載荷的ALG處理圖
圖1中私網側的主機要訪問公網的FTP服務器。NAT設備上配置了私網地址192.168.1.2到公網地址8.8.8.11的映射,實現地址的NAT轉換,以支持私網主機對公網的訪問。組網中,若沒有ALG對報文載荷的處理,私網主機發送的PORT報文到達服務器端后,服務器無法根據私網地址進行尋址,也就無法建立正確的數據連接。整個通信過程包括如下四個階段:
(1) 私網主機和公網FTP服務器之間通過TCP三次握手成功建立控制連接。
(2) 控制連接建立后,私網主機向FTP服務器發送PORT報文,報文中攜帶私網主機指定的數據連接的目的地址和端口,用於通知服務器使用該地址和端口和自己進行數據連接。
(3) PORT報文在經過支持ALG特性的NAT設備時,報文載荷中的私網地址和端口會被轉換成對應的公網地址和端口。即設備將收到的PORT報文載荷中的私網地址192.168.1.2轉換成公網地址8.8.8.11,端口1084轉換成12487。
(4) 公網的FTP服務器收到PORT報文后,解析其內容,並向私網主機發起數據連接,該數據連接的目的地址為8.8.8.11,目的端口為12487(注意:一般情況下,該報文源端口為20,但由於FTP協議沒有嚴格規定,有的服務器發出的數據連接源端口為大於1024的隨機端口,如本例采用的是wftpd服務器,采用的源端口為3004)。由於該目的地址是一個公網地址,因此后續的數據連接就能夠成功建立,從而實現私網主機對公網服務器的訪問。
在HOST(FTP客戶端)抓包如圖2所示:
圖2 PORT模式FTP客戶端抓包
在FTP服務器端抓包如圖3所示:
圖3 PORT模式FTP服務器端抓包
由上抓包可知:主動模式(PORT)的連接過程是:客戶端程序首先會為自己隨機分配一個TCP 端口,它使用這個端口向服務器的FTP端口(默認為21)發出連接請求,服務器接受請求之后會建立一條控制鏈路,然后客戶程序向服務器發出PORT命令(通常格式為PORT A1,A2,A3,A4,P1,P2,其中A1,A2,A3,A4為客戶端IP地址,P1,P2為隨機的一個數據連接端口號,端口號等於P1*256+P2),告訴服務器它的數據通道的端口打開了。當需要傳送數據時,服務器向客戶端提供的隨機端口發送連接請求,請求被接受之后便開始傳輸數據,主動模式下,需要做ALG處理的是客戶端發出的PORT報文,如FTP客戶端上抓包中的第13個報文,其中有一個包含地址和端口的字段為Request arg,如圖4所示:
圖4 ALG轉換前的PORT報文
FTP客戶端發出的PORT報文經過NAT設備后對應FTP服務器端上抓的第13個報文,私網地址192.168.1.2轉換成公網地址8.8.8.11,端口1084轉換成12487,如圖5所示:
圖5 ALG轉換后的PORT報文
3.1.2 被動模式(PASV)的連接過程
如圖6所示,位於外部網絡的FTP客戶端以PASV方式訪問內部網絡的FTP服務器,經過中間的設備進行NAT轉換,該設備上使能了ALG特性。
圖6 FTP PASV方式報文載荷的ALG處理圖
圖2中的NAT設備上配置了私網地址192.168.1.1到公網地址8.8.8.2的映射,實現地址的NAT轉換。整個通信過程包括如下四個階段:
(1) 建立控制通道
客戶端向服務器發送TCP連接請求。TCP連接建立成功后,服務器和客戶端進入用戶認證階段。若TCP連接失敗,服務器會斷開與客戶端的連接。
(2) 用戶認證
客戶端向服務器發送認證請求,報文中包含FTP命令(USER、PASSWORD)及命令所對應的內容。客戶端發送的認證請求報文在通過配置了ALG的設備時,報文載荷中攜帶的命令字將會被解析出來,用於進行狀態機轉換過程是否正確的檢查。若狀態機轉換發生錯誤,則丟棄報文。這樣可防止客戶端發送狀態機錯誤的報文攻擊服務器或者非法登陸服務器,起到保護服務器的作用。客戶端的認證請求報文通過ALG處理之后,到達服務器端,服務器將對其進行響應。
(3) 創建數據通道
認證狀態正確且用戶是服務器已經授權的客戶端,才能和服務器建立數據連接,進行數據的交互。如圖6所示,當客戶端發送“PASV”命令發起連接時,服務器會在發送給客戶端的PASV響應報文中攜帶自己的私網地址和端口號(IP1,Port1),響應報文經過ALG設備時被解析,其中攜帶的服務器的私網地址和端口號被轉換成其對應的公網地址和端口號(IP2,Port2),之后在該地址和端口與客戶端的地址和端口之間將建立起數據通道。
(4) 數據交互
客戶端和服務器之間的數據交互可以直接通過數據通道來進行。
在FTP服務器端抓包如圖7所示:
圖7 PASV模式FTP服務器端抓包
由上抓包可知:被動模式(PASV)的連接過程是客戶端程序首先為自己隨機分配一個TCP端口,使用這個端口向服務器的FTP端口發出連接請求,服務器接受請求之后會建立一條控制鏈路,然后客戶端程序發出PASV命令,要求服務器采用PASV模式建立數據連接,服務器便為自己隨機分配一個數據通道端口,並將這個端口號告訴客戶端程序(通常格式為:Entering Passive Mode (A1,A2,A3,A4,P1,P2),其中A1,A2,A3,A4為服務器IP地址,P1,P2為隨機端口號)。當需要傳送數據時,客戶端程序采用另一個隨機端口向服務器提供的數據通道端口發送連接請求,請求被接受之后便開始傳輸數據,數據鏈路通道打開,被動模式下,需要做ALG處理的是服務器發出的Pasv response報文,如上抓包中的第14個包,其中有一個包含地址和端口的字段為Response arg,如圖8所示:
圖8 需要做ALG的Pasv response報文
3.2 ALG與H323/SIP的應用
3.2.1 ALG與H323的應用
H.323協議用於發起會話,它能控制多個參與者參加的多媒體會話的建立和終結,並能動態調整和修改會話屬性,如會話帶寬要求、傳輸的媒體類型(語音、視頻等)、媒體的編解碼格式、廣播的支持等。
H.323協議采用Client/Server模型,如在圖9所示的語音組網中,主要通過網關(Gateway)與網守(Gatekeeper)之間的通信來完成用戶呼叫的建立過程。
網關(Gateway):用於連接H323電話終端;
網守(Gatekeeper):注冊/位置/代理服務器,管理各gateway
圖9 H.323語音應用組網圖
H323協議棧如圖10所示:
圖10 H.323協議棧
由協議棧可知,H323是一個協議族,由眾多協議來完成地址定位,注冊,媒體協商等一系列工作。其中TCP/UDP載荷中帶有地址或者端口信息,若在網關進行了NAT處理后,則需要進行ALG處理的有H.225、H.245、RAS等信令協議報文,具體為:
(1) UDP RAS報文:gatekeeper、registar、admission的request和confirm報文
(2) TCP H.225報文:setup、alerting、connect報文
(3) TCP H.245報文:open logical chanel、open logical chanel ACK報文
H323通信中會建立4種連接:
RAS連接:網關與網守之間的UDP連接,源目的端口均是1719。
H.225連接:routed模式建立在網關與網守之間,redirect模式建立在網關與網關之間的TCP連接。源端口一般是發起方隨機分配的,目的端口是1720。
H.245連接:routed模式建立在網關與網守之間,redirect模式建立在網關與網關之間的TCP連接。源端口一般是發起方隨機分配的,目的端口通過H.225的connect報文協商。
RTP/RTCP連接:建立在網關與網關之間的UDP連接。源和目的通過H.245連接里的open logical chanel及其ACK報文協商。
3.2.2 ALG與SIP的應用
SIP(Session Initiation Protocol,會話初始協議)是一個用於建立、更改和終止多媒體會話的應用層控制協議,其中的會話可以是IP電話、多媒體會話或多媒體會議。SIP是通過各種頭域里的信息的交互來管理會話的。而頭域里與呼叫建立相關的包含IP地址和端口信息的字段需要被ALG處理,否則無法正確進行呼叫。SIP UA直接呼叫組網如圖11所示(兩台路語音由器作為SIP UA,能夠互相直接呼叫):
圖11 SIP UA直接呼叫組網圖
SIP消息采用文本方式編碼,包括請求消息與響應消息兩類。SIP請求消息包括如下六種。
(1) INVITE:用於邀請用戶加入一個呼叫。
(2) ACK:用於對請求消息的響應消息進行確認。
(3) OPTIONS:用於請求協商能力信息。
(4) BYE:用於釋放已建立的呼叫。
(5) CANCEL:用於釋放尚未建立的呼叫。
(6) REGISTER:用於向SIP注冊服務器登記用戶位置等信息。
SIP響應消息用於對請求消息進行響應,指示呼叫或注冊的成功或失敗狀態。在請求與響應報文中需要進行ALG處理的地址字段類型主要有:Via、Record_Route、Contact、SDP。
ALG處理流程為如下三個步驟:
首先,ALG根據會話標識的協議類型對報文進行解碼,若解碼發現報文為不需要做ALG或解碼發現為錯誤字段時退出,解碼發現需進行字段轉換時進一步處理;
其次,ALG查找接口上的NAT配置,根據NAT配置轉換報文中的IP地址、端口、call-id等信息並建立關聯表,關聯表記錄了載荷地址的轉換關系;
最后,ALG調整報文載荷中的長度字段,如sipmessage header的content-length字段標識message body的長度,ALG對message body中的地址轉換后,message body長度可能變化,content-length字段值需要置為變化后的值。