1. 为什么要学习NAT技术?
因为在VPN服务端需要使用NAT技术做IP包转发,所以要学习。
2. NAT是什么?
NAT(通常指的是 网络技术)是与 路由、地址转换、数据包转发 和 网络流量管理 相关的技术集合。它解决的是如何将数据包从源设备送到目标设备,如何处理网络中的地址转换(如 NAT),以及如何优化网络中的数据流量(如 QoS)。简而言之,NAT 技术就是用来确保网络数据可以有效、安全地在设备间传输,并提供路由、地址管理和流量控制等功能。
听起来和没说一样,看下面NAT技术是如何工作的。
3. NAT 技术是如何工作的?
NAT 技术的核心工作原理是通过 地址转换 将私有网络中的设备的私有 IP 地址转换为公共 IP 地址,这样私有网络中的设备才能访问互联网。当互联网响应请求时,NAT 会根据一些规则(如端口号)将返回的数据包重新路由到正确的私有设备。
我们可以分解这个过程,明确数据包如何从公网回到私有网络中的主机。
NAT 过程详解:
- 发送请求:
-
- 假设设备 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。
- 假设设备 A 在私有网络中,IP 地址为
- 请求到达互联网:
-
- 现在,设备 A 的数据包已经被 NAT 路由器转发出去,目标服务器(
example.com)收到的请求来源是203.0.113.5:50001。 - 目标服务器返回响应时,它将数据包发送到
203.0.113.5:50001,而 NAT 路由器并不直接把这个数据包发到外部设备,它需要根据端口和映射来判断最终数据包的目标。
- 现在,设备 A 的数据包已经被 NAT 路由器转发出去,目标服务器(
- 响应回到 NAT 路由器:
-
- 目标服务器(
example.com)将响应发送到 NAT 路由器的公共 IP 地址和端口203.0.113.5:50001。 - NAT 路由器接收到返回的数据包后,检查该端口号是否存在于其 NAT 转发表中。在这个表中,记录了外部端口号(
50001)和对应的 内部设备 IP 地址(192.168.1.100)以及 内部端口号。
- 目标服务器(
- 数据包转发回私有网络:
-
- NAT 路由器根据 端口映射 查找到原始请求的私有 IP 地址(
192.168.1.100),并将响应数据包的目标 IP 地址修改为 192.168.1.100,目标端口号保持不变(即50001)。 - 然后,NAT 路由器将数据包转发给设备 A(
192.168.1.100),这样设备 A 就收到了互联网响应的包。
- NAT 路由器根据 端口映射 查找到原始请求的私有 IP 地址(
- 设备 A 接收响应:
-
- 最终,设备 A 收到从外部服务器返回的数据包,它的 目标地址 是
192.168.1.100,端口号是之前分配的50001,NAT 路由器根据这个端口号和 IP 地址,准确地将数据包转发到设备 A。
- 最终,设备 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,防止外部网络直接访问内部设备。
工作原理:
- 内部设备(源 IP:192.168.1.100)向外部服务器(目标 IP:8.8.8.8)发送请求。
- 路由器接收请求,将源 IP 替换为自己的公网 IP(如 203.0.113.1),并记录端口映射关系(如 192.168.1.100:5000 → 203.0.113.1:5001)。
- 外部服务器响应时,将数据包发送至路由器的公网 IP(203.0.113.1:5001)。
- 路由器根据映射表将目标 IP 还原为内部设备 IP(192.168.1.100:5000),转发给内部设备。
DNAT(目标网络地址转换)
功能:修改数据包的目标 IP 地址,使外部网络能够访问内部网络的特定设备或服务(如 Web 服务器、SSH 服务器)。
应用场景:
- 外网访问内网服务:将公网 IP 的特定端口(如 203.0.113.1:80)映射到内部服务器的对应端口(如 192.168.1.200:80),实现外网用户访问内网网站。
- 负载均衡:将请求分发到多个内部服务器,实现流量分摊。
工作原理:
- 外部客户端(源 IP:1.2.3.4)向公网 IP(目标 IP:203.0.113.1:80)发送 HTTP 请求。
- 路由器接收请求,将目标 IP 替换为内部 Web 服务器 IP(如 192.168.1.200:80)。
- 内部服务器处理请求并响应,将数据包发送至客户端(源 IP 为内部 IP)。
- 路由器再次通过 SNAT 将源 IP 替换为公网 IP(203.0.113.1),确保客户端能正常接收响应。
对比与联系
| 特性 | SNAT | DNAT |
|---|---|---|
| 修改的地址 | 源 IP 地址 | 目标 IP 地址 |
| 流量方向 | 内→外(访问外网) | 外→内(外网访问内网服务) |
| 典型应用 | 共享公网 IP、隐藏内网结构 | 发布内网服务、负载均衡 |
| 依赖关系 | 常与 DNAT 配合使用 | 通常需要 SNAT 辅助响应流量 |
常见实现方式
- 路由器 / 防火墙:如家用路由器(如 TP-Link)、企业防火墙(如 Cisco ASA、Fortinet)通过配置 NAT 规则实现 SNAT/DNAT。
- Linux 系统:使用
iptables或nftables配置,例如: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 阶段完成的。
📌 总结
| 名称 | 说明 |
|---|---|
| Netfilter | Linux 内核中处理网络包的系统,是实现 iptables / nftables 的底层 |
| PREROUTING | Netfilter 的一个处理阶段,发生在包进入内核后的第一步 |
| 用途 | 修改目标地址(DNAT)、打标记、做早期拦截 |