(六)路由器配置NAT
本章节主要以cisco路由器配置为例,使用GNS3仿真平台搭建一个最简单的实验环境进行验证。
1. 常用命令(cisco)
首先介绍本实验可能用到的一些命令,先有个概念,后面再在实验中熟悉并掌握。
1.1. VPC
# 配置ip、掩码和网关
ip address/mask gateway
# show ip
查看ip
1.2. 路由器
# 进入全局模式
configure terminal
# 查看所有接口
do show interface
# 进入接口模式
interface g0/0
# 配置路由器接口ip和掩码
ip address 192.168.0.1 255.255.255.0
# 激活
no shut
# 退出
exit
# 查看路由
show ip route
# 指定NAT内部接口 在内网相应接口的接口配置模式下执行
ip nat inside
# 指定NAT外部接口 在外网相应接口的接口配置模式下执行
ip nat outside
# 在内部地址与外部地址之间建立静态地址转换关系
ip nat inside source static [NAT前的内部地址] [NAT后的外部地址]
# 在外部地址与内部地址之间建立静态地址转换关系
ip nat outside source static [NAT前的外部地址] [NAT后的内部地址]
# 显示当前存在的NAT转换信息
show ip nat translations
# 查看NAT的统计信息
show ip nat statics
# 显示当前存在的NAT转换的详细信息
show ip nat translations verbose
# 跟踪NAT操作,显示出每个被转换的数据包
debug ip nat
# 删除静态NAT映射
no ip nat inside source static local-address global-address
no ip nat outside source static local-address global-address
# 删除动态NAT映射表中的所有内容
clear ip nat translations *
# pnat
ip nat inside source static {UDP|TCP} local-address port global-address port
ip nat outside source static {UDP|TCP} local-address port global-address port
# 定义一个标准的access-list规则,声明允许哪些内部本地地址可以进行动态地址转换,其中,access-list-number为1-99之间的一个任意整数,通配符为子网掩码的反掩码
access-list access-list-number permit 源地址 通配符
# 定义内部全局地址池
ip nat pool 地址池名 起始IP地址 终止IP地址 netmask 子网掩码
# 定义符合先前定义的access-list规则的IP数据包与先前定义的地址池中的IP地址进行转换,只分配ip,不复用端口
ip nat inside source list access-list-number pool 内部全局地址池名
# 定义符合先前定义的access-list规则的IP数据包与先前定义的地址池中的IP地址进行复用地址转换,同ip复用端口
ip nat inside source list list-number pool 内部全局地址池名 overload
# 删除全局地址池
no ip nat pool name
# 删除访问列表
no access-list access-list-number
# 删除动态源地址转换
no ip nat inside source list list-number pool 内部全局地址池名
no ip nat inside source list list-number pool 内部全局地址池名 overload
2. 环境
2.1. 配置PC
2.1.1. PC1
PC1> ip 192.168.0.2/24 192.168.0.1
Checking for duplicate address...
PC1 : 192.168.0.2 255.255.255.0 gateway 192.168.0.1
2.1.2. PC2
PC2> ip 30.0.0.2/24 30.0.0.1
Checking for duplicate address...
PC2 : 10.0.0.2 255.255.255.0 gateway 10.0.0.1
2.2. 配置路由器
2.2.1. R1
2.2.1.1. g0/0
R1(config)<span class="tag">#interface</span> g0/0
R1(config-if)<span class="tag">#ip</span> address 192.168.0.1 255.255.255.0
R1(config-if)<span class="tag">#no</span> shut
R1(config-if)#
*Jul 10 14:48:52.979: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to up
*Jul 10 14:48:53.979: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to up
2.2.1.2. g1/0
R1(config)<span class="tag">#interface</span> g1/0
R1(config-if)<span class="tag">#ip</span> address 20.0.0.2 255.255.255.0
R1(config-if)<span class="tag">#no</span> shut
2.2.2. R2
2.2.2.1. #### g0/0
R1(config)<span class="tag">#interface</span> g0/0
R1(config-if)<span class="tag">#ip</span> address 20.0.0.3 255.255.255.0
R1(config-if)<span class="tag">#no</span> shut
2.2.2.2. g1/0
R1(config)<span class="tag">#interface</span> g1/0
R1(config-if)<span class="tag">#ip</span> address 30.0.0.1 255.255.255.0
R1(config-if)<span class="tag">#no</span> shut
2.2.3. 查看路由
2.2.3.1. R1
R1(config-if)<span class="tag">#do</span> show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
20.0.0.0/24 is subnetted, 1 subnets
C 20.0.0.0 is directly connected, GigabitEthernet1/0
C 192.168.0.0/24 is directly connected, GigabitEthernet0/0
存在两条直连路由
2.2.3.2. R2
R2(config)<span class="tag">#do</span> show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
20.0.0.0/24 is subnetted, 1 subnets
C 20.0.0.0 is directly connected, GigabitEthernet0/0
30.0.0.0/24 is subnetted, 1 subnets
C 30.0.0.0 is directly connected, GigabitEthernet1/0
存在两条直连路由
2.2.4. ping实验
此时两台路由器上并没有运行任何路由协议,都只存在直连路由,因此在pc1上很显然是ping不通pc2的,因为R1并不知道30.0.0.0/24网段下一跳应该送到何处。
[PC1> ping 30.0.0.2/24
*192.168.0.1 icmp_seq=1 ttl=255 time=45.867 ms (ICMP type:3, code:1, Destination host unreachable)
*192.168.0.1 icmp_seq=2 ttl=255 time=11.573 ms (ICMP type:3, code:1, Destination host unreachable)
*192.168.0.1 icmp_seq=3 ttl=255 time=8.511 ms (ICMP type:3, code:1, Destination host unreachable)](<PC1%3E ping 20.0.0.3
84 bytes from 20.0.0.3 icmp_seq=1 ttl=255 time=11.490 ms
84 bytes from 20.0.0.3 icmp_seq=2 ttl=255 time=5.910 ms
84 bytes from 20.0.0.3 icmp_seq=3 ttl=255 time=5.994 ms
PC1> ping 30.0.0.2
*192.168.0.1 icmp_seq=1 ttl=255 time=11.198 ms (ICMP type:3, code:1, Destination host unreachable)
*192.168.0.1 icmp_seq=2 ttl=255 time=12.263 ms (ICMP type:3, code:1, Destination host unreachable)>)
2.3. 配置静态NAT
2.3.1. inside方式
R1(config)<span class="tag">#ip</span> nat inside source static 192.168.0.2 20.0.0.4
R1(config)<span class="tag">#interface</span> g0/0
R1(config-if)<span class="tag">#ip</span> nat inside
*Jul 6 16:20:25.563: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up
R1(config)<span class="tag">#interface</span> g1/0
R1(config-if)<span class="tag">#ip</span> nat outside
R1(config)<span class="tag">#do</span> show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- 20.0.0.4 192.168.0.2 --- ---
R1(config)<span class="tag">#ip</span> route 30.0.0.0 255.255.255.0 20.0.0.3
这里我们在R1上添加了30.0.0.0/24的路由,下一跳送给R2,但是R2上并没有添加指向192.168.0.0/24的路由。如果不对源地址进行NAT,R2路由器是不知道192.168.0.0/24网段下一跳应该送到哪里的,但是经过NAT后源地址已经变成了20.0.0.4,R2上有这条直连路由,流量经过NAT后可以通。
2.3.1.1. pc1 ping 30.0.0.2
pc1抓包,NAT前
pc2抓包,NAT后
去程流量从inside口入,匹配nat规则,源地址替换为20.0.0.4;
回程流量匹配会话,目的地址由20.0.0.4替换为192.168.0.2
2.3.1.2. pc2 ping 192.168.0.2
配置路由
R2(config)<span class="tag">#ip</span> route 192.168.0.0 255.255.255.0 20.0.0.2
抓包如下:
去程从outside口入,不进行NAT地址替换,pc1看到的源地址就是30.0.0.2;
回程从inside口入,进行NAT地址替换,源地址替换为20.0.0.4;
pc2访问的目的是192.168.0.2,reply报文源地址是20.0.0.4,地址不匹配,流量不通。
2.3.1.3. pc2 ping 20.0.0.4

去程从outside口入,不进行NAT地址替换,30.0.0.2 -> 20.0.0.4;
回程从inside口入,进行NAT地址替换,192.168.0.2 -> 30.0.0.2变为20.0.0.4 -> 30.0.0.2;
流量正常。
2.3.2. outside方式
R1(config)<span class="tag">#ip</span> nat outside source static 30.0.0.2 20.0.0.4
R1(config)<span class="tag">#interface</span> g0/0
R1(config-if)<span class="tag">#ip</span> nat inside
*Jul 6 16:20:25.563: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up
R1(config)<span class="tag">#interface</span> g1/0
R1(config-if)<span class="tag">#ip</span> nat outside
R1(config)<span class="tag">#do</span> show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- --- --- 20.0.0.4 30.0.0.2
R1(config)<span class="tag">#ip</span> route 30.0.0.0 255.255.255.0 20.0.0.3
R2(config)<span class="tag">#ip</span> route 192.168.0.0 255.255.255.0 20.0.0.2
2.3.2.1. p2 ping 192.168.0.2


去程从R1的outside口进,匹配nat规则,源地址替换为20.0.0.4;
返程根据会话将目的地址20.0.0.4替换为30.0.0.2;
流量正常
2.3.2.2. p1 ping 30.0.0.2

由于是在outside配置的nat规则,因此去程从inside口进,并不会进行nat,pc2收到的源地址就是192.168.0.2;
返程从outside口进时匹配到了nat规则,将源地址30.0.0.2替换为20.0.0.4;
对于pc1来说,看到的源地址20.0.0.4和发出的报文目的地址30.0.0.2不匹配,流量不通。
2.3.2.3. pc1 ping 20.0.0.4

由于是在outside配置的nat规则,因此去程并不会进行nat,pc2收到的源地址就是192.168.0.2,而返程在outside口进时匹配到了nat规则,将源地址30.0.0.2替换为20.0.0.4,对于pc1来说就是看到的与20.0.0.4这个地址在通信。
2.3.3. 总结
- inside规则匹配从inside口流入的流量并替换源地址;outside规则匹配从outside口流入的流量并替换源地址。两个规则是相对的,inside配置的规则,对于内网主机来说看到的外网地址是真实地址,对于外网主机来说看到的是NAT后的内网主机地址;而对于outside规则来说,对于内网主机看到的外网地址是NAT后的地址,对于外网主机来说看到的地址是真实的内网地址。
- inside的规则是给内网主机做nat的,outside的规则是给外网主机做nat的,其实我们可以发现inside和outside是对等的。
- 静态规则即可以正向内网主动访问外网,也可以反向外网主动访问内网。
2.4. 配置静态PNAT
指定端口进行NAT
R1(config)<span class="tag">#ip</span> nat inside source static tcp 192.168.0.2 23 20.0.0.4 10000
pc2 通过tcp协议ping 20.0.0.4
PC2> ping ?
**ping** HOST [OPTION ...]
Ping the network HOST. HOST can be an ip address or name
Options:
**-1** ICMP mode, default
**-2** UDP mode
**-3** TCP mode
**-c** count Packet count, default 5
**-D** Set the Don't Fragment bit
**-f** FLAG Tcp header FLAG |**C**|**E**|**U**|**A**|**P**|**R**|**S**|**F**|
bits |7 6 5 4 3 2 1 0|
**-i** ms Wait ms milliseconds between sending each packet
**-l** size Data size
**-P** protocol Use IP protocol in ping packets
**1** - ICMP (default), **17** - UDP, **6** - TCP
**-p** port Destination port
**-s** port Source port
**-T** ttl Set ttl, default 64
**-t** Send packets until interrupted by Ctrl+C
**-w** ms Wait ms milliseconds to receive the response
Notes: 1. Using names requires DNS to be set.
2. Use Ctrl+C to stop the command.
PC2> ping 20.0.0.4 -P 6 -p 10000 -c 3
Connect 10000@20.0.0.4 seq=1 ttl=62 time=24.921 ms
SendData 10000@20.0.0.4 seq=1 ttl=62 time=33.232 ms
Close 10000@20.0.0.4 seq=1 ttl=62 time=34.103 ms
Connect 10000@20.0.0.4 seq=2 ttl=62 time=35.078 ms
SendData 10000@20.0.0.4 seq=2 ttl=62 time=36.881 ms
Close 10000@20.0.0.4 seq=2 ttl=62 time=25.813 ms
Connect 10000@20.0.0.4 seq=3 ttl=62 time=49.130 ms
SendData 10000@20.0.0.4 seq=3 ttl=62 time=40.901 ms
Close 10000@20.0.0.4 seq=3 ttl=62 time=41.091 ms
NAT前目的IP为20.0.0.4,目的端口为10000;NAT后目的ip为192.168.0.2,目的端口为23
2.5. 配置动态NAT
在192.168.0.0/24网络环境中新增pc3,更新组网图如下:
2.5.1. 配置源地址段为192.168.0.0/24的动态nat规则
R1(config)<span class="tag">#ip</span> nat pool mytest 20.0.0.10 20.0.0.20 netmask 255.255.255.0
!定义内部全局地址池
R1(config)<span class="tag">#access-list</span> 10 permit 192.168.0.0 0.0.0.255
!定义访问控制列表,内部本地地址范围
R1(config)<span class="tag">#ip</span> nat inside source list 10 pool mytest
!建立映射关系
2.5.1.1. pc1 ping 30.0.0.2
源地址在192.168.0.0/24内,动态源地址替换为了20.0.0.10
2.5.1.2. pc3 ping 30.0.0.2
源地址在192.168.0.0/24内,动态替换源地址为20.0.0.11
2.5.1.3. 总结
一个ip只可以被一个内网主机使用,ip不会在主机间复用。
2.5.2. 配置源地址段为192.168.0.2/32的动态nat规则
R1(config)<span class="tag">#ip</span> nat pool mytest 20.0.0.10 20.0.0.20 netmask 255.255.255.0
!定义内部全局地址池
R1(config)<span class="tag">#access-list</span> 10 permit 192.168.0.2 0.0.0.0
!定义访问控制列表,内部本地地址范围
R1(config)<span class="tag">#ip</span> nat inside source list 10 pool mytest
!建立映射关系
2.5.2.1. pc1 ping 30.0.0.2
源地址在192.168.0.2/32内,动态源地址替换为了20.0.0.12
2.5.2.2. pc3 ping 30.0.0.2
源地址不在192.168.0.2/32内,不替换源地址。
2.6. 配置动态PNAT
通过overload参数控制地址重复
R1(config)<span class="tag">#ip</span> nat pool mytest 20.0.0.10 20.0.0.20 netmask 255.255.255.0
!定义内部全局地址池
R1(config)<span class="tag">#access-list</span> 10 permit 192.168.0.0 0.0.0.255
!定义访问控制列表,内部本地地址范围
R1(config)<span class="tag">#ip</span> nat inside source list 10 pool mytest overload
!建立映射关系
使用pc1和pc3同时ping 30.0.0.2,可以发现复用了同一个20.0.0.12地址