NAT介紹及iptables配置NAT的方法
NAT,網路地址轉換,該技術是為了應對IPv4地址耗盡的問題而產生的。他的產生幾乎使IPv4起死回生。在IPv4已經被認為行將結束歷史使命之後近20年時間裡,人們幾乎忘了IPv4的地址空間即將耗盡這樣一個事實。
IPv4地址的劃分
在弄明白NAT的具體功能前,我們先來看一看IPv4地址的劃分。
IPv4協議為了路由和管理方便,43億的地址空間被按照不同字首長度劃分為A,B,C,D類地址網路和保留地址。其中,A類網路地址127段,每段包括主機地址約1678萬個。B類網路地址16384段,每段包括65536個主機地址。
RFC1918規定了三個保留地址段落:10.0.0.0-10.255.255.255
192.168.0.0-192.168.255.255。這三個範圍分別處於A,B,C類的地址段,不向特定的使用者分配,被IANA作為私有地址保留。這些地址可以在任何組織或企業內部使用,和其他Internet地址的區別就是,僅能在內部使用,不能作為全球路由地址。這就是說,出了組織的管理範圍這些地址就不再有意義,無論是作為源地址,還是目的地址。對於一個封閉的組織,如果其網路不連線到Internet,就可以使用這些地址而不用向IANA提出申請,而在內部的路由管理和報文傳遞方式與其他網路沒有差異。
SNAT:源IP地址轉換
平時說起NAT,一般指的是
對於有Internet訪問需求而內部又使用私有地址的網路,就要在組織的出口位置部署NAT閘道器,在報文離開私網進入Internet時,將源IP替換為公網地址,通常是出口裝置的介面地址。一個對外的訪問請求在到達目標以後,表現為由本組織出口裝置發起,因此被請求的服務端可將響應由Internet發回出口閘道器。出口閘道器再將目的地址替換為私網的源主機地址,發回內部。這樣一次由私網主機向公網服務端的請求和響應就在通訊兩端均無感知的情況下完成了。依據這種模型,數量龐大的內網主機就不再需要公有IP地址了。
DNAT:目的IP地址轉換
DNAT主要有兩大用處
1、釋出內部伺服器,讓外面的internet使用者能訪問到
2、網路重定向
NAT的弊端
NAT的存在破壞了IP端到端模型。NAT通過修改IP首部的資訊變換通訊的地址。但是在這個轉換過程中只能基於一個會話單位。當一個應用需要保持多個雙向連線時,麻煩就很大。NAT不能理解多個會話之間的關聯性,無法保證轉換符合應用需要的規則。當NAT閘道器擁有多個公有IP地址時,一組關聯會話可能被分配到不同的公網地址,這通常是伺服器端無法接受的。更為嚴重的是,當公網側的主機要主動向私網側傳送資料時,NAT閘道器沒有轉換這個連線需要的關聯表,這個資料包無法到達私網側的主機。這些反方向傳送資料的連線總有應用協議的約定或在初始建立的會話中進行過協商。但是因為NAT工作在網路層和傳輸層,無法理解應用層協議的行為,對這些資訊是無知的。NAT希望自己對通訊雙方是透明的,但是在這些情況下這是一種奢望。
圖形來自(網路之路-NAT篇)
因為NAT的工作依賴於傳輸層協議的的埠號,這樣NAT閘道器就無法處理ip分片報文,所有通過NAT閘道器的ip分片報文必須在閘道器重組後NAT轉換後再分片發出去,嚴重影響了轉發速度。
應用層閘道器(ALG)
應用層閘道器(ALG)是解決NAT對應用層協議無感知的一個最常用方法,成為NAT裝置的一個必需功能。因為NAT不感知應用協議,所以有必要額外為每個應用協議定製協議分析功能,這樣NAT閘道器就能理解並支援特定的協議。ALG與NAT形成互動關係,在一個NAT閘道器檢測到新的連線請求時,需要判斷是否為已知的應用型別,這通常是基於連線的傳輸層埠資訊來識別的。在識別為已知應用時,再呼叫相應功能對報文的深層內容進行檢查,當發現任何形式表達的IP地址
和埠時,將會把這些資訊同步轉換,並且為這個新連線建立一個附加的轉換表項。這樣,當報文到達公網側的目的主機時,應用層協議中攜帶的資訊就是NAT閘道器提供的地址和埠。一旦公網側主機開始傳送資料或建立連線到此埠,NAT閘道器就可以根據關聯表資訊進行轉換,再把資料轉發到私網側的主機。很多應用層協議實現不限於一個初始連線(通常為信令或控制通道)加一個數據連線,可能是一個初始連線對應很多後續的新連線。比較特別的協議,在一次協商中會產生一組相關連線,比如RTP/RTCP協議規定,一個RTP通道建立後佔用連續的兩個埠,一個服務於資料,另一個服務於控制訊息。此時,就需要ALG分配連續的埠為應用服務。ALG能成功解決大部分協議的NAT穿越需求。但是,出於安全性需要,有些應用型別報文從源端發出就已經加密,這種報文在網路中間無法進行分析,所以ALG無能為力。
Netfilter 提供了ALG的基礎框架,後續會以ftp協議為例來講解ALG的具體實現。
使用iptables來配置NAT
Iptables 中nat功能時有 target 來實現的。分為SNAT和DNAT。
還有一些NAT的功能 MASQUERADE,NETMAP,REDIRECT
1、SNAT
源IP地址轉換,只能用在nat表中的POSTROUTING chain中
--to-source ipaddr[-ipaddr][:port[-port]] //指定轉換後的源IP地址,如果是udp/tcp的報文,可以指定轉換後的埠號
--random//埠號對映時採用隨機的對映
--persistent//埠號對映時採用連續的埠號對映
例
如圖所示:
在NAT閘道器上配置
iptables -t nat -A POSTROUTING -p udp -j SNAT --to-source 9.9.9.9
在client 上發源ip和源埠號為192.168.3.227:60 的udp報文,在server上抓包結果如下:
源IP地址已經改變為9.9.9.9,但源埠號沒有改變
iptables -t nat -A POSTROUTING -p udp -j SNAT --to-source 9.9.9.9:100
在client 上發源ip和源埠號為192.168.3.227:60 的udp報文,在server上抓包結果如下:
源埠號已經改變為100了。
iptables -t nat -A POSTROUTING -p udp -j SNAT --to-source 9.9.9.9:100-200
在client 上分別發一個源ip 為192.168.3.227的,源埠號分別是50和70的udp報文,在server上抓包結果如下:
發現埠號對映是連續對映的
iptables -t nat -A POSTROUTING -p udp -j SNAT --to-source 9.9.9.9 --random
在client 上分別發一個源ip 和源埠號為192.168.3.227:50的udp報文,在server上抓包結果如下:
發現源埠號發生了改變,並且是隨機分配了一個
2、MASQUERADE
地址偽裝,本質跟SNAT一樣,都是替換源IP地址。SNAT是通過命令列給定IP地址,MASQUERADE是用NAT閘道器的傳送報文的三層的IP地址來替換報文的源IP地址,主要用在NAT閘道器通過DHCP動態獲取IP地址的應用場景
iptables -t nat -A POSTROUTING -j MASQUERADE
通過 client ping server,在server端抓包看到如下結果:
發現報文的源IP已經被替換成了NAT閘道器介面的IP地址。
3、DNAT
目的網路地址轉換,該Target只能用在 PREROUTING 和 OUTPUT兩個chain上
例、
iptables -t nat -A PREROUTING -j DNAT --to-destination 192.168.3.227
這時從server 端 ping 192.168.5.1 時,報文就會被DNAT到client端,在client端就能抓到icmp報文
4、REDIRECT
和DNAT原理一樣,只是把目的IP地址替換成接收埠的IP地址。該Target只能用在 PREROUTING 和 OUTPUT兩個chain上
例:
iptables -t nat -A PREROUTING -j REDIRECT
這時從client 端構造 目的地址是192.168.3.5的icmp request報文,在NAT閘道器上抓包如下:
發現經過目的地址替換後,NAT閘道器代替192.168.3.5 迴應了該icmp request。
說明該功能可以用在閘道器代理某些功能的應用場景。
轉自:http://blog.chinaunix.net/uid-26517122-id-4271713.html