Use public interface firewalld zone

This commit is contained in:
Stanislas Lange
2026-08-04 13:28:21 +02:00
parent 0000dda615
commit e457f5b096
2 changed files with 43 additions and 6 deletions
+19 -1
View File
@@ -3071,6 +3071,15 @@ function installOpenVPN() {
# Select the firewall backend before installing dependencies so native # Select the firewall backend before installing dependencies so native
# firewalld and nftables systems do not need the iptables package. # firewalld and nftables systems do not need the iptables package.
FIREWALL_BACKEND=$(detect_firewall_backend) FIREWALL_BACKEND=$(detect_firewall_backend)
FIREWALLD_PORT_ZONE=""
if [[ $FIREWALL_BACKEND == 'firewalld' ]]; then
if [[ -n $NIC ]]; then
FIREWALLD_PORT_ZONE=$(firewall-cmd --get-zone-of-interface="$NIC" 2>/dev/null || true)
fi
if [[ -z $FIREWALLD_PORT_ZONE || $FIREWALLD_PORT_ZONE == 'no zone' ]]; then
FIREWALLD_PORT_ZONE=$(firewall-cmd --get-default-zone)
fi
fi
# If OpenVPN isn't installed yet, install it. This script is more-or-less # If OpenVPN isn't installed yet, install it. This script is more-or-less
# idempotent on multiple runs, but will only install OpenVPN from upstream # idempotent on multiple runs, but will only install OpenVPN from upstream
@@ -3525,6 +3534,7 @@ verb 3"
# Record installer-owned policy so firewall rules can be removed exactly. # Record installer-owned policy so firewall rules can be removed exactly.
{ {
echo "FIREWALL_BACKEND=$FIREWALL_BACKEND" echo "FIREWALL_BACKEND=$FIREWALL_BACKEND"
echo "FIREWALLD_PORT_ZONE=$FIREWALLD_PORT_ZONE"
echo "ROUTE_INTERNET=$ROUTE_INTERNET" echo "ROUTE_INTERNET=$ROUTE_INTERNET"
echo "CLIENT_TO_CLIENT=$CLIENT_TO_CLIENT" echo "CLIENT_TO_CLIENT=$CLIENT_TO_CLIENT"
echo "LOCAL_NETWORKS=$LOCAL_NETWORKS" echo "LOCAL_NETWORKS=$LOCAL_NETWORKS"
@@ -3651,7 +3661,7 @@ verb 3"
# destination rules to forwarded traffic; zone rich rules alone only # destination rules to forwarded traffic; zone rich rules alone only
# govern traffic addressed to the server. # govern traffic addressed to the server.
log_info "firewalld detected, using firewall-cmd..." log_info "firewalld detected, using firewall-cmd..."
run_cmd_fatal "Adding OpenVPN port to firewalld" firewall-cmd --permanent --add-port="$PORT/$PROTOCOL" run_cmd_fatal "Adding OpenVPN port to firewalld zone $FIREWALLD_PORT_ZONE" firewall-cmd --permanent --zone="$FIREWALLD_PORT_ZONE" --add-port="$PORT/$PROTOCOL"
run_cmd_fatal "Creating OpenVPN firewalld zone" firewall-cmd --permanent --new-zone=openvpn-install run_cmd_fatal "Creating OpenVPN firewalld zone" firewall-cmd --permanent --new-zone=openvpn-install
run_cmd_fatal "Creating OpenVPN firewalld policy" firewall-cmd --permanent --new-policy=openvpn-egress run_cmd_fatal "Creating OpenVPN firewalld policy" firewall-cmd --permanent --new-policy=openvpn-egress
run_cmd_fatal "Setting OpenVPN policy ingress" firewall-cmd --permanent --policy=openvpn-egress --add-ingress-zone=openvpn-install run_cmd_fatal "Setting OpenVPN policy ingress" firewall-cmd --permanent --policy=openvpn-egress --add-ingress-zone=openvpn-install
@@ -5045,6 +5055,7 @@ function removeOpenVPN() {
if [[ -f $install_config ]]; then if [[ -f $install_config ]]; then
has_policy_manifest=y has_policy_manifest=y
FIREWALL_BACKEND=$(grep '^FIREWALL_BACKEND=' "$install_config" | cut -d= -f2-) FIREWALL_BACKEND=$(grep '^FIREWALL_BACKEND=' "$install_config" | cut -d= -f2-)
FIREWALLD_PORT_ZONE=$(grep '^FIREWALLD_PORT_ZONE=' "$install_config" | cut -d= -f2- || true)
ROUTE_INTERNET=$(grep '^ROUTE_INTERNET=' "$install_config" | cut -d= -f2-) ROUTE_INTERNET=$(grep '^ROUTE_INTERNET=' "$install_config" | cut -d= -f2-)
CLIENT_TO_CLIENT=$(grep '^CLIENT_TO_CLIENT=' "$install_config" | cut -d= -f2-) CLIENT_TO_CLIENT=$(grep '^CLIENT_TO_CLIENT=' "$install_config" | cut -d= -f2-)
LOCAL_NETWORKS=$(grep '^LOCAL_NETWORKS=' "$install_config" | cut -d= -f2-) LOCAL_NETWORKS=$(grep '^LOCAL_NETWORKS=' "$install_config" | cut -d= -f2-)
@@ -5064,7 +5075,14 @@ function removeOpenVPN() {
# Remove firewall rules # Remove firewall rules
log_info "Removing firewall rules..." log_info "Removing firewall rules..."
if systemctl is-active --quiet firewalld && { [[ $has_policy_manifest == 'y' && $FIREWALL_BACKEND == 'firewalld' ]] || { [[ $has_policy_manifest == 'n' ]] && firewall-cmd --list-ports | grep -q "$PORT/$PROTOCOL_BASE"; }; }; then if systemctl is-active --quiet firewalld && { [[ $has_policy_manifest == 'y' && $FIREWALL_BACKEND == 'firewalld' ]] || { [[ $has_policy_manifest == 'n' ]] && firewall-cmd --list-ports | grep -q "$PORT/$PROTOCOL_BASE"; }; }; then
if [[ $has_policy_manifest == 'y' ]]; then
if [[ -z $FIREWALLD_PORT_ZONE ]]; then
FIREWALLD_PORT_ZONE=$(firewall-cmd --get-default-zone)
fi
run_cmd "Removing OpenVPN port from firewalld zone $FIREWALLD_PORT_ZONE" firewall-cmd --permanent --zone="$FIREWALLD_PORT_ZONE" --remove-port="$PORT/$PROTOCOL_BASE"
else
run_cmd "Removing OpenVPN port from firewalld" firewall-cmd --permanent --remove-port="$PORT/$PROTOCOL_BASE" run_cmd "Removing OpenVPN port from firewalld" firewall-cmd --permanent --remove-port="$PORT/$PROTOCOL_BASE"
fi
if [[ $has_policy_manifest == 'y' ]]; then if [[ $has_policy_manifest == 'y' ]]; then
firewall-cmd --permanent --delete-policy=openvpn-egress 2>/dev/null || true firewall-cmd --permanent --delete-policy=openvpn-egress 2>/dev/null || true
firewall-cmd --permanent --delete-zone=openvpn-install 2>/dev/null || true firewall-cmd --permanent --delete-zone=openvpn-install 2>/dev/null || true
+23 -4
View File
@@ -6,6 +6,15 @@ echo "=== OpenVPN Server Container ==="
/opt/test/local-network-detection.sh /opt/openvpn-install.sh /opt/test/local-network-detection.sh /opt/openvpn-install.sh
/opt/test/interactive-install-flow.sh /opt/openvpn-install.sh /opt/test/interactive-install-flow.sh /opt/openvpn-install.sh
# Verify that the installer uses the zone bound to the public interface, not
# firewalld's default zone.
if systemctl is-active --quiet firewalld; then
FIREWALLD_TEST_INTERFACE=$(ip -4 route ls | awk '/^default / { for (i = 1; i <= NF; i++) if ($i == "dev") { print $(i + 1); exit } }')
firewall-cmd --set-default-zone=public >/dev/null
firewall-cmd --permanent --zone=external --change-interface="$FIREWALLD_TEST_INTERFACE" >/dev/null
firewall-cmd --reload >/dev/null
fi
# Create TUN device if it doesn't exist # Create TUN device if it doesn't exist
if [ ! -c /dev/net/tun ]; then if [ ! -c /dev/net/tun ]; then
mkdir -p /dev/net mkdir -p /dev/net
@@ -301,6 +310,10 @@ for setting in "ROUTE_INTERNET=$ROUTE_INTERNET" "CLIENT_TO_CLIENT=$CLIENT_TO_CLI
exit 1 exit 1
} }
done done
if systemctl is-active --quiet firewalld && ! grep -Fxq 'FIREWALLD_PORT_ZONE=external' /etc/openvpn/server/openvpn-install.conf; then
echo "FAIL: Policy manifest is missing the public interface's firewalld zone"
exit 1
fi
echo "PASS: Access policy configuration is correct" echo "PASS: Access policy configuration is correct"
@@ -831,11 +844,17 @@ if systemctl is-active --quiet firewalld; then
echo "FAIL: firewalld zone-wide masquerade should not be enabled" echo "FAIL: firewalld zone-wide masquerade should not be enabled"
exit 1 exit 1
fi fi
if firewall-cmd --list-ports | grep -q "1194/udp"; then FIREWALLD_PORT_ZONE=$(grep '^FIREWALLD_PORT_ZONE=' /etc/openvpn/server/openvpn-install.conf | cut -d= -f2-)
echo "PASS: OpenVPN port is open in firewalld" if firewall-cmd --zone="$FIREWALLD_PORT_ZONE" --query-port="1194/udp"; then
echo "PASS: OpenVPN port is open in the public interface's firewalld zone"
else else
echo "FAIL: OpenVPN port not found in firewalld" echo "FAIL: OpenVPN port not found in firewalld zone $FIREWALLD_PORT_ZONE"
firewall-cmd --list-ports firewall-cmd --zone="$FIREWALLD_PORT_ZONE" --list-ports
exit 1
fi
FIREWALLD_DEFAULT_ZONE=$(firewall-cmd --get-default-zone)
if [ "$FIREWALLD_DEFAULT_ZONE" != "$FIREWALLD_PORT_ZONE" ] && firewall-cmd --zone="$FIREWALLD_DEFAULT_ZONE" --query-port="1194/udp"; then
echo "FAIL: OpenVPN port was also added to firewalld's default zone"
exit 1 exit 1
fi fi
elif systemctl is-active --quiet nftables; then elif systemctl is-active --quiet nftables; then