linux與網路之NAT
在linux作業系統中,Netfilter元件是整合在linux核心中擴充套件各種網路服務的結構化底層框架,在核心級提供防火牆功能。核心中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,使用者可以通過一個命令工具(iptables)向其寫入規則。
報文流向:
- 流入本機:PREROUTING --> INPUT–>使用者空間程序
- 流出本機:使用者空間程序–>OUTPUT–> POSTROUTING
- 轉發:PREROUTING --> FORWARD --> POSTROUTING
核心中資料包的傳輸過程:
4. 當一個數據包進入網絡卡時,資料包首先進入PREROUTING鏈,核心根據資料包目的IP判斷是否需要轉送出去
5. 如果資料包就是進入本機的,資料包就會到達INPUT鏈。經INPUT鏈檢查後,資料包被髮往本地程序。本地程序進行相應處理後傳送響應資料包,資料包經過OUTPUT鏈,然後到達POSTROUTING鏈輸出;如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。
靜態NAT
通過手動設定,使 Internet 客戶進行的通訊能夠對映到某個特定的私有網路地址和埠。如果想讓連線在 Internet 上的計算機能夠使用某個私有網路上的伺服器(如網站伺服器)以及應用程式(如遊戲),那麼靜態對映是必需的。靜態對映不會從 NAT 轉換表中刪除。
如果在 NAT 轉換表中存在某個對映,那麼 NAT 只是單向地從 Internet 向私有網路傳送資料。這樣,NAT 就為連線到私有網路部分的計算機提供了某種程度的保護。但是,如果考慮到 Internet 的安全性,NAT 就要配合全功能的防火牆一起使用。
對於以上網路拓撲圖,當內網主機 10.1.1.1如果要與外網的主機201.0.0.11通訊時,主機(IP:10.1.1.1)的資料包經過路由器時,路由器通過查詢NAT table 將IP資料包的源IP地址(10.1.1.1)改成與之對應的全域性IP地址(201.0.0.1),而目標IP地址201.0.0.11保持不變,這樣,資料包就能到達201.0.0.11。而當主機HostB(IP:201.0.0.11) 響應的資料包到達與內網相連線的路由器時,路由器同樣查詢NAT table,將IP資料包的目的IP 地址改成10.1.1.1,這樣內網主機就能接收到外網主機發過來的資料包。在靜態NAT方式中,內部的IP地址與公有IP地址是一種一一對應的對映關係,所以,採用這種方式的前提是,機構能夠申請到足夠多的全域性IP地址。
動態NAT
動態地址NAT只是轉換IP地址,它為每一個內部的IP地址分配一個臨時的外部IP地址,主要應用於撥號,對於頻繁的遠端聯接也可以採用動態NAT。當遠端使用者聯接上之後,動態地址NAT就會分配給他一個IP地址,使用者斷開時,這個IP地址就會被釋放而留待以後使用。
動態NAT方式適合於 當機構申請到的全域性IP地址較少,而內部網路主機較多的情況。內網主機IP與全域性IP地址是多對一的關係。當資料包進出內網時,具有NAT功能的裝置對IP資料包的處理與靜態NAT的一樣,只是NAT table表中的記錄是動態的,若內網主機在一定時間內沒有和外部網路通訊,有關它的IP地址對映關係將會被刪除,並且會把該全域性IP地址分配給新的IP資料包使用,形成新的NAT table對映記錄。
中國大部分網民使用的就是這種動態NAT的機制。
NAPT
網路地址埠轉換NAPT(Network Address Port Translation)則是把內部地址對映到外部網路的一個IP地址的不同埠上。它可以將中小型的網路隱藏在一個合法的IP地址後面。NAPT與 動態地址NAT不同,它將內部連線對映到外部網路中的一個單獨的IP地址上,同時在該地址上加上一個由NAT裝置選定的埠號。
NAPT是使用最普遍的一種轉換方式,它又包含兩種轉換方式:SNAT和DNAT。
SNAT
企業內部的主機A想訪問網際網路上的主機C,首先將請求資料包(源:ipA,目標:ipC)傳送到防火牆所在主機B,B收到後將資料包源地址改為本機公網網絡卡的ip(源:ipA,目標:ipB),然後經網際網路傳送給C;C收到後將回應包(源:ipC,目標:ipB)轉發給C的路由器,經網際網路將回應包轉發給B,B收到迴應包後修改其目的地址,即迴應包改為(源:ipC,目標:ipA)然後將資料包轉發給A。
在這個過程中,修改了請求報文的源地址,叫做SNAT(source NAT POSTROUTING),用於區域網訪問網際網路。
不能在防火牆B的prerouting鏈上設定轉換源地址的防火牆策略,因為若在B的prerouting鏈上設定轉換源地址的防火牆策略,此時還未檢查路由表,還不知道要到達資料包中目標主機需經過本機的哪個網絡卡介面,即還不知道需將源地址替換為哪個公網網絡卡的ip,需在postrouting設定轉換源地址的防火牆策略。
DNAT
網際網路主機C想訪問企業內部的web伺服器A,但A的地址是私有地址,無法直接訪問。此時,C可以訪問防火牆的公網地址,C的請求資料包(源:ipC,目標:ipB)到達防火牆B後,在B的prerouting上將請求資料包的目標地址進行修改,並將資料包(源:ipC,目標:ipA)傳送給A。A收到後進行回覆傳送響應包(源:ipA,目的ipC)到防火牆,防火牆收到後對資料包源地址進行修改,並將響應包(源:ipB,目標:ipC)給C。利用這種機制可以將企業內部的服務釋出到網際網路。
在這個過程中,修改了請求報文的目標地址,叫做DNAT(destination NAT POSTROUTING),用於網際網路訪問區域網。
必須在防火牆的prerouting上設定修改目標地址的防火牆策略,因為若不在此處修改,請求資料包通過prerouting和路由表後,由於目標主機是本機,就會將資料包發往input,進而被髮往本地程序。