6.5. OpenShift Container Platform 中的 Ingress Node Firewall Operator
Ingress Node Firewall Operator 允许管理员在节点级别管理防火墙配置。
6.5.1. Ingress Node Firewall Operator
Ingress Node Firewall Operator 通过将守护进程集部署到您在防火墙配置中指定和管理的节点,在节点级别提供入口防火墙规则。要部署守护进程集,请创建一个 IngressNodeFirewallConfig
自定义资源 (CR)。Operator 应用 IngressNodeFirewallConfig
CR 来创建入口节点防火墙守护进程集 daemon
,它在与 nodeSelector
匹配的所有节点上运行。
您可以配置 IngressNodeFirewall
CR 的规则
,并使用 nodeSelector
将值设置为 "true" 的集群。
Ingress Node Firewall Operator 仅支持无状态防火墙规则。
不支持原生 XDP 驱动程序的网络接口控制器 (NIC) 将以较低性能运行。
对于 OpenShift Container Platform 4.14 或更高的版本,您必须在 RHEL 9.0 或更高版本上运行 Ingress Node Firewall Operator。
6.5.2. 安装 Ingress Node Firewall Operator
作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台安装 Ingress Node Firewall Operator。
6.5.2.1. 使用 CLI 安装 Ingress Node Firewall Operator
作为集群管理员,您可以使用 CLI 安装 Operator。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 有管理员特权的帐户。
流程
运行以下命令来创建
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
运行以下命令来创建
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
订阅 Ingress Node Firewall Operator。
要为 Ingress Node Firewall Operator 创建
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
要验证是否已安装 Operator,请输入以下命令:
$ oc get ip -n openshift-ingress-node-firewall
输出示例
NAME CSV APPROVAL APPROVED install-5cvnz ingress-node-firewall.4.16.0-202211122336 Automatic true
要验证 Operator 的版本,请输入以下命令:
$ oc get csv -n openshift-ingress-node-firewall
输出示例
NAME DISPLAY VERSION REPLACES PHASE ingress-node-firewall.4.16.0-202211122336 Ingress Node Firewall Operator 4.16.0-202211122336 ingress-node-firewall.4.16.0-202211102047 Succeeded
6.5.2.2. 使用 Web 控制台安装 Ingress Node Firewall Operator
作为集群管理员,您可以使用 Web 控制台安装 Operator。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 有管理员特权的帐户。
流程
安装 Ingress Node Firewall Operator:
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
OperatorHub。 - 从可用的 Operator 列表中选择 Ingress Node Firewall Operator,然后点 Install。
- 在 Install Operator 页面中,在 Installed Namespace 下选择 Operator recommended Namespace。
- 点 Install。
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
验证 Ingress Node Firewall Operator 是否已成功安装:
-
导航到 Operators
Installed Operators 页面。 确保 openshift-ingress-node-firewall 项目中列出的 Ingress Node Firewall Operator 的 Status 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有 InstallSucceeded 状态,请按照以下步骤进行故障排除:
- 检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
-
进入到 Workloads
Pods 页面,在 openshift-ingress-node-firewall
项目中检查 pod 的日志。 检查 YAML 文件的命名空间。如果缺少注解,您可以使用以下命令将注解
workload.openshift.io/allowed=management
添加到 Operator 命名空间中:$ oc annotate ns/openshift-ingress-node-firewall workload.openshift.io/allowed=management
注意对于单节点 OpenShift 集群,
openshift-ingress-node-firewall
命名空间需要workload.openshift.io/allowed=management
注解。
-
导航到 Operators
6.5.3. 部署 Ingress Node Firewall Operator
前提条件
- 已安装 Ingress Node Firewall Operator。
流程
要拒绝 Ingress Node Firewall Operator,请创建一个 IngressNodeFirewallConfig
自定义资源,该资源将部署 Operator 的守护进程集。您可以通过应用防火墙规则,将一个或多个 IngressNodeFirewall
CRD 部署到节点。
-
在
openshift-ingress-node-firewall
命名空间中创建IngressNodeFirewallConfig
,名为ingressnodefirewallconfig
。 运行以下命令来部署 Ingress Node Firewall Operator 规则:
$ oc apply -f rule.yaml
6.5.3.1. Ingress 节点防火墙配置对象
下表中描述了 Ingress Node Firewall 配置对象的字段:
字段 | 类型 | 描述 |
---|---|---|
|
|
CR 对象的名称。防火墙规则对象的名称必须是 |
|
|
Ingress Firewall Operator CR 对象的命名空间。 |
|
| 通过指定节点标签 (label) 用于目标节点的节点选择约束。例如: spec: nodeSelector: node-role.kubernetes.io/worker: "" 注意
|
Operator 使用 CR,并在与 nodeSelector
匹配的所有节点上创建一个入口节点防火墙守护进程集。
Ingress Node Firewall Operator 示例配置
以下示例中指定了完整的 Ingress Node 防火墙配置:
Ingress 节点防火墙配置对象示例
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
匹配的所有节点上创建一个入口节点防火墙守护进程集。
6.5.3.2. Ingress 节点防火墙规则对象
下表中描述了 Ingress Node Firewall 规则对象的字段:
字段 | 类型 | 描述 |
---|---|---|
|
| CR 对象的名称。 |
|
|
此对象的字段指定要应用防火墙规则的接口。例如, |
|
|
您可以使用 |
|
|
|
Ingress 对象配置
ingress
对象的值在下表中定义:
字段 | 类型 | 描述 |
---|---|---|
|
| 允许您设置 CIDR 块。您可以从不同地址系列配置多个 CIDR。 注意
不同的 CIDR 允许您使用相同的顺序规则。如果同一节点有多个 |
|
|
对于每个
将 注意 Ingress 防火墙规则使用阻止任何无效配置的验证 Webhook 进行验证。验证 Webhook 会阻止阻塞任何关键集群服务,如 API 服务器。 |
Ingress 节点防火墙规则对象示例
以下示例中指定了完整的 Ingress Node 防火墙配置:
Ingress 节点防火墙配置示例
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
- 节点上必须存在 <label_name> 和 <label_value>,且必须与应用到您希望
ingressfirewallconfig
CR 运行的节点的nodeselector
标签和值匹配。<label_value> 可以是true
或false
。通过使用nodeSelector
标签,您可以针对单独的节点组为目标,以使用ingressfirewallconfig
CR 应用不同的规则。
零信任 Ingress Node Firewall 规则对象示例
零信任 Ingress 节点防火墙规则可为多接口集群提供额外的安全性。例如,您可以使用零信任 Ingress Node Firewall 规则来丢弃除 SSH 之外的特定接口上的网络流量。
以下示例中指定了零信任 Ingress Node Firewall 规则集的完整配置:
用户需要为其提供应用程序使用的所有端口添加到允许列表,以确保正常工作。
零信任 Ingress 节点防火墙规则示例
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
6.5.4. 查看 Ingress Node Firewall Operator 规则
流程
运行以下命令来查看所有当前规则:
$ oc get ingressnodefirewall
选择返回的
<resource>
名称之一,并运行以下命令来查看规则或配置:$ oc get <resource> <name> -o yaml
6.5.5. 对 Ingress Node Firewall Operator 进行故障排除
运行以下命令列出已安装的 Ingress Node Firewall 自定义资源定义 (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
运行以下命令,以查看 Ingress Node Firewall 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
。当 Ingress Node Firewall Operator 将守护进程集部署到分配的节点时,STATUS
字段为Running
。运行以下命令来收集所有入口防火墙节点 pod 的日志:
$ oc adm must-gather – gather_ingress_node_firewall
在 sos 节点的报告中,其中包含位于
/sos_commands/ebpf
的 eBPFbpftool
输出的报告。这些报告包括用于或作为入口防火墙 XDP 处理数据包处理、更新统计信息和发出事件的查找表。