一文搞懂 NAT、内网穿透与代理服务器:从校园网到科学上网的底层原理
NAT 技术与代理服务:从内网通信到科学上网原理
问:为什么我们在家里、学校、公司里上网,明明电脑是
192.168.x.x这样的内网 IP,却可以访问公网网站?答:因为中间有 NAT 设备在帮我们“改地址、记映射、转发响应”。
NAT 就像一个小区门卫:住户不能直接暴露在大街上,但可以通过门卫收发快递。
在网络通信中,NAT(Network Address Translation,网络地址转换) 和 代理服务器(Proxy) 是两个非常常见、也非常容易混淆的概念。
简单来说:
| 技术 | 关注点 | 典型作用 |
|---|---|---|
| NAT | 修改 IP / 端口 | 让内网主机共享公网 IP 访问外网 |
| 内网打洞 | 利用 NAT 映射 | 尝试让两个 NAT 后面的主机直连 |
| 内网穿透 | 借助公网服务器中转或隧道 | 让外网访问内网服务 |
| 正向代理 | 代理客户端访问外部资源 | 校园网、公司网、访问控制 |
| 反向代理 | 代理服务端接收请求 | 负载均衡、网关、集群入口 |
1. NAT 是什么:它到底改了什么?
NAT 的核心作用是:把内网地址转换成公网地址。
常见的家庭网络结构大概是这样:
问:内网 IP 能不能直接在公网通信?
答:不能。
例如192.168.1.10、10.0.0.5、172.16.0.1这些都是私有地址,只能在局域网内部使用。公网路由器通常不会转发这些地址的数据包。
假设内网主机访问公网服务器:
内网主机:192.168.1.10:52341
目标服务器:8.8.8.8:443
路由器公网 IP:203.0.113.5
原始请求包大概是:
源地址:192.168.1.10:52341
目标地址:8.8.8.8:443
经过 NAT 设备之后,数据包会被改成:
源地址:203.0.113.5:40001
目标地址:8.8.8.8:443
也就是说,服务器看到的并不是你的真实内网 IP,而是 NAT 设备的公网 IP。
NAT 设备内部会维护一张转换表:
| 协议 | 内网地址 | NAT 后地址 | 目标地址 | 状态 |
|---|---|---|---|---|
| TCP | 192.168.1.10:52341 | 203.0.113.5:40001 | 8.8.8.8:443 | ESTABLISHED |
| TCP | 192.168.1.11:52342 | 203.0.113.5:40002 | 8.8.8.8:443 | ESTABLISHED |
返回包到达 NAT 设备时:
源地址:8.8.8.8:443
目标地址:203.0.113.5:40001
NAT 设备查表后发现:
203.0.113.5:40001 <=> 192.168.1.10:52341
于是把返回包改成:
源地址:8.8.8.8:443
目标地址:192.168.1.10:52341
再转发给内网主机。
问:为什么 NAT 需要改端口?
答:因为多个内网设备可能同时访问同一个公网服务器。
如果只改 IP,不改端口,NAT 设备就无法区分返回包应该给哪台内网主机。
所以 NAT 通常会同时改 IP 和端口,这种方式也叫 NAPT 或 PAT。
2. 两个不同网段的主机如何通信?
这里要分两种情况讨论:
- 两个主机在同一个组织网络内,只是网段不同
- 两个主机分别在不同 NAT 后面,比如两个家庭网络
情况一:同一个内网中的不同网段
例如:
主机 A:192.168.1.10/24
主机 B:192.168.2.20/24
网关:三层交换机或路由器
这时 A 和 B 不在同一个网段,不能直接通过 ARP 找到对方。
通信流程是:
A 发现 B 不在同一网段
A 把数据包发给默认网关
网关根据路由表转发到 B 所在网段
B 收到数据包后返回
返回流量也经过网关
问:两个不同网段一定需要 NAT 吗?
答:不一定。
如果两个网段都在同一个私有网络内部,只需要路由转发即可,不一定需要 NAT。
NAT 主要出现在内网访问公网,或者多个私有网络边界通信的场景。
情况二:两个主机分别在不同 NAT 后面
例如:
主机 A:192.168.1.10,位于家庭网络 A
主机 B:192.168.2.20,位于家庭网络 B
A 的 NAT 公网地址:203.0.113.5
B 的 NAT 公网地址:198.51.100.8
拓扑如下:
这时 A 想直接访问 B,会遇到一个问题:
问:A 能不能直接访问
192.168.2.20?答:不能。
因为192.168.2.20是 B 的内网地址,只在 B 的局域网内部有效。
问:A 能不能直接访问 B 的 NAT 公网 IP?
答:通常也不行。
因为 NAT 默认只允许“内网主动发起、外网被动响应”的连接。
如果外部主机突然访问 NAT 的某个端口,而 NAT 表里没有对应映射,NAT 设备通常会丢弃这个包。
所以,两个 NAT 后面的主机通信,一般有三种方式:
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 外部服务器中转 | A 和 B 都连服务器,消息通过服务器转发 | 稳定、简单 | 服务器带宽压力大,延迟较高 |
| 内网打洞 | A 和 B 同时向对方公网映射地址发包 | 成功后可直连,延迟低 | 依赖 NAT 类型,可能失败 |
| 内网穿透 | 内网主机主动连接公网节点,公网节点转发流量 | 适合暴露内网服务 | 依赖公网服务器或隧道服务 |
3. 传统服务器中转、内网打洞与内网穿透
传统服务器中转
最简单可靠的方式是:A 和 B 都连接同一个公网服务器 S。
这种方式很常见,例如:
- 即时通信软件
- 在线游戏房间
- 消息推送服务
- 某些远程控制系统
问:为什么中转服务器最稳定?
答:因为 A 和 B 都是主动向公网服务器发起连接,NAT 允许这种流量。
服务器拥有公网 IP,天然可以被双方访问。
缺点也很明显:
A <-> 服务器 <-> B
所有流量都经过服务器,服务器压力大,延迟也更高。
内网打洞
内网打洞的核心思想是:
既然 NAT 允许内网主动向外发包,那么 A 和 B 可以先各自向公网服务器发包,让服务器知道它们的公网映射地址,然后再尝试让 A 和 B 互相发包。
流程大概如下:
问:内网打洞为什么叫“打洞”?
答:因为主机主动向外发送数据包时,NAT 会创建一条临时映射。
这个映射就像在 NAT 设备上打开了一个“洞”,外部响应流量可以通过这个洞回来。
内网打洞常见于:
- P2P 下载
- 实时音视频通信
- 在线游戏
- WebRTC
- VoIP
不过内网打洞不是百分百成功。
影响成功率的因素包括:
NAT 类型
防火墙策略
协议类型 TCP / UDP
运营商网络限制
是否存在多层 NAT
通常来说,UDP 打洞更常见,TCP 打洞更复杂。
如果遇到对称型 NAT 或严格防火墙,打洞可能失败,这时就需要退回到服务器中转。
内网穿透
内网穿透更像是“我在内网开了一个服务,但想让公网访问到它”。
例如你本地启动了一个 Web 服务:
本地服务:http://127.0.0.1:8080
或者:http://192.168.1.10:8080
外网用户正常情况下访问不到它,因为你的电脑在 NAT 后面。
内网穿透的一般做法是:
过程可以理解为:
1. 内网机器主动连接公网穿透服务器
2. 这条连接因为是从内网主动发起的,所以 NAT 允许通过
3. 外网用户访问公网服务器
4. 公网服务器把请求通过已建立的隧道转发给内网机器
5. 内网机器处理后,再沿隧道返回响应
问:内网穿透和内网打洞有什么区别?
答:内网打洞的目标是让两个 NAT 后面的主机尽量直连。
内网穿透的目标是让外部用户通过公网入口访问内网服务。
一个偏向 P2P 直连,一个偏向服务暴露。
对比如下:
| 对比项 | 服务器中转 | 内网打洞 | 内网穿透 |
|---|---|---|---|
| 是否需要公网服务器 | 需要 | 需要协调服务器 | 需要公网入口 |
| 是否一定中转数据 | 是 | 成功后不一定 | 通常需要 |
| 稳定性 | 高 | 中等 | 较高 |
| 延迟 | 较高 | 较低 | 取决于隧道质量 |
| 典型场景 | 聊天、消息转发 | P2P、音视频、游戏 | 远程访问本地服务 |
4. 代理服务器:正向代理与反向代理
代理服务器的本质是:
客户端不直接访问目标,而是先访问代理,由代理代替客户端完成请求。
但是代理分两种:
正向代理:代理客户端
反向代理:代理服务端
正向代理
正向代理站在客户端这一边。
客户端知道自己在使用代理,目标网站看到的是代理服务器的 IP。
问:正向代理解决什么问题?
答:它主要解决“客户端如何访问外部资源”的问题。
例如访问控制、身份认证、缓存、隐藏客户端真实地址、统一出口管理等。
常见场景:
校园网代理
公司内网统一出口
浏览器代理
开发环境抓包代理
访问外部资源的网关
以校园网为例:
校园网可能会通过代理或网关实现:
- 用户认证
- 流量审计
- 访问权限控制
- 缓存热门资源
- 限制部分网络行为
- 统一公网出口
问:为什么学校或公司喜欢使用统一出口?
答:因为这样便于管理。
所有访问外网的流量都经过统一入口,管理员可以进行认证、统计、限速、安全检查和日志记录。
反向代理
反向代理站在服务端这一边。
用户访问的是反向代理,而不直接访问真实业务服务器。
例如:
用户访问:https://www.example.com
实际可能转发到:
10.0.0.11:8080
10.0.0.12:8080
10.0.0.13:8080
问:反向代理解决什么问题?
答:它主要解决“服务端如何对外提供服务”的问题。
例如负载均衡、隐藏真实服务器、SSL 终止、统一鉴权、限流、灰度发布等。
正向代理和反向代理最容易混淆,可以用一句话区分:
正向代理隐藏客户端,反向代理隐藏服务端。
对比如下:
| 对比项 | 正向代理 | 反向代理 |
|---|---|---|
| 代理谁 | 客户端 | 服务端 |
| 客户端是否知道代理存在 | 通常知道 | 通常无感 |
| 目标服务器看到谁 | 代理服务器 | 反向代理服务器 |
| 典型用途 | 访问控制、统一出口 | 负载均衡、网关入口 |
| 例子 | 校园网代理、公司代理 | Nginx、API Gateway、负载均衡器 |
5. 从校园网到集群负载均衡:两个典型例子
例子一:校园网中的正向代理
在校园网环境中,学生电脑访问外网可能不是直接出去,而是经过校园网认证系统或代理网关。
这种模型中:
学生电脑是客户端
校园网代理是正向代理
外部网站是目标服务器
问:校园网代理和 NAT 是一回事吗?
答:不是。
NAT 主要改 IP 和端口,工作更偏网络层和传输层。
代理服务器通常理解应用层协议,例如 HTTP、HTTPS、SOCKS 等,可以做更复杂的认证、缓存和访问控制。
当然,实际网络中 NAT 和代理经常一起出现:
学生电脑 -> 校园代理 -> NAT出口 -> Internet
例子二:集群服务器的反向代理与负载均衡
当一个网站访问量很大时,单台服务器扛不住,就需要多台服务器组成集群。
用户不可能记住每台服务器的地址,所以通常会在前面放一个反向代理或负载均衡器。
请求流程大致是:
1. 用户访问 www.example.com
2. DNS 将域名解析到反向代理 / 负载均衡器
3. 反向代理接收请求
4. 根据负载均衡算法选择一台后端服务器
5. 后端服务器处理请求
6. 反向代理把响应返回给用户
常见负载均衡策略:
| 策略 | 说明 |
|---|---|
| 轮询 | 请求依次分配给不同服务器 |
| 加权轮询 | 性能强的服务器分配更多请求 |
| 最少连接 | 谁连接数少就转发给谁 |
| IP Hash | 同一个客户端尽量落到同一台服务器 |
| 一致性哈希 | 常用于缓存、分布式系统场景 |
问:反向代理为什么能提高系统安全性?
答:因为真实业务服务器不直接暴露在公网。
外部用户只能访问反向代理,后端服务器隐藏在内网中。
这样可以统一做限流、鉴权、日志、安全过滤和异常流量拦截。
反向代理还可以承担很多网关能力:
HTTPS 证书管理
请求转发
静态资源缓存
接口鉴权
跨域处理
限流熔断
灰度发布
蓝绿部署
日志采集
6. 科学上网的网络原理与整体对比
先说明一点:这里讨论的是网络通信原理,不涉及具体工具配置和绕过步骤。
所谓“科学上网”,从技术角度看,本质上通常是:
客户端先连接一个代理或隧道服务器
再由代理或隧道服务器访问目标网站
最后把结果返回给客户端
抽象结构如下:
可以理解成:
原本:
客户端 -> 目标网站
变成:
客户端 -> 代理/隧道服务器 -> 目标网站
问:科学上网和正向代理有什么关系?
答:从网络模型上看,它通常属于正向代理或隧道代理的一种应用。
客户端主动把流量交给代理服务器,代理服务器再访问外部资源。
一些系统可能还会使用加密隧道:
客户端与远程服务器之间建立加密连接
中间网络只能看到客户端连接了远程服务器
无法直接看到隧道内部的具体应用数据
它涉及的常见技术概念包括:
- 正向代理
- SOCKS 代理
- HTTP CONNECT
- TLS 加密
- VPN 隧道
- DNS 解析转发
- 流量中转
- 加密封装
问:科学上网是不是等于 NAT?
答:不是。
NAT 是地址转换,主要解决“内网地址如何访问公网”的问题。
科学上网通常是代理或隧道技术,主要解决“客户端如何通过某个中间节点访问目标资源”的问题。
问:科学上网是不是等于内网穿透?
答:也不是。
内网穿透通常是让公网访问内网服务。
科学上网通常是让本地客户端通过代理访问外部资源。
两者都可能用到隧道,但方向和目的不同。
最后做一个整体对比:
| 技术 | 主要方向 | 是否修改 IP/端口 | 是否理解应用层协议 | 典型用途 |
|---|---|---|---|---|
| NAT | 内网到公网 | 是 | 通常不理解 | 共享公网 IP |
| 服务器中转 | 双方到服务器 | 不一定 | 取决于应用 | 消息转发、通信兜底 |
| 内网打洞 | NAT 后主机直连 | 利用 NAT 映射 | 通常不关心 | P2P、音视频 |
| 内网穿透 | 公网访问内网 | 可能涉及 | 可能涉及 | 暴露本地服务 |
| 正向代理 | 客户端访问外部 | 不一定 | 通常理解 | 校园网、公司代理 |
| 反向代理 | 外部访问服务端 | 不一定 | 通常理解 | 负载均衡、网关 |
| 科学上网 | 客户端经代理访问外部 | 不一定 | 通常涉及 | 代理访问、加密隧道 |
可以用下面这张图总结它们之间的关系:
问:学习这些技术时,应该抓住什么主线?
答:抓住“谁访问谁,谁代理谁,流量从哪里来,到哪里去”这条线。
NAT 关注地址转换;
正向代理关注客户端访问外部;
反向代理关注外部访问服务端;
内网穿透关注公网访问内网;
内网打洞关注 NAT 后主机之间尽量直连。
总结一句话:
NAT 解决的是“内网机器怎么出去”;
内网穿透解决的是“外网怎么进来”;
内网打洞解决的是“两个内网机器怎么尽量直连”;
正向代理解决的是“客户端怎么通过代理访问外部”;
反向代理解决的是“服务端怎么通过统一入口对外服务”。
理解了这些,很多网络现象就不再神秘了。
比如:
为什么家里的电脑没有公网 IP 也能上网?
为什么别人不能直接访问我电脑上的服务?
为什么 P2P 有时能直连,有时必须中转?
为什么公司或学校能统一管理外网访问?
为什么大型网站前面都有 Nginx、网关或负载均衡器?
为什么代理和隧道能改变访问路径?
这些问题的答案,本质上都离不开 NAT、代理、隧道和路由这几个核心概念。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)