Configuration IPtables

Dans cet article nous allons voir comment configurer IPtables pour protéger notre VM routeur et le réseau local virtuel. IPtables est une interface en ligne de commande permettant de configurer Netfiler. Netfiler est un framework implémentant un pare-feu au sein du noyau linux.

Nous activerons également le mode routeur pour que nos VM du réseau local virtuel puissent accéder à Internet.

Mode Routeur

Pour activer le mode routeur, il faut décommenter une ligne dans le fichier sysctl.conf:
nano /etc/sysctl.conf

Decommenter « net.ipv4.ip_forward=1 »

Puis recharger le fichier :
sysctl -p /etc/sysctl.conf
Voici la commande à entrer pour activer le NAT :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

IPtables

Pour configurer le pare-feu, j’ai utilisé un script (firewall.sh). L’avantage d’un script est de pouvoir l’activer au démarrage pour ne pas perdre notre configuration en cas de reboot du serveur.
nano /etc/init.d/firewall.sh

#!/bin/sh
### BEGIN INIT INFO
# Provides: ROUTEUR
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Example initscript
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
# Vider les tables actuelles
iptables -t filter -F
# Vider les règles personnelles
iptables -t filter -X
# Interdire toute connexion entrante et sortante
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
# 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
# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# Activer NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
##########################################
########## OUVERTURE PORT #############
#####################################
## SSH IN
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
# DNS Out
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
# NTP Out
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
# HTTP + HTTPS Out
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
# FTP Out
iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT

L’exemple ci dessus est assez générique et montré à titre indicatif. Il permet simplement de bloquer tous les ports en entrée/sortie, puis d’autoriser les ports et protocoles dont nous avons besoins. Pour plus d’informations, je vous recommande de lire ceci : http://doc.ubuntu-fr.org/iptables

Voici un exemple de paramètres à rajouter au script, dans le cas d’un serveur Web hébergé sur une VM du réseau local virtuel ayant pour adresse IP « 192.168.10.1 ». Remarque : 212.**.**.** correspond à l’IP publique de la VM routeur.

############## Serveur WEB ###########
# Ouvrir port HTTP
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# Autoriser NAT port HTTP
iptables -t nat -I PREROUTING -p tcp -d 212.**.**.** --dport 80 -j DNAT --to 192.168.10.1
iptables -I FORWARD -p tcp -d 192.168.10.1 --dport 80

A présent nous donnons les droits pour le rendre exécutable :
chmod +x /etc/init.d/firewall.sh
On ajoute le script au démarrage et on le démarre :
update-rc.d firewall.sh defaults
./firewall.sh

Le pare-feu est désormais actif, vous pouvez vérifier les règles actives avec la commande :
iptables -L

Bookmarquez le permalien.
  • juanito

    Merci pour ce dossier qui m’a permis de faire sortir plusieurs machines sur internet alors qu’une seule y était reliée physiquement!

  • Jon

    Hello,

    J’ai récupéré ton script mais j’ai un petit probleme.

    Tu écris :
    # 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

    Et mon iptable me dit : Bad argument RELATED,ESTABLISHED, j’ai essayé en mettant -state et –state mais pareil. Je sais pas si tu as une solution, je vais continué à chercher de mon coté.
    Merci 🙂

  • powtos

    Salut Jon au différente IP,

    J’ai vérifié sur mon fichier conf, voici les deux lignes que j’ai et qui fonctionnent:

    iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT