8.3. 使用 nftables 配置 NAT


有了 nftables ,您就可以配置以下网络地址转换(NAT)类型:

  • 伪装
  • 源 NAT(SNAT)
  • 目标 NAT(DNAT)
  • 重定向
重要

您只能在 iifnameoifname 参数中使用实际的接口名称,不支持替代名称(altname)。

8.3.1. NAT 类型

这些是不同的网络地址转换(NAT)类型:

伪装和源 NAT(SNAT)

使用以上 NAT 类型之一更改数据包的源 IP 地址。例如,互联网服务提供商(ISP)不会路由私有 IP 范围,如 10.0.0.0/8。如果您在网络中使用私有 IP 范围,并且用户可以访问互联网上的服务器,请将这些范围内的数据包的源 IP 地址映射到公共 IP 地址。

伪装和 SNAT 相互类似。不同之处是:

  • 伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
  • SNAT 将数据包的源 IP 地址设置为指定的 IP 地址,且不会动态查找传出接口的 IP 地址。因此,SNAT 要比伪装更快。如果传出接口使用了固定 IP 地址,则使用 SNAT。
目标 NAT(DNAT)
使用此 NAT 类型重写传入数据包的目标地址和端口。例如,如果您的 Web 服务器使用来自私有 IP 范围的 IP 地址,因此无法直接从互联网访问,您可以在路由器上设置 DNAT 规则,来将传入的流量重定向到此服务器。
重定向
这个类型是 IDT 的特殊示例,它根据链 hook 将数据包重定向到本地机器。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。

8.3.2. 使用 nftables 配置伪装

伪装使路由器动态地更改通过接口到接口 IP 地址发送的数据包的源 IP。这意味着,如果接口被分配了一个新 IP,nftables 会在替换源 IP 时自动使用新的 IP。

将通过 ens3 接口离开主机的数据包源 IP 替换为 ens3 上设置的 IP。

流程

  1. 创建一个表:

    Copy to Clipboard Toggle word wrap
    # nft add table nat
  2. 向表中添加 preroutingpostrouting 链:

    Copy to Clipboard Toggle word wrap
    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    重要

    即使您没有向 prerouting 链中添加规则,nftables 框架也会要求此链与传入的数据包回复匹配。

    请注意,您必须将 -- 选项传递给 nft 命令,以防止 shell 将负优先级值解释为 nft 命令的选项。

  3. postrouting 链中添加一条规则,来匹配 ens3 接口上传出的数据包:

    Copy to Clipboard Toggle word wrap
    # nft add rule nat postrouting oifname "ens3" masquerade

8.3.3. 使用 nftables 配置源 NAT

在路由器中,源 NAT(SNAT)可让您将通过接口发送的数据包 IP 改为专门的 IP 地址。然后,路由器会替换传出数据包的源 IP。

流程

  1. 创建一个表:

    Copy to Clipboard Toggle word wrap
    # nft add table nat
  2. 向表中添加 preroutingpostrouting 链:

    Copy to Clipboard Toggle word wrap
    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    重要

    即使您没有向 postrouting 链添加规则,nftables 框架也会要求此链与传出数据包回复相匹配。

    请注意,您必须将 -- 选项传递给 nft 命令,以防止 shell 将负优先级值解释为 nft 命令的选项。

  3. postrouting 链中添加一条规则,该规则将使用 192.0.2.1 替换通过ens3 的传出数据包的源 IP :

    Copy to Clipboard Toggle word wrap
    # nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1

8.3.4. 使用 nftables 配置目标 NAT

目标 NAT (DNAT)可让您将路由器上的流量重定向到无法直接从互联网访问的主机。

例如,有了 DNAT,路由器将发送给端口 80443 的传入流量重定向到 IP 地址为 192.0.2.1 的 Web 服务器。

流程

  1. 创建一个表:

    Copy to Clipboard Toggle word wrap
    # nft add table nat
  2. 向表中添加 preroutingpostrouting 链:

    Copy to Clipboard Toggle word wrap
    # 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 命令的选项。

  3. prerouting 链中添加一条规则,该规则将路由器的 ens3 接口上端口 80443 的传入流量重定向到 IP 地址为 192.0.2.1 的 web 服务器:

    Copy to Clipboard Toggle word wrap
    # nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
  4. 根据您的环境,添加 SNAT 或伪装规则,将从 Web 服务器返回的数据包的源地址改为发送者:

    1. 如果 ens3 接口使用动态 IP 地址,请添加一条伪装规则:

      Copy to Clipboard Toggle word wrap
      # nft add rule nat postrouting oifname "ens3" masquerade
    2. 如果 ens3 接口使用静态 IP 地址,请添加一条 SNAT 规则。例如,如果 ens3 使用 198.51.100.1 IP 地址:

      Copy to Clipboard Toggle word wrap
      # nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
  5. 启用数据包转发:

    Copy to Clipboard Toggle word wrap
    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

其它资源

8.3.5. 使用 nftables 配置重定向

重定向 功能是目标网络地址转换(DNAT)的一种特殊情况,它根据链 hook 将数据包重定向到本地计算机。

例如,您可以将发送到本地主机端口 22 的流量重定向到端口 2222

流程

  1. 创建一个表:

    Copy to Clipboard Toggle word wrap
    # nft add table nat
  2. 向表中添加 prerouting 链:

    Copy to Clipboard Toggle word wrap
    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }

    请注意,您必须将 -- 选项传递给 nft 命令,以防止 shell 将负优先级值解释为 nft 命令的选项。

  3. prerouting 链中添加一条规则,其将端口 22 上的传入流量重定向到端口 2222

    Copy to Clipboard Toggle word wrap
    # nft add rule nat prerouting tcp dport 22 redirect to 2222

其它资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat, Inc.