TUTOS.EU

Mise en place d'une configuration de base pour le Firewall Iptables

Comment mettre en place le paramétrage de base de IpTables sur votre serveur Linux quand il est en frontal sur Internet

Le firewall va être configuré ainsi :

  • On va modifier la politique par défaut de la table des entrées (INPUT) et des transferts (FORWARD) pour que le trafic soit bloqué. Ainsi un flux qui n'est pas explicitement autorisé sera bloqué.
  • On va ensuite ajouter en tête de liste des autorisations, au cas par cas. On autorisera :
    • le trafic lié ou appartenant à des connexions déjà établies
    • le traffic sur l'interface locale
    • le traffic nécessaire comme les requêtes DNS, l'interrogation des serveurs de temps
    • le trafic pour les services que l'on souhaite mettre à disposition comme web, ssh, etc

Notes concernant la signification des futures commandes :

-t ou --table table : nom de la table à utiliser. Par défaut c'est filter qui contient les chaînes input, output et forward, mais cela peut être nat, mangle, raw
-A pour --append : Append to chain
	-A ajoute une règle à une chaine cad INPUT, OUTPUT, FORWARD.
	Un append ajoute la règle à la suite des autres cad en bas de liste.
-I insère une règle. Par défaut elle est insérée en première ligne, en position 1 cad en début de liste.
	On peut préciser le numéro de la ligne.
-s ou --source : réseau ou ip source
-d ou --destination : réseau ou ip cible
-p ou --protocol : on indique le protocol. Cela peut être tcp, udp, icmp, all etc
--sport ou --source-port : c'est le port source
--dport ou --destination-port : c'est le port cible
-i pour --in-interface c'est à dire le nom de l'interface d'entrée.
	Quand il n'y a qu'une carte réseau il n'est pas toujours nécessaire de le préciser
	lo correspond à l'interface de loopback
-o pour --out-interface c'est à dire le nom de l'interface de sortie.
-j (ou --jump ?) : on indique ce qu'on fait du paquet avec par exemple ACCEPT, DROP, LOG etc
-P chaîne (chain) cible, cad INPUT, OUTPUT, FORWARD etc
Lien vers le fichier : cliquez ici

Voici les commandes qui vont être exécutées par le script qui va paramétrer iptables.
Les lignes qui débutent pas un # sont des lignes commentées qui servent d'information

#Réinitialiser iptables
	#-F pour -flush : Delete all rules in  chain or all chains
	#-X pour à priori --delete-chain : Delete a user-defined chain
sudo iptables -F
sudo iptables -X
	
#permettre à une connexion déjà ouverte de recevoir du trafic :
	# notez que pour les nouvelles versions la commande peut être :
	# iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

#Authoriser l'interface locale (loopback).
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

#Création d'une new user-defined chain pour pouvoir autoriser ET logger un flux avec le préfixe iptables
iptables -N LOGACCEPT
iptables -A LOGACCEPT -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGACCEPT -j ACCEPT

#Création d'une new user-defined chain pour pouvoir explicitement bloquer et logger un flux avec le préfixe iptables
iptables -N LOGDROP
iptables -A LOGDROP -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGDROP -j DROP

#On aurait pu préciser dans chaque règle de rejet qu'elle interface était concernée, comme par exemple eth0 en spécifiant -i eth0, mais avouez que c'est nettement plus compliqué.
#Si vous n'avez pas authorisé le traffic de loopback dans les première règles et donc que vous le faites après coup, il faut s'assurer que cette règle soit dans les premières. Pour cela on va faire un Insert en seconde position avec cette commande
#iptables -t filter -I INPUT 2 -i lo -j ACCEPT
#iptables -t filter -I OUTPUT 2 -i lo -j ACCEPT

#Permettre le trafic entrant et sortant pour le port SSH, cad le port 22
iptables -t filter -A INPUT -p tcp --dport 22 -j LOGACCEPT #-i eth0
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
echo "ssh ok"

#Permettre le trafic entrant pour un éventuel serveur openVpn, cad le port 1194
iptables -t filter -A INPUT -p udp --dport 1194 -j LOGACCEPT
echo "OpenVpn ok"

#Autoriser le ping en entrée et sortie
iptables -t filter -A INPUT -p icmp -j LOGACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

#Autoriser les requêtes DNS en sortie
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
echo "dns ok"

#Pour éventuellement autoriser les requêtes DNS en entrée
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

#Autoriser les requêtes NTP en sortie pour pouvoir se synchroniser ai niveau temps
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "ntp ok"

#Changer la politique par défaut sur les paquets entrants pour que, sans règle appliquée, le paquet soit rejeté. Attention donc à avoir au préalable autoriser le SSH par exemple.
#On aurait pu laisser la politique par défaut à ACCEPT et avoir placé en toute dernière règle une qui refuse tout. Les paquets autorisés par les règles précédentes n'atteindraient pas celle-ci.
#iptables -A INPUT -j DROP
iptables -P INPUT DROP

#Modification de la politique par défaut sur les paquets transférés afin que par défaut ils soient bloqués
iptables -P FORWARD DROP

#On peut modifier la politique par défaut pour bloquer de base les paquets sortants mais je ne le fais pas car je trouve cela trop violent
#iptables -P OUTPUT DROP

echo "Script de configuration de iptables terminé"
Lien vers le fichier : cliquez ici

Notez qu'à priori pour avoir un log des paquets en entrée et des paquets forward on peut utiliser ces commandes :

iptables -A INPUT -j LOG
iptables -A FORWARD -j LOG
Lien vers le fichier : cliquez ici

J'ai aussi vu sur
http://www.cyberciti.biz/tips/linux-iptables-10-how-to-block-common-attack.html

que l'on pouvait bloquer des attaques basiques avec ces commandes :

#Force SYN packets check : S'assurer que les nouveaux paquets sont des paquets SYN, sinon les shooter
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

#Force Fragments packets check : forcer la vérification des paquets fragmentés. A priori cela évite que Linux panique pour des pertes de données
iptables -A INPUT -f -j DROP

#Shooter les paquets XMAS  mal formés
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

#Shooter les paquets NULL
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
Lien vers le fichier : cliquez ici

Toutes ces commandes seront placées dans un fichier script nommé ici firewall.sh
firewall.sh sera créé dans /etc/init.d

Ce script devra commencer par une entête qui sera :

#!/bin/sh
## BEGIN INIT INFO
# Provides:          Firewall maison
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive:     false
# Short-Description: Firewall maison
### END INIT INFO
Lien vers le fichier : cliquez ici

Pour créer le fichier de script firewall.sh dans dans /etc/init.d on va donc entrer ces commandes :

cd /etc/init.d
nano firewall.sh
Lien vers le fichier : cliquez ici

Ce qui donne :

On placera alors ce contenu dans firewall.sh et on sauvegardera le fichier :

#!/bin/sh
## BEGIN INIT INFO
# Provides:          Firewall maison
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive:     false
# Short-Description: Firewall maison
### END INIT INFO

#Réinitialiser iptables
	#-F pour -flush : Delete all rules in  chain or all chains
	#-X pour à priori --delete-chain : Delete a user-defined chain
sudo iptables -F
sudo iptables -X
	
#permettre à une connexion déjà ouverte de recevoir du trafic :
	# notez que pour les nouvelles versions la commande peut être :
	# iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

#Authoriser l'interface locale (loopback).
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

#Création d'une new user-defined chain pour pouvoir autoriser ET logger un flux avec le préfixe iptables
iptables -N LOGACCEPT
iptables -A LOGACCEPT -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGACCEPT -j ACCEPT

#Création d'une new user-defined chain pour pouvoir explicitement bloquer et logger un flux avec le préfixe iptables
iptables -N LOGDROP
iptables -A LOGDROP -j LOG --log-prefix 'iptables:' -m limit --limit 2/min
iptables -A LOGDROP -j DROP

#On aurait pu préciser dans chaque règle de rejet qu'elle interface était concernée, comme par exemple eth0 en spécifiant -i eth0, mais avouez que c'est nettement plus compliqué.
#Si vous n'avez pas authorisé le traffic de loopback dans les première règles et donc que vous le faites après coup, il faut s'assurer que cette règle soit dans les premières. Pour cela on va faire un Insert en seconde position avec cette commande
#iptables -t filter -I INPUT 2 -i lo -j ACCEPT
#iptables -t filter -I OUTPUT 2 -i lo -j ACCEPT

#Permettre le trafic entrant et sortant pour le port SSH, cad le port 22
iptables -t filter -A INPUT -p tcp --dport 22 -j LOGACCEPT #-i eth0
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
echo "ssh ok"

#Permettre le trafic entrant pour un éventuel serveur openVpn, cad le port 1194
iptables -t filter -A INPUT -p udp --dport 1194 -j LOGACCEPT
echo "OpenVpn ok"

#Autoriser le ping en entrée et sortie
iptables -t filter -A INPUT -p icmp -j LOGACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "ping ok"

#Autoriser les requêtes DNS en sortie
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
echo "dns ok"

#Pour éventuellement autoriser les requêtes DNS en entrée
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

#Autoriser les requêtes NTP en sortie pour pouvoir se synchroniser ai niveau temps
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "ntp ok"

#Changer la politique par défaut sur les paquets entrants pour que, sans règle appliquée, le paquet soit rejeté. Attention donc à avoir au préalable autoriser le SSH par exemple.
#On aurait pu laisser la politique par défaut à ACCEPT et avoir placé en toute dernière règle une qui refuse tout. Les paquets autorisés par les règles précédentes n'atteindraient pas celle-ci.
#iptables -A INPUT -j DROP
iptables -P INPUT DROP

#Modification de la politique par défaut sur les paquets transférés afin que par défaut ils soient bloqués
iptables -P FORWARD DROP

#On peut modifier la politique par défaut pour bloquer de base les paquets sortants mais personnellement je ne le fais pas car je trouve cela trop violent
#iptables -P OUTPUT DROP

echo "Script de configuration de iptables terminé"
Lien vers le fichier : cliquez ici

Une fois que l'on a sauvegardé et quitté le fichier avec ctrl -X
on va donner les droits d'exécution au fichier firewall.sh avec la commande

chmod +x ./firewall.sh
Lien vers le fichier : cliquez ici

Et pour que firewall.sh soit lancé automatiquement au boot on entre la commande

update-rc.d firewall.sh defaults
Lien vers le fichier : cliquez ici

Pour annuler cette dernière commande on tape

update-rc.d -f firewall.sh remove
Lien vers le fichier : cliquez ici

Par défaut, les droits du fichiers sont du type :
tous les droits pour le propriétaire, lecture et exécution pour les autres.
On peut remettre ces droits ainsi :

chmod 755 firewall.sh
Lien vers le fichier : cliquez ici

A la vue de cette configuration, si vous voulez voir en temps réel les flux qui sont autorisés, tapez (sous Ubuntu) :

tail -f /var/log/syslog | grep 'IPTABLES: '
Lien vers le fichier : cliquez ici

Exemple

Pages Web

Site WebDescription
doc.ubuntu-fr.org/iptablesDocumentation de prise en main de iptables du site Ubuntu
dd-wrt.com/wikiWiki de la distrib dd-wrt qui donne la signification des options de base d'iptables
Ariege360.frExplique comment créer le fichier firewall.sh, le rendre exécutable et le lancer automatiquement au boot du serveur. Explique aussi fail2ban
Cyberciti.bizHow to: Linux Iptables block common attacks
Linux.die.netAide de Iptables sur Linux.die.net