Configuring Segregated Networks
Page not available in that version
The current page Configuring Segregated Networks doesn't exist in version v1.4.1 of the documentation for this product.
Overview
This guide covers configuring a cluster with separate interfaces for internal cluster communication and external internet access (also known as segregated or dual-homed deployments). In this setup, eth1 handles the internal cluster traffic (pod-to-pod, control plane) while eth0 provides public internet access.
Security Benefit: This configuration provides physical isolation between East-West (cluster) and North-South (external) traffic. The trusted zone allows unrestricted internal communication, while the public zone handles external access with controlled port exposure.
When configuring segregated networks with K3s, proper interface binding is essential. K3s uses the --flannel-iface flag to ensure pod traffic stays on the private network, and the --node-external-ip flag to advertise the public address for external access.
Important: K3s manages pod masquerading and service routing automatically. You only need to configure firewalld zones correctly and pass the proper flags to the K3s installer.
Complete, step-by-step instructions follow.
Prerequisites
Before starting, ensure:
- Operating system is installed and updated on all nodes
- Network connectivity between nodes is available
- SSH access is configured for all cluster nodes
Configure Firewalld Zones
This guide configures separate zones for internal cluster traffic and external access.
Assign Interfaces to Zones
K3s uses trusted zone for the internal network to allow unrestricted pod-to-pod and control plane traffic:
# Assign eth0 (external/internet) to public zone
firewall-cmd --permanent --zone=public --change-interface=eth0
# Assign eth1 (internal/cluster) to trusted zone
firewall-cmd --permanent --zone=trusted --change-interface=eth1
# Allow pod and service CIDRs in trusted zone (required for pod communication)
firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16
# Reload firewall
firewall-cmd --reload
Configure Firewall Ports
Open the necessary ports on the public zone for external access:
# External access ports
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=9095/tcp
firewall-cmd --permanent --zone=public --add-port=6379/tcp
firewall-cmd --permanent --zone=public --add-port=8125/tcp
firewall-cmd --permanent --zone=public --add-port=8125/udp
# Apply changes
firewall-cmd --reload
Note: K3s automatically creates iptables rules for internal cluster ports (6443, 10250, 2379-2380, 8472, 5001, 9500-9503, 8500-8504, 10000-30000, 3260, 2049) when using
--flannel-iface=eth1. Pod and service CIDRs (10.42.0.0/16 and 10.43.0.0/16) are already allowed in the trusted zone via the--add-sourcecommands above.
Verify Zone Configuration
firewall-cmd --zone=public --list-all
firewall-cmd --zone=trusted --list-all
Expected output for public zone:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth2
sources:
services: dhcpv6-client ssh cockpit
ports: 80/tcp 443/tcp 9095/tcp 6379/tcp 8125/tcp 8125/udp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Expected output for trusted zone:
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: eth1
sources: 10.42.0.0/16 10.43.0.0/16
services: ssh mdns
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Note: Additional interfaces may appear in a zone (e.g.,
eth0 eth2) if firewalld auto-assigned them based on network configuration. This is expected and does not affect functionality.
Single-NIC Alternative
If you only have a single network interface, see the Shared Interface Setup guide instead. This guide is specifically for multi-NIC deployments with separate interfaces for cluster and external traffic.
Troubleshooting
Verify Zone Configuration
If pods cannot communicate with services, verify the trusted zone has the correct sources configured:
firewall-cmd --zone=trusted --list-all
Expected output:
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: eth1
sources: 10.42.0.0/16 10.43.0.0/16
services: ssh mdns
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Ensure both 10.42.0.0/16 (pod network) and 10.43.0.0/16 (service network) are listed under sources. If missing, re-run:
firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16
firewall-cmd --reload