×

Ingress 节点防火墙运算符

Ingress 节点防火墙运算符通过将守护程序集部署到您在防火墙配置中指定和管理的节点来提供节点级别的入口防火墙规则。要部署守护程序集,您需要创建一个IngressNodeFirewallConfig自定义资源 (CR)。该运算符应用IngressNodeFirewallConfig CR 来创建入口节点防火墙守护程序集daemon,该守护程序集在与nodeSelector匹配的所有节点上运行。

您可以配置IngressNodeFirewall CR 的rules,并使用nodeSelector将它们应用于集群,并将值设置为“true”。

Ingress 节点防火墙运算符仅支持无状态防火墙规则。

不支持原生 XDP 驱动的网络接口控制器 (NIC) 将以较低的性能运行。

对于 OpenShift Container Platform 4.14 或更高版本,您必须在 RHEL 9.0 或更高版本上运行 Ingress 节点防火墙运算符。

安装 Ingress 节点防火墙运算符

作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台安装 Ingress 节点防火墙运算符。

使用 CLI 安装 Ingress 节点防火墙运算符

作为集群管理员,您可以使用 CLI 安装运算符。

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您拥有具有管理员权限的帐户。

步骤
  1. 要创建openshift-ingress-node-firewall命名空间,请输入以下命令:

    $ cat << EOF| oc create -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        pod-security.kubernetes.io/enforce: privileged
        pod-security.kubernetes.io/enforce-version: v1.24
      name: openshift-ingress-node-firewall
    EOF
  2. 要创建OperatorGroup CR,请输入以下命令:

    $ cat << EOF| oc create -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: ingress-node-firewall-operators
      namespace: openshift-ingress-node-firewall
    EOF
  3. 订阅 Ingress 节点防火墙运算符。

    1. 要为 Ingress 节点防火墙运算符创建Subscription CR,请输入以下命令:

      $ cat << EOF| oc create -f -
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: ingress-node-firewall-sub
        namespace: openshift-ingress-node-firewall
      spec:
        name: ingress-node-firewall
        channel: stable
        source: redhat-operators
        sourceNamespace: openshift-marketplace
      EOF
  4. 要验证运算符是否已安装,请输入以下命令:

    $ oc get ip -n openshift-ingress-node-firewall
    示例输出
    NAME            CSV                                         APPROVAL    APPROVED
    install-5cvnz   ingress-node-firewall.4.17.0-202211122336   Automatic   true
  5. 要验证运算符的版本,请输入以下命令:

    $ oc get csv -n openshift-ingress-node-firewall
    示例输出
    NAME                                        DISPLAY                          VERSION               REPLACES                                    PHASE
    ingress-node-firewall.4.17.0-202211122336   Ingress Node Firewall Operator   4.17.0-202211122336   ingress-node-firewall.4.17.0-202211102047   Succeeded

使用Web控制台安装Ingress Node Firewall Operator

作为集群管理员,您可以使用Web控制台安装Operator。

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您拥有具有管理员权限的帐户。

步骤
  1. 安装Ingress Node Firewall Operator

    1. 在OpenShift Container Platform Web控制台中,单击**Operators** → **OperatorHub**。

    2. 从可用Operator列表中选择**Ingress Node Firewall Operator**,然后单击**Install**。

    3. 在**Install Operator**页面上的**Installed Namespace**下,选择**Operator recommended Namespace**。

    4. 单击**Install**。

  2. 验证Ingress Node Firewall Operator是否已成功安装

    1. 导航到**Operators** → **Installed Operators**页面。

    2. 确保**Ingress Node Firewall Operator**列在**openshift-ingress-node-firewall**项目中,且**Status**为**InstallSucceeded**。

      安装过程中,Operator可能会显示**Failed**状态。如果安装稍后以**InstallSucceeded**消息成功,您可以忽略**Failed**消息。

      如果Operator的**Status**不是**InstallSucceeded**,请使用以下步骤进行故障排除

      • 检查**Operator Subscriptions**和**Install Plans**选项卡中**Status**下的任何故障或错误。

      • 导航到**Workloads** → **Pods**页面,并检查openshift-ingress-node-firewall项目中pod的日志。

      • 检查YAML文件的命名空间。如果缺少注释,您可以使用以下命令向Operator命名空间添加注释workload.openshift.io/allowed=management

        $ oc annotate ns/openshift-ingress-node-firewall workload.openshift.io/allowed=management

        对于单节点OpenShift集群,openshift-ingress-node-firewall命名空间需要workload.openshift.io/allowed=management注释。

部署Ingress Node Firewall Operator

前提条件
  • 已安装Ingress Node Firewall Operator。

步骤

要部署Ingress Node Firewall Operator,请创建一个IngressNodeFirewallConfig自定义资源,该资源将部署Operator的daemon set。您可以通过应用防火墙规则将一个或多个IngressNodeFirewall CRD部署到节点。

  1. 在名为ingressnodefirewallconfigopenshift-ingress-node-firewall命名空间内创建IngressNodeFirewallConfig

  2. 运行以下命令来部署Ingress Node Firewall Operator规则

    $ oc apply -f rule.yaml

Ingress Node Firewall配置对象

下表描述了Ingress Node Firewall配置对象的字段

表1. Ingress Node Firewall配置对象
字段 类型 描述

metadata.name

字符串

CR对象的名称。防火墙规则对象的名称必须为ingressnodefirewallconfig

metadata.namespace

字符串

Ingress Firewall Operator CR对象的命名空间。IngressNodeFirewallConfig CR必须在openshift-ingress-node-firewall命名空间内创建。

spec.nodeSelector

字符串

用于通过指定的节点标签来定位节点的节点选择约束。例如

spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ""

nodeSelector中使用的标签必须与节点上的标签匹配,才能启动daemon set。例如,如果节点标签node-role.kubernetes.io/workernode-type.kubernetes.io/vm应用于节点,则必须使用nodeSelector设置至少一个标签才能启动daemon set。

spec.ebpfProgramManagerMode

布尔值

指定Node Ingress Firewall Operator是否使用eBPF Manager Operator来管理eBPF程序。此功能是技术预览功能。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

Operator使用CR并根据nodeSelector在所有匹配的节点上创建一个ingress node firewall daemon set。

Ingress Node Firewall Operator示例配置

以下示例指定了完整的Ingress Node Firewall配置

示例Ingress Node Firewall配置对象
apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewallConfig
metadata:
  name: ingressnodefirewallconfig
  namespace: openshift-ingress-node-firewall
spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ""

Operator使用CR并根据nodeSelector在所有匹配的节点上创建一个ingress node firewall daemon set。

Ingress Node Firewall规则对象

下表描述了Ingress Node Firewall规则对象的字段

表2. Ingress Node Firewall规则对象
字段 类型 描述

metadata.name

字符串

CR对象的名称。

interfaces

数组

此对象的字段指定要应用防火墙规则的接口。例如,- en0- en1

nodeSelector

数组

您可以使用nodeSelector选择要应用防火墙规则的节点。将命名nodeselector标签的值设置为true以应用规则。

ingress

对象

ingress允许您配置允许外部访问集群上服务的规则。

Ingress对象配置

下表定义了ingress对象的数值

表3. ingress对象
字段 类型 描述

sourceCIDRs

数组

允许您设置CIDR块。您可以配置来自不同地址族的多个CIDR。

不同的CIDR允许您使用相同的顺序规则。如果同一节点和接口的多个IngressNodeFirewall对象具有重叠的CIDR,则order字段将指定首先应用哪个规则。规则按升序应用。

rules

数组

Ingress防火墙rules.order对象从每个source.CIDR1开始排序,每个CIDR最多100条规则。较低顺序的规则先执行。

rules.protocolConfig.protocol支持以下协议:TCP、UDP、SCTP、ICMP和ICMPv6。ICMP和ICMPv6规则可以匹配ICMP和ICMPv6类型或代码。TCP、UDP和SCTP规则可以匹配单个目标端口或使用<start : end-1>格式的端口范围。

rules.action设置为allow以应用规则,或设置为deny以禁止规则。

Ingress防火墙规则使用验证Webhook进行验证,该Webhook阻止任何无效配置。验证Webhook可防止您阻止任何关键的集群服务,例如API服务器。

Ingress Node Firewall规则对象示例

以下示例指定了完整的Ingress Node Firewall配置

示例Ingress Node Firewall配置
apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewall
metadata:
  name: ingressnodefirewall
spec:
  interfaces:
  - eth0
  nodeSelector:
    matchLabels:
      <ingress_firewall_label_name>: <label_value> (1)
  ingress:
  - sourceCIDRs:
       - 172.16.0.0/12
    rules:
    - order: 10
      protocolConfig:
        protocol: ICMP
        icmp:
          icmpType: 8 #ICMP Echo request
      action: Deny
    - order: 20
      protocolConfig:
        protocol: TCP
        tcp:
          ports: "8000-9000"
      action: Deny
  - sourceCIDRs:
       - fc00:f853:ccd:e793::0/64
    rules:
    - order: 10
      protocolConfig:
        protocol: ICMPv6
        icmpv6:
          icmpType: 128 #ICMPV6 Echo request
      action: Deny
1 节点上必须存在一个``和一个``,并且必须与应用于您希望`ingressfirewallconfig` CR在其上运行的节点的`nodeselector`标签和值匹配。``可以是`true`或`false`。通过使用`nodeSelector`标签,您可以将不同的规则应用于不同的节点组,以使用`ingressfirewallconfig` CR。

零信任入口节点防火墙规则示例

零信任入口节点防火墙规则可以为多接口集群提供额外的安全性。例如,您可以使用零信任入口节点防火墙规则来丢弃特定接口上的所有流量,除了SSH流量。

以下示例指定了零信任入口节点防火墙规则集的完整配置

为了确保正常功能,用户需要在以下情况下将应用程序将使用的所有端口添加到允许列表。

零信任入口节点防火墙规则示例
apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewall
metadata:
 name: ingressnodefirewall-zero-trust
spec:
 interfaces:
 - eth1 (1)
 nodeSelector:
   matchLabels:
     <ingress_firewall_label_name>: <label_value> (2)
 ingress:
 - sourceCIDRs:
      - 0.0.0.0/0 (3)
   rules:
   - order: 10
     protocolConfig:
       protocol: TCP
       tcp:
         ports: 22
     action: Allow
   - order: 20
     action: Deny (4)
1 网络接口集群
2 ``和``需要与应用于您希望应用`ingressfirewallconfig` CR的特定节点的`nodeSelector`标签和值匹配。
3 `0.0.0.0/0` 用于匹配任何CIDR
4 `action`设置为`Deny`

eBPF Manager Operator 集成只是一个技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

入口节点防火墙 Operator 集成

入口节点防火墙使用eBPF程序来实现其一些关键的防火墙功能。默认情况下,这些 eBPF 程序使用入口节点防火墙特有的机制加载到内核中。您可以将入口节点防火墙 Operator 配置为改为使用 eBPF Manager Operator 来加载和管理这些程序。

启用此集成后,将应用以下限制

  • 如果 XDP 不可用且 TCX 与 bpfman 不兼容,则入口节点防火墙 Operator 将使用 TCX。

  • 入口节点防火墙 Operator 守护程序集 Pod 将保持在`ContainerCreating`状态,直到应用防火墙规则。

  • 入口节点防火墙 Operator 守护程序集 Pod 作为特权运行。

配置入口节点防火墙 Operator 以使用 eBPF Manager Operator

入口节点防火墙使用eBPF程序来实现其一些关键的防火墙功能。默认情况下,这些 eBPF 程序使用入口节点防火墙特有的机制加载到内核中。

作为集群管理员,您可以将入口节点防火墙 Operator 配置为改为使用 eBPF Manager Operator 来加载和管理这些程序,从而增加额外的安全性和可观察性功能。

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您拥有具有管理员权限的帐户。

  • 您已安装入口节点防火墙 Operator。

  • 您已安装 eBPF Manager Operator。

步骤
  1. 将以下标签应用于`ingress-node-firewall-system`命名空间

    $ oc label namespace openshift-ingress-node-firewall \
        pod-security.kubernetes.io/enforce=privileged \
        pod-security.kubernetes.io/warn=privileged --overwrite
  2. 编辑名为`ingressnodefirewallconfig`的`IngressNodeFirewallConfig`对象并设置`ebpfProgramManagerMode`字段

    入口节点防火墙 Operator 配置对象
    apiVersion: ingressnodefirewall.openshift.io/v1alpha1
    kind: IngressNodeFirewallConfig
    metadata:
      name: ingressnodefirewallconfig
      namespace: openshift-ingress-node-firewall
    spec:
      nodeSelector:
        node-role.kubernetes.io/worker: ""
      ebpfProgramManagerMode: <ebpf_mode>

    其中

    `<ebpf_mode>`: 指定入口节点防火墙 Operator 是否使用 eBPF Manager Operator 来管理 eBPF 程序。必须为`true`或`false`。如果未设置,则不使用 eBPF Manager。

查看入口节点防火墙 Operator 规则

步骤
  1. 运行以下命令以查看所有当前规则

    $ oc get ingressnodefirewall
  2. 选择一个返回的`<resource>`名称,然后运行以下命令以查看规则或配置

    $ oc get <resource> <name> -o yaml

入口节点防火墙 Operator 故障排除

  • 运行以下命令列出已安装的入口防火墙自定义资源定义 (CRD)

    $ oc get crds | grep ingressnodefirewall
    示例输出
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    ingressnodefirewallconfigs.ingressnodefirewall.openshift.io       2022-08-25T10:03:01Z
    ingressnodefirewallnodestates.ingressnodefirewall.openshift.io    2022-08-25T10:03:00Z
    ingressnodefirewalls.ingressnodefirewall.openshift.io             2022-08-25T10:03:00Z
  • 运行以下命令以查看入口节点防火墙 Operator 的状态

    $ oc get pods -n openshift-ingress-node-firewall
    示例输出
    NAME                                       READY  STATUS         RESTARTS  AGE
    ingress-node-firewall-controller-manager   2/2    Running        0         5d21h
    ingress-node-firewall-daemon-pqx56         3/3    Running        0         5d21h

    以下字段提供有关 Operator 状态的信息:`READY`、`STATUS`、`AGE`和`RESTARTS`。当入口节点防火墙 Operator 将守护程序集部署到分配的节点时,`STATUS`字段为`Running`。

  • 运行以下命令收集所有入口防火墙节点 Pod 的日志

    $ oc adm must-gather – gather_ingress_node_firewall

    日志可在包含 eBPF `bpftool` 输出(位于`/sos_commands/ebpf`)的 sos 节点报告中找到。这些报告包括用作入口防火墙 XDP 处理数据包处理、更新统计信息和发出事件时使用的或更新的查找表。