Red Hat Training

A Red Hat training course is available for RHEL 8

9.11. 使用 firewalld 配置 NAT

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

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

9.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 的一个特殊情况,用于将数据包重定向到本地计算机上的不同端口。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。

9.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 选项传给命令。

9.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>

其他资源

9.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= &lt;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>

其他资源