【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允许出站)
      之后所有通信都复用这条连接
相关推荐
迷途之人不知返1 小时前
自主实现一个简单的shell命令行
linux
顺风尿一寸2 小时前
深入 Linux 6.18 挂载机制:从 VFS 到 ext4 的完整调用链
linux
她说彩礼65万3 小时前
C语言 assert
java·linux·c语言
lcj25113 小时前
【Linux】 Makefile 详解
linux·笔记·面试
天疆说3 小时前
腾讯会议 Linux 版在 NVIDIA 显卡上看不到画面:EGL 像素配置与窗口视觉不匹配的排查与修复
linux·数据库·腾讯会议
geats人山人海3 小时前
linux 2 基本操作与vim
linux·运维·vim
lisanmengmeng4 小时前
NRPE 添加命令(三)
java·linux·服务器
人工智能培训4 小时前
数字孪生驱动大模型工业知识库:为具身机器人植入领域专业经验
大数据·linux·服务器·前端·人工智能
江屿风5 小时前
【Linux系统】【从菜鸟驿站到操作系统:一节课打通Linux重定向与缓冲区真相】流食般投喂
linux·运维·服务器·开发语言·笔记