Recherche


imprimer pdf
FireWall

Avertissement
Ce guide est reservé aux personnes ayant un bon niveau dans l'administration des serveurs dédiés sous Linux. La manipulation d'un firewall peut être dangereuse. En effet, vous pouvez bloquer votre serveur ce qui vous forcera à le redémarrer en HARD. Si vous vous trompez dans le script final et que vous le mettez en auto démarrage, vous n'aurez plus accés à votre machine ! Faites donc très attention et si vous ne vous sentez pas à l'aise avec ce guide, ne paramétrez pas votre firewall !

Un firewall c'est quoi ?
C'est un programme qui va bloquer certains ports de votre machine et en ouvrir d'autre. Imaginez votre maison : vous avez une porte à l'avant et une porte à l'arrière. Celle à l'arrière ne vous sert jamais, autant la condamner. Pourquoi ? Parce que c'est un risque potentiel d'intrusion pour un voleur. Avec le firewall c'est pareil, on va fermer tous les ports dont nous n'avons pas besoin.

Quels sont les ports dont vous vous servez ?
Attention !
Avant toute chose, il faut faire très attention à ce que vous allez faire. En effet, vous risquez de vous tromper de ports et de fermer les mauvais. Imaginez si vous fermez le port SSH ! Il faudra alors soit redemarrer via telnet, soit via webmin ou alors rebooter en hard :/.

Les ports ouverts par défaut sur les serveurs OVH sont :
21 - ftp (le serveur FTP, à laisser selon utilisation).
22 - ssh (l'accés au shell crypté, à laisser !).
23 - telnet (l'accés au shell non crypté, à laisser en dépannage).
25 - smtp (le serveur de courrier sortant, à laisser dans la plupart des cas).
53 - dns (le serveur DNS, à laisser dans la plupart des cas).
80 - http (le serveur web, à laisser).
110 - pop3 (l'accés aux mails, à laisser dans la plupart des cas).
143 - imap (l'accés aux mails, à laisser si vous n'utilisez pas pop3).
443 - https (l'accés au web crypté, à laisser selon votre utilisation).
1000 - webmin (panneau de configuration du serveur, à laisser si vous vous en servez).

Ces ports sont ceux ouverts par défaut mais vous avez peut-être des logiciels lancés qui en ouvrent d'autres. À vous de savoir lequels sont à garder ou non. Une fois votre choix effectué, passons à la mise en œuvre.

Iptables
Iptables est un firewall très performant, installé sur tous les serveurs OVH. Le fonctionnement va être le suivant : nous allons ouvrir certains ports et fermer tout le reste. Dans cet exemple, nous allons laisser que le port 22 (SSH) et 80 (HTTP). Ce n'est qu'un exemple, c'est à vous de l'adapter par rapport à vos besoins.
Connectez-vous avec SSH en root.
La première chose à faire est de vérifer la version d'iptables :
$ /sbin/iptables -V
iptables v1.2.4

La version est ici trop ancienne. On va mettre la 1.2.9 :
$ cd /root
$ wget http://www.netfilter.org/files/iptables-1.2.9.tar.bz2
$ tar xvfj iptables-1.2.9.tar.bz2
$ cd iptables-1.2.9
$ make KERNEL_DIR=/usr/src/linux
$ make install KERNEL_DIR=/usr/src/linux
$ cd /sbin
$ mv iptables iptables.old
$ mv iptables-restore iptables-restore.old
$ mv iptables-save iptables-save.old
$ ln -s /usr/local/sbin/iptables iptables
$ ln -s /usr/local/sbin/iptables-restore iptables-restore
$ ln -s /usr/local/sbin/iptables-save iptables-save
$ /sbin/iptables -V
iptables v1.2.9


Voilà, iptables est mis à jour, on peut poursuivre.

On liste les régles existantes :
$ /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

On voit trois rubriques : Input, Forward et Output.
Nous allons nous occupper que de la rubrique Input pour le moment (pour le trafic entrant).

On authorise les ports 22 et 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


La rubrique Input se remplit, c'est bon signe ;).
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 :
$ /sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Il ne reste plus qu'à bloquer le reste (attention, c'est là ou le firewall va vraiment faire effet, verifiez 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 solicité 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 securisé. En effet, immaginons quelqu'un qui vous envoie des paquets à répétition sur un mauvais port, votre serveur ne les traîtera pas, alors qu'avec la regle reject, il prendra le temps de répondre.
À vous de voir ;)

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 <IP> -j DROP


Le firewall est maintenant en action. Essayez de scanner votre serveur, vous ne verez que les ports 22 et 80 d'ouverts. Ne vous étonnez pas si le scan est très lent, c'est à cause de la régle DROP.

IP à exclure... et à autoriser ;)

Pour un Serveur dedie :

Si vous souhaitez bloquer le protocole ICMP (les requêtes ping), vous devez laisser au moins ping.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, proxy.ovh.net, proxy.sbg.ovh.net, proxy.bhs.ovh.net vous pinguer. Cela permet aux équipes d'OVH de verifier le bon état de votre serveur.
Vous devez de plus laisser passer l'IP obtenue de la façon suivante :
L'IP de votre serveur est de la forme aaa.bbb.ccc.ddd
Vous devez laisser passer : aaa.bbb.ccc.250
Ex 213.186.57.143 doit laisser passer 213.186.57.250 pour le serveur SLA et 213.186.57.251 pour le serveur mrtg afin de pouvoir bénéficier de RTM.

Pour le nouveau système de monitoring icmp vous devez autoriser les plages d'ip suivantes : 92.222.184.0/24, 92.222.185.0/24, 92.222.186.0/24, 167.114.37.0/24.
Veillez à eviter les configuration de rate limit global sur l'icmp qui perturbes les systèmes de monitoring. vous devez aussi autoriser les 3 ips suivantes : 151.80.231.244 151.80.231.245 151.80.231.246 sur le protocol icmp .

Si vous êtes sur un serveur HG, laissez passer de plus l'IP aaa.bbb.ccc.249 (règle temporaire).

Pour le nouveau système de monitoring icmp vous devez autoriser les plages d'ip suivantes : 92.222.184.0/24, 92.222.185.0/24, 92.222.186.0/24, 167.114.37.0/24. Veuillez à eviter les configuration de rate limit global sur l'icmp qui perturbes les systèmes de monitoring.

Pour autoriser le ping depuis nos serveurs, entrez les règles suivantes :
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 37.187.231.251 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.184.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.185.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.186.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 167.114.37.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.244 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.245 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.246 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.250 -j ACCEPT # IP = aaa.bbb.ccc obtenue selon la règle precedente
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.249 -j ACCEPT # temporaire, seulement pour serveurs HG
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.251 -j ACCEPT # IP pour system de monitoring


Au niveau de SSH, si vous souhaitez restreindre l'accés seulement depuis votre IP, il vous est conseillé de laisser aussi cache.ovh.net. En effet, en cas de problème sur votre machine, nous pourrons intervenir dessus et vous dépanner. Si vous fermez le port 22 pour les techniciens d'OVH, nous ne pourrons vous aider si votre machine est bloquée.

Pour autoriser le SSH depuis nos serveurs, entrez la règle suivante :
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT

Si vous avez un filer RAID, ne pas oublier d'autoriser les connexions NFS. Pour cela, nous pouvons être large en autorisant tout ce qui vient du réseau interne 192.168.0.0/16 :
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT

Si vous avez une configuration en Cluster, il faut également autoriser le port 79 pour que OCO puisse communiquer avec le répartiteur de charge.
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT


Si votre serveur se trouve à Roubaix 3, il est nécessaire que vous récupériez votre serveur de monitoring :

Vous trouverez alors un serveur ayant un nom du type sla-rbx3-2.ovh.net que vous devez ajouter aux exceptions de votre firewall. Le tcpdump doit être fait sur l'ip fixe :

tcpdump host ip.fixe.du.serveur | grep ICMP


Exemple de configuration complète
Voici un exemple de script complet pour protéger votre serveur via iptables. Il est assez permissif dans le sens où la plupart des services présents sur votre machine sont accessibles, mais il peut servir de base pour votre propre configuration :
/sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 37.187.231.251 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.184.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.185.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 92.222.186.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 167.114.37.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.244 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.245 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.246 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.250 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j REJECT

Dans ces règles, il faut bien sûr remplacer xx.xx.xx.xx par l'adresse IP de la machine dont vous vous servez pour accéder à votre serveur en FTP et SSH.

Automatiser le firewall
Une fois votre firewall parfaitement configuré, il ne vous reste plus qu'à créer un script qui se lancera à chaque démarrage de votre serveur. Voici un exemple à placer dans un fichier nommé par exemple "firewall" dans le répertoire /etc/init.d/ :
#!/bin/sh
# chkconfig: 3 21 91
# description: Firewall

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 proxy.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx2.ovh.net -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 icmp --source ping.ovh.net -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 icmp --source 37.187.231.251 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source a2.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source 92.222.184.0/24 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source 92.222.185.0/24 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source 92.222.186.0/24 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source 167.114.37.0/24 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.244 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.245 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source 151.80.231.246 -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


Donnez-lui les droits 700 et tapez "/etc/init.d/firewall start" pour le démarrer et "/etc/init.d/firewall stop" pour l'arrêter. Pour le lancer automatiquement au démarrage :
$ /sbin/chkconfig --level 3 firewall on
$ /sbin/chkconfig --level 06 firewall off


Vérifiez avant de mettre le script à chaque démarrage du serveur qu'il soit bon sinon votre serveur sera définitivement bloqué ! La communication entre le service RTM et votre serveur nécessite également que vous autorisez les connexions entrant sortant sur les ports UDP 6100 a 6200.