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 ?

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

Règles pour les paquets sortants

Quels services sont nécessaires au serveur ?

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

Règle pour les paquets traversants (routés)

# 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é…

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

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

Commentaires

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+

Laisser un commentaire

(requis)

(requis)