NAT 技术、代理服务器、内网穿透与内网打洞(C++ / Linux 面试笔记)
学习顺序:NAT 为什么出现 → NAT/NAPT 如何转换 → NAT 为什么影响外部访问 → 代理服务器如何转发 → 如何让内网服务对外开放 → 两台内网设备如何直连。
本文主要讨论IPv4、常见家用/企业出口 NAT、TCP/UDP。不同路由器、防火墙和运营商的具体行为可能不同。
目录
目录
- NAT 技术、代理服务器、内网穿透与内网打洞(C++ / Linux 面试笔记)
- 目录
- 1. NAT 技术基础
- 1.1 NAT 为什么出现?
- 1.2 NAT 与路由转发不是一回事
- 1.3 NAT 的基本分类
- 1.4 基本 NAT 的地址转换流程
- 1.5 NAPT:多台内网设备共享同一个公网 IPv4(重点)
- 1.6 NAT 的映射和过滤:理解“为什么外网无法随便访问内网”
- 1.7 NAT 的不足和使用限制
- 1.8 双重 NAT 与 CGNAT
- 2. 代理服务器
- 2.1 什么是代理服务器(Proxy Server)?
- 2.2 正向代理(Forward Proxy)
- 2.2.1 概念和通信方向
- 2.2.2 工作流程
- 2.2.3 主要用途
- 2.2.4 常见技术
- 2.3 反向代理(Reverse Proxy)
- 2.3.1 概念和通信方向
- 2.3.2 工作流程
- 2.3.3 主要功能
- 2.3.4 典型场景
- 2.4 正向代理与反向代理对比(必背)
- 3. NAT 与代理服务器的区别和联系
- 3.1 核心区别
- 3.2 三个特别容易混淆的点
- 4. 内网穿透与内网打洞
- 4.1 为什么公网设备经常访问不到内网主机?
- 4.2 什么是内网穿透(NAT Traversal)?
- 4.3 方案一:端口映射(Port Forwarding / DNAT)
- 概念
- 工作流程
- 4.4 方案二:公网中转/反向隧道(FRP、ngrok 等)
- 概念
- 工作流程
- 4.5 方案三:内网打洞(Hole Punching)
- 4.5.1 概念与目标
- 4.5.2 需要什么角色?
- 4.5.3 UDP 打洞的简化流程
- 4.5.4 STUN、TURN、ICE(面试加分)
- 4.6 内网穿透与内网打洞的区别
- 4.7 实际应用
- 5. 综合对比与选型
- 5.1 一张表串起所有概念
- 5.2 选用时先问三个问题
- 6. C++ / Linux 笔试面试重点
- 6.1 高频问答
- 6.2 Linux 常用排查命令
- 6.3 一分钟背诵版
- 附录:关联网络基础知识速查
- 参考资料与延伸学习
1. NAT 技术基础
1.1 NAT 为什么出现?
NAT(Network Address Translation,网络地址转换):网络设备在转发数据包时,根据规则和映射关系修改 IP 地址;常见家庭网络还会配合 TCP/UDP 端口转换。
IPv4 地址只有 32 位,全球可用公网 IPv4 地址有限。家庭、学校、企业内部可以使用 RFC 1918 私有地址,再利用出口 NAT 设备共享有限的公网 IPv4 地址。
| 私有 IPv4 地址段 | 前缀 | 地址总数 |
|---|---|---|
10.0.0.0~10.255.255.255 | /8 | 16,777,216 |
172.16.0.0~172.31.255.255 | /12 | 1,048,576 |
192.168.0.0~192.168.255.255 | /16 | 65,536 |
- 私有地址可以在互相隔离的不同网络中重复使用;普通公网路由不会直接转发 RFC 1918 私有地址。
- 并非所有“非私有 IP”都是公网 IP:例如
127.0.0.1是回环地址,169.254.0.0/16是链路本地地址。 - 路由器的 WAN 口 IP不一定是公网 IP,可能由上级 NAT/运营商 CGNAT 分配地址。
📌 大白话:一家公司可以有很多员工分机,但对外只使用少数几个电话号码。私有 IP 像分机号,公网 IP 像对外号码,NAT 负责转换。
1.2 NAT 与路由转发不是一回事
- 路由(Routing):查路由表,根据目的 IP 和策略确定下一跳及出口接口。
- NAT:在经过设备时按规则修改源/目的 IP,可能同时修改端口,并维护转换状态。
- 路由器可以只路由不 NAT;NAT 一般依赖转发过程,但不是每经过一个路由器都要 NAT。
普通路由器转发 IPv4 数据包时,通常保持源 IP、目的 IP 不变(同时更新 TTL 等);链路层以太网帧的源、目的 MAC 则随每一跳重新封装而改变。
📌 大白话:路由决定“下一站往哪走”,NAT 决定“是否需要换发件/收件地址”。
1.3 NAT 的基本分类
| 类型 | 主要变化 | 常见用途 |
|---|---|---|
| SNAT(源 NAT) | 修改源 IP(可能同时修改源端口) | 内网主机访问外网 |
| DNAT(目的 NAT) | 修改目的 IP(可能同时修改目的端口) | 端口映射、把外部请求转给内网服务器 |
| 静态 NAT | 预先配置固定地址转换关系 | 固定对外地址映射 |
| 动态 NAT | 从地址池动态分配转换地址 | 多个内部地址共享公网地址池 |
| NAPT/PAT | 地址与 TCP/UDP 端口联合转换 | 多台设备共享少量公网 IP |
NAT 分类可以从不同角度观察:SNAT/DNAT 描述修改方向;静态/动态描述映射配置方式;NAPT 描述是否利用端口复用地址,并非互斥分类。
1.4 基本 NAT 的地址转换流程
沿用原文示例:内网主机10.0.0.10访问外网主机163.221.120.9,出口 NAT 地址为202.244.174.37。
- 内网发出:原始数据包源 IP=
10.0.0.10,目的 IP=163.221.120.9。 - 出口 SNAT:NAT 网关将源 IP 改为
202.244.174.37,记录所需的映射/连接状态,并转发出去。 - 服务器响应:服务器看到的请求源 IP 是
202.244.174.37,响应发往该地址。 - 返回方向逆向转换:NAT 网关根据已有转换状态,将响应包的目的 IP 改回
10.0.0.10并转发给内网主机。
这是地址转换原理的简化例子;如果多台设备要同时共享一个公网 IPv4,通常还需要 NAPT 结合端口区分流量。
📌 大白话:发出时把“内部寄件地址”替换成“公司对外地址”,回复到达公司后,再按登记记录送回正确员工。
1.5 NAPT:多台内网设备共享同一个公网 IPv4(重点)
NAPT(Network Address Port Translation,网络地址端口转换),也常称 PAT,使用 IP 地址与传输层端口共同进行转换。它是家用 IPv4 路由器中最常见的 NAT 形式。
假设公网出口使用文档示例地址203.0.113.10:
| 内网通信端点 | NAT 后的公网通信端点 |
|---|---|
192.168.1.100:50000 | 203.0.113.10:40001 |
192.168.1.101:50000 | 203.0.113.10:40002 |
203.0.113.10属于专用文档示例网段,不是可实际分配使用的公网地址。示例中的端口仅为说明映射,并不要求 NAT 一定更换端口。
一次典型 TCP 出站通信:
- 内网程序使用
192.168.1.100:50000向公网服务器发起 TCP 连接。 - NAT 网关观察到出站流量,根据映射策略创建/复用转换表项;可能把源地址端口转换成
203.0.113.10:40001。 - 外网服务器收到请求,向公网映射端点发回应答。
- NAT 设备结合协议、地址端口及连接状态查表,改写回目标内网地址端口并转发。
- 映射有存活时间;关闭连接、状态变化或超时后可被清理,具体由设备决定。
关键补充:不同 NAT 的表项键、端口复用方式和外部访问限制不同,不能笼统地说只凭一个公网端口就能匹配所有情况;也不能认为每次连接必然分配“唯一且与原来不同”的端口。
📌 大白话:两个员工都用内部分机50000,对外接线员分别分配40001、40002,回复时就能区分发给谁。
1.6 NAT 的映射和过滤:理解“为什么外网无法随便访问内网”
这里最容易混淆两个问题:
- 映射(Mapping):内部
IP:端口对应哪个外部IP:端口? - 过滤(Filtering):即使外部知道该映射,来自哪些外部地址/端口的数据包允许进入?
出站连接一般会创建映射,但**“有映射”不代表“任意互联网主机都可直接连接”**。NAT/防火墙可能仅允许特定对端的数据包进入。
常见描述:
- Endpoint-Independent Mapping(端点无关映射):同一内部端点向不同外部目标发送时,通常复用相同外部映射。
- Endpoint-Dependent Mapping(端点相关映射):外部映射可能随目的地址或端口改变。
- 端点无关 / 地址相关 / 地址和端口相关过滤:说明哪些来源的入站数据包可使用已有映射。
传统教材会提“完全锥形 NAT、受限锥形 NAT、端口受限锥形 NAT、对称 NAT”,可用于入门,但实际设备的映射行为、过滤行为、端口保持和超时规则需要分别判断;不能仅凭一个标签精确预测打洞成功率。
📌 大白话:映射相当于前台知道分机号对应哪个员工;过滤相当于门卫规定哪些外部来电有资格转接。
1.7 NAT 的不足和使用限制
- 外部连接不容易主动到达内网服务:没有显式端口转发、已有合适映射或其他穿透机制时,入站连接往往会被 NAT/防火墙拦截。
- 维护状态需要资源:映射表、连接跟踪和超时回收占用设备 CPU 与内存;高并发时可能形成瓶颈。
- 设备重启可能中断连接:状态丢失后,既有 TCP/UDP 会话可能无法继续;高可用设备可同步状态,但并非普遍支持。
- 破坏端到端可达性:某些点对点应用需要配合端口转发、打洞或中继。
- 应用协议兼容性:如果协议在业务内容中携带地址/端口,地址转换可能需要应用层辅助处理,或修改协议设计。
注意:NAT 不是防火墙,也不等同于安全保证。实际访问控制还依赖设备的防火墙规则、主机安全配置等。
1.8 双重 NAT 与 CGNAT
- 双重 NAT:家用路由器之外还有一层 NAT,例如光猫路由模式 + 家用路由器路由模式。
- CGNAT(Carrier-Grade NAT,运营商级 NAT):运营商侧多个用户共享公网 IPv4;用户家用路由器 WAN 口可能获得
100.64.0.0/10共享地址空间或其他非公网地址。
影响:即使你在家用路由器中配置了端口映射,如果上级 NAT 不配合,公网用户仍可能访问不到内网服务器。
📌 大白话:你家小区门口有一位门卫,但小区外的园区大门还有第二位门卫。只说服第一位门卫放行,不代表外面的人就进得来。
2. 代理服务器
2.1 什么是代理服务器(Proxy Server)?
代理服务器:位于通信双方之间,代替一方接收请求、向另一方建立或转发通信,再把响应送回去。它可以实现访问控制、缓存、流量分配、TLS 终止或协议转换等能力。
代理可以工作在不同层次:最常见的是HTTP 应用层代理,也有SOCKS 等通用 TCP/UDP 代理。不能一概说所有代理都必须解析 HTTP 内容。
📌 大白话:代理是“代办人”,客户端或服务端不一定直接跟对方打交道,而是先找代理帮忙。
2.2 正向代理(Forward Proxy)
2.2.1 概念和通信方向
正向代理主要代表客户端去访问目标服务器。客户端通常需要知道或配置代理地址,目标服务器一般看到的是代理的网络出口,而不是与其直连的原始客户端地址。
客户端 A ──请求──> 正向代理 ──代为请求──> 目标网站 客户端 A <─响应── 正向代理 <──响应────── 目标网站2.2.2 工作流程
- 客户端把要访问的目标交给正向代理(显式代理配置或相关网络配置)。
- 代理按规则进行认证、访问控制、缓存检查等。
- 若需要访问目标,代理向目标服务器发起连接或建立代理隧道。
- 目标服务器返回响应,代理把响应送回客户端。
- 代理可根据能力进行缓存、日志记录或其他处理。
HTTPS 特别注意:HTTP 正向代理常用CONNECT建立 TCP 隧道;若没有进行受信任的 TLS 中间人解密,代理一般看不到 HTTPS 加密的页面正文,也不能随意改写它。
2.2.3 主要用途
- 企业/学校出口的访问认证、权限控制与审计。
- 特定 HTTP 资源缓存,节省带宽(是否有效受 HTTPS、缓存控制等因素影响)。
- 使客户端通过指定出口访问目标网络。
- 在一定范围内隐藏客户端源 IP;不等于匿名或绝对隐私,代理仍可能记录信息,业务也可能通过认证/Cookie 等识别用户。
2.2.4 常见技术
- Squid:典型 HTTP 缓存/正向代理软件。
- SOCKS5:通用代理协议,常用于 TCP,也定义了 UDP ASSOCIATE 能力。
- Nginx:主流用途是 Web 服务和反向代理;不能简单把它当作通用的 HTTP 正向代理产品。
📌 大白话:员工想访问网站,但要先经过公司指定的网络代办员;代办员决定能不能访问,再代表员工对外发请求。
2.3 反向代理(Reverse Proxy)
2.3.1 概念和通信方向
反向代理主要代表服务器端接收客户端请求,提供统一入口,并把请求转发给一个或多个后端服务。用户通常只需要知道反向代理的域名或地址。
┌──> C++ 后端 A 客户端 ──> Nginx ──┼──> C++ 后端 B └──> C++ 后端 C2.3.2 工作流程
- 客户端向网站域名(通常解析到反向代理或其前面的接入层)发起请求。
- 反向代理进行 TLS 处理(视配置而定)、路由匹配、鉴权、缓存检查等。
- 代理根据路径、主机名、权重和后端健康状况等规则选择目标服务。
- 后端程序处理业务并返回响应。
- 代理将响应返回客户端,必要时改写头部或缓存内容。
2.3.3 主要功能
| 功能 | 含义 | 典型用途 |
|---|---|---|
| 负载均衡 | 把请求分配给多台后端 | 提升吞吐与可用性 |
| 统一入口 | 让多个业务共用域名和接入层 | /api、/static路由 |
| 静态资源与缓存 | 直接返回可缓存的静态文件 | 降低后端负载 |
| HTTPS/TLS 终止 | 在代理层处理 TLS 连接 | 集中管理证书(依配置) |
| 访问控制/限流 | 根据规则拒绝或限制部分请求 | 降低滥用风险 |
| 动静分离 | 静态资源在代理层处理,动态请求交给应用 | 降低后端计算开销 |
| 请求/响应处理 | 改写 URL、HTTP 头部等 | 网关逻辑与兼容处理 |
安全边界:反向代理可以降低后端直接暴露的程度,但不会自动“彻底隐藏”后端,更不能单靠它抵御所有 DDoS/入侵;仍需网络隔离、访问控制、补丁与专门防护。
2.3.4 典型场景
- Nginx/HAProxy/Traefik 将公网请求转给多个 C++、Java 或 Go 后端。
- Web 网站使用静态缓存和动态 API 分流。
- 统一域名管理多个微服务,集中配置证书或网关策略。
- CDN 的部分节点具备缓存和反向代理式回源能力;CDN 还涉及 DNS/调度、边缘网络等,不等于单台反向代理。
📌 大白话:顾客只知道公司的前台(反向代理),前台根据业务把事情分给不同员工(后端服务器)。
2.4 正向代理与反向代理对比(必背)
| 对比 | 正向代理 | 反向代理 |
|---|---|---|
| 主要代表谁 | 客户端 | 服务端 |
| 客户端是否通常需要配置代理 | 通常需要 | 通常不需要 |
| 目标服务器通常看到谁 | 代理出口 | 代理作为前端连接方 |
| 典型用途 | 访问控制、客户端出口、缓存 | 负载均衡、统一入口、TLS 终止 |
| 典型软件 | Squid、支持 SOCKS/HTTP 的代理程序 | Nginx、HAProxy、Traefik |
真实客户端 IP 可以通过约定的
X-Forwarded-For/Forwarded等头向后端传递,但这些头必须由可信代理正确设置/清洗,不能直接相信任意客户端伪造的值。
3. NAT 与代理服务器的区别和联系
3.1 核心区别
| 维度 | NAT / NAPT | 代理服务器 |
|---|---|---|
| 主要工作 | 修改数据包地址/端口并跟踪映射 | 代替客户端/服务端建立或转发通信 |
| 常见层次 | 网络层 IP;NAPT 还涉及 TCP/UDP 端口 | 常见是应用层 HTTP;也可以是传输层/通用代理 |
| 对应用协议的理解 | 基础 NAT 通常不需要理解 HTTP 内容 | HTTP 代理可理解 HTTP;隧道/SOCKS 未必理解业务正文 |
| 客户端感知 | 常见家庭 NAT 对客户端透明 | 显式正向代理通常需要客户端配置;反向代理通常对用户透明 |
| 部署位置 | 网关、防火墙、主机软件、云网络 | 独立服务、网关、边缘节点等 |
| 常见用途 | IPv4 地址复用、地址空间衔接、端口映射 | 访问控制、缓存、转发、负载均衡、协议处理 |
3.2 三个特别容易混淆的点
- NAT 不等于代理:NAT 通常改写经过的报文;HTTP 代理通常终止一侧连接,再建立另一侧连接。
- 有 NAT 不等于有安全防火墙:NAT 与包过滤/连接跟踪常在同一设备上,但职责不同。
- 私有 IP 并非必须使用正向代理才能上网:一般家用网络仅靠路由和 NAPT 就能访问公网服务。
📌 大白话:NAT 更像“修改快递单上的寄件/收件信息”,代理更像“由中间人替你收发快递”。
4. 内网穿透与内网打洞
4.1 为什么公网设备经常访问不到内网主机?
内网主机通常没有公网可路由地址,而且 NAT/防火墙对未经许可的入站流量可能没有相应转换规则或不允许放行。
因此:内网主动访问外网通常比较容易;外网主动连接未经配置的内网服务通常比较困难。但这不是绝对规则,取决于网络架构、NAT/防火墙状态和配置。
📌 大白话:内网电脑能主动打电话给外面,但外面的人不知道你的分机对应哪条线路,门卫也不一定允许陌生电话直接打进来。
4.2 什么是内网穿透(NAT Traversal)?
内网穿透:泛指在存在 NAT/防火墙等网络边界的情况下,使用配置或协议机制,使需要通信的两端能够建立有效的连接或数据通道。
常见目标包括:
- 让公网用户访问内网 Web 服务、文件服务、远程桌面。
- 让两个不同 NAT 后面的终端建立 P2P 连接。
- 在不能直连时通过公网中转服务器进行业务通信。
术语说明:中文语境中“内网穿透”常泛指上述多种方案;严格来说,端口映射、打洞、反向隧道/中继的技术机制不同,不能全部混成同一种做法。
4.3 方案一:端口映射(Port Forwarding / DNAT)
概念
管理员在 NAT 路由器上配置规则,把某个公网入口的端口转发给内网主机的固定端口。
公网用户 → 路由器公网 IP:8080 │ DNAT/端口映射 ▼ 192.168.1.100:8080工作流程
- 内网服务器监听服务端口,例如 TCP
8080。 - 配置外部端口与内网 IP/端口的转发规则,并确保防火墙允许。
- 外部客户端访问路由器的公网入口。
- 网关按规则把数据包目的地址/端口转换为内网服务器,响应再按连接状态转换回外部地址。
条件与限制:需要网关配置权限、公网可达入口;如有 CGNAT/多级 NAT,需要上级设备配合。动态 IP 可能需要 DDNS;暴露服务时要配置认证、加密和最小权限。
📌 大白话:事先告诉门卫:“所有找 8080 房间的来客,都引导去 192.168.1.100 的 8080 号窗口。”
4.4 方案二:公网中转/反向隧道(FRP、ngrok 等)
概念
内网主机主动连接有公网入口的中转节点,在已建立的通道上双向传输业务数据,使外部用户间接访问内网服务。
内网服务 A ──主动建立通道──> 公网中转服务器 <──连接── 公网客户端 B <══════════════ 业务数据经中转 ════════════>工作流程
- 在公网部署中转服务,并在内网部署客户端程序。
- 内网客户端主动连接中转端,建立并维护可用通道(可采用长连接或其他实现)。
- 公网用户连接中转节点公布的地址/端口。
- 中转节点通过通道把请求转给内网服务,再把响应发回公网用户。
典型工具:frp、ngrok 等;具体部署与协议能力以版本和配置为准。
优点:不要求用户控制 NAT 路由器,适合多级 NAT / CGNAT 场景。
代价:业务数据经过中转,可能增加延迟、带宽成本;中转节点也可能成为性能和可用性瓶颈。
📌 大白话:公司派了一个固定在外面的接待员。内部员工主动和接待员保持联系,外来客户先找接待员,再由接待员转接。
4.5 方案三:内网打洞(Hole Punching)
4.5.1 概念与目标
内网打洞:处在不同 NAT 后的两端,通过协调建立可用的 NAT 映射和入站许可,尝试让业务流量直接在两端之间传输,减少或避免公网中转。
- UDP 打洞比较常见;TCP 也有相关技术,但实现和兼容性通常更复杂。
- “打洞”并非真的给路由器开一个永久洞,而是利用设备已有映射、过滤规则以及两端主动发包等行为创造临时可达路径。
- 打洞不能保证 100% 成功,失败时通常应选择中继。
📌 大白话:两个住在不同园区的人,都先主动向对方方向“打招呼”,尝试让各自门卫允许对方后续的来往消息。
4.5.2 需要什么角色?
- 主机 A、B:都在 NAT 后,需要通信。
- 协调/信令服务:让双方交换候选地址和进行连接协商。
- 地址发现服务:例如 STUN,帮助一端了解外部观察到的映射地址及相关信息。
- 后备中继:例如 TURN,在直连失败时转发业务数据。
严格区分:协调服务器并不一定是“中继服务器”。协调用于交换信息,中继用于实际转发业务数据。一种产品也可以同时提供两种功能。
4.5.3 UDP 打洞的简化流程
假设 A、B 位于不同内网,均可以先访问公网协调服务。
- 各自向公网服务发送数据:NAT 设备可能创建或复用 UDP 映射,公网侧能观察到各自的外部
IP:端口。 - 交换候选地址:通过信令/协调服务告知双方可能可达的公网映射地址;还可以包括局域网等其他候选地址。
- 双方进行连通性探测:A、B 按协商结果向对方候选地址发送 UDP 探测数据,尝试满足各自 NAT/防火墙的过滤条件。
- 测试是否真正双向可达:不能仅凭“交换了地址”就认定打洞成功,必须收到对端探测响应或其他有效确认。
- 成功则直连传输;失败则中继:持续通信也要考虑 NAT 映射超时、网络切换和必要的保活机制。
公网协调 / STUN 服务 ↑ ↑ 地址发现 地址发现 │ │ 内网主机 A → NAT A ⇄ NAT B ← 内网主机 B ③ 两端互发探测 ④ 双向验证 成功:业务数据直连 失败:可切换 TURN 中继为什么会失败?常见原因包括映射随目标变化、入站过滤严格、端口不可预测、UDP 被阻断、多级 NAT、设备超时等。所谓“对称 NAT 不能打洞”是过于绝对的简化说法;具体成败取决于端点相关映射、过滤等实际行为与可用方案。
4.5.4 STUN、TURN、ICE(面试加分)
| 名称 | 英文 | 作用 |
|---|---|---|
| STUN | Session Traversal Utilities for NAT | 帮终端发现 NAT 外部映射信息,并支持连接探测相关机制 |
| TURN | Traversal Using Relays around NAT | 在无法直连等情况下,通过中继服务器转发业务数据 |
| ICE | Interactive Connectivity Establishment | 收集候选地址、互相探测、选择可用路径;可以结合 STUN 和 TURN |
典型应用:WebRTC 音视频、P2P 连接建立等。
📌 大白话:STUN 帮你问“外面看我是什么地址”;ICE 负责“试几条路,选能通的”;TURN 负责“实在走不通,就由我帮你转运”。
4.6 内网穿透与内网打洞的区别
“内网穿透”是广义目标或技术集合;“打洞”只是尝试直连的一类方案。更适合比较的是具体实现方式:
| 方式 | 数据实际经过哪里 | 是否需要控制家用路由器 | 优点 | 局限 |
|---|---|---|---|---|
| 端口映射 | 公网入口 → 内网服务器 | 通常需要 | 简单、稳定,适合固定服务 | 公网入口和权限要求高 |
| 中转/反向隧道 | 经公网服务器转发 | 通常不需要 | 适配复杂 NAT | 中转带宽与延迟成本 |
| 打洞直连 | 成功时两端直接通信 | 通常不需要 | 减少中继开销 | NAT/防火墙限制,成功率不保证 |
| 打洞失败后 TURN | 经 TURN 服务器转发 | 通常不需要 | 提升连接成功率 | 需要中继资源 |
4.7 实际应用
- 远程访问家中 NAS:有公网入口时可端口映射;没有公网入口可反向隧道/中继,注意强身份认证。
- 公司内网 Web 管理系统:VPN、零信任访问网关或经过授权的反向隧道,通常比直接暴露管理端口更稳妥。
- 实时音视频:ICE + STUN 尝试直连,失败时 TURN 中继。
- P2P 文件传输/游戏联机:在网络允许时尽量直连,否则选择中继。
安全提醒:NAT 穿透会改变服务的可访问边界,须取得网络所有者授权,并启用认证、加密、访问控制和日志审计;未经授权不要暴露内网服务。
5. 综合对比与选型
5.1 一张表串起所有概念
| 技术 | 主要解决的问题 | 核心机制 | 是否一定有公网中转 |
|---|---|---|---|
| NAT | 地址转换与地址空间衔接 | 改写 IP、维护映射 | 否 |
| NAPT | 多个内网端点共享有限的公网 IP | IP + 端口转换 | 否 |
| 正向代理 | 替客户端访问其他服务 | 代理接收、转发或建隧道 | 否(代理本身需可达目标) |
| 反向代理 | 为服务端提供统一入口 | 代理接入、后端转发 | 否 |
| 端口映射 | 把外部连接导向内网服务 | 静态 DNAT/防火墙规则 | 否 |
| 反向隧道/中转 | 无法直连时提供可访问路径 | 内网主动建通道,外部流量经中转 | 通常是 |
| UDP 打洞 | 尝试 NAT 后两端 P2P 直连 | 映射发现、双方探测、过滤许可 | 协调常需要,业务成功后不一定中转 |
5.2 选用时先问三个问题
- 要解决的是哪种通信?内网访问公网、外部访问内网服务,还是两个内网终端 P2P?
- 有没有可达公网入口及路由器权限?有则可考虑端口映射;没有可能需要反向隧道或直连探测。
- 更重视直连低延迟还是稳定可达?实时 P2P 通常采取“尝试直连 + 中继兜底”。
6. C++ / Linux 笔试面试重点
6.1 高频问答
Q1:NAT 和 NAPT 有什么区别?
NAT 泛指 IP 地址转换;NAPT 进一步利用 TCP/UDP 端口,实现多台主机共享一个公网 IPv4 地址。
Q2:家用路由器有了 NAT,是否就不会被外部访问?
不一定。是否可访问还要看现有映射、过滤规则、端口转发、UPnP/PCP、上级 NAT 和防火墙等;NAT 不等于安全防火墙。
Q3:为什么外网主动访问内网服务器通常失败?
外部请求可能没有对应的地址映射或不符合 NAT/防火墙的入站过滤规则。
Q4:NAT 映射与过滤有什么区别?
映射决定内外地址端口如何对应;过滤决定哪些外部数据可以进入。
Q5:NAT 与路由转发有什么不同?
路由选择下一跳;NAT 修改指定的源/目的地址或端口,二者可以配合但并非一回事。
Q6:正向代理与反向代理如何区分?
正向代理主要代表客户端访问目标;反向代理主要代表服务端接收访问并转发到后端。
Q7:反向代理有哪些作用?
负载均衡、统一入口、静态缓存、TLS 终止、动静分离、限流和访问控制等。
Q8:正向代理和 NAT 一样吗?
不一样。NAT 是地址/端口改写;代理以程序或服务形式代为连接或转发通信,应用层代理还能处理应用协议。
Q9:内网穿透有哪些常见方案?
端口映射、反向隧道/中转、P2P 打洞,以及无法直连时使用中继。
Q10:什么是 UDP 打洞?
双方在公网协调机制帮助下发现并交换候选地址,主动发探测包争取可用 NAT 映射和过滤许可,成功后直接通信。
Q11:为什么打洞不一定成功?
映射/过滤行为、端口变化、NAT 层级、运营商和防火墙策略等都可能阻止直连。
Q12:STUN、TURN、ICE 有什么区别?
STUN 用于映射发现与相关探测;TURN 提供实际中继;ICE 协调候选收集、连通性检查和路径选择。
Q13:为什么 CGNAT 下配置家用端口映射仍然访问不到?
上级运营商 NAT 仍可能阻断公网入站流量,必须同时获得公网可达入口或改用其他方案。
Q14:Linux/C++ 面试需要手写 NAT 或 ICE 吗?
一般软件开发岗位更重视原理、网络排障、Socket/TCP/UDP、反向代理的使用;专门做网关、音视频、P2P 或网络内核开发的岗位会深入到实现细节。
6.2 Linux 常用排查命令
| 命令 | 作用 |
|---|---|
ip addr | 查看本机 IP、接口 |
ip route | 查看路由表、默认网关 |
ip neigh | 查看邻居缓存(IPv4 ARP 等) |
ss -lntup | 查看监听的 TCP/UDP 端口与进程信息(权限影响显示) |
curl -v URL | 检查 HTTP 连接与响应 |
traceroute 目标IP或tracepath 目标IP | 尝试观察路径与跳数 |
tcpdump -ni 接口 'tcp or udp' | 捕获报文进行分析(通常需权限) |
nft list ruleset | 在使用 nftables 的系统查看规则(通常需权限) |
conntrack -L | 已安装 conntrack 工具且有权限时,观察连接跟踪表 |
排查顺序(实用):
- 本机 IP/子网/路由是否正确?
- 能否到达默认网关和公网目标?
- 服务是否监听正确的 IP 和端口?
- 防火墙/安全组/端口映射是否放行?
- WAN 口是否有真正可达的公网 IPv4,还是 CGNAT?
- 如涉及打洞:候选地址、STUN 结果、连通性探测、是否切换 TURN 中继?
6.3 一分钟背诵版
NAT通过修改 IP 地址,NAPT进一步结合端口,使多个内网主机共享少量公网 IPv4。路由决定下一跳,NAT 决定地址/端口如何转换。正向代理代表客户端访问目标,反向代理代表服务器对外提供统一入口。公网访问内网可以使用端口映射、反向隧道或中转;内网打洞则尝试让 NAT 后面的双方直接通信。实际 P2P 系统常通过ICE + STUN尝试连通,失败时用TURN中继。
附录:关联网络基础知识速查
原笔记末尾涉及数据链路层、网络层、传输层、应用层,这些知识对理解 NAT/代理有帮助,但不属于本章主线,因此集中放在附录,便于复习时查阅。
| 层次 | 核心问题 | 重点知识点 |
|---|---|---|
| 数据链路层 | 当前链路怎样交付帧? | 以太网帧、MAC、ARP(IPv4 链路地址解析)、MTU、交换机 |
| 网络层 | 怎样跨网络到达目的 IP? | IPv4、子网、最长前缀匹配、路由表、TTL、ICMP、IP 分片、NAT |
| 传输层 | 怎样在主机进程间通信? | TCP/UDP、端口、握手、确认重传、滑动窗口、流控与拥塞控制、MSS |
| 应用层 | 应用如何约定消息格式与交互? | HTTP/HTTPS、DNS、代理、自定义应用协议 |
补充易错点:
- 以太网通常能检测坏帧并丢弃,但不保证每一帧可靠送达;可靠性常由上层协议处理。
- MAC 地址不应简单理解为“永久全球唯一”:它可能是本地管理地址,也可能被随机化或修改。
- MTU 限制链路可承载的网络层数据包大小;IPv4 在允许时可能分片,IPv6 路由器不进行途中分片;TCP 通常借助 MSS/PMTU 尽量避免分片。
- TCP 是字节流,不存在应用层消息边界;解决“粘包/拆包”应设计长度字段、分隔符或固定长度等消息定界机制,单纯靠超时不可靠。
- DNS 负责域名解析,HTTP 负责应用请求/响应;HTTPS 是运行在安全传输机制之上的 HTTP,现代实现还可能使用 QUIC/HTTP/3。
参考资料与延伸学习
- RFC 1918:私有 IPv4 地址空间。
- RFC 4787:UDP NAT 行为要求;RFC 5382:TCP NAT 行为要求。
- RFC 8489:STUN;RFC 8656:TURN;RFC 8445:ICE。
- 原笔记参考作者页面:https://blog.csdn.net/qq_54652195。