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)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word