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 后地址目标地址状态
TCP192.168.1.10:52341203.0.113.5:400018.8.8.8:443ESTABLISHED
TCP192.168.1.11:52342203.0.113.5:400028.8.8.8:443ESTABLISHED

返回包到达 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:443NAT路由器203.0.113.5内网主机192.168.1.10:52341公网服务器8.8.8.8:443NAT路由器203.0.113.5内网主机192.168.1.10:52341请求192.168.1.10:52341 ->> 8.8.8.8:443NAT转换后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。

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

这种方式很常见,例如:

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

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

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

缺点也很明显:

A <-> 服务器 <-> B

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

内网打洞

内网打洞的核心思想是:

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

流程大概如下:

主机B192.168.2.20NAT B198.51.100.8:50001打洞协调服务器NAT A203.0.113.5:40001主机A192.168.1.10主机B192.168.2.20NAT B198.51.100.8:50001打洞协调服务器NAT A203.0.113.5:40001主机A192.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 等多样性计算架构

更多推荐