Firewall — Sécurisation serveur (SSH + Web)

Configure iptables pour n'autoriser que les ports 22 (SSH), 80 (HTTP) et 443 (HTTPS). Tout le reste est DROP. Règles persistantes via iptables-persistent.

sécuritéfirewalliptableslinux
$ curl scripts.ysavary.fr/firewall-base | bash

Firewall — Sécurisation serveur basique

Configure iptables pour un serveur web standard : seuls les ports 22, 80 et 443 sont ouverts.
Utilise iptables-persistent pour survivre aux redémarrages.

> Attention : Ce script coupe toutes les connexions entrantes sauf SSH/HTTP/HTTPS.
> Vérifie que tu as bien accès sur le port 22 avant de lancer.

Ports ouverts :

Tout le reste : DROP (silencieux, pas de REJECT pour éviter le scan).

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."

# Sécurité : vérifier que SSH est bien accessible avant de verrouiller
warn "Ce script va fermer TOUS les ports sauf 22, 80, 443."
warn "Assure-toi d'être connecté en SSH sur le port 22."
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 complet ────────────────────────────────────────────────────────────
info "=== Remise à zéro des règles ==="
iptables  -F; iptables  -X; iptables  -Z
ip6tables -F; ip6tables -X; ip6tables -Z

# ── Politique par défaut : DROP ───────────────────────────────────────────────
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 ==="

apply() {
    iptables  "$@"
    ip6tables "$@"
}

# Loopback
apply -A INPUT -i lo -j ACCEPT

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

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

# ── Ports autorisés ───────────────────────────────────────────────────────────
apply -A INPUT -p tcp --dport 22  -j ACCEPT   # SSH
apply -A INPUT -p tcp --dport 80  -j ACCEPT   # HTTP
apply -A INPUT -p tcp --dport 443 -j ACCEPT   # HTTPS

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

echo ""
info "=== Firewall configuré ==="
echo ""
echo "  Ports ouverts :"
echo "    22/tcp   — SSH"
echo "    80/tcp   — HTTP"
echo "    443/tcp  — HTTPS"
echo ""
echo "  Politique par défaut : DROP (tout le reste ignoré)"
echo ""
echo "  Règles actives :"
iptables -L INPUT -n -v --line-numbers
echo ""
echo "  Ajouter un port : iptables -A INPUT -p tcp --dport PORT -j ACCEPT && netfilter-persistent save"
echo "  Voir les règles  : iptables -L INPUT -n -v"
echo ""