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 nat
Copy 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" masquerade
Copy 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 nat
Copy 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.1
Copy 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 nat
Copy 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.1
Copy 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" masquerade
Copy 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.1
Copy 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 nat
Copy 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 2222
Copy to Clipboard Copied! Toggle word wrap Toggle overflow