Firewall and Network Ports
The confluent server binds a small, fixed set of ports. Most of what a deployment needs on the wire is served by other daemons on the same machine: the web server, a TFTP server, and optionally DNS, NTP and a log receiver. This page lists every port involved and gives worked firewalld and ufw configurations for them.
As described in the architecture overview, a confluent server normally reaches three separate networks, and which one a port belongs on matters as much as the port number:
- External, where administrators and the API live.
- Deployment, carrying the operating system NICs of the nodes. Network boot and OS installation happen here.
- BMC, a dedicated and fully isolated hardware management network carrying the BMCs, PDUs and the management ports of switches. Discovery and out-of-band control happen here.
Clusters usually have a fourth, high speed network as well, an InfiniBand, OmniPath or fast RoCE fabric used for traffic between compute nodes and to parallel storage. Confluent needs nothing open there unless you also deploy over it.
The deployment and BMC networks are normally completely separate from each other. The tables below name the network each port belongs to.
Ports bound by the confluent server¶
These are opened by confluentd itself.
| Port | Protocol | Network | Purpose |
|---|---|---|---|
| 13001 | TCP | Deployment, and external if native TLS API clients connect there | Node credential handout during deployment, TLS client API, and collective peer traffic |
| 67 | UDP | Deployment | DHCPv4 and PXE |
| 547 | UDP | Deployment | DHCPv6, for network boot over IPv6 |
| 4011 | UDP | Deployment | ProxyDHCP, for booting alongside an independent DHCP server |
| 427 | UDP | BMC | SLP hardware discovery |
| 1900 | UDP | BMC, deployment | SSDP. BMCs are discovered with it, and deploying nodes use it to find their confluent server |
Note
Port 13001 carries three things: deploying nodes collecting their credentials and API key (the mechanism that arms a node for deployment), clients such as confetty and nodeshell using the TLS API, and collective members reaching each other. The listener only starts once /etc/confluent/srvcert.pem exists, which osdeploy initialize creates.
The following are bound by confluent as well, but are not opened by the rules further down:
| Port | Protocol | Purpose | Why it is not opened |
|---|---|---|---|
| 4005 | TCP | HTTP API | Listens on 127.0.0.1 unless [http] bindhost in /etc/confluent/service.cfg moves it. External access normally goes through the web server on 443 |
| 3900 and up | TCP | Web UI BMC forwarding | Only needed for browser access to BMC web interfaces and KVM. See Web UI forwarding |
Ports served by other daemons¶
| Port | Protocol | Network | Daemon | Needed for |
|---|---|---|---|---|
| 443 | TCP | Deployment, and external if the web interface is used | httpd or nginx | Always on the deployment network: the reverse proxy in front of confluent, the deployment payload, and the node API |
| 80 | TCP | Deployment | httpd or nginx | PXE boot, always. UEFI HTTP boot only when deployment.useinsecureprotocols is set |
| 69 | UDP | Deployment | tftpd | PXE boot. Confluent has no built-in TFTP server, it only stages the iPXE binaries |
| 22 | TCP | External, and deployment if osdeploy initialize -l was used | sshd | Administrative access, and node to server access if osdeploy initialize -l was used |
| 53 | TCP and UDP | Deployment | dnsmasq or named | Optional. Only if this server resolves for the cluster, see DNS and DHCP with dnsmasq |
| 123 | UDP | Deployment | chronyd or ntpd | Optional. Only if this server is the cluster time source rather than an upstream one |
| 514 | TCP | Deployment | rsyslog | Optional. logging.method=rsyslog without TLS, see node log forwarding |
| 6514 | TCP | Deployment | rsyslog | Optional. logging.method=rsyslog with logging.tls |
| 19532 | TCP | Deployment | systemd-journal-remote | Optional. logging.method=journal-remote |
| 2049, 111 | TCP | Deployment | nfsd, rpcbind | Optional. Only if this server exports NFS for shared collective state or node media |
Warning
Plain HTTP on port 80 is required for PXE boot, not optional. Confluent declines to answer a PXE boot request unless deployment.useinsecureprotocols is set to firmware or always, and the iPXE chainload URL it then hands out is plain http://. The whole early boot payload follows over the same port: boot.ipxe, the kernel and the initramfs. Only once the installer is running does the node switch to HTTPS for the API. UEFI HTTP boot is the path that can stay on HTTPS only, by leaving deployment.useinsecureprotocols at its default of never.
DNS and DHCP with dnsmasq (optional)¶
Confluent answers DHCP and PXE itself and needs no DNS server, so port 53 is only required if you choose to run one. confluent2dnsmasq and confluent2hosts can generate its configuration from the node attribute database. See Confluent and DHCP interaction.
dnsmasq then binds port 67 alongside confluent. confluent2dnsmasq emits bind-dynamic by default so the two can share it. Without that, confluent cannot bind the DHCP port and stops answering boot requests.
Node log forwarding (optional)¶
Nodes forward their logs to the server only when logging.servers is set. Leave it unset and none of 514, 6514 or 19532 is needed. The transport depends on logging.method and logging.tls, so only one of the three is normally in use. Certificates for the TLS transports are renewed by a daily timer on each node that calls back over HTTPS, so port 443 stays in use long after deployment finishes.
Collective (optional)¶
Collective members reach each other on port 13001, the same port used for the client API, authenticated with mutual TLS. No additional port is needed to form or run a collective. If members share state over NFS rather than a synchronized local filesystem, the NFS ports apply as well.
Native TLS API (optional)¶
Remote confluent clients connect directly to TCP port 13001. If those clients reach the server through its external address, allow that port on the external interface too. Restrict the allowance to the client addresses or subnet, as shown in the firewall examples below. HTTPS on port 443 does not replace this native TLS connection.
Outbound connections¶
Almost all of these go out over the BMC network. They rarely need rules on the server itself, since outgoing traffic is permitted by default, but they matter for any ACL between the server and the BMC network.
| Port | Protocol | Network | Purpose |
|---|---|---|---|
| 443 | TCP | BMC | Redfish, BMC web interfaces, switches, PDUs |
| 623 | UDP | BMC | IPMI, including serial-over-LAN console |
| 161 | UDP | BMC | SNMP, used to read switch MAC address tables for switch based discovery |
| 3900 | TCP | BMC | BMC KVM video, when relaying to a browser |
| 8006 | TCP | BMC | Proxmox VE API, for Proxmox managed nodes |
| 22 | TCP | Deployment | nodeshell, nodersync, Ansible, and file synchronization to deployed nodes |
Configuring the firewall¶
The examples below cover firewalld (used on Enterprise Linux and SUSE) and ufw (used on Ubuntu and Debian). Each port is opened with a built-in service where one matches it exactly, and by number otherwise.
Each interface gets a zone of its own. Without an explicit --zone, firewall-cmd writes to the default zone, which would open the deployment ports on your external interface too. Fill the zones with rules first and assign the interfaces last, as shown at the end of this section, so no interface ever sits in a zone that is still missing rules:
# external: administration only
firewall-cmd --permanent --zone=public --add-service=ssh # 22/tcp, administrative access
# deployment: a new, empty zone for the ports confluent binds, plus the web server
firewall-cmd --permanent --new-zone=deployment
firewall-cmd --permanent --zone=deployment --add-port=13001/tcp # confluent API and node credential handout
firewall-cmd --permanent --zone=deployment --add-service=dhcp # 67/udp, DHCPv4, for network boot
firewall-cmd --permanent --zone=deployment --add-port=1900/udp # SSDP, discovery and nodes finding the server
firewall-cmd --permanent --zone=deployment --add-service=https # 443/tcp, deployment payload and node API
If the nodes were set up with osdeploy initialize -l, they log in to this server over SSH, so allow that on the deployment network as well. Leaving the public zone takes SSH away from them otherwise:
firewall-cmd --permanent --zone=deployment --add-service=ssh # 22/tcp, node to server login
If you use the native TLS API externally, add this optional rule. Replace 10.1.0.50/32 with the client address or subnet. For IPv6 clients, use family="ipv6" and an IPv6 address or subnet in a separate rule:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.1.0.50/32" port port="13001" protocol="tcp" accept'
The remaining boot ports depend on how the nodes boot. Add whichever apply:
firewall-cmd --permanent --zone=deployment --add-service=http # 80/tcp, PXE boot, HTTP boot without TLS
firewall-cmd --permanent --zone=deployment --add-service=tftp # 69/udp, PXE boot
firewall-cmd --permanent --zone=deployment --add-service=dhcpv6 # 547/udp, network boot over IPv6
firewall-cmd --permanent --zone=deployment --add-service=proxy-dhcp # 4011/udp, ProxyDHCP, with a separate DHCP server
Port 1900 is opened by number rather than with the built-in ssdp service, and the BMC interface is trusted so that discovery works. Discovery needs more than open ports explains both, and what to do if you cannot trust the BMC interface.
Add --zone=public --add-service=https as well if you use the web interface. Optional cluster services belong in the deployment zone:
firewall-cmd --permanent --zone=deployment --add-service=dns # 53, only if this server resolves for the cluster
firewall-cmd --permanent --zone=deployment --add-service=ntp # 123/udp, only if this server is the time source
Node log forwarding needs only the port of the transport actually in use:
firewall-cmd --permanent --zone=deployment --add-port=514/tcp # syslog, logging.method=rsyslog without TLS
firewall-cmd --permanent --zone=deployment --add-port=6514/tcp # syslog over TLS, rsyslog with logging.tls
firewall-cmd --permanent --zone=deployment --add-port=19532/tcp # logging.method=journal-remote
The built-in syslog and syslog-tls services do not fit these: syslog opens 514/udp while the receiver listens on 514/tcp, and syslog-tls opens 6514/udp alongside the tcp port.
Warning
firewalld does not forward traffic between zones by default. If this server also routes for its deployment network, that traffic crosses from deployment to public and is dropped. Permit it with a policy (firewalld 0.9 or later), and add --zone=public --add-masquerade as well if the deployment network is NATed:
firewall-cmd --permanent --new-policy=deploy-out
firewall-cmd --permanent --policy=deploy-out --add-ingress-zone=deployment
firewall-cmd --permanent --policy=deploy-out --add-egress-zone=public
firewall-cmd --permanent --policy=deploy-out --set-target=ACCEPT
Once the zones hold every rule you need, load them and assign the interfaces. Where NetworkManager manages an interface, firewall-cmd stores the zone in its connection profile and the change takes effect at once. Elsewhere, such as on SUSE with wicked, firewalld keeps the assignment itself and applies it on the next reload. Substitute your own interface names:
firewall-cmd --reload # load the rules before assigning interfaces
firewall-cmd --permanent --zone=public --change-interface=eno1 # external
firewall-cmd --permanent --zone=deployment --change-interface=eno2 # deployment
firewall-cmd --permanent --zone=trusted --change-interface=eno3 # BMC, trusted, see below
firewall-cmd --reload # apply where NetworkManager is not in use
Warning
If you opened ports in public while following Confluent Installation, they stay open on the external interface until you remove them. Do this only after the interfaces have moved, since until then the deployment interface still relies on those rules. Remove both service rules and legacy numeric port rules. Keep https there only if you use the web interface. The source-restricted native TLS API rule above stays in place:
for svc in https http dhcp dhcpv6 proxy-dhcp tftp; do # leave out https if you use the web interface
firewall-cmd --permanent --zone=public --remove-service=$svc
done
for port in 13001/tcp 1900/udp 427/udp 67/udp 69/udp 4011/udp 547/udp; do
firewall-cmd --permanent --zone=public --remove-port=$port
done
firewall-cmd --reload
Ubuntu ships ufw, inactive by default, so nothing here applies unless you enable it. Every rule names its port directly, so it works whichever web server you use.
Scope each rule to an interface with in on. A bare ufw allow applies to every interface, which would open the deployment ports externally too. Allow SSH before enabling ufw, or it will refuse new SSH connections, including your next login. Substitute your own interface names:
# external: administration only
ufw allow in on eno1 to any port 22 proto tcp # SSH, administrative access
# deployment: the ports confluent binds, plus the web server
ufw allow in on eno2 to any port 13001 proto tcp # confluent API and node credential handout
ufw allow in on eno2 to any port 67 proto udp # DHCPv4, for network boot
ufw allow in on eno2 to any port 1900 proto udp # SSDP, discovery and nodes finding the server
ufw allow in on eno2 to any port 443 proto tcp # HTTPS, deployment payload and node API
# BMC: trusted, see below
ufw allow in on eno3
ufw enable
If the nodes were set up with osdeploy initialize -l, they log in to this server over SSH, so allow that on the deployment interface as well. The cleanup below removes the rule they relied on otherwise:
ufw allow in on eno2 to any port 22 proto tcp # SSH, node to server login
If you use the native TLS API externally, add this optional rule. Replace 10.1.0.50/32 with the client address or subnet, and add a separate rule for any IPv6 clients:
ufw allow in on eno1 from 10.1.0.50/32 to any port 13001 proto tcp
The remaining boot ports depend on how the nodes boot. Add whichever apply:
ufw allow in on eno2 to any port 80 proto tcp # HTTP, PXE boot, HTTP boot without TLS
ufw allow in on eno2 to any port 69 proto udp # TFTP, PXE boot
ufw allow in on eno2 to any port 547 proto udp # DHCPv6, network boot over IPv6
ufw allow in on eno2 to any port 4011 proto udp # ProxyDHCP, with a separate DHCP server
If you use the web interface, allow HTTPS on the external interface as well:
ufw allow in on eno1 to any port 443 proto tcp # HTTPS, web interface
The BMC interface is allowed wholesale so that discovery works, see Discovery needs more than open ports. Optional cluster services belong on the deployment interface:
ufw allow in on eno2 to any port 53 # DNS, only if this server resolves for the cluster
ufw allow in on eno2 to any port 123 proto udp # NTP, only if this server is the cluster time source
Node log forwarding needs only the port of the transport actually in use:
ufw allow in on eno2 to any port 514 proto tcp # syslog, logging.method=rsyslog without TLS
ufw allow in on eno2 to any port 6514 proto tcp # syslog over TLS, rsyslog with logging.tls
ufw allow in on eno2 to any port 19532 proto tcp # logging.method=journal-remote
Warning
ufw denies routed traffic by default, so if this server also routes or NATs for its deployment network, that stops the moment you enable it. Permit the forwarding you need explicitly, naming your own interfaces:
ufw route allow in on eno2 out on eno1
Warning
If you added rules while following Confluent Installation, they apply to every interface, external included, until you delete them. Delete them only once every scoped rule you need is in place, so SSH, the web interface and any native TLS API clients stay reachable on eno1, and network boot, deployment and SSH from nodes set up with osdeploy initialize -l keep working on eno2. Earlier versions of that guide used the OpenSSH, Apache Secure and Apache application profiles, so the loop removes those as well. ufw reports and skips any rule that does not exist:
for rule in 22/tcp 443/tcp 80/tcp 13001/tcp 67/udp 1900/udp 69/udp 547/udp 4011/udp OpenSSH 'Apache Secure' Apache; do
ufw delete allow "$rule"
done
Discovery needs more than open ports¶
Opening 427 and 1900 is enough to receive discovery traffic that nodes and BMCs send to the server. It is not enough for confluent's own active scans. Those go out to multicast and broadcast addresses, and the answers come back as unicast packets from a different address than the request was sent to, which connection tracking does not associate with the outgoing request. The replies are therefore dropped as unsolicited.
Opening a fixed port does not help either: each scan sends from a freshly allocated source port, so there is no stable port to allow.
This affects the BMC network above all, because that is where the devices confluent scans for actually live, and it is also the one network where trusting an interface is genuinely safe.
Which device sits on which network¶
A confluent server typically has three interfaces, and what decides the firewall treatment is not how private the network looks but who can put a packet on the wire:
| Interface | Network | Who can send from it | Treatment |
|---|---|---|---|
eno1 | External, for example 10.1.0.0/24, routed to the rest of your site | Everyone at your site, plus your gateway, corporate DNS, LDAP, NTP and monitoring | Restricted: 22 for administration, 443 if the web interface is used, and source-restricted 13001 if native TLS API clients connect here |
eno2 | Deployment, for example 172.30.1.0/24, private and unrouted | The nodes, and therefore every user with a shell on a node | Restricted: the port rules only, never trusted |
eno3 | BMC, for example 172.30.2.0/24, isolated | Only BMCs, PDUs and switch management ports. No user reaches it, and admins normally only through the confluent server | Trusted, so discovery replies arrive |
ib0 | High speed (optional), an InfiniBand, OmniPath or RoCE fabric | The nodes, as on the deployment network | None. No confluent port belongs here, unless you deploy over it, in which case the deployment rules apply |
Putting the BMC interface in the trusted zone, as Configuring the firewall already does, is what makes active discovery work. No additional rule is needed. If you cannot trust it, see If you cannot trust the BMC interface below.
Warning
Do not give the deployment interface the same treatment. Anyone with a shell on a node can send packets from that network, so trusting it would expose every service on the server to every cluster user, not just confluent's ports. Leave it on the port rules from Configuring the firewall.
It does not need trusting anyway: traffic arriving there is node-initiated, so a deploying node's SSDP search and the server's reply are part of one exchange that connection tracking already permits.
The exception is a BMC that shares a physical port with the node's operating system NIC (a shared LOM or NC-SI port) and therefore sits on the deployment network rather than on a separate BMC network. Confluent's active scans then have to reach it there, and their replies are dropped just as on an untrusted BMC network. PXE driven discovery commonly ends up here: the boot attempt itself is node-initiated, but it then moves each BMC onto the lom port and finds it with nodediscover rescan, which is an active scan. Exempt only the addresses the BMCs use rather than the whole interface, which is easiest when they have a range of their own:
firewall-cmd --permanent --zone=trusted --add-source=172.30.1.192/26 # BMC addresses on the deployment network
firewall-cmd --reload
ufw allow in on eno2 from 172.30.1.192/26 # BMC addresses on the deployment network
Anyone with root on a node can still claim one of those addresses. Where that is not acceptable, use one of the alternatives under If you cannot trust the BMC interface.
Note
Do not narrow SSDP down to the multicast destination address. The ssdp service that ships with firewalld restricts traffic to 239.255.255.250 and ff02::c, but a node searching for its deployment server also sends to the subnet broadcast address. With the built-in service in place only the multicast search is answered, and the broadcast search is dropped. That is why Configuring the firewall opens port 1900 by number rather than adding the built-in service.
If you cannot trust the BMC interface¶
Open only the two discovery ports on it instead. Devices announcing themselves are still heard, which BMCs do when they power on, but replies to confluent's active scans are dropped:
firewall-cmd --permanent --new-zone=bmc
firewall-cmd --permanent --zone=bmc --add-port=427/udp # SLP, BMC discovery
firewall-cmd --permanent --zone=bmc --add-port=1900/udp # SSDP, BMC discovery
firewall-cmd --reload # load the zone and rules before assigning it
firewall-cmd --permanent --zone=bmc --change-interface=eno3
firewall-cmd --reload # apply where NetworkManager is not in use
ufw allow in on eno3 to any port 427 proto udp # SLP, BMC discovery
ufw allow in on eno3 to any port 1900 proto udp # SSDP, BMC discovery
ufw delete allow in on eno3 # then remove the wholesale rule
With firewalld, you can receive the scan replies as well by matching them with an ipset, as described next. ufw has no equivalent, so there the replies stay dropped.
Matching scan replies with an ipset¶
firewalld can single out the replies to confluent's active scans. The rules below record the source address and port of each outgoing scan in an ipset for three seconds, and accept the packets that come back to it. They only add the replies, so open the discovery ports as described above as well.
firewall-cmd --permanent --new-ipset=confluentv4 --type=hash:ip,port --option timeout=3
firewall-cmd --permanent --new-ipset=confluentv6 --type=hash:ip,port --option timeout=3 --family inet6
firewall-cmd --reload
firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -p udp -m udp --dport 427 -j SET --add-set confluentv6 src,src --exist
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp -m udp --dport 427 -j SET --add-set confluentv4 src,src --exist
firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -p udp -m udp --dport 1900 -j SET --add-set confluentv6 src,src --exist
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp -m udp --dport 1900 -j SET --add-set confluentv4 src,src --exist
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p udp -m set --match-set confluentv4 dst,dst -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 1 -p udp -m set --match-set confluentv6 dst,dst -j ACCEPT
firewall-cmd --reload
Warning
This only works with FirewallBackend=iptables set in /etc/firewalld/firewalld.conf. Direct rules are always iptables rules, whatever the backend, but under the default nftables backend firewalld evaluates its own rules after them, so the ACCEPT above does not stop the zone from dropping the reply afterwards.
Both mechanisms are on the way out: firewalld documents the iptables backend and the direct interface as deprecated and slated for removal. Prefer the trusted zone where you can.
Web UI forwarding (optional)¶
The web interface can proxy a node's BMC web interface and remote console through the confluent server, so browsers do not need direct access to the BMC network. Port 3900 relays KVM video, and one further port starting at 3901 is allocated for each concurrent BMC session. There is no fixed upper bound, so size a range to the number of sessions you expect to have open at once.
These ports face the browser, so they belong on the external interface rather than the deployment one:
firewall-cmd --permanent --zone=public --add-port=3900-3999/tcp # KVM video plus one port per BMC session
firewall-cmd --reload
ufw allow in on eno1 to any port 3900:3999 proto tcp # KVM video plus one port per BMC session
SELinux¶
On distributions with SELinux enforcing, the web server needs permission to connect to confluent over the network:
setsebool -P httpd_can_network_connect=on
Without this, the reverse proxy on port 443 cannot reach the confluent API, and the web interface and node deployment both fail even though the firewall is correct.