Red Hat Training

A Red Hat training course is available for RHEL 8

9.10. 在区域间过滤转发的流量

firewalld 可让您控制不同 firewalld 区域之间的网络数据流。通过定义规则和策略,您可以管理在这些区域之间移动流量时如何允许或拒绝流量。

策略对象功能在 firewalld 中提供转发和输出过滤。您可以使用 firewalld 过滤不同区域之间的流量,以允许访问本地托管的虚拟机来连接主机。

9.10.1. 策略对象和区域之间的关系

策略对象允许用户将 firewalld 的原语(如服务、端口和丰富的规则)附加到策略。您可以将策略对象应用到以有状态和单向的方式在区域间传输的流量上。

# firewall-cmd --permanent --new-policy myOutputPolicy

# firewall-cmd --permanent --policy myOutputPolicy --add-ingress-zone HOST

# firewall-cmd --permanent --policy myOutputPolicy --add-egress-zone ANY

HOSTANY 是 ingress 和 egress 区域列表中使用的符号区域。

  • HOST 符号区域对于来自运行 firewalld 的主机的流量,或具有到运行 firewalld 的主机的流量允许策略。
  • ANY 符号区对所有当前和将来的区域应用策略。ANY 符号区域充当所有区域的通配符。

9.10.2. 使用优先级对策略进行排序

多个策略可以应用到同一组流量,因此应使用优先级为可能应用的策略创建优先级顺序。

要设置优先级来对策略进行排序:

# firewall-cmd --permanent --policy mypolicy --set-priority -500

在上例中,-500 是较低的优先级值,但具有较高的优先级。因此,-500 将在 -100 之前执行。

较低数字优先级值具有更高的优先级,首先应用。

9.10.3. 使用策略对象过滤本地托管的容器和物理连接到主机的网络之间的流量

策略对象功能允许用户过滤 Podman 和 firewalld 区域之间的流量。

注意

红帽建议默认阻止所有流量,并打开 Podman 工具所需的可选择的服务。

流程

  1. 创建一个新的防火墙策略:

    # firewall-cmd --permanent --new-policy podmanToAny
  2. 阻止从 Podman 到其它区域的所有流量,并只允许 Podman 上必要的服务:

    # firewall-cmd --permanent --policy podmanToAny --set-target REJECT
    # firewall-cmd --permanent --policy podmanToAny --add-service dhcp
    # firewall-cmd --permanent --policy podmanToAny --add-service dns
    # firewall-cmd --permanent --policy podmanToAny --add-service https
  3. 创建一个新的 Podman 区域:

    # firewall-cmd --permanent --new-zone=podman
  4. 为策略定义 ingress 区域:

    # firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman
  5. 为所有其他区域定义 egress 区域:

    # firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANY

    将 egress 区域设置为 ANY 意味着您可以从 Podman 过滤到其他区。如果要过滤到主机,则将 egress 区域设置为 HOST。

  6. 重启 firewalld 服务:

    # systemctl restart firewalld

验证

  • 验证到其他区域的 Podman 防火墙策略:

    # firewall-cmd --info-policy podmanToAny
    podmanToAny (active)
      ...
      target: REJECT
      ingress-zones: podman
      egress-zones: ANY
      services: dhcp dns https
      ...

9.10.4. 设置策略对象的默认目标

您可以为策略指定 --set-target 选项。可用的目标如下:

  • ACCEPT - 接受数据包
  • DROP - 丢弃不需要的数据包
  • REJECT - 拒绝不需要的数据包,并带有 ICMP 回复
  • CONTINUE(默认)- 数据包将遵循以下策略和区域中的规则。

    # firewall-cmd --permanent --policy mypolicy --set-target CONTINUE

验证

  • 验证有关策略的信息

    # firewall-cmd --info-policy mypolicy

9.10.5. 使用 DNAT 将 HTTPS 流量转发到不同主机

如果您的 web 服务器使用私有 IP 地址在 DMZ 中运行,您可以配置目标网络地址转换 (DNAT) 以使互联网上的客户端能够连接到此 web 服务器。在本例中,Web 服务器的主机名解析为路由器的公共 IP 地址。当客户端建立到路由器上定义的端口的连接时,路由器会将数据包转发到内部 Web 服务器。

前提条件

  • DNS 服务器将 Web 服务器的主机名解析为路由器的 IP 地址。
  • 您知道以下设置:

    • 您要转发的专用 IP 地址和端口号
    • 要使用的 IP 协议
    • 要重定向数据包的 web 服务器的目标 IP 地址和端口

流程

  1. 创建防火墙策略:

    # firewall-cmd --permanent --new-policy <example_policy>

    与区域不同,策略也允许数据包过滤输入、输出和转发流量。这很重要,因为将流量转发到本地的 web 服务器、容器或虚拟机上的端点需要此类功能。

  2. 为入站和出站流量配置符号链接区域,以便路由器本身连接到其本地 IP 地址并转发此流量:

    # firewall-cmd --permanent --policy=<example_policy> --add-ingress-zone=HOST
    # firewall-cmd --permanent --policy=<example_policy> --add-egress-zone=ANY

    --add-ingress-zone=HOST 选项是指本地生成的数据包,并从本地主机中传输。--add-egress-zone=ANY 选项引用移动到任何区域的流量。

  3. 添加将流量转发到 Web 服务器的富规则:

    # firewall-cmd --permanent --policy=<example_policy> --add-rich-rule='rule family="ipv4" destination address="192.0.2.1" forward-port port="443" protocol="tcp" to-port="443" to-addr="192.51.100.20"'

    富规则将路由器 IP 地址(192.0.2.1)上端口 443 的 TCP 流量转发到 Web 服务器 IP 地址(192.51.100.20)的端口 443。

  4. 重新载入防火墙配置文件:

    # firewall-cmd --reload
    success
  5. 在内核中激活 127.0.0.0/8 的路由:

    • 对于持久性更改,请运行:

      # echo "net.ipv4.conf.all.route_localnet=1" > /etc/sysctl.d/90-enable-route-localnet.conf

      命令永久配置 route_localnet 内核参数,并确保设置在系统重启后保留。

    • 要在不重启系统的情况下立即应用设置,请运行:

      # sysctl -p /etc/sysctl.d/90-enable-route-localnet.conf

      sysctl 命令可用于应用实时更改,但配置在系统重启后不会保留。

验证

  1. 连接到路由器的 IP 地址和您转发到 web 服务器的端口:

    # curl https://192.0.2.1:443
  2. 可选:验证 net.ipv4.conf.all.route_localnet 内核参数是否活跃:

    # sysctl net.ipv4.conf.all.route_localnet
    net.ipv4.conf.all.route_localnet = 1
  3. 验证 <example_policy> 是否活跃,并包含您需要的设置,特别是源 IP 地址和端口,要使用的协议以及目标 IP 地址和端口:

    # firewall-cmd --info-policy=<example_policy>
    example_policy (active)
      priority: -1
      target: CONTINUE
      ingress-zones: HOST
      egress-zones: ANY
      services:
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:
    	rule family="ipv4" destination address="192.0.2.1" forward-port port="443" protocol="tcp" to-port="443" to-addr="192.51.100.20"

其他资源