【学习VPN之路】NAT技术

345 阅读8分钟

1. 为什么要学习NAT技术?

因为在VPN服务端需要使用NAT技术做IP包转发,所以要学习。

2. NAT是什么?

NAT(通常指的是 网络技术)是与 路由地址转换数据包转发网络流量管理 相关的技术集合。它解决的是如何将数据包从源设备送到目标设备,如何处理网络中的地址转换(如 NAT),以及如何优化网络中的数据流量(如 QoS)。简而言之,NAT 技术就是用来确保网络数据可以有效、安全地在设备间传输,并提供路由、地址管理和流量控制等功能。

听起来和没说一样,看下面NAT技术是如何工作的。

3. NAT 技术是如何工作的?

NAT 技术的核心工作原理是通过 地址转换 将私有网络中的设备的私有 IP 地址转换为公共 IP 地址,这样私有网络中的设备才能访问互联网。当互联网响应请求时,NAT 会根据一些规则(如端口号)将返回的数据包重新路由到正确的私有设备。

我们可以分解这个过程,明确数据包如何从公网回到私有网络中的主机。

NAT 过程详解:

  1. 发送请求:
    • 假设设备 A 在私有网络中,IP 地址为 192.168.1.100,它想要访问一个外部网站 http://example.com
    • 当设备 A 发送数据包时,它的 源 IP 地址192.168.1.100,但是为了让数据包能够穿越 NAT 路由器,它的 源 IP 地址 会被 NAT 转换为路由器的公共 IP 地址,假设公共 IP 为 203.0.113.5
    • 同时,NAT 路由器会为这个请求分配一个临时的 源端口(如 50001),然后将数据包的源地址修改为 203.0.113.5:50001,目标地址是网站 http://example.com
  1. 请求到达互联网:
    • 现在,设备 A 的数据包已经被 NAT 路由器转发出去,目标服务器(example.com)收到的请求来源是 203.0.113.5:50001
    • 目标服务器返回响应时,它将数据包发送到 203.0.113.5:50001,而 NAT 路由器并不直接把这个数据包发到外部设备,它需要根据端口和映射来判断最终数据包的目标。
  1. 响应回到 NAT 路由器:
    • 目标服务器(example.com)将响应发送到 NAT 路由器的公共 IP 地址和端口 203.0.113.5:50001
    • NAT 路由器接收到返回的数据包后,检查该端口号是否存在于其 NAT 转发表中。在这个表中,记录了外部端口号(50001)和对应的 内部设备 IP 地址192.168.1.100)以及 内部端口号
  1. 数据包转发回私有网络:
    • NAT 路由器根据 端口映射 查找到原始请求的私有 IP 地址(192.168.1.100),并将响应数据包的目标 IP 地址修改为 192.168.1.100,目标端口号保持不变(即 50001)。
    • 然后,NAT 路由器将数据包转发给设备 A(192.168.1.100),这样设备 A 就收到了互联网响应的包。
  1. 设备 A 接收响应:
    • 最终,设备 A 收到从外部服务器返回的数据包,它的 目标地址192.168.1.100,端口号是之前分配的 50001,NAT 路由器根据这个端口号和 IP 地址,准确地将数据包转发到设备 A。

如何回到主机的关键:端口映射

在整个过程中,NAT 通过维护 端口映射表 来管理进出数据流。这个表的作用是:

  • 外部请求到达时,根据源 IP 和端口号将请求转发到内部的正确设备。
  • 返回响应时,NAT 根据 目标端口号 找到原始请求的私有 IP 地址,并将响应数据包正确转发回去。

NAT 在解决以下问题上非常有效:

  • 私有网络与公网地址的转换:它允许多个设备共享同一个公网 IP 地址。
  • 防火墙功能:NAT 隐藏了私有网络设备的 IP 地址,有效地避免了外部设备直接访问内部设备。

总结:

  • 当设备发起请求时,NAT 会改变其源 IP 地址和源端口,将请求发送到外部网络。
  • 当外部服务器响应时,NAT 路由器根据端口号查找映射表,将数据包正确路由回内部设备。
  • 端口映射 是 NAT 工作的核心,确保数据包能够在响应回来的时候,准确地找到原始的私有设备。

SNAT(源网络地址转换)和 DNAT

SNAT(目标网络地址转换)是网络地址转换(NAT)技术的两种类型,主要用于修改 IP 数据包的源地址或目标地址,实现网络通信的地址适配和流量转发。以下是它们的详细介绍:

SNAT(源网络地址转换)

功能:修改数据包的源 IP 地址,使内部网络(如局域网)的设备能够通过单一公网 IP 访问外部网络(如互联网)。
应用场景

  • 共享公网 IP:企业或家庭内部多台设备通过路由器的 SNAT 功能共享一个公网 IP 访问互联网。
  • 隐藏内部网络结构:将内部私有 IP(如 192.168.1.0/24)转换为公网 IP,防止外部网络直接访问内部设备。

工作原理

  1. 内部设备(源 IP:192.168.1.100)向外部服务器(目标 IP:8.8.8.8)发送请求。
  2. 路由器接收请求,将源 IP 替换为自己的公网 IP(如 203.0.113.1),并记录端口映射关系(如 192.168.1.100:5000 → 203.0.113.1:5001)。
  3. 外部服务器响应时,将数据包发送至路由器的公网 IP(203.0.113.1:5001)。
  4. 路由器根据映射表将目标 IP 还原为内部设备 IP(192.168.1.100:5000),转发给内部设备。

DNAT(目标网络地址转换)

功能:修改数据包的目标 IP 地址,使外部网络能够访问内部网络的特定设备或服务(如 Web 服务器、SSH 服务器)。
应用场景

  • 外网访问内网服务:将公网 IP 的特定端口(如 203.0.113.1:80)映射到内部服务器的对应端口(如 192.168.1.200:80),实现外网用户访问内网网站。
  • 负载均衡:将请求分发到多个内部服务器,实现流量分摊。

工作原理

  1. 外部客户端(源 IP:1.2.3.4)向公网 IP(目标 IP:203.0.113.1:80)发送 HTTP 请求。
  2. 路由器接收请求,将目标 IP 替换为内部 Web 服务器 IP(如 192.168.1.200:80)。
  3. 内部服务器处理请求并响应,将数据包发送至客户端(源 IP 为内部 IP)。
  4. 路由器再次通过 SNAT 将源 IP 替换为公网 IP(203.0.113.1),确保客户端能正常接收响应。

对比与联系

特性SNATDNAT
修改的地址源 IP 地址目标 IP 地址
流量方向内→外(访问外网)外→内(外网访问内网服务)
典型应用共享公网 IP、隐藏内网结构发布内网服务、负载均衡
依赖关系常与 DNAT 配合使用通常需要 SNAT 辅助响应流量

常见实现方式

  • 路由器 / 防火墙:如家用路由器(如 TP-Link)、企业防火墙(如 Cisco ASA、Fortinet)通过配置 NAT 规则实现 SNAT/DNAT。
  • Linux 系统:使用iptablesnftables配置,例如:bash
# SNAT规则示例(将192.168.1.0/24网段的流量通过eth0接口访问外网)  
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE  

# DNAT规则示例(将公网80端口流量转发到内网服务器192.168.1.200:80)  
iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80
  • 云服务商:AWS EC2 的 NAT 网关(SNAT)、负载均衡器(DNAT),阿里云的 NAT 网关和端口转发等。

总结

  • SNAT是 “内网访问外网” 的桥梁,解决 IP 地址不足和安全隐藏问题。
  • DNAT是 “外网访问内网” 的钥匙,实现内部服务的对外暴露。
  • 两者结合使用,可构建灵活、安全的网络架构,是现代网络不可或缺的基础技术。

🧱 一、什么是 Netfilter?

Netfilter 是 Linux 内核中处理网络数据包的“过滤系统” ,它不是一个程序,而是一套内核内置机制,负责:

  • 拦截、修改、转发网络包
  • 实现防火墙功能(iptables/nftables)
  • 实现 NAT(SNAT/DNAT/MASQUERADE)
  • 做包的打标记、过滤、限速、日志等处理

📦 Netfilter 就像是一个“检查站网络管道”,数据包进出 Linux 系统时,都会经过它。


🧭 二、什么是 Netfilter 的 PREROUTING?

Netfilter 的工作流程由几个“钩子点”(hook)组成,每个钩子点都有其特定的时机和用途:

钩子点时机常用操作
PREROUTING包进入主机网络栈的最早阶段DNAT(目标地址转换)
INPUT目标是本机的包本机接收过滤
FORWARD包从一块网卡进,从另一块出去路由器行为
OUTPUT本机发出的包本机包过滤
POSTROUTING包即将离开本机前的最后阶段SNAT(源地址转换)

🧩 PREROUTING 是什么?

  • 它是 Netfilter 的五个钩子点中第一个阶段
  • 所有 从网卡接收到的包都会首先经过 PREROUTING
  • 在这里你可以对包做早期处理,比如:
    • DNAT:把目标地址改掉,例如 1.1.1.1 → 10.0.0.3
    • 改变 TTL、打标记、检测来源等

🧪 三、举个例子

假设你有个 Linux 服务器,运行了一个 VPN(如 WireGuard),你配置了一条 DNAT 规则:

iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.3:80

意思是:

如果有 TCP 包打算发到 1.2.3.4:80(比如这是你的公网 IP),就把它的目标地址改成 10.0.0.3:80 —— 即“转发到你的内网服务器”。

这个“目标地址修改”的操作就是 在 Netfilter 的 PREROUTING 阶段完成的


📌 总结

名称说明
NetfilterLinux 内核中处理网络包的系统,是实现 iptables / nftables 的底层
PREROUTINGNetfilter 的一个处理阶段,发生在包进入内核后的第一步
用途修改目标地址(DNAT)、打标记、做早期拦截