Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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 地址。因此,S SNAT 比伪装更快。如果传出接口使用了固定 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 配置伪装

  1. 创建一个表:
    # nft add table nat
  2. 向表中添加 preroutingpostrouting 链:
    # 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 命令的选项。
  3. 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

  1. 创建一个表:
    # nft add table nat
  2. 向表中添加 preroutingpostrouting 链:
    # 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 命令的选项。
  3. postrouting 链中添加一条规则,该规则将使用 192.0.2.1 替换通过ens3 的传出数据包的源 IP :
    # nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1

其他资源

6.3.4. 使用 nftables 配置目标 NAT

目标 NAT 可让您将路由器上的流量重定向到无法直接从互联网访问的主机。
以下流程描述了如何将发送到路由器端口 80443 的传入流量重定向到 IP 地址为 192.0.2.1 的主机。

过程 6.11. 使用 nftables 配置目标 NAT

  1. 创建一个表:
    # nft add table nat
  2. 向表中添加 preroutingpostrouting 链:
    # 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 链中添加一条规则,将发送到端口 80443ens3 接口上的传入流量重定向到 IP 为 192.0.2.1 的主机:
    # nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
  4. 根据您的环境,添加 SNAT 或伪装规则以更改源地址:
    1. 如果 ens3 接口使用动态 IP 地址,请添加一条伪装规则:
      # nft add rule nat postrouting oifname "ens3" masquerade
    2. 如果 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 配置重定向

  1. 创建一个表:
    # nft add table nat
  2. 在表中添加 prerouting 链:
    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
    请注意,您必须将 -- 选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。
  3. prerouting 链中添加一条规则,其将端口 22 上的传入流量重定向到端口 2222
    # nft add rule nat prerouting tcp dport 22 redirect to 2222

其他资源