Chapter 2. Configuring your firewall
If you use a firewall, you must configure your firewall’s allowlist to ensure OpenShift Container Platform has access to the URLs it requires to pull container images and access Red Hat services. Additional URLs are required for features such as Telemetry, Red Hat Lightspeed, cloud provider integrations, or certain build strategies.
2.1. Configuring your firewall for OpenShift Container Platform Copy linkLink copied to clipboard!
Before you install OpenShift Container Platform, you must configure your firewall to grant access to the sites that OpenShift Container Platform requires. When using a firewall, make additional configurations to the firewall so that OpenShift Container Platform can access the sites that it requires to function.
There are no special configuration considerations for services running on only controller nodes compared to compute nodes.
If your environment has a dedicated load balancer in front of your OpenShift Container Platform cluster, review the allowlists between your firewall and load balancer to prevent unwanted network restrictions to your cluster.
Procedure
Allowlist the following container registry URLs for cluster installation and upgrades:
Expand URL Port Function registry.redhat.io443
Provides core container images
access.redhat.com443
Hosts a signature store that a container client requires for verifying images pulled from
registry.access.redhat.com. In a firewall environment, ensure that this resource is on the allowlist.registry.access.redhat.com443
Hosts all the container images that are stored on the Red Hat Ecosystem Catalog, including core container images.
quay.io443
Provides core container images
cdn.quay.io443
Provides core container images
cdn01.quay.io443
Provides core container images
cdn02.quay.io443
Provides core container images
cdn03.quay.io443
Provides core container images
cdn04.quay.io443
Provides core container images
cdn05.quay.io443
Provides core container images
cdn06.quay.io443
Provides core container images
icr.io443
Provides IBM Cloud Pak container images. This domain is only required if you use IBM Cloud Paks.
cp.icr.io443
Provides IBM Cloud Pak container images. This domain is only required if you use IBM Cloud Paks.
-
You can use the wildcard
*.quay.ioinstead ofcdn.quay.ioandcdn0[1-6].quay.ioin your allowlist. -
You can use the wildcard
*.access.redhat.comto simplify the configuration and ensure that all subdomains, includingregistry.access.redhat.com, are allowed. -
When adding a site such as
quay.ioto your allowlist, do not add a wildcard entry such as*.quay.ioto your denylist. In most cases, image registries use a content delivery network (CDN) to serve images. If a firewall blocks access, image downloads are denied when the initial download request redirects to a hostname such ascdn01.quay.io.
-
You can use the wildcard
Allowlist the following URLs to enable cluster access, authentication, and updates:
Expand URL Port Function *.apps.<cluster_name>.<base_domain>443
Allowlist these URLs to enable cluster access, authentication, and updates.
api.openshift.com443
API endpoint for cluster tokens and update checks.
console.redhat.com443
Authentication service for cluster tokens.
sso.redhat.com443
The
https://console.redhat.comsite uses authentication fromsso.redhat.comFor egress traffic, Operators require route access to perform health checks to establish a connection for reaching endpoints. The authentication and web console Operators connect to two routes to verify functionality. Cluster administrators who do not want to allow
*.apps.<cluster_name>.<base_domain>, must allow the following routes:-
oauth-openshift.apps.<cluster_name>.<base_domain> -
canary-openshift-ingress-canary.apps.<cluster_name>.<base_domain> -
console-openshift-console.apps.<cluster_name>.<base_domain>, or the hostname that is specified in thespec.route.hostnamefield of theconsoles.operator/clusterobject if the field is not empty.
-
Allowlist the following registry URLs that host related artifacts for cluster installation and upgrades, such as installation content, release images, and client tools:
Expand URL Port Function mirror.openshift.com443
Required to access mirrored installation content and images. This site is also a source of release image signatures, although the Cluster Version Operator needs only a single functioning source.
quayio-production-s3.s3.amazonaws.com443
Required to access Quay image content in AWS.
rhcos.mirror.openshift.com443
Required to download Red Hat Enterprise Linux CoreOS (RHCOS) images.
storage.googleapis.com/openshift-release443
A source of release image signatures, although the Cluster Version Operator needs only a single functioning source.
- Set your firewall’s allowlist to include any site that provides resources for a language or framework that your builds require.
If you do not disable Telemetry, you must grant access to the following URLs to access Telemetry and Red Hat Lightspeed:
Expand URL Port Function cert-api.access.redhat.com443
Required for Telemetry
api.access.redhat.com443
Required for Telemetry
infogw.api.openshift.com443
Required for Telemetry
console.redhat.com443
Required for Telemetry and for
insights-operatorIf you use Alibaba Cloud, Amazon Web Services (AWS), Microsoft Azure, or Google Cloud to host your cluster, you must grant access to the URLs that offer the cloud provider API and DNS for that cloud:
Expand Cloud URL Port Function Alibaba
*.aliyuncs.com443
Required to access Alibaba Cloud services and resources. Review the Alibaba endpoints_config.go file to find the exact endpoints to allow for the regions that you use.
AWS
aws.amazon.com443
Used to install and manage clusters in an AWS environment.
*.amazonaws.comAlternatively, if you choose to not use a wildcard for AWS APIs, you must include the following URLs in your allowlist:
443
Required to access AWS services and resources. Review the AWS Service Endpoints in the AWS documentation to find the exact endpoints to allow for the regions that you use.
ec2.amazonaws.com443
Used to install and manage clusters in an AWS environment.
events.amazonaws.com443
Used to install and manage clusters in an AWS environment.
iam.amazonaws.com443
Used to install and manage clusters in an AWS environment.
route53.amazonaws.com443
Used to install and manage clusters in an AWS environment.
*.s3.amazonaws.com443
Used to install and manage clusters in an AWS environment.
*.s3.<aws_region>.amazonaws.com443
Used to install and manage clusters in an AWS environment.
*.s3.dualstack.<aws_region>.amazonaws.com443
Used to install and manage clusters in an AWS environment.
sts.amazonaws.com443
Used to install and manage clusters in an AWS environment.
sts.<aws_region>.amazonaws.com443
Used to install and manage clusters in an AWS environment.
tagging.us-east-1.amazonaws.com443
Used to install and manage clusters in an AWS environment. This endpoint is always
us-east-1, regardless of the region the cluster is deployed in.ec2.<aws_region>.amazonaws.com443
Used to install and manage clusters in an AWS environment.
elasticloadbalancing.<aws_region>.amazonaws.com443
Used to install and manage clusters in an AWS environment.
servicequotas.<aws_region>.amazonaws.com443
Required. Used to confirm quotas for deploying the service.
tagging.<aws_region>.amazonaws.com443
Allows the assignment of metadata about AWS resources in the form of tags.
*.cloudfront.net443
Used to provide access to CloudFront. If you use the AWS Security Token Service (STS) and the private S3 bucket, you must provide access to CloudFront.
GCP
*.googleapis.com443
Required to access Google Cloud services and resources. Review Cloud Endpoints in the Google Cloud documentation to find the endpoints to allow for your APIs.
accounts.google.com443
Required to access your Google Cloud account.
Microsoft Azure
management.azure.com443
Required to access Microsoft Azure services and resources. Review the Microsoft Azure REST API reference in the Microsoft Azure documentation to find the endpoints to allow for your APIs.
*.blob.core.windows.net443
Required to download Ignition files.
login.microsoftonline.com443
Required to access Microsoft Azure services and resources. Review the Azure REST API reference in the Microsoft Azure documentation to find the endpoints to allow for your APIs.
Allowlist the following URL for optional third-party content:
Expand URL Port Function registry.connect.redhat.com443
Required for all third-party images and certified operators.
If you use a default Red Hat Network Time Protocol (NTP) server, allow the following URLs. NTP operates on User Datagram Protocol (UDP) port 123, so this port must be opened on the firewall.
Expand URL Port Function 1.rhel.pool.ntp.org123
Provides NTP services for time synchronization.
2.rhel.pool.ntp.org123
Provides NTP services for time synchronization.
3.rhel.pool.ntp.org123
Provides NTP services for time synchronization.
If you do not use a default Red Hat NTP server, verify the NTP server for your platform and allow it in your firewall.
2.2. OpenShift Container Platform network flow matrix Copy linkLink copied to clipboard!
The following network flow matrixes describe the ingress flows to OpenShift Container Platform services for the following environments:
- OpenShift Container Platform on bare metal
- Single-node OpenShift with other platforms
- OpenShift Container Platform on Amazon Web Services (AWS)
- Single-node OpenShift on AWS
You can use the commatrix plugin for the oc command to generate local network flow data for your cluster. For more information see "Generating ingress network flow data using the commatrix plugin".
Use the information in the appropriate network flow matrix to help you manage ingress traffic for your specific environment. You can restrict ingress traffic to essential flows to improve network security.
Additionally, consider the following dynamic port ranges when managing ingress traffic for both bare metal and cloud environments:
-
9000-9999: Reserved for internal OpenShift Container Platform components. Do not assign user workloads or services to ports in this range. -
30000-32767: KubernetesNodePortservice ports. These ports are required only if you expose services by using theNodePortservice type. IfNodePortservices are not used, you can block this port range.
To view or download the complete raw CSV content for an environment, see the following resources:
The network flow matrixes describe ingress traffic flows for a base OpenShift Container Platform or single-node OpenShift installation. The matrixes do not apply for hosted control planes, Red Hat build of MicroShift, or standalone clusters.
2.2.1. Base network flows Copy linkLink copied to clipboard!
The following matrixes describe the base ingress flows to OpenShift Container Platform services.
For base ingress flows to single-node OpenShift clusters, see the Control plane node base flows matrix only.
| Direction | Protocol | Port | Namespace | Service | Pod | Container | Node Role | Optional |
|---|---|---|---|---|---|---|---|---|
| Ingress | TCP | 22 | Host system service | sshd | master | TRUE | ||
| Ingress | TCP | 111 | Host system service | rpcbind | master | TRUE | ||
| Ingress | TCP | 2379 | openshift-etcd | etcd | etcd | etcdctl | master | FALSE |
| Ingress | TCP | 2380 | openshift-etcd | healthz | etcd | etcd | master | FALSE |
| Ingress | TCP | 6080 | openshift-kube-apiserver | kube-apiserver | kube-apiserver-insecure-readyz | master | FALSE | |
| Ingress | TCP | 6443 | openshift-kube-apiserver | apiserver | kube-apiserver | kube-apiserver | master | FALSE |
| Ingress | TCP | 8798 | openshift-machine-config-operator | machine-config-daemon | machine-config-daemon | machine-config-daemon | master | FALSE |
| Ingress | TCP | 9001 | openshift-machine-config-operator | machine-config-daemon | machine-config-daemon | kube-rbac-proxy | master | FALSE |
| Ingress | TCP | 9099 | openshift-cluster-version | cluster-version-operator | cluster-version-operator | cluster-version-operator | master | FALSE |
| Ingress | TCP | 9100 | openshift-monitoring | node-exporter | node-exporter | kube-rbac-proxy | master | FALSE |
| Ingress | TCP | 9103 | openshift-ovn-kubernetes | ovn-kubernetes-node | ovnkube-node | kube-rbac-proxy-node | master | FALSE |
| Ingress | TCP | 9104 | openshift-network-operator | metrics | network-operator | network-operator | master | FALSE |
| Ingress | TCP | 9105 | openshift-ovn-kubernetes | ovn-kubernetes-node | ovnkube-node | kube-rbac-proxy-ovn-metrics | master | FALSE |
| Ingress | TCP | 9107 | openshift-ovn-kubernetes | egressip-node-healthcheck | ovnkube-node | ovnkube-controller | master | FALSE |
| Ingress | TCP | 9108 | openshift-ovn-kubernetes | ovn-kubernetes-control-plane | ovnkube-control-plane | kube-rbac-proxy | master | FALSE |
| Ingress | TCP | 9192 | openshift-cluster-machine-approver | machine-approver | machine-approver | kube-rbac-proxy | master | FALSE |
| Ingress | TCP | 9258 | openshift-cloud-controller-manager-operator | machine-approver | cluster-cloud-controller-manager | cluster-cloud-controller-manager | master | FALSE |
| Ingress | TCP | 9443 | openshift-cloud-controller-manager-operator | cloud-controller-manager-operator | cluster-cloud-controller-manager-operator | cluster-cloud-controller-manager | master | FALSE |
| Ingress | TCP | 9637 | openshift-machine-config-operator | kube-rbac-proxy-crio | kube-rbac-proxy-crio | kube-rbac-proxy-crio | master | FALSE |
| Ingress | TCP | 9978 | openshift-etcd | etcd | etcd | etcd-metrics | master | FALSE |
| Ingress | TCP | 9979 | openshift-etcd | etcd | etcd | etcd-metrics | master | FALSE |
| Ingress | TCP | 9980 | openshift-etcd | etcd | etcd | etcd | master | FALSE |
| Ingress | TCP | 10250 | Host system service | kubelet | master | FALSE | ||
| Ingress | TCP | 10256 | openshift-ovn-kubernetes | ovnkube | ovnkube | ovnkube-controller | master | FALSE |
| Ingress | TCP | 10257 | openshift-kube-controller-manager | kube-controller-manager | kube-controller-manager | kube-controller-manager | master | FALSE |
| Ingress | TCP | 10259 | openshift-kube-scheduler | scheduler | openshift-kube-scheduler | kube-scheduler | master | FALSE |
| Ingress | TCP | 17697 | openshift-kube-apiserver | openshift-kube-apiserver-healthz | kube-apiserver | kube-apiserver-check-endpoints | master | FALSE |
| Ingress | TCP | 22623 | openshift-machine-config-operator | machine-config-server | machine-config-server | machine-config-server | master | FALSE |
| Ingress | TCP | 22624 | openshift-machine-config-operator | machine-config-server | machine-config-server | machine-config-server | master | FALSE |
| Ingress | UDP | 111 | Host system service | rpcbind | master | TRUE |
| Direction | Protocol | Port | Namespace | Service | Pod | Container | Node Role | Optional |
|---|---|---|---|---|---|---|---|---|
| Ingress | TCP | 22 | Host system service | sshd | worker | TRUE | ||
| Ingress | TCP | 111 | Host system service | rpcbind | worker | TRUE | ||
| Ingress | TCP | 8798 | openshift-machine-config-operator | machine-config-daemon | machine-config-daemon | machine-config-daemon | worker | FALSE |
| Ingress | TCP | 9001 | openshift-machine-config-operator | machine-config-daemon | machine-config-daemon | kube-rbac-proxy | worker | FALSE |
| Ingress | TCP | 9100 | openshift-monitoring | node-exporter | node-exporter | kube-rbac-proxy | worker | FALSE |
| Ingress | TCP | 9103 | openshift-ovn-kubernetes | ovn-kubernetes-node | ovnkube-node | kube-rbac-proxy-node | worker | FALSE |
| Ingress | TCP | 9105 | openshift-ovn-kubernetes | ovn-kubernetes-node | ovnkube-node | kube-rbac-proxy-ovn-metrics | worker | FALSE |
| Ingress | TCP | 9107 | openshift-ovn-kubernetes | egressip-node-healthcheck | ovnkube-node | ovnkube-controller | worker | FALSE |
| Ingress | TCP | 9637 | openshift-machine-config-operator | kube-rbac-proxy-crio | kube-rbac-proxy-crio | kube-rbac-proxy-crio | worker | FALSE |
| Ingress | TCP | 10250 | Host system service | kubelet | worker | FALSE | ||
| Ingress | TCP | 10256 | openshift-ovn-kubernetes | ovnkube | ovnkube | ovnkube-controller | worker | FALSE |
| Ingress | UDP | 111 | Host system service | rpcbind | worker | TRUE |
2.2.2. Additional network flows for OpenShift Container Platform on bare metal Copy linkLink copied to clipboard!
In addition to the base network flows, the following matrix describes the ingress flows to OpenShift Container Platform services that are specific to OpenShift Container Platform on bare metal.
| Direction | Protocol | Port | Namespace | Service | Pod | Container | Node Role | Optional |
|---|---|---|---|---|---|---|---|---|
| Ingress | TCP | 53 | openshift-dns | dns-default | dns-default | dns | master | FALSE |
| Ingress | TCP | 6180 | openshift-machine-api | metal3-state | metal3 | metal3-httpd | master | FALSE |
| Ingress | TCP | 6183 | openshift-machine-api | metal3-state | metal3 | metal3-httpd | master | FALSE |
| Ingress | TCP | 6385 | openshift-machine-api | metal3-state | metal3 | metal3-httpd | master | FALSE |
| Ingress | TCP | 6388 | openshift-machine-api | metal3-state | metal3 | metal3-httpd | master | FALSE |
| Ingress | TCP | 9444 | openshift-kni-infra | haproxy | haproxy | master | FALSE | |
| Ingress | TCP | 9445 | openshift-kni-infra | haproxy | haproxy | master | FALSE | |
| Ingress | TCP | 9454 | openshift-kni-infra | haproxy | haproxy | master | FALSE | |
| Ingress | TCP | 18080 | openshift-kni-infra | coredns | coredns | master | FALSE | |
| Ingress | UDP | 53 | openshift-dns | dns-default | dns-default | dns | master | FALSE |
| Ingress | UDP | 6081 | openshift-ovn-kubernetes | ovn-kubernetes geneve | master | FALSE | ||
| Ingress | TCP | 53 | openshift-dns | dns-default | dns-default | dns | worker | FALSE |
| Ingress | TCP | 80 | openshift-ingress | router-internal-default | router-default | router | worker | FALSE |
| Ingress | TCP | 443 | openshift-ingress | router-internal-default | router-default | router | worker | FALSE |
| Ingress | TCP | 1936 | openshift-ingress | router-internal-default | router-default | router | worker | FALSE |
| Ingress | TCP | 18080 | openshift-kni-infra | coredns | coredns | worker | FALSE | |
| Ingress | UDP | 53 | openshift-dns | dns-default | dns-default | dns | worker | FALSE |
| Ingress | UDP | 6081 | openshift-ovn-kubernetes | ovn-kubernetes geneve | worker | FALSE |
2.2.3. Additional network flows for single-node OpenShift with other platforms Copy linkLink copied to clipboard!
In addition to the base network flows, the following matrix describes the ingress flows to OpenShift Container Platform services that are specific to single-node OpenShift configured with platform: none in the installation manifest.
| Direction | Protocol | Port | Namespace | Service | Pod | Container | Node Role | Optional |
|---|---|---|---|---|---|---|---|---|
| Ingress | TCP | 80 | openshift-ingress | router-internal-default | router-default | router | master | FALSE |
| Ingress | TCP | 443 | openshift-ingress | router-internal-default | router-default | router | master | FALSE |
| Ingress | TCP | 1936 | openshift-ingress | router-internal-default | router-default | router | master | FALSE |
2.2.4. Additional network flows for OpenShift Container Platform on AWS Copy linkLink copied to clipboard!
In addition to the base network flows, the following matrix describes the ingress flows to OpenShift Container Platform services that are specific to OpenShift Container Platform on AWS.
| Direction | Protocol | Port | Namespace | Service | Pod | Container | Node Role | Optional |
|---|---|---|---|---|---|---|---|---|
| Ingress | TCP | 10258 | openshift-cloud-controller-manager-operator | cloud-controller | cloud-controller-manager | cloud-controller-manager | master | FALSE |
| Ingress | TCP | 80 | openshift-ingress | router-default | router-default | router | worker | FALSE |
| Ingress | TCP | 443 | openshift-ingress | router-default | router-default | router | worker | FALSE |
| Ingress | UDP | 6081 | openshift-ovn-kubernetes | ovn-kubernetes geneve | worker | FALSE |
2.2.5. Additional network flows for single-node OpenShift on AWS Copy linkLink copied to clipboard!
In addition to the base network flows, the following matrix describes the ingress flows to OpenShift Container Platform services that are specific to single-node OpenShift on AWS.
| Direction | Protocol | Port | Namespace | Service | Pod | Container | Node Role | Optional |
|---|---|---|---|---|---|---|---|---|
| Ingress | TCP | 80 | openshift-ingress | router-default | router-default | router | master | FALSE |
| Ingress | TCP | 443 | openshift-ingress | router-default | router-default | router | master | FALSE |
| Ingress | TCP | 10258 | openshift-cloud-controller-manager-operator | cloud-controller | cloud-controller-manager | cloud-controller-manager | master | FALSE |
2.3. Ingress network flow management with the commatrix plugin Copy linkLink copied to clipboard!
Use the commatrix plugin for the oc command to analyze ingress network traffic and generate firewall rules for live clusters.
For ingress network analysis, the plugin reads the services deployed in a target cluster and generates a communication matrix of expected ingress flows. You can export the data in formats such as CSV, JSON, or YAML for audits, documentation, or configuring external firewalls.
For firewall configuration, the plugin generates nftables rules in Butane format that restrict ingress traffic to only the flows required by your cluster. The plugin also generates a NodeDisruptionPolicy patch to apply updates without triggering node reboots.
The plugin relies on EndpointSlice resources for port discovery. However, some ports on your cluster nodes might be open without a corresponding service or EndpointSlice, such as host-level services, monitoring agents, or third-party software. Use the --host-open-ports flag to discover actual listening ports on your nodes and merge them into the generated firewall rules. This ensures the rules capture all known open ports, not just those defined in EndpointSlice resources.
2.4. Installing the commatrix plugin Copy linkLink copied to clipboard!
You can install the commatrix plugin from the Red Hat Ecosystem Catalog.
You can also install the commatrix plugin by using Krew. For more information, see "CLI Manager Operator overview".
Prerequisites
-
You installed the OpenShift CLI (
oc). - You installed Podman.
Procedure
Log in to the Red Hat Ecosystem Catalog registry by running the following command and entering your credentials:
$ podman login registry.redhat.ioExtract the
commatrixbinary from the plugin image by running the following commands:$ podman create --name oc-commatrix registry.redhat.io/openshift-kni/commatrix:v4.22 $ podman cp oc-commatrix:/oc-commatrix . $ podman rm oc-commatrixMove the extracted binary to a directory in your system
PATH, such as/usr/local/bin/, by running the following command:sudo mv oc-commatrix /usr/local/bin/
Verification
Run the following command to verify that the plugin is available locally:
$ oc commatrixGenerate an up-to-date communication flows matrix for all ingress flows of openshift (multi-node and single-node in OpenShift) and Operators. Optionally, generate a host open ports matrix and the difference with the communication matrix. For additional details, please refer to the communication matrix documentation(https://github.com/openshift-kni/commatrix/blob/main/README.md). Usage: commatrix [command] Available Commands: completion Generate the autocompletion script for the specified shell generate Generate an up-to-date communication flows matrix for all ingress flows. help Help about any command Flags: -h, --help help for commatrix Use "commatrix [command] --help" for more information about a command.
2.5. Generate ingress network flow data using the commatrix plugin Copy linkLink copied to clipboard!
Use the commatrix plugin for the oc command to generate ingress network flow data from your cluster and identify any differences between open ports on the host and expected ingress flows for your environment.
The plugin generates ingress flows to OpenShift Container Platform services for the following environments:
- OpenShift Container Platform on bare metal
- Single-node OpenShift with other platforms
- OpenShift Container Platform on Amazon Web Services (AWS)
- Single-node OpenShift on AWS
Prerequisites
-
You installed the OpenShift CLI (
oc). -
You logged in as a user with
cluster-adminprivileges. - You installed Podman.
-
You installed the
commatrixplugin.
Procedure
Generate network flow data by running the following command:
$ oc commatrix generateNoteBy default, the plugin generates the network flow data in CSV format in a
communication-matrixdirectory in your current working directory.
Verification
View the generated network flow data in the
communication-matrixdirectory by running the following command:$ cat communication-matrix/communication-matrix.csvDirection,Protocol,Port,Namespace,Service,Pod,Container,Node Role,Optional Ingress,TCP,4194,kube-system,kubelet,konnectivity-agent,,,false Ingress,TCP,9100,openshift-monitoring,node-exporter,node-exporter,kube-rbac-proxy,,false Ingress,TCP,9103,openshift-ovn-kubernetes,ovn-kubernetes-node,ovnkube-node,kube-rbac-proxy-node,,false ...
2.6. Ingress traffic configuration with the commatrix plugin Copy linkLink copied to clipboard!
You can use the commatrix plugin to generate nftables rules that configure the firewall on cluster nodes to permit only the ingress traffic defined in the communication matrix.
nftables is the packet filtering framework in the Linux kernel that replaces iptables. OpenShift Container Platform cluster nodes running Red Hat Enterprise Linux CoreOS (RHCOS) use nftables for packet filtering. The commatrix plugin generates nftables rules and packages them as MachineConfig resources that the Machine Config Operator applies to your nodes.
When you generate firewall rules with the commatrix plugin in Butane format, the plugin also generates a NodeDisruptionPolicy patch. This patch enables the Machine Config Operator to apply nftables rule updates without triggering a full node reboot, minimizing disruption to running workloads.
When operators or components are installed, enabled, uninstalled, or disabled, you must regenerate the firewall rules to reflect the new configuration. Failure to regenerate and apply firewall rules in this scenario might have the following consequences:
- Unnecessary ports might remain open, which increases the attack surface of your cluster.
- Services might fail to function correctly if required ports remain blocked by outdated firewall rules.
2.7. Generate nftables firewall rules in Butane format Copy linkLink copied to clipboard!
You can generate nftables firewall rules in Butane format by using the commatrix plugin. The generated Butane configs contain nftables rules that allow the ingress flows defined in the communication matrix and block all other ingress flows.
Errors in nftables rules can block legitimate traffic and isolate nodes from the cluster. Review all generated rules before applying them.
Prerequisites
-
You installed the OpenShift CLI (
oc). -
You logged in as a user with
cluster-adminprivileges. - You installed Podman.
-
You installed the
commatrixplugin. -
You installed the
butaneCLI. - For custom node groups, you need an existing machine config pool that you can target using node label selectors.
Procedure
Generate firewall rules in Butane format by running the following command:
$ oc commatrix generate --format butaneBy default, the plugin writes the output files to the
communication-matrixdirectory in your current working directory.The plugin generates one Butane config file per node pool, named
butane-<pool_name>.yaml, and anode-disruption-policy.yamlpatch file, for example:communication-matrix/ ├── butane-master.yaml ├── butane-worker.yaml └── node-disruption-policy.yamlReview the generated Butane config files by running the following command:
$ cat communication-matrix/butane-<pool_name>.yamlSee the following example of the
butane-master.yamlfile.NoteYou can adjust the generated firewall rules in your YAML file to suit your network environment.
variant: openshift version: 4.22.0 metadata: name: 98-nftables-commatrix-master labels: machineconfiguration.openshift.io/role: master systemd: units: - name: "nftables.service" enabled: true contents: | # ... systemd unit configuration ... storage: files: - path: /etc/sysconfig/nftables.conf mode: 0600 overwrite: true contents: inline: | table inet openshift_filter { chain OPENSHIFT { type filter hook input priority 1; policy accept; # Allow loopback traffic iif lo accept # Allow established and related traffic ct state established,related accept # Allow ICMP on ipv4 ip protocol icmp accept ip6 nexthdr ipv6-icmp accept # Allow specific TCP and UDP ports tcp dport { 22, 6443, 9100, 10250, 30000-60999 } accept udp dport { 6081, 30000-60999 } accept # Drop broadcast traffic with rate-limited logging ip daddr 255.255.255.255 jump { limit rate 1/minute log prefix "firewall "; drop; } # Rate-limited logging and default drop jump { limit rate 1/minute log prefix "firewall "; drop; } } }Review the generated
NodeDisruptionPolicypatch by running the following command:$ cat communication-matrix/node-disruption-policy.yamlCheck whether your cluster already defines
NodeDisruptionPolicyentries by running the following command:$ oc get -o yaml machineconfiguration clusterApply the
NodeDisruptionPolicypatch:If the
MachineConfigurationresource does not define anynodeDisruptionPolicyentries, run the following command:$ oc patch machineconfiguration cluster --type=merge --patch-file=communication-matrix/node-disruption-policy.yamlIf the
MachineConfigurationresource already containsnodeDisruptionPolicyentries, manually add the entries fromnode-disruption-policy.yamlto the existing.spec.nodeDisruptionPolicy.unitsand.spec.nodeDisruptionPolicy.fileslists by running the following command:$ oc edit machineconfiguration cluster
Convert each Butane config to a
MachineConfigresource by running the following command:$ butane --strict -o mc-<pool_name>.yaml communication-matrix/butane-<pool_name>.yaml-
<pool_name>is the name of the target node pool.
-
Apply the
MachineConfigresources by running the following command for each node pool:ImportantYou must apply the
NodeDisruptionPolicypatch before applyingMachineConfigresources. If you applyMachineConfigresources without theNodeDisruptionPolicyin place, the Machine Config Operator triggers a full node reboot.$ oc apply -f mc-<pool_name>.yamlThe plugin generates
MachineConfigresources with the naming pattern98-nftables-commatrix-<pool_name>.
Verification
Open a debug shell on a target node by running the following commands:
$ oc debug node/<node_name> sh-5.1# chroot /host-
<node_name>is the name of a cluster node. -
chroot /hostaccesses the host filesystem.
-
Verify that the
nftablesrules are active on a node by running the following command:sh-5.1# nft list ruleset... table inet openshift_filter { chain OPENSHIFT { type filter hook input priority filter + 1; policy accept; iif "lo" accept ct state established,related accept ip protocol icmp accept ip6 nexthdr ipv6-icmp accept tcp dport { 22, 111, 2379-2380, 6080, 6443, 9001, 9099-9100, 9103-9105, 9107-9108, 9192, 9258, 9443, 9637, 9978-9980, 10250, 10256-10259, 17697, 22623-22624, 30000-60999 } accept udp dport { 111, 6081, 30000-60999 } accept ip daddr 255.255.255.255 jump { limit rate 1/minute burst 5 packets log prefix "firewall " drop } jump { limit rate 1/minute burst 5 packets log prefix "firewall " drop } } } ...Verify that denied traffic is logged with rate limiting by checking the node journal:
$ oc debug node/<node_name> -- chroot /host journalctl -k --grep firewallDenied packets are logged, but log entries are rate-limited to one per minute with an initial burst of five entries.
2.8. Revert nftables firewall rules generated by the commatrix plugin Copy linkLink copied to clipboard!
If you need to remove the nftables firewall rules from your cluster nodes, delete the MachineConfig resources, and then clean up the NodeDisruptionPolicy entries.
Prerequisites
-
You installed the OpenShift CLI (
oc). -
You logged in as a user with
cluster-adminprivileges. -
You applied
nftablesfirewall rules generated by thecommatrixplugin.
Procedure
Identify the
MachineConfigresources created by thecommatrixplugin by running the following command:$ oc get machineconfig | grep nftablesDelete the
MachineConfigresource for each node pool by running the following command:$ oc delete machineconfig 98-nftables-commatrix-<pool_name>Wait for all
MachineConfigPoolresources to return to theUPDATEDstate:$ oc get mcpExample output showing pools in
UPDATEDstateNAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 True False False 1 1 1 0 160d worker rendered-worker-a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 True False False 0 0 0 0 160dOpen a debug shell on a target node by running the following commands:
$ oc debug node/<node_name> sh-5.1# chroot /host-
<node_name>is the name of a cluster node. -
chroot /hostaccesses the host filesystem.
-
Verify that the custom
nftablesrules were removed by running the following command:sh-5.1# nft list ruleset 2>&1 | grep -q openshift_filter || echo "Custom rules removed"Remove the related
nftablesrules from theNodeDisruptionPolicyentries by editing theMachineConfigurationresource:$ oc edit machineconfiguration clusterRemove the
nftables.serviceentry from.spec.nodeDisruptionPolicy.unitsand the/etc/sysconfig/nftables.confentry from.spec.nodeDisruptionPolicy.files.
2.9. Reference flags for the commatrix plugin Copy linkLink copied to clipboard!
The following table describes the flags for the commatrix plugin.
| Flag | Type | Description |
|---|---|---|
|
| string |
Define the format of a custom entries file. The plugin appends the entries in this file to the generated data. Supported values are |
|
| string | Define the file path to a custom entries file. The plugin appends the entries in this file to the generated data. |
|
| boolean |
Enable verbose logging for debugging. The default value is |
|
| string |
Define the directory for output files. The default value is |
|
| string |
Assign nodes matching a label selector to a custom group for separate firewall rule generation. Specify in |
|
| string |
Define the output format. Supported values are |
|
| boolean |
Generate the expected communication data for the cluster environment. Identify the actual open ports on the cluster node to compare the difference between the expected open ports and the actual open ports. You can view the differences in the generated |
|
| boolean | Display the plugin help information. |