NAT 技术与代理服务:从内网通信到科学上网原理

问:为什么我们在家里、学校、公司里上网,明明电脑是 192.168.x.x 这样的内网 IP,却可以访问公网网站?

答:因为中间有 NAT 设备在帮我们“改地址、记映射、转发响应”。
NAT 就像一个小区门卫:住户不能直接暴露在大街上,但可以通过门卫收发快递。

在网络通信中,NAT(Network Address Translation,网络地址转换)代理服务器(Proxy) 是两个非常常见、也非常容易混淆的概念。

简单来说:

技术 关注点 典型作用
NAT 修改 IP / 端口 让内网主机共享公网 IP 访问外网
内网打洞 利用 NAT 映射 尝试让两个 NAT 后面的主机直连
内网穿透 借助公网服务器中转或隧道 让外网访问内网服务
正向代理 代理客户端访问外部资源 校园网、公司网、访问控制
反向代理 代理服务端接收请求 负载均衡、网关、集群入口

1. NAT 是什么:它到底改了什么?

NAT 的核心作用是:把内网地址转换成公网地址

常见的家庭网络结构大概是这样:

电脑A
192.168.1.10

路由器 / NAT设备
内网IP: 192.168.1.1
公网IP: 203.0.113.5

手机B
192.168.1.11

公网 Internet

目标服务器
8.8.8.8:443

问:内网 IP 能不能直接在公网通信?

答:不能。
例如 192.168.1.1010.0.0.5172.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

再转发给内网主机。

公网服务器 8.8.8.8:443 NAT路由器 203.0.113.5 内网主机 192.168.1.10:52341 公网服务器 8.8.8.8:443 NAT路由器 203.0.113.5 内网主机 192.168.1.10:52341 请求 192.168.1.10:52341 ->> 8.8.8.8:443 NAT转换后 203.0.113.5:40001 ->> 8.8.8.8:443 响应 8.8.8.8:443 ->> 203.0.113.5:40001 查NAT表后转发 8.8.8.8:443 ->> 192.168.1.10:52341

问:为什么 NAT 需要改端口?

答:因为多个内网设备可能同时访问同一个公网服务器。
如果只改 IP,不改端口,NAT 设备就无法区分返回包应该给哪台内网主机。
所以 NAT 通常会同时改 IP 和端口,这种方式也叫 NAPT 或 PAT。


2. 两个不同网段的主机如何通信?

这里要分两种情况讨论:

  1. 两个主机在同一个组织网络内,只是网段不同
  2. 两个主机分别在不同 NAT 后面,比如两个家庭网络

情况一:同一个内网中的不同网段

例如:

主机 A:192.168.1.10/24
主机 B:192.168.2.20/24
网关:三层交换机或路由器

这时 A 和 B 不在同一个网段,不能直接通过 ARP 找到对方。

通信流程是:

A 发现 B 不在同一网段
A 把数据包发给默认网关
网关根据路由表转发到 B 所在网段
B 收到数据包后返回
返回流量也经过网关

主机A
192.168.1.10/24

三层交换机 / 路由器

主机B
192.168.2.20/24

问:两个不同网段一定需要 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
192.168.1.10

NAT A
203.0.113.5

公网 Internet

NAT B
198.51.100.8

主机B
192.168.2.20

这时 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。

主机B NAT后 公网服务器S 主机A NAT后 主机B NAT后 公网服务器S 主机A NAT后 建立连接 建立连接 发送消息给B 转发消息 回复消息 转发回复

这种方式很常见,例如:

  • 即时通信软件
  • 在线游戏房间
  • 消息推送服务
  • 某些远程控制系统

问:为什么中转服务器最稳定?

答:因为 A 和 B 都是主动向公网服务器发起连接,NAT 允许这种流量。
服务器拥有公网 IP,天然可以被双方访问。

缺点也很明显:

A <-> 服务器 <-> B

所有流量都经过服务器,服务器压力大,延迟也更高。

内网打洞

内网打洞的核心思想是:

既然 NAT 允许内网主动向外发包,那么 A 和 B 可以先各自向公网服务器发包,让服务器知道它们的公网映射地址,然后再尝试让 A 和 B 互相发包。

流程大概如下:

主机B 192.168.2.20 NAT B 198.51.100.8:50001 打洞协调服务器 NAT A 203.0.113.5:40001 主机A 192.168.1.10 主机B 192.168.2.20 NAT B 198.51.100.8:50001 打洞协调服务器 NAT A 203.0.113.5:40001 主机A 192.168.1.10 注册,S看到A是203.0.113.5:40001 注册,S看到B是198.51.100.8:50001 告诉A:B的公网映射是198.51.100.8:50001 告诉B:A的公网映射是203.0.113.5:40001 向B的公网映射发包 向A的公网映射发包 如果NAT允许,建立直连通信

问:内网打洞为什么叫“打洞”?

答:因为主机主动向外发送数据包时,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 后面。

内网穿透的一般做法是:

外网用户

公网穿透服务器
public.example.com

穿透隧道

内网客户端Agent

本地服务
127.0.0.1:8080

过程可以理解为:

1. 内网机器主动连接公网穿透服务器
2. 这条连接因为是从内网主动发起的,所以 NAT 允许通过
3. 外网用户访问公网服务器
4. 公网服务器把请求通过已建立的隧道转发给内网机器
5. 内网机器处理后,再沿隧道返回响应

问:内网穿透和内网打洞有什么区别?

答:内网打洞的目标是让两个 NAT 后面的主机尽量直连。
内网穿透的目标是让外部用户通过公网入口访问内网服务。
一个偏向 P2P 直连,一个偏向服务暴露。

对比如下:

对比项 服务器中转 内网打洞 内网穿透
是否需要公网服务器 需要 需要协调服务器 需要公网入口
是否一定中转数据 成功后不一定 通常需要
稳定性 中等 较高
延迟 较高 较低 取决于隧道质量
典型场景 聊天、消息转发 P2P、音视频、游戏 远程访问本地服务

4. 代理服务器:正向代理与反向代理

代理服务器的本质是:

客户端不直接访问目标,而是先访问代理,由代理代替客户端完成请求。

但是代理分两种:

正向代理:代理客户端
反向代理:代理服务端

正向代理

正向代理站在客户端这一边。

客户端

正向代理服务器

目标网站

客户端知道自己在使用代理,目标网站看到的是代理服务器的 IP。

问:正向代理解决什么问题?

答:它主要解决“客户端如何访问外部资源”的问题。
例如访问控制、身份认证、缓存、隐藏客户端真实地址、统一出口管理等。

常见场景:

校园网代理
公司内网统一出口
浏览器代理
开发环境抓包代理
访问外部资源的网关

以校园网为例:

学生电脑

校园认证网关 / 正向代理

Internet

外部网站

校园网可能会通过代理或网关实现:

  • 用户认证
  • 流量审计
  • 访问权限控制
  • 缓存热门资源
  • 限制部分网络行为
  • 统一公网出口

问:为什么学校或公司喜欢使用统一出口?

答:因为这样便于管理。
所有访问外网的流量都经过统一入口,管理员可以进行认证、统计、限速、安全检查和日志记录。

反向代理

反向代理站在服务端这一边。

用户浏览器

反向代理服务器
Nginx / Gateway

业务服务器1

业务服务器2

业务服务器3

用户访问的是反向代理,而不直接访问真实业务服务器。

例如:

用户访问: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

负载均衡器 / 反向代理

用户2

用户3

应用服务器A

应用服务器B

应用服务器C

数据库

请求流程大致是:

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转换表

内网穿透

端口映射

公网隧道

正向代理

科学上网原理

公司/校园网代理

反向代理

负载均衡

API网关

问:学习这些技术时,应该抓住什么主线?

答:抓住“谁访问谁,谁代理谁,流量从哪里来,到哪里去”这条线。
NAT 关注地址转换;
正向代理关注客户端访问外部;
反向代理关注外部访问服务端;
内网穿透关注公网访问内网;
内网打洞关注 NAT 后主机之间尽量直连。

总结一句话:

NAT 解决的是“内网机器怎么出去”;
内网穿透解决的是“外网怎么进来”;
内网打洞解决的是“两个内网机器怎么尽量直连”;
正向代理解决的是“客户端怎么通过代理访问外部”;
反向代理解决的是“服务端怎么通过统一入口对外服务”。

理解了这些,很多网络现象就不再神秘了。

比如:

为什么家里的电脑没有公网 IP 也能上网?
为什么别人不能直接访问我电脑上的服务?
为什么 P2P 有时能直连,有时必须中转?
为什么公司或学校能统一管理外网访问?
为什么大型网站前面都有 Nginx、网关或负载均衡器?
为什么代理和隧道能改变访问路径?

这些问题的答案,本质上都离不开 NAT、代理、隧道和路由这几个核心概念。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐