為解決IPv4地址日益枯竭,出現NAT(Network Address Translation,網絡地址轉換)技術。NAT可以將來自一個網絡的IP數據報報頭中的IP地址(可以是源IP地址或目的IP地址,或兩者同時)轉換為另一個網絡的IP地址,主要用於實現私網用戶和公網用戶之間的互訪。
一、NAT主要特性
在AR G3路由器中把支持的NAT特性分為三大類:動態NAT、靜態NAT和NAT Server(NAT服務器),在實際應用中,分別對應配置動態地址轉換、配置靜態地址轉換和配置內部服務器。
1、動態NAT
私網IP與公網IP之間的轉換不是固定的。把需要訪問公網的私網IP地址動態地與公網IP地址建立臨時映射關系,將報文中的私網IP地址進行對應的臨時替換,待返回報文到達設備時再根據映射表“反向”把公網IP地址臨時替換回對應的私網IP地址,轉發給主機,實現內網用戶和外網的通信。
動態NAT的實現方式有Basic NAT和NAPT兩種(Easy IP是NAPT的一種特例)。Basic NAT是一種“一對一”的動態地址轉換;NAPT則通過引入“端口”變量,是一種“多對一”的動態地址轉換(映射的公網端口不同)。
2、靜態NAT
建立固定的一對一的公網IP地址和私網IP地址的映射。
3、NAT Server
內網向外網提供服務,內網服務器不能被屏蔽,這是一種由外網發起向內網訪問的NAT轉換情形。外網用戶訪問內網服務器,通過“公網IP地址:端口號”與服務器的“私網IP地址:端口號”的固定映射,從私網IP地址與公網IP地址的映射關系看,也是一種靜態映射關系。
二、BasicNAT實現原理
Basic Nat方式屬於一對一地址轉換,但不是靜態一對一,是動態。
內網向公網發起連接請求時,請求報文中的私網IP地址通過事先准備好的公網IP地址池動態建立私網IP與公網IP的NAT映射表項,利用映射的公網IP將報文中的源IP地址(即內網私網IP地址)進行替換。然后送達給外網的目的主機。外網主機收到請求報文后進行響應時,響應報文到達NAT設備,又將依據前面請求把我摁所建立的私網IP與公網IP映射關系反向將報文中的目的IP替換成對應的私網IP,然后送達給內部源主機。

①當內網側Host要訪問公網側Server時,向Router發送請求報文(即Outbound方向),此時報文中的源IP為Host自己的10.1.1.100,目的IP為Server的IP:211.100.7.34。
②Router收到來自Host請求報文后,從公網地址池選取一個空閑公網IP,建立與內網側報文源IP間的NAT轉換映射表項,包括正(Outbound)、反(Inbound)兩個方向,依據正向NAT表項將報文中的源IP地址轉換為對應的公網IP后向公網側發送。此時發送的報文的源IP地址是轉換后的公網IP:162.105.178.65,目的IP不變,仍為Server的IP:211.100.7.34。
③當Server收到請求報文后,需向Router發送響應報文(Inbound方向),此時只須將收到的請求報文中的源IP和目的IP對調即可,即報文的源IP是Server自己的IP:211.100.7.34,目的地址是Host私網IP轉換后的公網IP:162.105.178.65。
④當Router收到來自公網Server發送的響應報文后,會根據報文中的目的IP查找NAT映射表項,將報文中的目的IP轉換為Host主機對應的私網IP地址(源地址不變)后向私網側發送,此時報文中的源IP仍是Server的IP:211.100.7.34,目的IP地址轉換為Host的私網IP:10.1.1.100。
Basic NAT中的請求報文轉換的僅是其中的源IP地址(目的IP不變),即僅關心源IP地址;響應報文轉換的僅是其中的目的IP(源IP不變),即僅關心目的IP。
三、NAPT實現原理
多對一地址轉換,NAPT使用“IP地址+端口號”的形式進行轉換。

NAPT請求報文中轉換的僅是源IP地址和源端口號(目的IP和目的端口號不變),即僅關系源IP和源端口號;響應報文中轉換的是目的IP和目的端口號(源IP和源端口號不變),即僅關心目的IP和目的端口號。不同私網主機可以轉換成同一個公網IP,但轉換后的端口號必須不一樣。
四、EasyIP實現原理
實現原理與地址池NAPT轉換原理類似,可以算是NAPT的一種特例,不同的是Easy IP方式可以實現自動根據路由器上WAN接口的公網IP地址實現與私網IP地址之間的映射(無需創建公網地址池)。主要用於將路由器WAN接口IP地址作為要被映射的公網IP地址的情形,特別適合小型局域網接入Internet情況。

五、NATServer實現原理
NAT Server用於外網用戶需要使用固定公網IP地址訪問內部服務器的情形。通過事先配置好的服務器的“公網IP+端口號”與服務器的“私網IP+端口號”間的靜態映射關系來實現。(要先在Router上配置好靜態的NAT Server轉換映射表)。

①Router在收到外網用戶發起的訪問請求報文后(即Inbound方向),根據該請求的“目的IP:端口號”查找NAT Server轉換映射表,找出對應的“私網IP:端口號”,然后用找到的結果直接替換報文的“目的IP:端口號”,最后想內網側發送。上圖外網發送的請求報文中目的IP是202.102.1.68,端口號80,經過Router轉換后的目的IP和端口號為192.168.1.68:80。
②內網服務器收到由Router轉發的請求報文后,向Router發送響應報文(即Outbound方向)。此時報文中的源IP、端口號與目的IP、端口號與收到的請求報文中的完全對調,即響應報文中的源IP和端口號為前面的192.168.1.68:80.
③Router收到內網服務器的響應報文后又根據該響應報文中的“源IP:端口號”查抄NAT Server轉換表項,找出對應的“公網IP:端口號”,然后替換報文中的“源IP:端口號”。本例中內網服務器相應外網主機的報文的源IP和端口號是192.168.1.68:80,經Router轉換后的源IP和端口號為209.102.1.68:80。
由外網向內網服務器發送的請求報文中轉換的僅是目的IP和目的端口號(源IP和源端口號不變),即僅關心目的IP和目的端口號;從內網向外網發送的響應報文轉換的僅是源IP和源端口號(目的IP和目的端口號不變),即僅關心源IP和源端口號。
綜上總結:NAT中凡是由內網向外網發送的報文(不管是請求報文還是響應報文),在NAT路由器上轉換的都是源IP地址(或同時包括源端口號),而凡是由外網向內網發送的報文(不管是請求報文還是響應報文),在NAT路由器上轉換的都是目的IP地址(或同時包括源端口號)。
六、靜態NAT/NAPT
靜態NAT是指在進行NAT轉換時,內部網絡主機的IP與公網IP是一對一靜態綁定的,且每個公網IP只會分配給固定的內網主機轉換使用。與Basic NAT不同的只是這里先要在NAT路由器上配置好靜態NAT轉換映射表,而不僅是地址池。
靜態NAPT是指“內部網絡主機的私網IP+協議號+端口號”與“公網IP+協議號+端口號”是一對一靜態綁定的,靜態NAPT中的公網IP可以為多個私網IP使用。與NAPT不同的也是要先在NAT路由器上配置好靜態NAPT轉換映射表,而不僅是地址池。
七、NAT與路由器的本質區別
兩種技術主要存在實現機制和主要應用兩個方面的本質區別。
1、實現機制不同
NAT是通過解決兩個網絡間互訪的“身份”問題來解決實現兩個網絡的主機的互訪,即通過將報文中的源IP或目的IP轉換為對方網絡的IP地址來實現兩個網絡中的主機互訪。這里報文中的IP地址轉換相當於“身份”的轉換,即使一個網絡中的主機具有訪問對方網絡的合法“身份”。
路由器則是通過解決兩個網絡互訪“渠道”問題來實現兩個網絡的主機的互訪,即建立一條互訪的“路徑”(即路由表)來實現雙方主機的互訪,而雙方傳輸報文中的源IP和目的IP都不變,也就是雙方的“身份”並沒有經過轉換。
2、主要應用不同
NAT主要應用於內部局域網主機與Internet主機互訪的情形(當然也可以實現兩個局域網之間的互聯,但這不是NAT的主要應用),解決公網IPv4不足的問題。另外,在局域網與Internet的互聯中也不可能建立一個雙向互訪的具體路由表,一則是因為私網IP在Internet無法識別,再則因為Internet不是單一IP網段的網絡。
路由之所以選擇通過建立路徑來實現兩個網絡的主機的互訪,是因為路由主要都是使用私網IP,有明確IP網段的局域網之間的互聯。
https://blog.csdn.net/kaoa000/article/details/52368106
為什么要使用NAT
1 內網中主機過多,沒有足夠的合法IP地址可用。
2 當ISP發生變化時,使用NAT技術避免了IP地址的重新編址。
3 當兩個合並的網絡中出現了重復地址的時候。
4 利用NAT來解決TCP的負載均衡問題。
5 隱藏內部網絡,增強安全性。
NAT就是將內網中使用的私有地址轉換成可在Internet上進行路由的合法地址的技術。
私有地址范圍:
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172..31.255.255
192.168.0.0 ~ 192.168.255.255
NAT技術主要分為NAT和PAT。
NAT是從內部本地地址到內部全局地址的一對一轉換。
PAT是從多個內部本地地址到內部全局地址的多對一轉換。通過端口號確定其多個內部主機的唯一性。
NAT術語
Inside network:需要翻譯成外部地址的內部網絡。
Outside network:使用合法地址進行通信的外部網絡。
Local address:內部網絡使用的地址。
Global address:外部網絡使用的地址。
Inside local address:內部本地地址。數據在內部網絡使用的地址,一般為private ip address。
Inside global address:內部全局地址。數據為了到達外部網絡,用來代表inside local address的地址,一般為ISP提供的合法地址。
Outside local address:外部本地地址,不必是合法地址。當外部網絡數據到達內部網絡,外部網絡中的主機IP地址與內部網絡中的主機處在同一網段時,為防止內部主機誤認外部主機與自己在同一網段而廣播ARP請求,造成無法通信,將外部主機的地址轉換成外部本地地址之后再與內部主機進行通信。
Outside global address:數據在外部網絡使用的地址,是個合法地址。
Simple translation entry:把一個IP地址映射到另外一個地址上的一對一的翻譯方式。
Extended translation entry:把IP地址和端口(port)的組合翻譯成另外一個地址和端口的組合。
Static address translation:靜態地址翻譯,把一個local對應到一個global上去。
Dynamic address translation:動態翻譯,local和global池(pool)建立動態對應關系。
Port address translation(PAT):通過使用地址和端口的結合來達到多個local對應一個global的狀態。端口號用來確定每個local的唯一性。這樣的技術也叫超載(overloading)。
NAT的優缺點
優點:
1 極大的節省了合法的IP地址。
2 能夠處理地址重復情況,避免了地址的重新編號,增加了編址的靈活性。
3 隱藏了內部網絡地址,增強了安全性。
4 可以使多個使用TCP負載特性的服務器之間實現基本的數據包負載均衡。
缺點:
1 由於NAT要在邊界路由器上進行地址的轉換,增大了傳輸的延遲。
2 由於NAT改動了IP地址,失去了跟蹤端到端IP流量的能力。當出現惡意流量時,會使故障排除和流量跟蹤變的更加棘手。
3 不支持一些特定的應用程序。如早期版本的MSN。
4 增大了資源開銷。處理NAT進程增加了CPU的負荷,並需要更多內存來存儲NAT表項。
配置NAT
inside & outside
每個包含了NAT進程的接口必須被指定為內部接口或外部接口,但不能被同時指定為這兩個接口。在路由器上,必須至少有一個接口被配置成內部接口,一個接口被配置成外部接口。這樣路由器就知道怎樣在接口上處理入站和出站流量了。
D-Lab(config)#int e0 //進入接口模式
D-Lab(config-if)#ip nat inside //指定inside接口出站
D-Lab(config-if)#int s0
D-Lab(config-if)#ip nat outside //指定outside接口入站
靜態NAT
inside|outside local和inside|outside global的一對一映射
D-Lab(config)#ip nat {inside|outside} source static <
inside local> < inside global>
這樣就在NAT表中創建了一個永久表項。
配置示例:
D-Lab#config t
D-Lab(config)#int e0
D-Lab(config-if)#ip nat inside
D-Lab(config-if)#int s0
D-Lab(config-if)#ip nat outside
D-Lab(config)#ip nat inside source static
192.168.1.1 210.83.202.1
D-Lab(config)#ip nat outside source static
210.83.202.2 192.168.2.3
靜態PAT
D-Lab(config)#ip nat {inside|outside} source static <
protocol> <
inside local> < port> < inside global> < port>
配置示例:
D-Lab(config)#ip nat inside source static
tcp 10.1.1.1 80 214.118.21.121 80
動態NAT
動態NAT用來將inside local快速映射到inside global上。這些inside local放在可用的IP地址池中。同樣,必須給參與NAT進程的路由器接口分配IP地址。
當內部網絡主機要與Internet上的主機進行通信時,NAT邊界路由器會從標記為“NAT內部”的接口接收數據包。
D-Lab(config)#ip nat pool
<pool-name> <start-ip> <end-ip> netmask
xxxx
D-Lab(config)#ip nat pool <
pool-name>
<start-ip> <end-ip> prefix-length
xx //掩碼長度
例:
D-Lab(config)#ip nat pool
dyn-nat-pool 211.10.121.1 211.10.121.254 netmask
255.255.255.0
D-Lab(config)#ip nat pool
dyn-nat-pool 211.10.121.1 211.10.121.254 prefix-length
24
配置示例:
D-Lab(config)#inter e0
D-Lab(config-if)#ip add
192.168.1.1 255.255.255.0
D-Lab(config-if)#ip nat inside //指定內部接口
D-Lab(config-if)#inter s0
D-Lab(config-if)#ip add
210.83.202.1 255.255.255.192
D-Lab(config-if)#ip nat outside //指定外部接口
D-Lab(config-if)#exit
D-Lab(config)#access-list
1 permit
192.168.1.0 0.0.0.255 //標記inside local范圍
D-Lab(config)#ip nat pool
in-out
210.83.202.2 210.83.202.8 prefix
24 //設置inside global地址池
!
D-Lab(config)#ip nat inside source list
1 pool
in-out //啟用inside源地址翻譯,把標記的inside local范圍與inside global池關聯起來
動態PAT(多對一映射)
路由器為每個轉換表項添加第四層協議和端口信息
D-Lab(config)#ip nat inside source list 1 pool in-out
overload
如果不知道出站IP地址,可在命令中指定出站接口
D-Lab(config)#ip nat inside source list 1
e0 overload
//如果接口shut或者接口沒有設置IP地址的話,NAT不會生效
配置實例:
D-Lab(config)#inter e0
D-Lab(config-if)#ip add
192.168.1.1 255.255.255.0
D-Lab(config)#access-list
9 permit
192.168.1.0 0.0.0.255
為重復地址配置NAT
D-Lab(config)#ip nat pool
in-out
211.121.1.1 211.121.1.254 prefix-length
24 //設置local global池
D-Lab(config)#ip nat pool
out-in
10.1.2.1 10.1.2.254 prefix-length
24 //設置outside local池
D-Lab(config)#ip nat inside source list
1 pool
in-out //啟用inside源地址翻譯,把標記的inside local范圍與inside global池關聯起來
D-Lab(config)#ip nat inside source list
1 pool
out-in //將在標記的inside local范圍里的outside global轉換成outside local池里的地址
D-Lab(config)#int fa0/0
D-Lab(config-if)#ip nat inside //指定出站接口
D-Lab(config-if)#int s1/1
D-Lab(config-if)#ip nat outside //指定入站接口
D-Lab(config-if)#exit
D-Lab(config)#access-list 1 permit 10.1.1.0 0.0.0.255 //標記inside local地址范圍
更靈活的地址池的配置:
ip nat pool <name> { netmask <mask> | prefix-length <length> } [ type { rotary } ]
這樣可以允許定義不連續地址池,接下來定義地址空間:
address
<start> <end>
例:
D-Lab(config)#ip nat pool D-lab prefix-length 24
D-Lab(config-ipnat-pool)#address 11.69.73.12 11.69.73.14
D-Lab(config-ipnat-pool)#address 11.69.73.18 11.69.73.244
這樣就定義了一個11.69.73.12 ~ 11.69.73.14和11.69.73.18~11.69.73.244的地址池
NAT關聯routemap的配置:
ip nat inside source route-map
<name> pool
<name>
例:
ip nat pool
d-1 173.26.232.1 173.26.232.254 prefix-length 24
ip nat inside source route-map
d2-map pool
d-2
配置NAT超時設置:
ip nat translation timeout
<seconds> //特權模式下
NAT配置的驗證和故障排除
sh ip nat translations //查看生效的NAT表項
sh ip nat translations verbose //查看生效的NAT表項的詳細信息
sh ip nat statistics //顯示NAT的統計數字和配置信息
clear ip nat translation * //清除所有NAT表項
clear ip nat translation inside <global-ip> //清除指定的內部NAT表項 :
clear ip nat translation <protocol> <global-ip> <local-ip> <global-port> <local-port> //清除指定的NAT表項
debug ip nat [ <list> ] [ detailed ] //調試NAT進程