【Linux笔记】NAT与内网穿透

一、NAT技术

1.1 NAT 转换表

NAT 设备(路由器/防火墙)内部维护一张状态表,表中每一条记录通常包含以下五元组信息:

字段 说明
内网 IP 私有源地址 (如 192.168.1.100)
内网端口 私有源端口 (如 54321)
公网 IP 转换后的全局地址 (如 203.0.113.1)
公网端口 转换后的全局端口 (如 62000)
协议类型 TCP / UDP / ICMP 等

1.2 数据包处理流程

1.2.1 出站方向

当内网主机发起连接时,NAT 设备按以下步骤处理:

  1. 路由决策:确认数据包需要从 NAT 接口转发出去。

  2. 查表匹配:用 (内网IP, 内网端口, 目标IP, 目标端口, 协议) 查询现有表项。

    • 命中:直接使用已有映射,执行地址/端口替换。

    • 未命中:判定为新会话,进入下一步。

  3. 分配资源:从可用端口池中选择一个未被占用的公网端口。若使用多公网 IP 池,还需选择 IP 地址。

  4. 改写报文头:

    • 将源 IP 替换为选定的公网 IP。

    • 将源端口替换为选定的公网端口。

  5. 重新计算校验和:由于 IP 和端口发生变化,必须重新计算 IP 头部校验和、TCP/UDP 校验和(以及增量更新)。

  6. 创建表项:将新映射写入 NAT 表,启动超时计时器。

  7. 转发:将修改后的数据包送入出接口队列。

1.2.2 入站方向

当公网响应包到达 NAT 设备时:

  1. 查表匹配:用 (公网IP, 公网端口, 源IP, 源端口, 协议) 反向查询 NAT 表。

  2. 命中处理:

    • 将目标 IP 还原为内网 IP。

    • 将目标端口还原为内网端口。

    • 重新计算校验和。

    • 刷新该表项的超时计时器。

    • 根据内网 IP 查找路由表,转发至内网。

  3. 未命中处理 :若无对应表项且无静态映射规则,默认丢弃该数据包(这就是 NAT 天然阻挡外部主动连接的原因)。

1.2.3 完整流程

二、代理服务器

代理服务器是:位于客户端与目标服务器之间的中间服务器。

客户端不直接访问目标资源,而是将请求发送给代理服务器,由代理服务器代为请求,再将结果返回给客户端。

2.1 正向代理

复制代码
【正向代理】—— 代理"客户端"
  用户 ──→ [正向代理] ──→ 互联网(各种网站)
  目的:帮用户访问外部资源(翻墙、匿名、绕过限制)

工作流程

复制代码
1. 客户端配置代理地址(如 192.168.1.100:8080)

2. 客户端发起请求 → 目标: proxy:8080,请求体中携带目标URL

3. 代理服务器解析目标URL

4. 代理服务器向目标服务器发起请求

5. 目标服务器返回响应给代理

6. 代理将响应转发给客户端

2.2 反向代理

复制代码
【反向代理】—— 代理"服务端"
  用户 ──→ [反向代理] ──→ 内部服务器集群(A、B、C...)
  目的:保护后端、负载均衡、缓存加速

反向代理工作流程

复制代码
1. 客户端正常发起请求 → 目标: proxy:80(客户端不知道代理存在)

2. 反向代理接收请求

3. 根据规则(URL、Header、负载均衡算法)选择后端服务器

4. 代理向后端服务器转发请求(可能修改/添加Header)

5. 后端返回响应

6. 代理将响应返回给客户端

三、内网穿透

3.1 内网穿透的认识

内网穿透 :将处于NAT/防火墙之后的内网设备或服务,通过某种技术手段暴露给公网用户访问的技术统称。

为什么需要内网穿透:让公网用户访问到私有ip的服务。

复制代码
公网用户想访问你家里的电脑:


公网用户(8.8.8.8) ──→ ??? ──→ 你的电脑(192.168.1.100)


问题所在:
┌─────────────────────────────────────────────────────────┐
│  1. 你的电脑没有公网IP(运营商分配的是内网IP或NAT后地址)       │
│  2. 192.168.1.100 是私有地址,公网路由不可达                │
│  3. 路由器/防火墙默认拒绝入站连接                            │
│  4. 即使有公网IP,防火墙也会拦截未授权的入站请求               │
└─────────────────────────────────────────────────────────┘

网络层级:

复制代码
┌──────────────────────────────────────────────────────────────┐
│                        公网 (Internet)                        │
│                       公网IP: 203.0.113.1                     │
└───────────────────────────┬──────────────────────────────────┘
                            │ WAN口
                   ┌────────▼────────┐
                   │   家庭路由器      │  ← NAT设备
                   │   192.168.1.1    │
                   └────────┬────────┘
                            │ LAN口
              ┌─────────────┼─────────────┐
              │             │             │
     ┌────────▼───┐  ┌─────▼──────┐  ┌──▼─────────┐
     │ 电脑        │  │ NAS        │  │ 智能家居    │
     │192.168.1.2 │  │192.168.1.3 │  │192.168.1.4 │
     └────────────┘  └────────────┘  └────────────┘
                                
  这些私有地址(192.168.x.x / 10.x.x.x / 172.16~31.x.x)
  公网完全无法直接路由到达

3.2 内网穿透的原理

复制代码
核心原理:
  内网设备【主动】向公网服务器建立【出站】连接(NAT允许出站)
  然后利用这条已建立的连接,反向传输外部请求
​
┌──────────┐         ┌──────────────────┐         ┌──────────┐
│ 公网用户  │         │   公网中继服务器    │         │ 内网设备  │
│          │         │   (有公网IP)      │         │          │
│          │────────→│                  │←────────│          │
│  请求     │  ②访问  │  s通过已有隧道      │ ①主动   │  服务     │
│          │         │    转发请求       │   连接   │          │
│          │←────────│                  │────────→│          │
│  响应     │  ⑥返回  │  ⑤返回响应         │ ④处理    │  响应    │
└──────────┘         └──────────────────┘         └──────────┘
​
关键:步骤③是内网设备【主动发起】的出站连接
      NAT对此完全放行(因为NAT允许出站)
      之后所有通信都复用这条连接
相关推荐
readhere20 小时前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
打工仔折腾 AI1 天前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
关于Linux 线程局部存储的认识
linux·运维
小小de风呀1 天前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
晚风吹北巷1 天前
Linux复习篇(自用)
linux·运维·服务器·1024程序员节
by209991 天前
Linux 压缩传输、进程查看与权限管理
linux·经验分享·1024程序员节
无足鸟ICT1 天前
【RHCA+】reboot命令(重启)
linux·运维·服务器·1024程序员节
DYWorker0011 天前
第1课:基于正点原子RK3568开发板读懂Linux内核
linux·运维·网络
Android系统攻城狮1 天前
Linux FFmpeg深度解析之avformat_open_input调用流程与实战(一)
linux·运维·ffmpeg·车载音视频·ffmpeg音视频·音视频进阶手册