NAT (Network AddressTranslation)
NAT的本意是通過利用較少的公有IP地址來表示大量私有IP地址的方式來降低IP地址空間的耗用速度。
NAT術語:
CiscoNAT設備將NAT世界劃分爲內部inside和外部outside兩部分,內部網絡通常是私有企業或isp,外部網絡是公共internet或面向internet的服務提供商。
本地地址是內部網絡中設備看見的地址,全局地址則是外部網絡設備所看見的地址。
內部本地inside local:轉換之前內部源地址的名字;分配給內部設備的地址,這些地址不會被宣告到外部網絡。
外部本地outside global:轉換之前目標主機的名字;分配給外部設備的地址,這些地址不會被宣告到內部網絡中。
內部全局inside global:轉換之後內部主機的名字;內部設備被外部網絡所知曉的地址。
外部全局outside local:轉換之後外部目標主機的名字;外部設備被內部網絡所知曉地址。
IG地址被映射到IL地址,OL地址被映射到OG地址,Nat設備在地址轉換表中跟蹤地址映射情況。
Eg:
Router#showip nat translations
Pro Inside global Inside local Outside local Outside global
icmp203.10.5.23:86 192.168.2.23:86 192.31.7.130:86 172.16.80.91:86
icmp203.10.5.23:87 192.168.2.23:87 192.31.7.130:87 172.16.80.91:87
icmp203.10.5.23:88 192.168.2.23:88 192.31.7.130:88 172.16.80.91:88
NAT 與IP地址保護:
當內部設備向internet發送數據包時,NAT設備會從內部全局地址池中動態地選擇一個公有ip地址,並將其映射到該設備的內部本地地址,該映射操作將被記錄在nat表中。
當表項第一次進入NAT表時,同時啓動了一個定時器,該定時器的週期被稱爲轉換超時時間。每當該表項被用於轉換數據包的源地址和目的地址後,該定時器就被重置,如果定時器到期,則將從NAT表中刪除該表項,而動態分配的地址也將回到地址池中,cisco默認超時時間爲86400,可以利用ip nat translationtimeout來更改默認時間。一定要確保NAT地址池足夠大且裝換超時時間足夠小,從而保證動態地址池永遠不會被耗盡。
對多對一應用來說,沒有嚴格的本地地址空間與地址池大小的比例限制。
幾乎所有的企業都擁有郵件,web及ftp服務器等需要從外部可以發訪問,而這些地址需保持不變,這些系統不能使用動態NAT,必須將他們的IL地址靜態映射到IG地址上,而這些靜態映射的地址不能進入動態地址池。
NAT與ISP遷移:
CIDR的一個缺陷是會增加用戶更改ISP時的難度。如果用戶已經從ips1處分配到了地址塊,但又希望將internet服務提供商更換爲isp2,則只能將isp1的地址歸還給isp1,並從isp2處重新換取ip地址。
假設ISP1爲其用戶分配一個地址空間:205.113.50.0/23,當用戶遷移到ISP2 ISP2又爲用戶分配一個地址空間207.36.76.0/23此時用戶無需爲其內部系統重新分配IP地址,只要使用NAT即可。用戶可以使用ISP1地址空間作爲IL地址,將來自ISP2地址空間207.36.76.0/23作爲IG地址,並將IL地址映射到這些IG地址上即可。
改NAT方案風險是內部本地地址可能被泄露到公衆internet上,那麼被泄露地址將於合法改地址的ISP1相沖突,如果ISP2S使用了嚴格路由過濾機制,那麼這種錯誤將不會泄露到internet上。
另一個問題是ISP1很可能將該地址分配給用戶B那麼A將無法訪問用戶B,上述案例可以降低NAT遷移難度,但用戶最終應該將內部網絡重新編址爲私有地址。
NAT與多歸屬自治系統:
CIDR的另一個不足之處是很難實現多歸屬到不同的服務提供商。
爲了與internet建立正確的通信關係,ISP1和ISP2都需要宣告該用戶的地址空間205.113.50.0/23,如果ISP2不宣告該地址,那麼該用戶的所有入站流量都經過ISP1;如果ISP2宣告了205.113.50.0/23而ISP1僅宣告自己的CIDR地址塊那麼該用戶入站流量將匹配精確路由 ,從而全部選擇ISP2,這樣將產生如下問題:
1. ISP1必須在其CIDR地址塊中打孔,這就意味着可能需要在很多路由器上修改相應的過來路由和路由策略。
2. ISP2必須宣告其競爭對手的部分地址空間。
3. 宣告用戶的精確地址空間,那麼意味着會弱化CIDR在控制internet路由表規模方面的效率。
4. 某些全國性的服務提供商不收受長於/19的前綴,也意味着internet上的某些地方無法知道該用戶經過ISP2的路由。
通過NAT可以解決CIDR在多歸屬環境中的問題:在連接isp2的路由器上配置nat,將IG地址池設置爲isp2分配的CIDR地址塊,這樣isp2就不用在宣告isp1的地址空間,isp1也無需再宣告用戶的精確路由。
更有效的設計方案:在兩臺邊緣路由器上都實施NAT,來自每個isp的CIDR地址塊都設置爲各自的NAT中的IG地址池,IL地址來自私有地址10.0.0.0。
端口地址轉換:
NAT有有一種特定功能,可以將多個地址同時映射到單個地址,cisco將這種功能稱爲PAT(port address translation).
TCP/IP會話並不是2個IP地址之間的的包交換,而是2個ip套接字之間的包交換。套接字就是(地址,端口)二元組,PAT會同時轉換IP地址和端口號,來自不同地址的數據包可以被轉換爲同一個地址,但對應的端口號不相同,這樣就可以共享同一個地址了。
PAT工作原理:
NAT與TCP負載分發:
利用NAT可以將多臺相同的服務器表示爲單個地址 Eg:
外部網絡設備到達的服務器地址都是206.35.91.10 但實際是內網存在4臺鏡像服務器,nat路由器採用輪詢方式在這4臺服務器之間分發會話。4臺服務器必須提供相同的可訪問內容。
該應用方案與基於DNS的負載查詢共享方式類似,基於NAT的負載均衡也不很穩定,因爲路由器並不感知服務器的故障,任然會將數據包轉換髮到該故障服務器,這樣一來故障服務器會出現路由黑洞。
NAT與虛擬服務器:
NAT技術不僅可以讓外部通過同一個地址訪問所有服務,還可以將多種服務分發到不同的地址。
當外部主機向內部網絡發送數據包時NAT路由器除了要檢查目的地址之外,還要檢查目的端口號。如果目的端口號是25 NAT路由器將該數據包目的地址轉換爲郵件服務器地址 192.168.50.1;同一臺主機發送目的端口爲80的數據包,則被路由器將數據包的目的地址轉換成web服務器地址 192.168.50.2.
NAT存在的問題:
NAT底層功能
1. 頭部檢驗
2. 分段
3. 加密:NAT路由器需放置在安全側,而不能將其放置在被加密路徑上
4. 安全:NAT不能阻止拒絕服務或會話劫持等常見***
5. 協議相關問題:cisco NAT所支持的IP流量和應用程序
Configuring Static Translation
Step 1 Router(config)# ip nat inside source static local-ip global-ip
Step 2 Router(config)# interface type number
Step 3 Router(config-if)# ip nat inside
Step 4 Router(config)# interface type number
Step 5 Router(config-if)# ip nat outside
Configuring Dynamic Translation with an Access List
Step 1 Router(config)# ip nat pool name start-ip end-ip {netmask netmask | prefix-length prefix-length}
Step 2 Router(config)# access-list access-list-number permit source [source-wildcard]
Step 3 Router(config)# ip nat inside source list access-list-number pool name
Step 4 Router(config)# interface type number
Step 5 Router(config-if)# ip nat inside
Step 6 Router(config)# interface type number
Step 7 Router(config-if)# ip nat outside
Configuring Dynamic Translation with a Route Map
Step 1 Router(config)# ip nat pool name start-ip end-ip {netmask netmask | prefix-length prefix-length}
Step 2 Router(config)# route-map name permit sequence
Step 3 Router(config)# ip nat inside source route-map name pool name
Step 4 Router(config)# interface type number
Step 5 Router(config-if)# ip nat inside
Step 6 Router(config)# interface type number
Step 7 Router(config-if)# ip nat outside
Overloading an Inside Global Address
Step 1 Router(config)# ip nat pool name start-ip end-ip {netmask netmask | prefix-length prefix-length}
Step 2 Router(config)# access-list access-list-number permit source [source-wildcard]
Step 3 Router(config)# ip nat inside source list access-list-number pool name overload
Step 4 Router(config)# interface type number
Step 5 Router(config-if)# ip nat inside
Step 6 Router(config)# interface type number
Step 7 Router(config-if)# ip nat outside
Changing Translation Timeouts
Router(config)#ip nat translationtimeout seconds……………………not use overloading. 默認超時時間24H
Router(config)#ip nat translationudp-timeout seconds
Router(config)#ip nat translationdns-timeout seconds
Router(config)#ip nat translationtcp-timeout seconds
Router(config)#ip nat translationfinrst-timeout seconds
Router(config)#ip nat translationicmp-timeout seconds
Router(config)#ip nat translationsyn-timeout seconds