Bases d’un firewall sur serveur dédié avec Netfilter (iptables)
Notre serveur dédié se sent un peu nu sur Internet et pour cause : il n’est doté d’aucun filtrage IP. Il faudrait rapidement lui injecter, à l’aide d’iptables, quelques règles netfilter afin de le protéger un minimum.
Nous allons créer un script contenant les règles à mettre en place. Ce script sera lancé au démarrage du serveur.
Initialisation
La toute première étape va consister à vider les tables :
# RAZ DES TABLES
iptables -t filter -F
iptables -t filter -X
.
Les connexions existantes ne doivent pas être cassées… C’est utile sur un serveur dédié, pour ne pas perdre la main.
# Ne pas casser les connexions établies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
.
Comme toujours quand on parle de sécurité, nous allons commencer par tout interdire. Aucun paquet, qu’il soit entrant, sortant ou routé par le serveur ne doit passer.
# Interdire tous les paquets...tous...
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
.
A nous maintenant d’autoriser le trafic nécessaire… Et seulement le trafic nécessaire. Nous allons, dans l’ordre, étudier les connexions entrante, sortantes et éventuellement celles susceptibles d’ être routées par la machine; C’est relativement rare pour un serveur dédié, mais possible, dans le cas de VPN par exemple.
Règles pour les paquets entrants
Quels services sont fournis par le serveur ?
- Un serveur WEB,
# HTTP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
.
- Un serveur VPN (OpenVPN) pour un client dont l’adresse IP est XXX.XXX.XXX.XXX,
# OpenVPN
iptables -t filter -A INPUT -p udp --dport 1194 -s XXX.XXX.XXX.XXX -j ACCEPT
.
- Un serveur de mails,
# SMTP
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
.
- Les boites mails sont accessibles en POP et IMAP, mais depuis le VPN uniquement,
# POP3
iptables -t filter -A INPUT -i tun+ -p tcp --dport 110 -j ACCEPT
# IMAP
iptables -t filter -A INPUT -i tun+ -p tcp --dport 143 -j ACCEPT
.
- De même, un serveur DNS est disponible pour les machines du vpn,
# DNS en Entrée
iptables -t filter -A INPUT -i tun+ -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -i tun+ -p udp --dport 53 -j ACCEPT
.
- Pour être conforme au RFC, le serveur répond aux requêtes ICMP (ping),
# ICMP
iptables -t filter -A INPUT -p icmp -j ACCEPT
.
- N’oublions pas SSH… Ca peut toujours servir,
# SSH
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
.
- Enfin, aucune restriction n’est appliquée pour l’interface Loopback (Localhost)
# LOOPBACK
iptables -t filter -A INPUT -i lo -j ACCEPT
.
Règles pour les paquets sortants
Quels services sont nécessaires au serveur ?
- Le serveur doit pouvoir envoyer des requêtes DNS,
# DNS
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
.
- Disposer d’un accès HTTP ( utile pour les mises à jour ),
# HTTP
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
.
- Ssh est autorisé en sortie,
# SSH
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
.
- Envoyer des mails,
# SMTP
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
.
- Récupérer des mails sur un compte POP3 par l’intermédiaire de fetchmail,
# POP3
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
.
- Pinguer (ben tiens !),
# ICMP
iptables -t filter -A OUTPUT -t icmp -j ACCEPT
.
- Etablir une connexion OpenVPN vers un autre serveur dont l’adresse IP est YYY.YYY.YYY.YYY : Ce serveur interconnecte un VPN dont il est le serveur avec un VPN dont il est client,
# VPN
iptables -t filter -A OUTPUT -p udp --dport 1194 -d YYY.YYY.YYY.YYY -j ACCEPT
.
- Enfin, aucune restriction sur l’interface loopback,
# LOOPBACK
iptables -t filter -A OUTPUT -o lo -j ACCEPT
.
Règle pour les paquets traversants (routés)
- Ce serveur interconnecte deux VPN, on ne souhaite pas filter le trafic d’un VPN vers l’autre,
# VPN2VPN
iptables -t filter -A FORWARD -i tun+ -o tun+ -j ACCEPT
.
Syn flood, spoofing et compagnie…
Pour finir, ajoutons quelques règles pour limiter tout ça, quelques traces dans les logs et le tour sera joué…
- Limitation du syn flood
# Syn Flood
iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
iptables -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
.
- « Anti-spoofing »
# Spoofing
iptables -N SPOOFED
iptables -A SPOOFED -s 127.0.0.0/8 -j DROP
iptables -A SPOOFED -s 169.254.0.0/12 -j DROP
iptables -A SPOOFED -s 172.16.0.0/12 -j DROP
iptables -A SPOOFED -s 192.168.0.0/16 -j DROP
iptables -A SPOOFED -s 10.0.0.0/8 -j DROP
.
- Log des paquets rejetés dans syslog
# LOG des paquets rejetés
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP]:'
iptables -A LOG_DROP -j DROP
iptables -t filter -A INPUT -j LOG_DROP
iptables -t filter -A OUTPUT -j LOG_DROP
iptables -t filter -A FORWARD -j LOG_DROP
.
Voilà, ce n’est pas trop mal pour un début ; ) Ci-dessous, le script « recollé » :
########## ## INIT ## ########## # RAZ DES TABLES iptables -t filter -F iptables -t filter -X # Ne pas casser les connexions établies iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Interdire tous les paquets...tous... iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP ########### ## INPUT ## ########### # HTTP iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT # OpenVPN iptables -t filter -A INPUT -p udp --dport 1194 -s XXX.XXX.XXX.XXX -j ACCEPT # SMTP iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT # POP3 iptables -t filter -A INPUT -i tun+ -p tcp --dport 110 -j ACCEPT # IMAP iptables -t filter -A INPUT -i tun+ -p tcp --dport 143 -j ACCEPT # DNS en Entrée iptables -t filter -A INPUT -i tun+ -p tcp --dport 53 -j ACCEPT iptables -t filter -A INPUT -i tun+ -p udp --dport 53 -j ACCEPT # ICMP iptables -t filter -A INPUT -p icmp -j ACCEPT # SSH iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT # LOOPBACK iptables -t filter -A INPUT -i lo -j ACCEPT ############ ## OUTPUT ## ############ # DNS iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT # HTTP iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT # SSH iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT # SMTP iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT # POP3 iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT # ICMP iptables -t filter -A OUTPUT -t icmp -j ACCEPT # VPN iptables -t filter -A OUTPUT -p udp --dport 1194 -d YYY.YYY.YYY.YYY -j ACCEPT # LOOPBACK iptables -t filter -A OUTPUT -o lo -j ACCEPT ############### ## FORWARD ## ############### # VPN2VPN iptables -t filter -A FORWARD -i tun+ -o tun+ -j ACCEPT ############### ## FINITIONS ## ############### # Syn Flood iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT iptables -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT # Spoofing iptables -N SPOOFED iptables -A SPOOFED -s 127.0.0.0/8 -j DROP iptables -A SPOOFED -s 169.254.0.0/12 -j DROP iptables -A SPOOFED -s 172.16.0.0/12 -j DROP iptables -A SPOOFED -s 192.168.0.0/16 -j DROP iptables -A SPOOFED -s 10.0.0.0/8 -j DROP # LOG des paquets rejetés iptables -N LOG_DROP iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP]:' iptables -A LOG_DROP -j DROP iptables -t filter -A INPUT -j LOG_DROP iptables -t filter -A OUTPUT -j LOG_DROP iptables -t filter -A FORWARD -j LOG_DROP |
Laissez votre message après le bip...Biiiiip



Hey mec, ne pas oublier d’appeller la table « SPOOFED » sinon elle sert a rien
iptables -A INPUT -p all -i eth0 -j SPOOFED
A+