NAT

发布时间 2023-03-26 16:40:37作者: 张贺贺呀

前言

我们对NAT的理解会慢慢随着时间不断的加深,比如在真实设备上的操作,以及在不同的场景下验证NAT之后理解会更加深刻,在vmware workstation的用户手册当中发现会有nat的存在,会在docker或kvm、net-filter框架当中看到nat身影。

NAT的产生是因为全球IP地址不足

首页----中国互联网络信息中心

企业/个人—运营商—CNNIC(中国互联网信息中心)—APNIC—ICANN

  • APNIC:亚太地区注册机构,AP代表亚太地址,全世界一共有五个;

  • ICANN:IP地址最高的管理地址,2012宣布IP地址已经分配完成,下面的区域还有IP地址;

  • 手机的4G网络拿到的也是一个私网地址,比如你在广州办了一张卡,但是你人在东北,那其实你的IP地址会显示在广州,因为你用的公网IP地址在广州。

  • 没有NAT不能上网的原因不是中间的路由器不转发私网路由,而是回包没路由,它也不能加这个路由;

NAT好处

  • 有效避免外网攻击,可以很大程序上提高网络的安全性
  • 控制内网主机访问餐网,同时也控制外网访问内网,解决了内外网不能互通的问题

家用路由器为什么那么差劲?直播、打游戏会卡,但是一重启就会好多了

这其实与NAT有关,NAT的会话信息是存储在内存当中的,如果说你的同时上网的设备过多,内存会不足,所以就会出现这种情况。所以现在很多的家用路由器厂商都在强调自家的厂商内存够大,能同时支持几十人在线。

现在的运营商给的光猫都携带了路由器的功能,基本上的上网没有问题,我们在中小企业是否可以不买路由器,就直接使用光猫的路由功能呢?不建议这么做,因为光猫的性能其实不怎么好,由于是内存,如果大量产生了会话,那就会很容易出现网络卡顿的现象,所以说,我们最好自己购买的大内存路由器,然后将路由功能,尤其是NAT功能放到我们自己购买的路由器上,这样会话就存在在我们自己购买的路由器上,用户体验就会好很多;

静态NAT

静态最重要的特点就是一对一

# int 出接口
int gx/x/x

	# 全局使能
	nat static enable 开启NAT静态功能

	#在外网接口配置
	net static global  <与外网接口的IP处于同一网段的未使用地址>  inside  <允许内网的哪个IP出去>  

# 查看静态NAT的配置
	dis nat static

注意:

  • 注意,你在配置静态NAT的时候不要使用当前接口上正在使用的NAT地址,你想呀,你如果这么做了?那下面的其它主机怎么上网
  • “与外网接口的IP处于同一网段的未使用地址”并不用直接配置到接口上,你只要在接口上实现NAT之后地址就会自动生效的。
  • 当配置完之后,通过dis nat static就会发现生成两条永久信息,如下图所示:

image-20230326155911940

image-20230326155900334

[R1]dis nat session protocol icmp  #查看关于icmp的nat会话
     Protocol          : ICMP(1)
     SrcAddr   Vpn     : 192.168.0.1         #源ip是192.168.0.1                         
     DestAddr  Vpn     : 9.9.9.9                                        
     Type Code IcmpId  : 0   8   12611
     NAT-Info
       New SrcAddr     : 12.1.1.2         #把源IP给转换成了12.1.1.2

NOTE:此会话是缓存的,在nat不工作的时候是看不出来的,只有当nat一直工作的时候,这个缓存才会有,所以要在客户端一直ping 9.9.9.9才可以看到

静态NAT的用途

极少情况下你需要做一对一的映射,一般是这样的场景,公司里面向运营商购买了一个网段,这个网段共有10多个地址,那我们公司平时上网用一个也就足够了,那还有那么多地址怎么办呢?其实很简单,当公司再有长时间的,需要做端口映射的服务,那你就直接让他直接剩下的公网地址,这样比较贴近于真实的场景,开发人员也比较喜欢这种方式。

动态NAT

动态NAT就是把可用的公网IP放在一个地址池里面,当主机需要公网地址的时候,从地址池里面拿一个,用完会自动释放,如果同时有多台主机在上网把地址池里面的公网IP地址耗尽,那新的主机需要上网的话,就得排队等前面的主机释放地址,就像我们去比较火的餐馆吃饭,没有桌了只能等前面的客人吃完。

nat address-gruop 1  58.57.50.51  58.57.50.55
acl 2000
	rule 0 permit source 192.168.0.0 0.0.0.255
int g0/0/0 # 出接口
	nat outbound 2000 address-group 1 no-pat  # no-pat就是不转换端口
dis nat address-group # 查看NAT地址池配置信息
dis nat outbound  # 查看动态NAT配置信息
dis nat seeesion all # 查看nat转换表,在ping的时候查看

动态NAT有个细节需要注意,如果你是单个主机,PING了五次,那第一次都单独对应一个IP地址,并不是每一台主机单独对应一台主机,并不会绑定某个主机,而是每一个数据包都会占用一个公网IP地址,这就会导致大量的占用公网IP和内存会话。你内网有三台主机需要上网,但是你公网地址只有三个,做这种动态NAT地址是不够的。

no-pat的真正含义,是不需要转端口,你想一下,A访问谷歌的443端口,B也同时访问谷歌的443端口,同时访问的话,如果路由器不转换端口的话,就必须一个公网地址对一个私网地址。

NAPT/PAT

全称:NAPT(network address port translation)

动态NAT我们看到了,非常消耗IP地址,这种方式其实是不适合我们上网的,所以动态NAT发展出了另一种NAT叫NAPT或是PAT,网络地址端口转换,允许多个地址映射到同一个公网地址的不同端口。

配置的话,在前面的基础上不加no-pat就可以了,通过不同的ID进行标识(type code icmpID),如下图所示:

ICMP由于没有端口号,所以用ID号进行标识,http就直接用端口号进行标识了。

Easy-ip

  • 上面三种用并不是接口地址,你需要搞一个地址池,而easy-ip就可以直接使用接口上的配置IP地址进行NAT转换,就不用配置地址池了。
  • 而且,现在我们家用路由器都是动态拨号,是无法将一个固定的地方放到地址池里面的,所以前三种方式都不适用于我们现在的环境,所以才有的easy-ip,有什么我就用什么,不要自行车。

image-20230326155825180

思路与配置

第一步:先写一个ACL做匹配,做匹配范围时没有隐含的允许所有通过,做访问控制时才有,比如我们上图的R1路由器让想内网的192.168.0.0/24这个网段都使用R1的12.1.1.1/19这个IP的话ACL就得这样写:

[R1]acl 2000  #定义一个ACL先把192.168.0.0/24这个网段给匹配上
[R1-acl-basic-2000]rule permit source 192.168.0.0 0.0.0.255

再次强调,ACL只有在做访问控制的时候才会有一个默认规则:没有配置住的都会允许,但是在这里我们没有做访问控制,只是做了匹配,所以并不会有用默认规则的存在。
第二步:到R1的外网接口(G0/0/1)上调用第一步定义的ACL。
当在G0/0/1接口调用了此ACL之后,每当这个接口匹配住一个数据报文,都会把其源地址转换为G0/0/1自己的IP

R1]int g0/0/1
[R1-GigabitEthernet0/0/1]nat outbound 2000  #出接口方向

原理

192.168.0.1  ping  9.9.9.9的通信过程:当192.168.0.1的数据帧被R1的G0/0/1的接口给匹配住以后,都会向其网络层添加一个标记,如下所示:

image-20230326155808980

image-20230326155758241

那么此标记有什么用的?其实R1路由器内部会根据此标记维持一张表,假设是192.168.0.1ping9.9.9.9,R1给这个帧打的标记是2222,那么R1路由器会在内部生成这样一张表,如下图:

image-20230326155749527

然后才把此数据包发出去,当此数据包回来的时候源IP成了9.9.9.9,目标IP成了R1的g0/0/1接口的IP也就是12.1.1.1,与数据发出时相比,源目标和目标IP都发生了变化,但是,序号依次还存在于ICMP的数据报文里面,此结果已经抓包验证过,如下图:

image-20230326155740984

可以此数据帧与上面的请求时的数据帧对比,发现此序号是相同的,于是R1路由器会根据此序号把此数据帧的目标IP替换成192.168.0.1。
以上阐述的都是ping包,也就是ICMP协议,我们知道ICMP是网络层的协议,没有端口的概念,但是当内网的PC访问外网的WWW服务器时,R1是怎样转换的呢?这时候R1就不是通过在ICMP里面打标记实现了,因为一旦有了端口之后,客户端源端口因为是随机的,所以客户端的端口号就是现成的标记,R1路由会把源端口号当做是标记

image-20230326155730778

NAT-server

image-20230326155715179

interface GigabitEthernet0/0/1
	# 注意,这里的外网映射的IP不能是g0/0/1接口的IP
	# 而应该替换成current-interface,华为就是这么设计的。
	# nat server protocol tcp global 12.1.1.2 www inside 192.168.0.2 www
	nat server protocol tcp global current-interface www inside 192.168.0.2 www

# 验证,会发现直接”绑定死了“
[Huawei]dis nat server
  Nat Server Information:
  Interface  : GigabitEthernet0/0/0
    Global IP/Port     : current-interface/80(www) (Real IP : 0.0.0.0)
    Inside IP/Port     : 192.168.0.2/80(www)
    Protocol : 6(tcp)   
    VPN instance-name  : ----                            
    Acl number         : ----
    Description : ----