Firewall — Serveur 3CX (tous les ports nécessaires)

Configure iptables avec tous les ports requis par 3CX PBX : SIP, RTP, tunnel SBC, admin web et wizard. Règles persistantes.

sécuritéfirewalliptables3cxvoip
$ curl scripts.ysavary.fr/firewall-3cx | bash

Firewall — Serveur 3CX

Configure iptables avec l'ensemble des ports nécessaires au bon fonctionnement de 3CX Phone System.

Ports ouverts :

| Port | Proto | Usage |
|------|-------|-------|
| 22 | TCP | SSH |
| 80 | TCP | HTTP (redirect vers HTTPS) |
| 443 | TCP | HTTPS — interface admin |
| 5001 | TCP | HTTPS SIP — clients 3CX (app mobile, softphone) |
| 5015 | TCP | Wizard de configuration (à fermer après setup) |
| 5060 | TCP+UDP | SIP standard |
| 5061 | TCP | SIP TLS |
| 5090 | TCP+UDP | Tunnel SBC |
| 9000–9499 | UDP | RTP — flux audio/vidéo |

> Note : Le port 5015 peut être fermé après la configuration initiale pour réduire la surface d'attaque.

bash
#!/bin/bash
set -euo pipefail

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info()  { echo -e "${GREEN}[INFO]${NC}  $*"; }
warn()  { echo -e "${YELLOW}[WARN]${NC}  $*"; }
error() { echo -e "${RED}[ERR]${NC}   $*"; exit 1; }

[[ $EUID -ne 0 ]] && error "Ce script doit être exécuté en root."

warn "Ce script va appliquer les règles firewall 3CX."
warn "Seuls les ports nécessaires à 3CX seront ouverts."
echo ""
read -rp "  Continuer ? [oui/NON] " confirm
[[ "$confirm" != "oui" ]] && echo "Annulé." && exit 0

# ── Installation iptables-persistent ─────────────────────────────────────────
info "=== Installation de iptables-persistent ==="
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y iptables-persistent

# ── Flush ────────────────────────────────────────────────────────────────────
info "=== Remise à zéro des règles ==="
iptables  -F; iptables  -X; iptables  -Z
ip6tables -F; ip6tables -X; ip6tables -Z

# ── Politique par défaut ──────────────────────────────────────────────────────
iptables  -P INPUT   DROP
iptables  -P FORWARD DROP
iptables  -P OUTPUT  ACCEPT
ip6tables -P INPUT   DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT  ACCEPT

info "=== Application des règles 3CX ==="

tcp() { iptables -A INPUT -p tcp --dport "$1" -j ACCEPT; ip6tables -A INPUT -p tcp --dport "$1" -j ACCEPT; }
udp() { iptables -A INPUT -p udp --dport "$1" -j ACCEPT; ip6tables -A INPUT -p udp --dport "$1" -j ACCEPT; }

# Loopback
iptables  -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT

# Connexions établies
iptables  -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ICMP
iptables  -A INPUT -p icmp   --icmp-type echo-request -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT

# ── Ports 3CX ────────────────────────────────────────────────────────────────
tcp 22          # SSH
tcp 80          # HTTP
tcp 443         # HTTPS admin
tcp 5001        # HTTPS SIP (app 3CX, softphones)
tcp 5015        # Wizard (peut être fermé après config)
tcp 5060        # SIP TCP
udp 5060        # SIP UDP
tcp 5061        # SIP TLS
tcp 5090        # Tunnel SBC TCP
udp 5090        # Tunnel SBC UDP

# RTP audio/vidéo (plage complète 3CX)
iptables  -A INPUT -p udp --dport 9000:9499 -j ACCEPT
ip6tables -A INPUT -p udp --dport 9000:9499 -j ACCEPT

# ── Sauvegarde ───────────────────────────────────────────────────────────────
info "=== Sauvegarde des règles ==="
netfilter-persistent save

echo ""
info "=== Firewall 3CX configuré ==="
echo ""
echo "  Ports ouverts :"
echo "    22/tcp           — SSH"
echo "    80/tcp           — HTTP"
echo "    443/tcp          — HTTPS admin"
echo "    5001/tcp         — HTTPS SIP (clients 3CX)"
echo "    5015/tcp         — Wizard (fermer après config)"
echo "    5060/tcp+udp     — SIP"
echo "    5061/tcp         — SIP TLS"
echo "    5090/tcp+udp     — Tunnel SBC"
echo "    9000-9499/udp    — RTP audio/vidéo"
echo ""
echo "  Fermer le wizard après config :"
echo "    iptables -D INPUT -p tcp --dport 5015 -j ACCEPT && netfilter-persistent save"
echo ""
iptables -L INPUT -n -v --line-numbers
echo ""