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

Commande Signification
-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 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 présicer 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

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

#Reinitialiser iptables
	#-F pour -flush : Delete all rules in  chain or all chains
	#-X pour a priori --delete-chain : Delete a user-defined chain
sudo iptables -F
sudo iptables -X
sudo ip6tables -F
	
#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
echo "traffic sur l interface locale ok"

#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 specifiant -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"

#Pour éventuellement autoriser les ping en entrée, dé-commentez ces lignes
#iptables -t filter -A INPUT -p icmp -j LOGACCEPT

#Autoriser le ping en sortie
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "ping en sortie 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, dé-commentez ces lignes
#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"

#Autoriser tout le trafic en entrée depuis le réseau local qui commencera ici par une ip en 192.168
iptables -t filter -A INPUT -s 192.168.0.0/16 -j ACCEPT
echo "reseau local 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.

#Modification de la politique par défaut pour iptables de ipV6. On bloque en entrée et en transfert
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP

#Modification pour ipv4
#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 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
sudo ip6tables -F
	
#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
echo "traffic sur l interface locale ok"

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

#Pour éventuellement autoriser les ping en entrée, dé-commentez ces lignes
#iptables -t filter -A INPUT -p icmp -j LOGACCEPT

#Autoriser le ping en sortie
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "ping en sortie 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"

#Autoriser tout le trafic en entrée depuis le réseau local qui commencera ici par une ip en 192.168
iptables -t filter -A INPUT -s 192.168.0.0/16 -j ACCEPT
echo "reseau local 192.168.0.0 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.

#Modification de la politique par défaut pour iptables de ipV6. On bloque en entrée et en transfert
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP

#Modification pour ipv4
#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

Pour que votre script de configuration soit lancé automatiquement au boot de la machine, regarder l'article

https://www.tutos.eu/8599

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
Linux.comHow to Write iptables Rules for IPv6