1.11. 使用 firewalld 配置 NAT

使用 firewalld,您可以配置以下网络地址转换(NAT)类型:

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

1.11.1. 网络地址转换类型

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

伪装

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

伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。

目标 NAT(DNAT)
使用此 NAT 类型重写传入数据包的目标地址和端口。例如,如果您的 Web 服务器使用私有 IP 范围内的 IP 地址,因此无法直接从互联网访问,则您可以在路由器上设置 DNAT 规则,将传入的流量重定向到此服务器。
重定向
此类型是 DNAT 的一个特殊情况,其将数据包重定向到本地计算机上的不同端口。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。

1.11.2. 配置 IP 地址伪装

您可以在系统上启用 IP 伪装。在访问互联网时,IP 伪装会隐藏网关后面的单个机器。

流程

  1. 要检查是否启用了 IP 伪装(例如,对于 external 区),以 root 用户身份输入以下命令:

    # firewall-cmd --zone=external --query-masquerade

    如果已启用,命令将会打印 yes,且退出状态为 0。否则,将打印 no ,退出状态为 1。如果省略了 zone,则将使用默认区。

  2. 要启用 IP 伪装,请以 root 用户身份输入以下命令:

    # firewall-cmd --zone=external --add-masquerade
  3. 要使此设置持久,请将 --permanent 选项传给命令。
  4. 要禁用 IP 伪装,请以 root 身份输入以下命令:

    # firewall-cmd --zone=external --remove-masquerade

    要使此设置永久生效,请将 --permanent 选项传给命令。

1.11.3. 使用 DNAT 转发传入的 HTTP 流量

您可以使用目标网络地址转换(DNAT)将传入的流量从一个目标地址和端口定向到另一个目标地址和端口。通常,这对于将来自外部网络接口的请求重定向到特定的内部服务器或服务非常有用。

先决条件

  • firewalld 服务在运行。

流程

  1. 使用以下内容创建 /etc/sysctl.d/90-enable-IP-forwarding.conf 文件:

    net.ipv4.ip_forward=1

    此设置在内核中启用 IP 转发。它使内部 RHEL 服务器充当路由器,并将数据包从网络转发到网络。

  2. /etc/sysctl.d/90-enable-IP-forwarding.conf 文件中载入设置:

    # sysctl -p /etc/sysctl.d/90-enable-IP-forwarding.conf
  3. 转发传入的 HTTP 流量:

    # firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=198.51.100.10:toport=8080 --permanent

    之前的命令使用以下设置定义一个 DNAT 规则:

    • --zone=public - 用来配置 DNAT 规则的防火墙区域。您可以将其调整为您需要的任何区域。
    • --add-forward-port - 指示您要添加一个端口转发规则的选项。
    • port=80 - 外部目标端口。
    • proto=tcp - 指示您转发 TCP 流量的协议。
    • toaddr=198.51.100.10 - 目标 IP 地址。
    • toport=8080 - 内部服务器的目标端口。
    • --permanent - 使 DNAT 规则在重启后保持不变的选项。
  4. 重新载入防火墙配置以应用更改:

    # firewall-cmd --reload

验证

  • 验证您使用的防火墙区域的 DNAT 规则:

    # firewall-cmd --list-forward-ports --zone=public
    port=80:proto=tcp:toport=8080:toaddr=198.51.100.10

    或者,查看对应的 XML 配置文件:

    # cat /etc/firewalld/zones/public.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
      <short>Public</short>
      <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
      <service name="ssh"/>
      <service name="dhcpv6-client"/>
      <service name="cockpit"/>
      <forward-port port="80" protocol="tcp" to-port="8080" to-addr="198.51.100.10"/>
      <forward/>
    </zone>

其他资源

1.11.4. 重定向来自非标准端口的流量,以便使 Web 服务在标准端口上可访问

您可以使用重定向机制使内部运行在非标准端口上的 Web 服务可以访问,而无需用户在 URL 中指定端口。因此,URL 更简单,提供更好的浏览体验,而非标准端口仍然在内部使用或用于特定的要求。

先决条件

  • firewalld 服务在运行。

流程

  1. 使用以下内容创建 /etc/sysctl.d/90-enable-IP-forwarding.conf 文件:

    net.ipv4.ip_forward=1

    此设置在内核中启用 IP 转发。

  2. /etc/sysctl.d/90-enable-IP-forwarding.conf 文件中载入设置:

    # sysctl -p /etc/sysctl.d/90-enable-IP-forwarding.conf
  3. 创建 NAT 重定向规则:

    # firewall-cmd --zone=public --add-forward-port=port=<standard_port>:proto=tcp:toport=<non_standard_port> --permanent

    之前的命令使用以下设置定义 NAT 重定向规则:

    • --zone=public - 用于配置规则的防火墙区域。您可以将其调整为您需要的任何区域。
    • --add-forward-port=port=<non_standard_port> - 指示您要使用最初接收传入流量的源端口添加端口转发(重定向)规则的选项。
    • proto=tcp - 指示您重定向 TCP 流量的协议。
    • toport=<standard_port> - 目标端口,在源端口上收到后,传入的流量应被重定向到的端口。
    • --permanent - 使规则在重启后保持不变的选项。
  4. 重新载入防火墙配置以应用更改:

    # firewall-cmd --reload

验证

  • 验证您使用的防火墙区域的重定向规则:

    # firewall-cmd --list-forward-ports
    port=8080:proto=tcp:toport=80:toaddr=

    或者,查看对应的 XML 配置文件:

    # cat /etc/firewalld/zones/public.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
      <short>Public</short>
      <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
      <service name="ssh"/>
      <service name="dhcpv6-client"/>
      <service name="cockpit"/>
      <forward-port port="8080" protocol="tcp" to-port="80"/>
      <forward/>
    </zone>

其他资源