1. NAT技術原理
NAT(Network Address Translation,網絡地址轉換),是一種把內部私有地址轉換成外部公有地址的技術,簡單來理解,NAT技術在局域網是使用內部私有地址通信的,但是當局域網的主機想要和外部互聯網進行通信時,會在網關設備處將主機的局域網私有地址翻轉成互聯網的公有地址,可以使主機接入互聯網從而進行網絡通信。
特別是就國內目前的環境來說,普遍都是使用NAT技術來訪問互聯網的,NAT技術在一定程度上可以解決公有地址不足所帶來的的問題。
NAT技術通常是應用在路由器,防火牆等設備,NAT主要有三種類型:
- 靜態NAT
- 端口NAT
- 動態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地址的使用。