这是我参与 8 月更文挑战的第 30 天,活动详情查看: 8月更文挑战
NAT简介
NAT(Network Address Translation,网络地址转换)
是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网(私网IP)连接到因特网(公网IP)的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址(公网IP地址)。这样,所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
NAT的实现方式有三种,即静态转换Static Nat
、动态转换Dynamic Nat
和端口多路复用OverLoad
。
静态转换
是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换
是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
端口多路复用(Port address Translation,PAT)
是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,网络中应用最多的就是端口多路复用方式。
思科锐捷设备配置NAT实例
R1:
R1(config)#access-list 1 permit 172.16.1.0 0.0.0.255 ->注意ACL要用反掩码
R1(config)#ip nat inside source list 1 interface g1/0 overload
->这个overload一定要加,不然转化不成功
R1(config-if)#int g0/0
R1(config-if)#ip nat inside
R1(config-if)#ip add 172.16.1.1 255.255.255.0
R1(config-if)#int g1/0
R1(config-if)#ip nat outside
R1(config-if)#ip add 10.1.12.1 255.255.255.0
R2:
R2(config)#ip nat pool NAT 10.1.12.2 10.1.12.2 netmask 255.255.255.0
R2(config)#access-list 1 permit 172.16.1.0 0.0.0.255
R2(config)#ip nat inside source list 1 pool NAT overload
R2(config)#ip nat inside source static tcp 172.16.1.2 80 10.1.12.2 80 ->将PC2的80端口做端口映射出去
R2(config)#int g0/0
R2(config-if)#ip nat inside
R2(config-if)#ip add 172.16.1.1 255.255.255.0
R2(config-if)#int g1/0
R2(config-if)#ip nat outside
R2(config-if)#ip add 10.1.12.2 255.255.255.0
说一下NAT的一些坑点吧,第一就是overlord
一定要加,第二就是一定设置inside
和outside
接口
配置完成后,我们使用PC1去ping一下R2,发现可以通,说明NAT转化成功,如果没有转化R2是没有路由到PC1的
在R1上查看NAT的转化记录,发现已经成功转化了,冒号后面后面表示对应的端口号,这样做是为了可以将多个IP地址转化为一个IP地址。由于多个IP地址对应成了一个,要怎么才能知道回程的数据包是要发给谁,这个时候就要利用端口号进行标识。
在R1的G0/0进行抓包,发现数据包还没有转化
在R1的G1/0抓包发现数据包的原IP地址已经被转化为这个接口的IP地址
接下来是PC2去pingR1
可以看到使用NAT pool定义地址池去转化也没有问题
在PC1上使用telnet去测试R2上的端口是否已经打开,从结果来看这个结果是打开状态
在R2的G1/0接口抓包可以看到TCP数据包成功被映射
在R2连接R1的G0/0接口由于做了端口映射,路由器发现这个有人访问了被映射的端口,也是数据包到这个接口又进行了转化
华为设备配置NAT实例
[R1]int g0/0/0
[R1-GigabitEthernet0/0/0]ip add 192.168.1.1 24
[R1-GigabitEthernet0/0/0]int g0/0/1
[R1-GigabitEthernet0/0/1]ip add 10.1.12.1 24 --配置ACL匹配需要转化的IP地址
[R1]acl number 2000
[R1-acl-basic-2000]rule 10 permit source 192.168.1.0 0.0.0.255 --使用Easy IP的方式去将ACL匹配到的IP地址转化为接口的IP地址
[R1]int g0/0/1
[R1-GigabitEthernet0/0/1]nat outbound 2000
[R2]int g0/0/0
[R2-GigabitEthernet0/0/0]ip add 10.1.12.2 24
[R2-GigabitEthernet0/0/0]nat server global 10.1.12.3 inside 192.168.1.2 ->进行服务器映射,这里有一个比较坑的就是需要在接口下进行映射,不然不会成功
[R2-GigabitEthernet0/0/0]int g0/0/1
[R2-GigabitEthernet0/0/1]ip add 192.168.1.1 24
在R1的G0/0/1抓包可以看到NAT转化成功了,PC1的数据包的IP地址已经被转化为R1的接口地址了,所以可以访问到R2,顺便说一下为什么有一个数据包失败了呢,因为第一次和R2通信要进行ARP请求去获取MAC地址
接下来Server1开启http服务
PC1可以访问到Server1,说明映射成功