NAT技术--网络地址转换原理

目录

一、NAT技术

[1.1 什么是 NAT 技术](#1.1 什么是 NAT 技术)

[1.2 NAT 技术中 IP 的转换过程](#1.2 NAT 技术中 IP 的转换过程)

[1.3 NAPT技术](#1.3 NAPT技术)

[1.4 NAT 技术中的细节](#1.4 NAT 技术中的细节)

[1.4 NAT 技术的缺陷](#1.4 NAT 技术的缺陷)

二、代理服务器

[2.1 正向代理](#2.1 正向代理)

正向代理的应用场景

[2.2 反向代理](#2.2 反向代理)

反向代理的应用场景

[2.3 NAT技术和代理服务的区别](#2.3 NAT技术和代理服务的区别)

三、内网穿透

内网穿透的完整流程

四、内网打洞

内网打洞的完整流程

五、内网穿透和内网打洞的对比


一、NAT技术

1.1 什么是 NAT 技术

NAT 也就是网络地址转换技术,主要作用就是将局域网的私网 IP,转换成公网 IP 上网。解决了公网 IP 数量不足的问题,让一整个局域网的多台主机,共用一个WAN口公网IP访问外网。

1.2 NAT 技术中 IP 的转换过程

当内网主机向外发送数据时,NAT路由器会对数据包进行地址转换,将报文的私有源地址10.0.0.10替换为路由器的全局公网IP地址202.244.174.37。

当外部网络的响应数据回传到NAT路由器时,路由器又会反向解析报文地址,将数据包的目标公网IP 202.244.174.37重新替换为内网主机的私有IP 10.0.0.10,保障数据准确回传给内网主机。

在NAT路由器内部,会自动维护一张专属的地址转换映射表,所有内外网地址转换的对应关系都会记录在这张表中。

当内网主机10.0.0.10第一次向外网目标主机163.221.120.9发起数据通信、发送报文时,NAT路由器就会自动生成对应的地址映射关系,写入转换表中,用于后续的双向数据转发。

1.3 NAPT技术

那么问题来了,如果局域网内存在多台主机同时访问同一台外网服务器,外网服务器回传的数据包目标 IP 都会统一为路由器的公网地址。此时 NAT 路由器该如何区分数据包,准确转发给对应的内网主机?

为了解决该场景下的地址区分难题,NAPT技术应运而生。NAPT 会通过 IP 地址加端口号的组合,搭建内网主机与外网通信的绑定关联关系,这份映射关联由 NAT 路由器自动维护。以 TCP 通信为例,内网主机与外网服务器建立连接的瞬间,路由器就会生成对应的映射表项;当双方通信连接断开之后,路由器又会自动清除这条失效的映射表项。

1.4 NAT 技术中的细节

在一个局域网内可能存在多台不同主机,使用相同端口向外发数据包的情况。如果在使用NAT技术进行转化的过程中,只单纯替换公网IP,就会出现公网IP+端口完全一致的情况。这样外网返回的流量进入路由器时,就无法唯一确定到底要转发给内网哪一台主机。

所以 NAT 不仅仅只会替换私网 IP 为公网 IP,还会同时替换端口号,保证每一条内网连接对应的公网IP+端口都是唯一的。

由于端口号只有16位,最大只有65536个端口,所以一台路由器能够维持的 NAT 映射数量 是有限的,这也就意味着能同时上网的主机数量存在上限。

这里还有一个非常关键的特性:NAT 映射表是主动建立、单向开放的。

如果内网主机从来没有主动向外网服务器发送过数据,路由器中就不会生成对应的映射条目。外网服务器就算想主动发数据进来,路由器也找不到对应的内网主机,会直接丢弃流量。

所以外网永远无法主动访问内网,必须由内网主机先主动发起通信,建立好 NAT 映射之后,双方才能正常收发数据。

1.5 NAT 技术的缺陷

因为所有外网通信完全依赖路由器的 NAT 转换表,所以 NAT 存在很多固有缺陷:

第一,无法由外网主动向内网建立连接。只能内网主动发起访问,外网无法主动穿透 NAT 访问内网设备。

第二,NAT 映射表的动态生成、超时销毁,都会消耗路由器性能,产生额外开销。

第三,一旦 NAT 设备宕机、重启,哪怕有热备份,所有已经建立的 TCP 连接映射条目全部失效,所有网络连接都会直接断开。

二、代理服务器

2.1 正向代理

只对数据做接收和转发的服务器我们称之为代理服务器。这种更靠近客户端的代理服务器我们称之为正向代理服务器。正向代理服务器在企业和高校中都会做这种代理服务器,当用户发送数据到外网时,数据都会经过代理服务器,这样企业或者高校就能够监控用户的行为了。代理服务器是客户端和服务器端最大的中间人。

代理服务器并不是路由器,它上面安装了Linux操作系统,同时会在应用层安装诸如NGINX等的代理软件。

正向代理的应用场景

企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。

公共网络环境:在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。

内容过滤与保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响。

提高访问速度:对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。

跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源。

2.2 反向代理

我们在日常上网时有时候会访问到一些公司内部的网站,而一个公司内部可能有成千上万台服务器。当该公司为我们提供网页web服务时,肯定不会把所有的主机全部暴露在网络中。所以就需要有一个代理服务器来控制用户访问到的机器。这种代理服务器就是反向代理服务器。

相比于正向代理服务器,反向代理服务器更加靠近服务端。反向代理服务器上一般会部署 Nginx,后端的真实业务服务器不会暴露自己的IP地址,整个集群对外只暴露反向代理这一个IP地址,所以我们客户端访问网站时只需要访问这一个代理IP即可。

当用户主机发起登录请求时,反向代理服务器不会对用户的任何数据进行处理,只会将用户发送的用户名、密码转发到内网对应的Redis、MySQL业务服务器中,由后端服务器完成账号密码的校验验证。认证通过后,后端服务器会返回网页数据,反向代理服务器依旧不做任何处理,直接将网页信息回传给用户,此时客户端登录成功。

所以反向代理的第一个核心作用就是流量分发。当大量用户流量接入时,反向代理会通过各类负载均衡算法,将海量请求分散转发到不同的后端服务器中,避免单台服务器压力过大,以此提升整个服务器集群的抗压能力和并发能力。

第二个核心作用是静态资源加速。用户在访问网站的图片、音频、视频等静态资源时,这类静态资源一般不会存放在后端业务服务器中。用户发起请求后,反向代理服务器不需要向后端服务器或数据库发起请求,不需要选择后端机器,也不存在任何业务逻辑处理,可以直接将本地存放的静态资源返回给用户。

因为省去了后端转发与业务处理的流程,极大缩短了响应时间,所以反向代理服务器能够有效对整个服务器集群的访问速度进行提速。

反向代理的应用场景

负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。

安全保护:反向代理服务器可以隐藏后端 Web 服务器的真实 IP 地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。

缓存加速:反向代理服务器可以缓存后端 Web 服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。

内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需求,如 URL 重写、用户认证等。

动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。

CDN(Content Delivery Network,内容分发网络)就是采用了反向代理的原理

2.3 NAT技术和代理服务的区别

NAT 和代理服务器都可以帮助内网主机访问外网 ,但是二者底层原理和定位有着本质区别 。 首先是应用目标,NAT 属于网络基础功能 ,主要用来解决公网 IP 数量不够的问题。代理服务器更偏向上层业务应用,可以用来做网络加速、访问控制这类功能。

而底层工作层级不一样,NAT 运行在网络层,直接修改报文里的 IP 地址完成转换 。代理服务器大多运行在应用层,会完整接收上层请求再重新发起通信。

除此之外二者部署场景也不一样。NAT 一般部署在局域网出口路由器上 ;代理服务器部署更加灵活,既能放在局域网内部,也可以放在广域网,实现跨网络转发。

部署载体也有区别,NAT 通常直接集成在路由器、防火墙这类硬件设备 中。代理服务器本质是软件程序,需要单独部署在服务器上。

三、内网穿透

正常情况下,不同区域的内网是完全隔离的。比如我们在家想远程处理公司、学校内网的设备故障,或者维护内网服务,是无法直接访问的。因为家庭内网、公司内网属于两个完全独立的局域网,中间被各自的 NAT 网关隔离,外网无法主动入站。

想要突破这个限制,让外网可以主动访问内网服务,就需要用到内网穿透技术。

内网穿透的核心思路是借助一台拥有公网 IP 的云服务器作为中转跳板,让内网客户端主动和公网服务器建立永久隧道,把内网服务暴露到公网,实现跨内网访问。

内网穿透的完整流程

以下是基于 FRP 实现的内网穿透完整流程

首先在一台拥有独立公网 IP 的云服务器上,部署并启动 frp 的服务端程序 frps。

在处于家庭内网、被 NAT 保护的 Linux 主机上,安装 frp 客户端程序 frpc。由内网的 frpc 主动向外发起 TCP 连接,主动穿透网关,和公网的 frps 服务端建立一条永久的长连接隧道。

同时我们在客户端配置端口映射,将本机 SSH 服务的 22 端口,绑定映射到云服务器 frps 的 8888 端口上。

配置完成后,当我们身处公司、学校等任意外网环境时,只需要访问云服务器的公网 IP + 8888 端口。

所有访问流量会顺着提前建立好的 TCP 隧道,穿透本地 NAT 网关,被自动转发到内网 Linux 主机的 22 端口。

最终我们就可以在外网直接 SSH 连接、操控内网主机,完美突破了 NAT 禁止外网主动访问内网的限制。

四、内网打洞

我们主机向外网服务器发送数据时,实际承担转发工作的是运营商侧的出口 NAT 路由器。

如果想要两台处在不同内网的主机直接互相通信,可以借助一台公网中转服务器完成内网打洞。首先,两台主机先主动和公网服务器建立连接,服务器会分别记录两台主机对应的运营商出口公网 IP 与端口,然后再把双方的出口地址互相告知给对方。等到两台主机都拿到彼此的公网出口地址后,后续的数据传输就不需要再经过中转服务器,两台主机之间可以直接点对点收发报文,这套实现方案就叫做内网打洞技术 ,属于典型的 P2P 点对点通信。

内网打洞大多基于 UDP 协议实现,依靠 TCP 协议做内网打洞的场景相对很少。

内网打洞的完整流程

首先我们准备一台拥有独立公网IP的外网中转服务器,作为两台内网主机的通信中介。

两台分别处于不同内网、各自被NAT网关保护的主机,会分别主动向外发起UDP连接,主动穿透各自本地网关,和公网中转服务器建立临时通信链路。

公网服务器会分别记录两台内网主机经过NAT转换后的公网IP与对外端口,并将双方的外网地址信息互相推送告知对方。

两台内网主机拿到彼此的公网IP和端口之后,会主动向对方的外网地址持续发送UDP探测报文。

这些探测流量会在双方各自的NAT网关上冲刷生成临时映射条目,打通两侧NAT的单向访问通道,完成内网打洞。

打洞成功后,两台内网主机就可以直接点对点传输数据,后续所有通信流量不再经过公网中转服务器,直接双向互通报文。

通过这种方式,我们可以让两个不同局域网的主机绕过NAT禁止外网主动入站的限制,实现跨内网的P2P直接通信,这就是UDP内网打洞的完整原理。

五、内网穿透和内网打洞的对比

内网穿透和内网打洞,都是为了解决不同内网主机无法直接通信 的问题,但是两者的工作方式有着本质区别。

首先是内网穿透,全程都需要依靠公网服务器 作为中转节点。两台内网主机传输数据时,所有流量都必须经过公网服务器转发,主机之间无法直接建立通信,服务器自始至终都要参与数据交换。

而内网打洞只在前期需要公网服务器 。两台内网主机先主动连接公网服务器,由服务器互相交换双方的公网出口 IP 和端口。地址交换完成之后,后续所有的数据传输,就可以由两台主机直接点对点通信,不再需要服务器参与转发数据。

除此之外二者的协议使用也不一样。内网穿透对 TCP、UDP 协议都适配 ,通用性很强。而内网打洞大多基于 UDP 协议实现,TCP 协议的打洞场景非常少,实用性较低。

内网穿透的难度相对来说低一些 ,因为内网穿透是依靠服务器的,由服务器全程支持转发。而内网打洞难度会大一些,因为它不依赖服务器持续中转,需要两端的 NAT 网关类型相互匹配、端口映射规则刚好允许跨网直连。不同运营商、不同路由器的 NAT 规则都不一样,环境非常不稳定,所以打洞成功率很低,实现难度远远高于内网穿透。

相关推荐
该逃避避2 小时前
出海广告跑不起来怎么办?动态住宅IP助力广告跑量
运维·服务器·网络
一条泥憨鱼2 小时前
【从0开始学习计算机网络】| ip协议-ttl-标识-分片偏移-ip分片与重组
运维·服务器·网络
不像程序员的程序媛11 小时前
检测网络的命令mtr详解
网络
天启HTTP11 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
运维行者_11 小时前
网络性能监控怎么做?从自动发现到根因分析的4个环节
运维·服务器·网络·人工智能·支持向量机
hz5678913 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
优橙教育14 小时前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
AIgorithmGEEK14 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化