最近在看负载均衡方面的东西中很多都提到了NAT穿越,特意在此总结一下:
先做一个约定:
内网A中有:A1(192.168.30.112),A2(192.168.30.114)两个用户
网关X1(一个NAT设备)有公网IP222.225.80.51;
内网B中有:B1(192.168.40.112),B2(192.168.40.114)两个用户
网关Y1(一个NAT设备)有公网IP222.225.50,34;.
NAT的简介和原理
简介
NAT即Network Address Translation,它可以让那些使用私有地址的内部网络连接到Internet或其它IP网络上.NAT路由在将内部网络的数据包发送到公用网络时,在IP包的报头把私有地址转换成合法的IP地址.
原理:
当内部网络中的一台主机想传输数据到外部网络时,它先将数据包传输到NAT路由器上,路由器检查数据包的报头,获取该数据包的源IP信息,并从它的NAT映射表中找出与该IP匹配的转换条目,用所选的内部全局地址(全局唯一IP地址)来替换内部局部地址,并转发数据包.
当外部网络对内部主机进行应答时,数据包被送到NAT路由器上,路由器接收到目的地址为内部全局地址(外网IP)的数据包,它将用内部全局地址通过NAT映射表查找内部局部地址,然后将数据包的目的地址替换成内部局部地址(内网私有IP),并将数据包转发到内部主机.
NAT有什么优点和缺点?
优点
- 对于家庭或小型商业机构,使用NAT可以更便宜,更有效的接入Internet。
- 使用NAT可以缓解目前全球IP地址不足的问题.
- NAT能够隐藏内部网络,保证内部网络的安全性.
缺点
- NAT会增加延迟,因为要转换的每个数据包包头的IP地址,增加了延迟.
- 导致无法进行端到端IP跟踪.
- NAT会使某些使用内嵌地址的应用不能正常工作.
NAT的三种类型
静态NAT (一对一)
静态转换:(static Nat):是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址,借助静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问.
假设在A网中A1客户机请求百度具体过程如下:(前提是已经进行过静态NAT配置.)
首先进行DNS解析得到百度的IP为180.97.33.107:4000.接下来的过程如下:
请求过程:
在客户机
192.168.30.112:4000 --> 180.97.33.107:4000
在网关:
222.225.50.81:4000 --> 180.97.33.107:4000
网关上的静态映射表:
192.168.30.112:4000 -->222.225.80.51:4000
根据公网IP,改请求包的源IP.
回应过程
百度的应用服务器收到请求后,处理请求,回复请求如下:
在百度的应用服务器上:
180.97.33.107:4000 --->222.25.50.81:4000
在网关:
180.97.33.107:4000 --->192.168.30.112:4000
根据网关上的静态映射表,改变目的IP;
总结
在A网中,网关中只有一个合法的公网IP,在A网中的内网中,就只能有一台pc能通过这个网关访问外网,它们之间是一一对应关系,一个内网IP对应网关的一个公网IP,再进行配置时就已经指定.如果想让内网中的其它pc也能访问外网,那么网关就必须有多个公网IP,并对每台系想访问外网的pc进行静态配置.
动态NAT (多对多)
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对并不是一一对应的,而是随机的。所有被管理员授权访问外网的私有IP地 址可随机转换为任何指定的公有IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。每个地址 的租用时间都有限制。这样,当ISP提供的合法IP地址略少于网络内部的计算机数量时,可以采用动态转换的方式。
继续假设A网中的A1访问百度.
前提是进行过动态NAT配置. 这里假设网关A上有3个合法的公网IP(222.225.80.51,222.225.80.52,222.225.80.53)
请求过程
在客户机
192.168.30.112:4000 --> 180.97.33.107:4000
在网关:
222.225.80.51:4000 --> 180.97.33.107:4000 //这个公网IP是从配置时指定的公网IP中随机选择的.也有可能会是222.225.80.52或222.225.80.53;
网关上的静态映射表:
192.168.30.112:4000 -->222.225.80.51:4000
根据公网IP,改请求包的源IP.
回应过程
在百度的应用服务器上:
180.97.33.107:4000 --->222.25.50.81:4000
在网关:
180.97.33.107:4000 --->192.168.30.112:4000
根据网关上的静态映射表,改变目的IP;
端口多路复用(多对一,目前使用最多的)
通过使用端口多路复用,可以达到一个公网地址对应多个私有地址的一对多转换。在这种工作方式下,内部网络的所有主机均可共享一个合法外部IP地 址实现对Internet的访问,来自不同内部主机的流量用不同的随机端口进行标示,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有 主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
A网中的A1,A2同时访问百度
请求过程
在客户机
192.168.30.112:4000 ---> 180.97.33.107:4000
192.168.30.114:4000 ---> 180.97.33.107:4000
在网关
222.225.80.51:2223 ---> 180.97.33.107:4000
222.225.80.51:2345 --->180.97.33.107:4000
网关的映射:
192.168.30.112:4000 ---> 222.225.80.51:2223
192.168.30.114:4000 ---> 222.225.80.51:2345
回复过程和上面的相同,先由百度应用服务器发给网关,查询映射表,发给对应的pc;
不同NAT 网关后的内部主机如何互访?(P2P如何穿越NAT)?
场景
A网中的A1(192.168.30.112)想访问B网中的B1(192.168.40.112);
假设1:假设A网中A1首先访问B网的网关(222.225.50.34),那么A1又怎么能知道B1的网关是222.225.50.34.好,暂且假设A1知道B1的网关为222.225.50.34,现在请求到了B1的网关,那么它又怎么知道发给A网中的哪个主机pc呢.
向外部固定的服务器注册外部地址和端口号.
- 首先,A1和B1都要向服务器发起注册,连接中携带用户名,这样服务器收到连接后就能将注册信息中携带的IP地址,端口号和用户名关联,做成一张表:
eg:A1,B1访问180.34.56.12进行注册.
A1 192.168.30.112:4000 -- > 180.34.56.12:5687
B1 192.168.40.112:4000 -- > 180.34.56.12:5678
A1的网关映射表: 192.168.30.112:4000 --> 222.225.80.51:2345
B1的网关映射表:192.168.40.112:4000 --> 222.225.50.34:3245
在180.34.56.12保存一张表
用户名 | 网关IP | 端口 |
---|---|---|
A1 | 222.225.80.51 | 2345 |
B1 | 222.225.50.34 | 3245| |
现在假设A1访问B1,先去180.34.56.12检索B1的网关的IP和端口,检索到向其发送连接.
- 当数据包到达B1的网关时,根据外网IP和端口查询网关的映射表得到内部IP和端口。
- 把数据包发给内网对应的pc.