
🌐 Aussi en: English · Deutsch · Español
Chez moi, dans mon homelab, je fais tourner plusieurs réseaux internes.
L’un pour les appareils clients de confiance, l’autre nettement moins fiable – une sorte de DMZ. La DMZ héberge les VM qui doivent être joignables depuis Internet au niveau réseau.
L’objectif principal : protéger le réseau interne et limiter le rayon d’explosion si une machine de la DMZ non fiable se fait compromettre.
Les deux réseaux sont reliés directement à mes serveurs.
Pour les garder au moins un minimum séparés, j’utilise un petit boîtier Protectli comme pare-feu dédié : il fait office de routeur de couche 3, gère le trafic entre les réseaux et impose la segmentation.
Dessus, j’ai mis en place un jeu de règles iptables basique mais fonctionnel. Il surveille le trafic entre les réseaux et fait du filtrage à états tout simple – autrement dit, il suit les connexions et n’autorise les réponses que si l’ouverture de la connexion a été autorisée.
Pour ma propre santé mentale (et ma sécurité), voici une version allégée de la configuration – pas tout, seulement les parties qui montrent comment ça marche :
#!/bin/bash
# ==========================================
# Simple Firewall Script with Logging
# Network Separation: Internal <-> Firewall <-> DMZ
# Internal: 192.168.0.x/24
# DMZ: 192.168.100.x/24
# ==========================================
### 1. Basic Cleanup ###
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X
# Default Policies: Deny all traffic by default
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
### 2. Allow Loopback Traffic ###
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
### 3. Allow Established and Related Connections ###
/sbin/iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
### 4. Allow ICMP (Ping etc.) ###
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
/sbin/iptables -A FORWARD -p icmp -j ACCEPT
### 5. Prevent Common Scans and Spoofing ###
# Block XMAS and NULL scans
/sbin/iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP
/sbin/iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP
# Block spoofed source addresses
/sbin/iptables -A INPUT -s 0.0.0.0/8 -j DROP
/sbin/iptables -A INPUT -s 127.0.0.0/8 ! -i lo -j DROP
/sbin/iptables -A INPUT -s 169.254.0.0/16 -j DROP
/sbin/iptables -A INPUT -s 224.0.0.0/4 -j DROP
/sbin/iptables -A INPUT -s 240.0.0.0/5 -j DROP
### 6. Allow Internal -> DMZ Traffic ###
/sbin/iptables -A FORWARD -s 192.168.0.x/24 -d 192.168.100.x/24 -j ACCEPT
# Allow Fluent Bit / OpenSearch from DMZ to internal Elasticsearch node
/sbin/iptables -A INPUT -p tcp -s 192.168.100.x/24 -d 192.168.0.x –dport 9200 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -s 192.168.100.x/24 -d 192.168.0.x –dport 9200 -j ACCEPT
### 7. Block DMZ -> Internal Traffic (unless explicitly allowed) ###
/sbin/iptables -A FORWARD -s 192.168.100.x/24 -d 192.168.0.x/24 -j DROP
### 8. Access to the Firewall (INPUT chain) ###
# Allow SSH to firewall from internal
/sbin/iptables -A INPUT -p tcp -d 192.168.0.x –dport 22 -m state –state NEW -j ACCEPT
# Allow HTTP/HTTPS access to firewall (e.g. web interface)
/sbin/iptables -A INPUT -p tcp -d 192.168.0.x –dport 80 -m state –state NEW -j ACCEPT
/sbin/iptables -A INPUT -p tcp -d 192.168.0.x –dport 443 -m state –state NEW -j ACCEPT
### 9. Allow Internal <-> Internal ###
/sbin/iptables -A FORWARD -s 192.168.0.x/24 -d 192.168.0.x/24 -j ACCEPT
### 10. Outbound Traffic from the Firewall ###
# DNS, NTP, FTP, SSH, Mail, Web etc.
/sbin/iptables -A OUTPUT -p udp –dport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -p udp –dport 123 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 20:21 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 22 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 25 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 43 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 443 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 465 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 587 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp –dport 9200 -j ACCEPT
### 11. Allow Forwarding of DNS, HTTP/S, and FTP from Intern/DMZ ###
# DNS
/sbin/iptables -A FORWARD -p udp –dport 53 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp –dport 53 -j ACCEPT
# Web (HTTP/HTTPS)
/sbin/iptables -A FORWARD -p tcp –dport 80 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp –dport 443 -j ACCEPT
# FTP
/sbin/iptables -A FORWARD -p tcp –dport 20 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp –dport 21 -j ACCEPT
### 12. Logging of Dropped Packets (excluding Broadcast/Multicast) ###
/sbin/iptables -N LOGGING
# Ignore broadcast and multicast logging
/sbin/iptables -A LOGGING -m pkttype –pkt-type broadcast -j DROP
/sbin/iptables -A LOGGING -m pkttype –pkt-type multicast -j DROP
# Log everything else that’s dropped
/sbin/iptables -A LOGGING -m limit –limit 2/min -j LOG \
–log-prefix « IPTables-Dropped: » –log-level 4
/sbin/iptables -A LOGGING -j DROP
# Send dropped INPUT and FORWARD traffic to LOGGING chain
/sbin/iptables -A INPUT -j LOGGING
/sbin/iptables -A FORWARD -j LOGGING
exit 0




