6.3. 使用 nftables 配置 NAT
使用
nftables
,您可以配置以下网络地址转换(NAT
)类型:
- 伪装
- 源 NAT (
SNAT
) - 目标 NAT (
DNAT
) - 重定向
6.3.1. 不同的 NAT 类型: masquerading、source NAT、destination NAT 和 redirect
这些是不同的网络地址转换(
NAT
)类型:
伪装和源 NAT(SNAT)
使用这些
NAT
类型之一更改数据包的源 IP 地址。例如,互联网服务提供商不路由私有 IP 范围,如 10.0.0.0/8
。如果您在网络中使用私有 IP 范围,并且用户应该能够访问 Internet 上的服务器,请将这些范围内的数据包的源 IP 地址映射到公共 IP 地址。
伪装和
SNAT
非常相似。不同之处是:
- 伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
SNAT
将数据包的源 IP 地址设置为指定 IP,且不会动态查找传出接口的 IP 地址。因此,SSNAT
比伪装更快。如果传出接口使用了固定 IP 地址,则使用SNAT
。
目标 NAT(DNAT)
使用此
NAT
类型将传入的流量路由到不同主机。例如,如果您的 web 服务器使用保留 IP 范围内的 IP 地址,因此无法直接从互联网访问,您可以在路由器上设置 DNAT
规则,以将传入的流量重定向到这个服务器。
重定向
这个类型是 IDT 的特殊示例,它根据链 hook 将数据包重定向到本地机器。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。
6.3.2. 使用 nftables 配置伪装
伪装使路由器动态地更改通过接口到接口 IP 地址发送的数据包的源 IP。这意味着,如果接口被分配了一个新 IP,
nftables
会在替换源 IP 时自动使用新的 IP。
以下流程描述了如何将通过
ens3
接口离开主机的数据包的源 IP 替换为 ens3
上设置的 IP。
过程 6.9. 使用 nftables 配置伪装
- 创建一个表:
# nft add table nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
重要即使您没有向prerouting
链中添加规则,nftables
框架也会要求此链与传入的数据包回复匹配。请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向
postrouting
链中添加一条规则,来匹配ens3
接口上传出的数据包:# nft add rule nat postrouting oifname "ens3" masquerade
6.3.3. 使用 nftables 配置源 NAT
在路由器上,源 NAT (
SNAT
)允许您将通过接口发送的数据包 IP 更改为特定的 IP 地址。
以下流程描述了如何替换数据包的源 IP ,使其通过
ens3
接口离开路由器到达192.0.2.1
。
过程 6.10. 使用 nftables 配置源 NAT
- 创建一个表:
# nft add table nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
重要即使您没有向prerouting
链添加规则,nftables
框架也要求此链与传出数据包回复匹配。请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向
postrouting
链中添加一条规则,该规则将使用192.0.2.1
替换通过ens3
的传出数据包的源 IP :# nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1
其他资源
- 如需更多信息,请参阅 第 6.6.2 节 “将特定本地端口上传入的数据包转发到不同主机”。
6.3.4. 使用 nftables 配置目标 NAT
目标
NAT
可让您将路由器上的流量重定向到无法直接从互联网访问的主机。
以下流程描述了如何将发送到路由器端口
80
和 443
的传入流量重定向到 IP 地址为 192.0.2.1
的主机。
过程 6.11. 使用 nftables 配置目标 NAT
- 创建一个表:
# nft add table nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
重要即使您没有向 postrouting 链添加规则,nftables
框架也要求此链与传出数据包回复匹配。请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向 prerouting 链中添加一条规则,将发送到端口 80 和 443 的
ens3
接口上的传入流量重定向到 IP 为 192.0.2.1 的主机:# nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
- 根据您的环境,添加 SNAT 或伪装规则以更改源地址:
- 如果
ens3
接口使用动态 IP 地址,请添加一条伪装规则:# nft add rule nat postrouting oifname "ens3" masquerade
- 如果
ens3
接口使用静态 IP 地址,请添加SNAT
规则。例如,如果ens3
使用 198.51.100.1 IP 地址:# nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
其他资源
6.3.5. 使用 nftables 配置重定向
重定向
功能是目标网络地址转换(DNAT)的一种特殊情况,它根据链 hook 将数据包重定向到本地计算机。
以下流程描述了如何将发送到本地主机端口 22 的流量重定向到端口 2222。
过程 6.12. 使用 nftables 配置重定向
- 创建一个表:
# nft add table nat
- 在表中添加 prerouting 链:
# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向 prerouting 链中添加一条规则,其将端口 22 上的传入流量重定向到端口 2222 :
# nft add rule nat prerouting tcp dport 22 redirect to 2222