NAT - Network Address Translation 网络地址转换
顾名思义,是一种在数据包通过路由器或者防火墙时替换/重写IP源地址或者目的地址的技术。
发明该技术的本意是:使用私有地址的设备或者主机通过这种方式可以用有限的公网地址在网络上进行通信,从而减缓了IPv4地址紧缺的趋势。
但是大家逐渐发现NAT可有更多用途:服务器负载均衡,网络安全,网络移植和融合等。
什么时候使用NAT
1. 需要接入internet但是主机没有足够的公网地址
2. 更换ISP需要重新分配网络地址时
3. 网络融合但是有IP地址冲突时
4. 内网地址由于安全原因需要隐藏时
优点
1. 保存了有限的公有IP地址
2. 在网络运营中减少了IP地址重新划分
3. 增加了链接网络灵活性和安全性
缺点
1. 地址转换增加了数据交换的延时
2. 失去了端到端的IP可追踪性
3. 有些程序不能与NAT兼容
种类
1. 静态NAT - 一对一
2. 动态NAT - 多对多
3. 过载NAT - 多对一或多对少,PAT - port address translation
重要概念
角度 角度
位置 | Inside Local | Inside Global |
位置 | Outside Local | Outside Global |
Inside Local: 分配给内网主机的地址
Inside Global: 从外网看,内网主机的地址 (从里往外发包时,IP地址转换后内网主机的地址)
Outside Global:分配给外网主机的地址
Outside local: 从内网看,外网主机的地址 (从外往里发包时,IP地址转换后的外网主机地址)
基本配置
1. 选择NAT种类,写出需要转换的IP地址, 最好用inside/outside标注好
2. 在config t 后启动nat,用相应的keyword对应相应的种类, static-静态; pool - 动态; overload - 过载
3. 在对应端口声明对如NAT是inside还是outside
4. 对于静态NAT前三步就够了,Dynamic & PAT 需要再加一步添加access-list
5. 用sh ip nat tran ; sh ip nat statistics; debug ip nat 等验证
配置实例 (注:例子来源于 Sybex CCNA第七版, Chap 14 NAT, Hands on Lab - 以下为GNS3中的模拟)
Part 1 - Dynamic NAT
------------------------------------------------------
Lab_A - 相关NAT的配置
interface Serial0/0
ip address 192.168.20.1 255.255.255.0
ip nat inside
encapsulation ppp
interface Serial0/1
ip address 171.16.10.2 255.255.255.0
ip nat outside
encapsulation ppp
ip nat pool GlobalNet 171.16.10.50 171.16.10.55 netmask 255.255.255.0 》》》》 config NAT pool
ip nat inside source list 1 pool GlobalNet
ip classless
ip route 171.16.0.0 255.255.0.0 171.16.10.1
no ip http server
!
access-list 1 permit 192.168.20.0 0.0.0.255
--------------------------------------------------------------
Lab B & Lab C telnet 171.16.10.1 and output from Lab A, 开启 debug ip nat
==========Before Telnet===========
Lab_A#sh ip nat trans
Lab_A#
==========After Telnet============
Lab_A#
01:39:40: NAT: s=192.168.20.2->171.16.10.50, d=171.16.10.1 [0] >>>>>>> telnet from Lab B
01:39:40: NAT: s=171.16.10.1, d=171.16.10.50->192.168.20.2 [0]
### output omitted#####
Lab_A#
01:42:44: NAT: s=192.168.30.2->171.16.10.51, d=171.16.10.1 [0] >>>>>>> telnet from Lab C
01:42:44: NAT: s=171.16.10.1, d=171.16.10.51->192.168.30.2 [0]
### output omitted#####
Lab_A#sh ip nat tran
Pro Inside global Inside local Outside local Outside global
--- 171.16.10.50 192.168.20.2 --- ---
--- 171.16.10.51 192.168.30.2 --- ---
Lab_A#sh ip nat statistics
Total active translations: 2 (0 static, 2 dynamic; 0 extended)
Outside interfaces:
Serial0/1
Inside interfaces:
Serial0/0
Hits: 47 Misses: 2
Expired translations: 0
Dynamic mappings:
-- Inside Source
access-list 1 pool GlobalNet refcount 2
pool GlobalNet: netmask 255.255.255.0
start 171.16.10.50 end 171.16.10.55
type generic, total addresses 6, allocated 2 (33%), misses 0 >>>>>>> used 1/3 of the 6 IP addresses
Part 2 - PAT
------------------------------------------------------
先移除 Dynamic NAT相关配置
Lab_A#clear ip nat tran * >>>>>>>>> only dynamic NAT entries will be removed
Lab_A#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Lab_A(config)#no ip nat inside source list 1 pool GlobalNet
Lab_A(config)#$ool GlobalNet 171.16.10.50 171.16.10.55 netmask 255.255.255.0
Lab_A(config)#
Lab_A - 相关PAT的配置
interface Serial0/0
ip address 192.168.20.1 255.255.255.0
ip nat inside
encapsulation ppp
interface Serial0/1
ip address 171.16.10.2 255.255.255.0
ip nat outside
encapsulation ppp
ip nat pool Adam-PAT 171.16.10.100 171.16.10.100 netmask 255.255.255.0
ip nat inside source list 2 pool Adam-PAT overload >>>>>>>>>>>>>>>>>>>>>> overload keyword
ip classless
ip route 171.16.0.0 255.255.0.0 171.16.10.1
no ip http server
!
access-list 1 permit 192.168.20.0 0.0.0.255
access-list 1 permit 192.168.30.0 0.0.0.255
access-list 2 permit 192.168.20.0 0.0.0.255
access-list 2 permit 192.168.30.0 0.0.0.255
----------------------------------------------------------------
Lab B & Lab C telnet 171.16.10.1 and output from Lab A, 开启 debug ip nat
==========Before Telnet===========
Lab_A#sh ip nat trans
Lab_A#
==========After Telnet============
Lab_A#
02:07:17: NAT: s=192.168.20.2->171.16.10.100, d=171.16.10.1 [0] >>>>>>>>>> Telnet from Lab B
02:07:17: NAT: s=171.16.10.1, d=171.16.10.100->192.168.20.2 [0]
02:08:14: NAT: s=192.168.20.2->171.16.10.100, d=171.16.10.1 [17] >>>>>>>>> Telnet from Lab C
02:08:14: NAT: s=171.16.10.1, d=171.16.10.100->192.168.20.2 [8]
Lab_A#sh ip nat trans
Pro Inside global Inside local Outside local Outside global
tcp 171.16.10.100:11002 192.168.20.2:11002 171.16.10.1:23 171.16.10.1:23
tcp 171.16.10.100:1024 192.168.30.2:11002 171.16.10.1:23 171.16.10.1:23
-------------------------------------------------
篇后语
通过写这个文章加上在GNS3实现这个lab发现我这个动手能力简直烂到不行,文艺点叫眼高手低。虽然经常看相关的文章,平时工作trouble-shooting也会用到相关的命令和知识。今天在GNS3上试着一模拟问题全出来了,一会串口起不来(需要改下封装协议 - encapsulation ppp), 一会儿rip 水平分割忘了。整整在这捯饬了一下午 (中间偷懒去看了一集 Game of Thrones)。 所以,结论是,需要 在以后总结知识的时候尽量用GNS3或者IOU模拟下实验,以免出现纸上谈兵的情况。