Règles de base iptables
J’ai dut changé de serveur il y a 2 jours et face à une nouvelle installation, je me suis retrouvé confronté à une configuration de base iptables ésotérique. Après plusieurs tentatives de modifications “nouvelle mode”, j’en suis revenu à ma méthode favorite, l’ancienne, celle qui marche. Ainsi, si vous voulez régler un firewall “basique” (assez fiable), vous pouvez suivre ma méthode. Elle n’est pas nouvelle ni révolutionnaire, mais elle est maîtrisable.
Tout d’abord, la fameuse commande “iptables -L” me donnait des règles difficilement compréhensibles. Etant donné que je voulais au moins arriver à ouvrir quelques ports, et sans entrer dans une configuration compliquée, j’ai décidé de faire un “flush”. Erreur !!! trop pressé, j’ai simplement laissé les règles par défaut en “DROP”, je n’avais plus qu’à relancer le serveur pour m’en sortir.
Bref, pour éviter tout problème, voici les commandes de base à effectuer:
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -t mangle -F
iptables -t nat -X
Ce qui fait que toutes les règles de bases sont supprimées. Mais ne perd pas la connexion en cours car nous avons demandé d’accepter toutes les connexions par défaut (le temps de configurer le par-feu).
Mainentant, on va configurer un peu notre par-feu pour n’ouvrir que ce dont nous avons vraiment besoin, à savoir:
- ssh (port 22)
- http, https et http-alt (ports 80, 443 et 8080)
Il faut aussi:
- accepter les connexions sur le rebouclage locale (connexions internes)
- accepter les connexions déjà en cours vers la sortie, si une connexion entrante à été acceptée, il faut pouvoir lui répondre
- accepter tout en sortie (pour mon cas, vous pouvez ne pas le vouloir)
On va donc commencer par le plus simple,
iptables -A INPUT -i lo -j ACCEPT
Donc, sur l’interface “lo”, on accept tout. On continue sur notre lancée, on accepte les connexions établies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Et enfin, les connexions venant de l’extérieure sont acceptées seulement sur les ports que nous désirons. L’interface “eth0” est, sur mon serveur, la carte qui est utilisé pour l’accès depuis l’extérieure, vérifiez avec “ifconfig” le nom de votre interface réseau.
Donc pour mes ports à ouvrir (tcp uniquement):
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 8080 -j ACCEPT
Pour des raisons pratique, je veux que mon serveur accpete aussi de répondre au “ping”, vous pouvez utiliser cette règle:
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
Et enfin, je “DROP” (laisse tomber, c’est-à-dire refuser…) le reste par défaut:
iptables -P INPUT DROP
Un coup de “iptables -L” vous donne la liste effective des règles de votre firewall:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:http-alt
ACCEPT icmp -- anywhere anywhere icmp echo-request
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Ce qui compte ici, c’est de voir que la politique par défaut (policy) est à DROP pour les entrées (INPUT) et traduction ip (FORWARD, utile dans mon cas car j’installe libvirt pour faire tourner des LXC, à savoir que libvirt installe des règles iptables au lancement, donc je ne m’en occupe pas pour le moment).
Pour des raisons pratique, je veux que mon serveur accpete aussi de répondre au “ping”, vous pouvez utiliser cette règle:
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
L’autre commande utile est “iptables-save”:
*filter
:INPUT DROP [7:614]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [414:373999]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
COMMIT
# Completed on Fri Nov 1 01:02:47 2013
# Generated by iptables-save v1.4.14 on Fri Nov 1 01:02:47 2013
*mangle
:PREROUTING ACCEPT [720:485103]
:INPUT ACCEPT [716:484539]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [496:383895]
:POSTROUTING ACCEPT [496:383895]
COMMIT
# Completed on Fri Nov 1 01:02:47 2013
# Generated by iptables-save v1.4.14 on Fri Nov 1 01:02:47 2013
*nat
:PREROUTING ACCEPT [17:1894]
:INPUT ACCEPT [7:499]
:OUTPUT ACCEPT [15:900]
:POSTROUTING ACCEPT [15:900]
COMMIT
Maintenant, plusieurs solutions… Vous être sur Debian, vous devez installer le paquet “iptables-persistent” puis taper cette commande:
iptables-save > /etc/iptables/rules.v4
Lors du redémarrage serveur, “iptables-restore < /etc/iptables/rules.v4” sera effectuée.
Sinon, sur CentOS et RedHat, utilisez cette commande:
service iptables save
Cela a pour effet de sauver votre configuration dans “/etc/sysconfig/iptables”.
Quand tout est fini, essayez de vérifier si tout est ok vue de l’extérieur. La commande nmap peut vous aider:
nmap -v ip_de_votre_server
Evidemment, utilisez cette commande depuis un poste externe au réseau du serveur. Il faut que vous ne voyez que les ports que vous avez autorisé et pas un de plus.
Pour ma part:
nmap -v XXXXXX.org
Starting Nmap 6.40 ( http://nmap.org ) at 2013-11-01 15:02 CET
Initiating Ping Scan at 15:02
Scanning XXXX.org (XXXXX) [4 ports]
Completed Ping Scan at 15:02, 0.04s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 15:02
Completed Parallel DNS resolution of 1 host. at 15:02, 0.00s elapsed
Initiating SYN Stealth Scan at 15:02
Scanning XXXXXX.org (XXXXXX) [1000 ports]
Discovered open port 22/tcp on XXXXXX
Discovered open port 80/tcp on XXXXXX
Discovered open port 443/tcp on XXXXXX
Discovered open port 8080/tcp on XXXXXX
Completed SYN Stealth Scan at 15:02, 4.39s elapsed (1000 total ports)
Nmap scan report for XXXXXX.org (XXXXXXXXX)
Host is up (0.029s latency).
rDNS record for XXXXX: XXXXXX
Not shown: 996 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
8080/tcp open http-proxy
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 4.49 seconds
Raw packets sent: 2002 (88.064KB) | Rcvd: 7 (292B)
Vous pourrez ensuite gérer d’autres aspects de sécurité, mais pour l’heure cette première version vous évitera d’être mangé par un méchant pirate amateur. J’insiste sur le fait que cet article ne vous permet pas une sécurité absolue, mais c’est un début pour ceux qui veulent s’atteler à iptables.