6.3. 使用 nftables 配置 NAT
使用
nftables,您可以配置以下网络地址转换(NAT)类型:
- 伪装
- 源 NAT (
SNAT) - 目标 NAT (
DNAT) - 重定向
这些是不同的网络地址转换(
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
# nft add table natCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 向表中添加
prerouting和postrouting链:nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } nft add chain nat postrouting { type nat hook postrouting priority 100 \; }# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要即使您没有向prerouting链中添加规则,nftables框架也会要求此链与传入的数据包回复匹配。请注意,您必须将--选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向
postrouting链中添加一条规则,来匹配ens3接口上传出的数据包:nft add rule nat postrouting oifname "ens3" masquerade
# nft add rule nat postrouting oifname "ens3" masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.3. 使用 nftables 配置源 NAT 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
在路由器上,源 NAT (
SNAT)允许您将通过接口发送的数据包 IP 更改为特定的 IP 地址。
以下流程描述了如何替换数据包的源 IP ,使其通过
ens3 接口离开路由器到达192.0.2.1。
过程 6.10. 使用 nftables 配置源 NAT
- 创建一个表:
nft add table nat
# nft add table natCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 向表中添加
prerouting和postrouting链:nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } nft add chain nat postrouting { type nat hook postrouting priority 100 \; }# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要即使您没有向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
# nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
- 如需更多信息,请参阅 第 6.6.2 节 “将特定本地端口上传入的数据包转发到不同主机”。
6.3.4. 使用 nftables 配置目标 NAT 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
目标
NAT 可让您将路由器上的流量重定向到无法直接从互联网访问的主机。
以下流程描述了如何将发送到路由器端口
80 和 443 的传入流量重定向到 IP 地址为 192.0.2.1 的主机。
过程 6.11. 使用 nftables 配置目标 NAT
- 创建一个表:
nft add table nat
# nft add table natCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 向表中添加
prerouting和postrouting链:nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } nft add chain nat postrouting { type nat hook postrouting priority 100 \; }# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要即使您没有向 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# nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 根据您的环境,添加 SNAT 或伪装规则以更改源地址:
- 如果
ens3接口使用动态 IP 地址,请添加一条伪装规则:nft add rule nat postrouting oifname "ens3" masquerade
# nft add rule nat postrouting oifname "ens3" masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果
ens3接口使用静态 IP 地址,请添加SNAT规则。例如,如果ens3使用 198.51.100.1 IP 地址:nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
# nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
6.3.5. 使用 nftables 配置重定向 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
重定向 功能是目标网络地址转换(DNAT)的一种特殊情况,它根据链 hook 将数据包重定向到本地计算机。
以下流程描述了如何将发送到本地主机端口 22 的流量重定向到端口 2222。
过程 6.12. 使用 nftables 配置重定向
- 创建一个表:
nft add table nat
# nft add table natCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 在表中添加 prerouting 链:
nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,您必须将--选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向 prerouting 链中添加一条规则,其将端口 22 上的传入流量重定向到端口 2222 :
nft add rule nat prerouting tcp dport 22 redirect to 2222
# nft add rule nat prerouting tcp dport 22 redirect to 2222Copy to Clipboard Copied! Toggle word wrap Toggle overflow