33-NAT技術詳解

1. NAT技術原理

NAT(Network Address Translation,網絡地址轉換),是一種把內部私有地址轉換成外部公有地址的技術,簡單來理解,NAT技術在局域網是使用內部私有地址通信的,但是當局域網的主機想要和外部互聯網進行通信時,會在網關設備處將主機的局域網私有地址翻轉成互聯網的公有地址,可以使主機接入互聯網從而進行網絡通信。

 

特別是就國內目前的環境來說,普遍都是使用NAT技術來訪問互聯網的,NAT技術在一定程度上可以解決公有地址不足所帶來的的問題。

 

NAT技術通常是應用在路由器,防火牆等設備,NAT主要有三種類型:

  1. 靜態NAT
  2. 端口NAT
  3. 動態NAT

 

2. 動態NAT原理

動態NAT(Dynamic NAT,簡稱DAT)在把內部網絡的私有IP地址轉換成公有IP地址時,採用動態的方法隨機分配一個公有IP地址。也就是說,當內部網絡的主機需要接入互聯網時,動態NAT就會隨機分配一個公有的IP地址,另外,動態NAT還需要指定哪些內部地址是可以轉換的,哪些地址可以作爲合法的公有地址使用的。

 

NAT技術通常應用在局域網內的主機要接入互聯網的場景,下面通過實驗來深入學習動態NAT的原理。

 

3. 動態NAT部署

動態NAT實驗部署如下圖所示:

首先配置R1,R2,R3設備的ip地址信息,這裏略過......

 

然後配置R1,R2等設備的靜態路由:

R1(config)#ip route 0.0.0.0 0.0.0.0 12.1.1.2
R1(config)#
R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R2(config)#ip route 192.168.1.0 255.255.255.0 12.1.1.1
R2(config)#ip route 192.168.2.0 255.255.255.0 12.1.1.1
R2(config)#ip route 0.0.0.0 0.0.0.0 23.1.1.3
R2(config)#

 

 

測試網絡連通性:

R2#ping 3.3.3.3

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 52/61/64 ms
R2#

可以看到,邊緣設備是可以訪問外網的。

 

R1#ping 8.8.8.8 source 192.168.1.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1 
.....
Success rate is 0 percent (0/5)
R1#

R1作爲一個內網設備,是無法訪問外網的。因爲互聯網中的設備是沒有內網設備的路由信息,這意味着如果內網想要訪問外網的話就需要通過NAT技術實現內網和外網的網絡通信。

 

 

現在R2設備上部署NAT技術實現內網和互聯網的通信,配置如下:

R2#
R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
//配置公網訪問流量
R2(config)#access-list 1 permit 192.168.1.0 0.0.0.255
R2(config)#access-list 1 permit 192.168.2.0 0.0.0.255
//定義公有地址池,設置地址池的名字爲DNAT
R2(config)#ip nat pool DNAT 23.1.1.10 23.1.1.20 netmask 255.255.255.0
R2(config)#
*Mar  1 00:05:21.203: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up
R2(config)#

通過ACL配置允許內網192.168.1.0和192.168.2.0網段可以訪問公網的流量,還配置了動態NAT的公有地址池,這裏分配了10個公有地址。

 

 

//定義內外接口
R2(config)#int f0/0
//內網
R2(config-if)#ip nat inside

*Mar  1 00:09:10.147: %SYS-3-CPUHOG: Task is running for (2028)msecs, more than (2000)msecs (0/0),process = Exec.
-Traceback= 0x61388000 0x61386C28 0x61387318 0x61387DF8 0x61387EA4 0x6134931C 0x613494DC 0x613495E4 0x613495E4 0x6134A538 0x613830FC 0x613933CC 0x613786EC 0x6137927C 0x6137A268 0x60F9A778 
R2(config-if)#
R2(config-if)#exit
R2(config)#int f1/0
//外網
R2(config-if)#ip nat outside
R2(config-if)#

然後在出口設備定義內網接口,相當於告訴路由器哪邊的接口是內網,哪邊的接口是公網。

 

 

//執行動態NAT
R2(config)#ip nat inside source list 1 pool DNAT
R2(config)#

執行動態NAT,這一步會將內網ip轉換成公網ip地址,根據之前的配置將會匹配源列表,將內網的192.168.1.0和192.168.2.0網段的地址轉換成公網地址。

 

然後開啓nat調試功能:

R2#debug ip nat
IP NAT debugging is on
R2#

 

 

測試網絡連通性:

R1#ping 3.3.3.3 source 192.168.2.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.2.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 96/99/108 ms
R1#
R1#
R1#ping 3.3.3.3 source 192.168.1.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 96/100/112 ms
R1#

從上面的結果來看,說明內網是可以訪問外網的。

 

 

在R3設備上開啓ICMP協議調試功能並查看ICMP調試信息:

R3#
*Mar  1 00:33:13.927: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.023: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.103: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.195: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.275: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
R3#
R3#
*Mar  1 00:32:32.711: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:32.807: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:32.891: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:32.987: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:33.083: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
R3#

從上面的調試信息來看,R3的icmp響應包封裝的目的ip地址並不是內網的196.168網段,因爲R3作爲一個外網設備,它是無法知曉內網的路由信息的,它只知道出口設備的路由信息,所以R3設備會將出口設備的ip地址封裝爲目的地址。然後R2設備收到ICMP響應包後,會查找NAT映射表並將公網地址轉換成對應的內網地址。

 

查看R2設備上的nat映射表信息:

R2#
R2#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 23.1.1.11:7       192.168.1.1:7      3.3.3.3:7          3.3.3.3:7
--- 23.1.1.11          192.168.1.1        ---                ---
icmp 23.1.1.10:6       192.168.2.1:6      3.3.3.3:6          3.3.3.3:6
--- 23.1.1.10          192.168.2.1        ---                ---
R2#

從這張NAT映射表可以看到,內網地址被一一映射到公網地址了。

 

 

對於這點我們可以在R2設備上開啓NAT調試驗證這一點,在R2設備上查看NAT調試信息:

R2#
*Mar  1 00:26:56.803: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [5]
*Mar  1 00:26:56.867: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [5]
*Mar  1 00:26:56.931: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [6]
*Mar  1 00:26:56.995: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [6]
*Mar  1 00:26:57.059: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [7]
*Mar  1 00:26:57.123: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [7]
*Mar  1 00:26:57.187: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [8]
*Mar  1 00:26:57.251: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [8]
*Mar  1 00:26:57.323: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [9]
*Mar  1 00:26:57.387: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [9]
R2#
*Mar  1 00:31:16.607: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [15]
*Mar  1 00:31:16.675: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [15]
*Mar  1 00:31:16.739: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [16]
*Mar  1 00:31:16.803: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [16]
*Mar  1 00:31:16.867: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [17]
*Mar  1 00:31:16.931: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [17]
*Mar  1 00:31:16.995: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [18]
*Mar  1 00:31:17.059: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [18]
*Mar  1 00:31:17.123: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [19]
R2#

從R2設備的NAT調試信息來看,不同的內網地址會轉換成不同的公網地址。

 

 

查看NAT轉換狀態:

R2#show ip nat statistics 
Total active translations: 2 (0 static, 2 dynamic; 0 extended)
Outside interfaces:
  FastEthernet1/0
Inside interfaces: 
  FastEthernet0/0
Hits: 68  Misses: 7
CEF Translated packets: 74, CEF Punted packets: 0
Expired translations: 8
Dynamic mappings:
-- Inside Source
[Id: 1] access-list 1 pool DNAT refcount 2
 pool DNAT: netmask 255.255.255.0
        start 23.1.1.10 end 23.1.1.20
        type generic, total addresses 11, allocated 2 (18%), misses 0
Queued Packets: 0
R2#

這條命令的作用是查看nat轉換狀態,即公網地址的分配情況。

對於動態NAT技術來說,在IPv4地址已經枯竭的情況下並不能節省地址的使用,因爲每個私有地址必須要映射到一個公有地址。

 

4. 端口NAT

端口NAT跟動態NAT的原理是相同的,不同的是,端口NAT是將內網的ip地址轉換成公網的一個公有ip地址的不同端口上,也就是說在這個公有ip地址加上一個由端口NAT技術選定的一個TCP端口號。通過不同的端口號來區分不同的內網ip地址。

 

5. 端口NAT部署

一般部署端口NAT的話,是在出口設備上通過接口部署端口NAT,配置如下:

R2#conf t
R2(config)#access-list 1 permit 192.168.1.0 0.0.0.255
R2(config)#access-list 1 permit 192.168.2.0 0.0.0.255
R2(config)#int f0/0
R2(config-if)#ip nat inside
R2(config-if)#exit
R2(config)#int f1/0
R2(config-if)#ip nat outside
R2(config-if)#exit
//執行端口NAT
R2(config)#ip nat inside source list 1 interface f1/0 ?        
  overload    Overload an address translation
  reversible  Allow out->in traffic
  vrf         Specify vrf
  <cr>
R2(config)#ip nat inside source list 1 interface f1/0 overload 
R2(config)#exit
R2#

ip nat inside source list 1 interface f1/0 overload 這條命令的作用就是開啓端口NAT的接口進行地址複用。

 

 

 

測試端口NAT:

R1#ping 3.3.3.3 source 192.168.1.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/36/44 ms
R1#
R1#ping 3.3.3.3 source 192.168.2.1 

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.2.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/35/40 ms
R1#

 

 

查看R2設備上的端口NAT調試信息:

R2#
*Mar  1 00:09:25.415: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [15]
*Mar  1 00:09:25.479: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [15]
*Mar  1 00:09:25.543: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [16]
*Mar  1 00:09:25.607: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [16]
*Mar  1 00:09:25.671: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [17]
*Mar  1 00:09:25.735: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [17]
*Mar  1 00:09:25.787: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [18]
*Mar  1 00:09:25.807: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [18]
*Mar  1 00:09:25.827: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [19]
*Mar  1 00:09:25.847: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [19]
R2#
*Mar  1 00:09:28.151: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [20]
*Mar  1 00:09:28.199: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [20]
*Mar  1 00:09:28.219: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [21]
*Mar  1 00:09:28.239: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [21]
*Mar  1 00:09:28.259: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [22]
*Mar  1 00:09:28.279: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [22]
*Mar  1 00:09:28.299: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [23]
*Mar  1 00:09:28.319: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [23]
*Mar  1 00:09:28.343: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [24]
*Mar  1 00:09:28.359: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [24]
R2#

從R2的nat調試信息來看,多個內網的ip地址被映射成了同一個公網ip地址,但是端口NAT會通過不同的端口號來區分不同的內網IP地址,這點可以從nat的轉換表中驗證。

 

 

查看NAT轉換表:

R2#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 23.1.1.2:3        192.168.1.1:3      3.3.3.3:3          3.3.3.3:3
icmp 23.1.1.2:4        192.168.2.1:4      3.3.3.3:4          3.3.3.3:4
R2#

在NAT轉換表中確實通過不同的端口號來映射到不同的內網地址,相對於動態NAT來說,在公網地址不足的情況下,端口NAT比動態NAT要更加節省ip地址的使用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章