NAT及其使用

nat是什么?nat打洞是什么意思?有什么作用?为什么需要打洞?

NAT是什么?

NAT (Network Address Translation,网络地址转换) 是一种网络技术,用于将私有IP地址转换为公有IP地址。

NAT的基本工作原理

1
2
3
4
5
内网设备 (192.168.1.100) 

路由器/防火墙 (NAT设备)

互联网 (公网IP: 120.25.30.40)

当内网设备访问外网时:

  • 出去的包:私有IP → 公网IP
  • 返回的包:公网IP → 私有IP

为什么需要NAT?

1. IPv4地址短缺

  • 全球IPv4地址不够用
  • 大量设备共享少量公网IP

2. 网络安全

  • 隐藏内网结构
  • 防止外网直接访问内网设备

3. 成本考虑

  • 减少公网IP的需求和费用

NAT的问题

主要限制

1
2
3
外网用户无法主动连接内网设备

问题:P2P通信困难

比如:

  • 两个都在NAT后面的用户无法直接连接
  • 游戏、视频通话、文件传输受阻
  • 服务器部署受限

NAT打洞是什么?

NAT打洞(NAT Traversal/Hole Punching) 是绕过NAT限制,使两个内网设备能够直接通信的技术。

基本原理

  1. 建立映射:内网设备先向外网发包,在NAT上建立端口映射
  2. 保持映射:定期发包保持映射不失效
  3. 直接通信:利用已建立的映射进行P2P通信

NAT打洞的具体过程

UDP打洞示例

1
2
3
4
5
6
7
8
9
客户端A (NAT_A后) ←→ 服务器S ←→ 客户端B (NAT_B后)

1. A向S发包:NAT_A记录 A:内网端口 → S:端口
2. B向S发包:NAT_B记录 B:内网端口 → S:端口
3. S告诉A:B的公网地址和端口
4. S告诉B:A的公网地址和端口
5. A直接向B的公网地址发包
6. B直接向A的公网地址发包
7. 建立A和B的直接连接

关键技术

STUN (Session Traversal Utilities for NAT)

1
2
3
# 客户端查询自己的公网地址和端口
stun_client stun.l.google.com:19302
# 返回:你的公网IP是 120.25.30.40:12345

TURN (Traversal Using Relays around NAT)

  • 当直接打洞失败时,通过中继服务器转发

ICE (Interactive Connectivity Establishment)

  • 综合多种NAT穿越技术的框架

应用场景

1. 即时通讯

  • 微信、QQ语音/视频通话
  • Skype、Zoom等

2. 游戏

  • P2P联机游戏
  • 减少服务器负载

3. 文件传输

  • BitTorrent下载
  • 局域网文件共享

4. 远程访问

  • VPN连接
  • 远程桌面

5. WebRTC

  • 浏览器实时通信
  • 在线会议、直播

实际例子

微信语音通话的过程:

  1. 你和朋友都在各自家的WiFi(NAT)后面
  2. 微信服务器作为中介,帮你们交换公网地址信息
  3. 通过NAT打洞建立直接连接
  4. 语音数据直接在你们之间传输,不经过微信服务器

这就是为什么有时候微信语音很流畅(打洞成功),有时候质量不好(需要中继转发)的原因。

NAT打洞让本来无法直接通信的内网设备能够建立P2P连接,大大提高了网络应用的效率和用户体验。