Patrice Ferlet
Patrice Ferlet
Créateur de ce blog.
Publié le nov. 1, 2013 Temps de lecture: 6 min

Me suivre sur Mastodon

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.

comments powered by Disqus