Iptables

Wikis > Informatique > Linux > Iptables

List of Rules


To list the rules currently applied to iptables

/sbin/iptables -L


Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

We see three sections: Input, Forward and Output.
We’ll take care of that section Input for the moment (for incoming traffic).

Ajouter des règles a Iptables


It allows ports 22 and 80:

/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT


-A INPUT : on place notre régle en entrée du firewall.
-i eth0 : ici c'est l'interface ethernet qui nous intéresse.
-p tcp : le protocole traîté est le TCP (on ne traîte que celui-là pour le moment).
--dport 22 : la règle va être appliquée sur le port SSH (n° 22).
-j ACCEPT : on accepte ce trafic.

On reliste tout :

/sbin/iptables -L

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:www

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Bloquer tout par défaut


On voit que la politique par défaut est de tout accepter => Chain INPUT (policy ACCEPT). Nous voulons bloquer tout le trafic qu’on n’aura pas au préalable autorisé. On va donc ajouter une règle qui va bloquer les autres ports.
Mais il se pose alors un problème : lorsqu’une connexion va être faite depuis notre serveur vers le serveur kernel.org pour télécharger le nouveau noyau (ce n’est qu’un exemple), il va établir une connexion vers le site et va attendre sa réponse. La demande de connexion va bien partir mais comment va-t-elle revenir étant donné qu’on a tout bloqué ?
Heureusement, iptables est puissant et peux aussi trier les paquets par rapport à leur état. On va donc ajouter une règle :

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il ne reste plus qu’à bloquer le reste (attention, c’est là ou le firewall va vraiment faire effet, vérifiez donc d’avoir bien rentré vos règles sinon vous allez bloquer votre serveur !) :

/sbin/iptables -A INPUT -i eth0 -j DROP

On a en fait deux choix ou niveau de cette règle.
Soit on droppe les paquets, c’est-à-dire que si un paquet arrive et qu’il n’est pas accepté on l’efface. Le client attendra de son côté une réponse en vain, jusqu’au timeout.
La deuxième solution est de rejeter les paquets (REJECT au lieu de DROP). Si un paquet non sollicité arrive, on renvoie au client une erreur et il n’attend plus car il a une réponse négative.
Rejeter les paquets est plus propre mais les jeter est plus sécurisé. En effet, imaginons quelqu’un qui vous envoie des paquets à répétition sur un mauvais port, votre serveur ne les traitera pas, alors qu’avec la règle REJECT, il prendra le temps de répondre.

=== Supprimer/Organiser des règles ===

Pour mettre à zéro votre firewall, tapez :

/sbin/iptables -F INPUT

Cette commande supprimera toutes les règles de la rubrique INPUT.

Si vous souhaitez ajouter une régle entre la première et la deuxième, tapez ceci :

/sbin/iptables -I INPUT 2 ... la suite de votre règle

Pour supprimer la règle n°3 tapez ceci :

/sbin/iptables -D INPUT 3

Pour bloquer totalement une IP :

/sbin/iptables -I INPUT 1 -s  -j DROP

== Automatiser le Firewall ==

Pour automatiser le l’application des règles Iptables au démarrage, nous allons créer un fichier « /etc/init.d/firewall »
#!/bin/sh

### BEGIN INIT INFO
# Provides: iptables
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Firewall for DMZ
# Description: Start the firewall rules for DMZ server
### END INIT INFO

IPT=/sbin/iptables

case "$1" in
start)
$IPT -F INPUT
$IPT -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.xxx -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.250 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
$IPT -A INPUT -i eth0 -j REJECT
exit 0
;;

stop)
$IPT -F INPUT
exit 0
;;

*)

echo "Usage: /etc/init.d/firewall {start|stop}"
exit 1
;;

esac

exit 0

On lui donne les droits d’exécutions:

chmod 700 /etc/init.d/firewall

Puis on dis au système de le lancer au démarrage:

update-rc.d firewall defaults