1.NAT技术
NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
1.1NAT技术背景
在IPv4协议中,IP地址数量不足是一个大问题,而NAT技术就是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。
在进行对外通信时,NAT能够将私有IP经过一系列替换操作最终转为全局IP,也就是说,NAT是一种将私有IP和全局IP相互转化的技术方法。
- 装有NAT软件的路由器叫做NAT路由器,所有使用私有IP的主机在和外界通信时,都要在NAT路由器上将其私有IP转换成全局IP。
- 大部分学校、家庭、公司内部每个终端设置的IP都是私有IP,而只在出口路由器(再外层就是公网)或必要的服务器上设置全局IP。
1.2NAT IP转换过程
假设某个局域网当中有A、B、C三台主机,在公网当中有一台服务器,以主机A访问公网中的这台服务器为例,我们来看看数据包在传输过程中IP地址的转换过程。
(1)数据包从局域网到公网的过程
主机A向服务器发起数据请求的过程中,数据包中IP地址的转换过程如下:
- 刚开始,该数据包当中的源IP地址就是主机A的私有IP地址,目的IP地址就是服务器的公网IP地址。
- 当数据包经过NAT路由器时,路由器会将该数据包的源IP地址替换成自己的WAN口IP地址,此时该数据包的源和目的IP地址就都是公网IP了。
- 该数据包在互联网中经过各种路由转发,最终到达服务器主机。
- 服务器收到主机A的数据请求并处理后,就会对主机A发来的请求进行响应。
(2)数据包从公网到局域网的过程
服务器向主机A进行响应的过程中,数据包中IP地址的转换过程如下:
- 刚开始,该数据包当中的源IP地址就是服务器的公网IP地址,目的IP地址就是路由器的WAN口IP地址。
- 数据包在互联网中经过各种路由转发,到达主机A所在局域网的NAT路由器,此时路由器会根据**“地址转换表”**将该数据包的目的IP地址替换成主机A的私有IP地址。
- 最终路由器就会将该数据包转发给局域网中的主机A。
需要注意的是,因为主机A向服务器发起数据请求时,该数据包当中的源IP地址被替换成了NAT路由器的WAN口IP地址,相当于是该路由器代替主机A向服务器发起了数据请求,因此服务器发出的响应数据包的目的IP地址应该是NAT路由器的WAN口IP地址。
1.3NAPT
(1)地址转换表
当局域网当中的主机要访问外网时,NAT路由器会将这些数据包的源IP地址替换成自己的WAN口IP地址。
当外网发来响应数据时,报文的目的IP地址是NAT路由器的WAN口IP地址,但是此时报文还没有到达真正要去的主机,所以此时NAT路由器内部会维护一张**“地址转换表”**,根据该地址转换表将目的IP地址替换为目的主机的私有IP地址。
该转换表中维护的是局域网中主机的私有IP,与其对应访问的外网当中的某个公网IP之间的映射关系,这份映射互为键值。
当局域网中的主机第一次向外网发起数据请求时,就会生成表中的映射关系。
比如在TCP建立连接时,会建立对应的映射关系,在TCP断开连接后,就会删除对应的映射关系。
在刚才的例子中,主机A第一次向服务器发起数据请求时,路由器中就会建立以下映射关系。
当NAT路由器收到服务器向主机A发来的响应数据时,就可以通过查表得知该响应数据是发送给局域网当中的主机A的。
但如果转换表中维护的只是局域网中主机的私有IP,与其对应访问的外网当中的某个公网IP之间的映射关系,那么就会出现某些问题。
如果局域网中的主机A和主机B同时都在访问该服务器,那么此时转换表中就会建立如下两对映射关系:
此时这张转换表只能保证从左到右的唯一性,而不能保证从右到左的唯一性,当服务器发来响应数据时,该数据包中的目的IP地址都是路由器的WAN口IP,此时NAT路由器就无法判断该数据包应该转发给主机A还是主机B,此时就需要用到NAPT技术。
(2)NAPT
NAPT(Network Address Port Translation,网络地址端口转换),可以将多个内部地址映射为一个合法公网地址。
当局域网中的主机向外网发送数据时,路由器会将该数据包的源IP地址替换为自己的WAN口IP地址,并建立该主机私有IP与其对应访问的公网IP之间的映射关系。
但如果局域网中的多台主机同时访问同一个外网服务,当路由器收到外网发来的响应数据时,路由器无法判断该响应数据应该转发给局域网中的哪台主机,因为该局域网中所有主机的数据包都由路由器代替发送了,因此发来的响应数据包的目的IP地址都是路由器的WAN口IP地址。
于是NAPT在建立转换表的映射关系时,除了建立局域网中私有IP与其对应访问的公网IP之间的映射关系外,还会加上一个由NAT路由器选定的端口号。
此时当局域网中的多台主机同时访问同一个外网服务时,虽然外网发来的响应数据的目的IP地址都是路由器的WAN口IP,但发给局域网中不同主机的响应数据对应的目的端口号是不同的,此时路由器就能通过IP+Port的方式来区分发给不同主机的数据包。
比如局域网中的主机A和主机B都在访问同一个服务器,并且它们访问服务器时采用的端口号都是1025。
- 假设主机A发送的数据包先到达路由器,此时路由器将数据包的源IP地址替换成自己的WAN口IP地址,由于路由器用于访问该服务器的1025号端口没有被使用,因此该数据包的源端口号可以不变。
- 当主机B发来的数据包到达路由器时,路由器同样将数据包的源IP地址替换成自己的WAN口IP地址,但此时路由器用于访问该服务器的1025号端口已经被主机A使用了,因此路由器会重新选定一个端口号对数据包的源端口号进行替换(比如1026)。
此时转换表中就会建立如下两队映射关系:
此时这张转换表既能保证从左到右的唯一性,也能保证从右到左的唯一性。
因此NAPT技术就是NAT路由器通过维护一张**“地址转换表”**,该表中记录源IP、源端口和目的IP、目的端口的对应关系,通过查表得到数据转发的目的地。
1.4NAT技术的缺陷
NAT技术进行私有IP和公网之间的替换,主要就是依赖NAT路由器当中维护的网络地址转换表,但这张转换表也体现出了NAT的一些缺陷:
-
无法从NAT外部向内部服务器建立连接,因为外部无法知道内部的私网IP,也就无法主动与内部服务器建立连接。
-
转换表的生成和销毁都需要额外开销。
-
通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开。
2.代理服务器
代理服务器(Proxy Server)的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理。
(1)正向代理
正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端。
通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。
- 提高访问速度:正向代理服务器可以将目的服务器对应的资源缓存到本地,此时当其他人要访问该资源时,直接在正向代理服务器就可以获取,而不需要再次进行外网访问(部分加速器)。
- 访问控制:访问控制:通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站。
- 内容过滤:正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等。
- 隐藏客户端身份:正向代理可以隐藏客户端的真实IP地址,保护客户端的隐私。
(2)反向代理
反向代理服务器是一种网络架构模式,其作为Web服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。
这种架构模式可以提升网站性能、安全性和可维护性等。
- 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。
- 安全保护:反向代理服务器可以隐藏后端Web服务器的真实IP地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。
- 缓存加速:反向代理服务器可以缓存后端Web服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。
- 内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需求,如URL重写、用户认证等。
- 动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。
- CDN(ContentDeliveryNetwork,内容分发网络)通过在网络各处放置节点服务器,构建一个智能虚拟网络,以实时地根据网络流量、各节点的连接和负载状况、到用户的距离和响应时间等综合信息,将用户的请求重新导向离用户最近的服务节点上。这样,用户就可以就近取得所需内容,从而解决Internet网络拥挤的状况,提高用户访问网站的响应速度。(加速器)
需要注意的是,代理服务器的主要工作只是对数据进行转发,因此代理服务器处理数据的压力不会特别大,并且代理服务器也可以有多个,因此不必担心代理服务器过载的情况。
(3)正向代理和反向代理的异同
正向代理和反向代理的相同点:
- 正向代理服务器和反向代理服务器都是位于客户端和服务器之间的。
- 正向代理服务器和反向代理服务器的主要工作,都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端
正向代理和反向代理的不同点:
- 正向代理是客户端的代理,帮助客户端访问其无法访问的服务器资源的,而反向代理则是服务器的代理,帮助服务器做负载均衡、安全防护等工作的。
- 正向代理一般是客户端架设的,而反向代理一般是服务端架设的。
- 正向代理中,服务器不知道真正的客户端到底是谁,服务器认为正向代理服务器就是真实的客户端,而反向代理中,客户端不知道真正的服务器是谁,客户端认为反向代理服务器就是真实的服务器。
3.NAT和代理服务器的区别
NAT和代理服务器都是代替我们向服务器发起数据请求的,但它们有如下区别:
- 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题,而代理服务器则是更贴近具体应用,比如通过代理服务器进行FANQIANG,另外像迅游这样的加速器,也是使用的代理服务器。
- 从底层实现上讲,NAT工作在网络层,直接对IP地址进行替换,而代理服务器往往工作在应用层。
- 从使用范围上讲,NAT一般在局域网的出口部署,而代理服务器可以在局域网代理,也可以在广域网代理,也可以跨网代理。
- 从部署位置上看,NAT一般集成在防火墙、路由器等硬件设备上,而代理服务器则是一个软件程序(比如Nginx和Apache),需要部署在服务器上。
4.内网穿透
两台主机如何跨局域网直接进行通信?
- 首先在代理服务器上部署安装配置"frps"(frp服务端),在主机部署安装配置"frpc"(frp客户端)。
- 让一台主机与代理服务器建立连接,生成NAT映射表。
- 通过"frpc"将本地某个端口映射到代理服务器"frps"的某端口。
这样一来,未来其他主机只需要访问代理服务器的特定端口,就能直接访问到目标主机的特定端口,即内网穿透技术。
内网打洞
假设此时有两个主机A、B分别与某云服务器建立连接(比如某直播),此时NAT映射表全部建立完成。
某直播云服务器会获取到两个主机的出口路由器的IP地址和端口号,如果此时云服务器将A主机的出口路由器IP地址和端口号与B主机的出口路由器IP地址和端口号进行交换。
云服务器交换后将对方主机的出口路由器的IP地址和端口号响应回相应主机,此时A主机就知道了B主机出入口路由器的IP地址和端口,B主机也知道了A主机的IP地址和端口号。
此时A主机就可以不用访问某直播云服务器而直接访问B主机,这样可以大大降低云服务器的流量压力,这种技术被称为”内网打洞“技术。
两台主机不通过云服务器直接访问对方,这种行为就是"P2P"。
你可以期待太阳从东方升起,而风却随心所欲地从四面八方吹来。 —萨特