Accueil > Installer un serveur > Sécuriser son serveur debian > installer un parefeu (iptables)

Installer un parefeu (iptables)

Il va falloir maintenant installer un pare feu pour contrer certaines attaques contre votre serveur. Autant vous dire que paramétrer un parefeu en ligne de commande nécessite d'être attentif car sinon vos sites web peuvent être rendus inaccessibles ou pire encore vous pourrez ne plus vous connecter à votre serveur en SSH...

On va procéder comme suit :

- installer le parfeu
- définir les ports autorisés à entrer vers le serveur
- bloquer tout les autres ports entrants
- (on ne bloque pas les données sortantes)

Nous allons maintenant installer un parfeu nommé iptables.

apt-get install iptables


Note :iptables existe aussi pour l'ipv6, pour cela il suffit d'utiliser la commande ip6tables au lieu de iptables

Par précaution on va scanner tout les ports de notre serveur pour savoir quels ports sont ouverts afin de ne pas faire de bêtises et de ne pas bloquer des services (il ne faut scanner uniquement votre propre machine car sinon c'est considéré comme une attaque pour chercher des ports ouverts)

nmap -v 111.222.111.222

Not shown: 1707 closed ports
PORT    STATE SERVICE
21/tcp  open  ftp            ---> le serveur FTP
22/tcp  open  ssh            ---> l’accès au shell crypté (connexion au serveur)
25/tcp  open  smtp         ---> le serveur de courrier sortant
53/tcp  open  domain     ---> le serveur DNS
80/tcp  open  http           ---> le serveur web
110/tcp open  pop3         ---> l’accès aux mails
111/tcp open  rpcbind     ---> portmap daemon 
143/tcp open  imap         ---> l’accès aux mails

On voit tout les ports ouverts et notamment le port 22/tcp ouvert et en écoute par ssh (connexion au serveur depuis un poste distant), il ne faudra surtout pas bloquer ce port !
pour tester on va afficher la liste de vos règles actuelles. Si vous n'avez encore jamais configurer iptables, vous devriez voir :

iptables -L -v -n --line-numbers
Chain INPUT (policy ACCEPT 3624 packets, 354K bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 4763 packets, 4383K bytes)
num   pkts bytes target     prot opt in     out     source               destination


La colonne num est le numéro de la réglé, car si vous voulez supprimer une règle il faut connaître son numero (pour l'instant il n'y a pas de règles)

Pour créer des règles iptables vous allez devoir faire très attention, notamment pour le port de SSH (22 par défaut) car si vous désactivez ce port vous ne pourrez plus vous connecter à distance à votre serveur.

Notes :INPUT, OUTPUT, FORWARD.

INPUT : Si le paquet est adressé au poste, il est confronté au filtre INPUT.
OUTPUT : Si le paquet sort du poste, il passera donc par la chaine OUTPUT.
FORWARD : Si une quelconque règle autorise le paquet à entrée, le paquet passera la barrière de INPUT, si il n'y a pas de règle spécifique qui autorise le paquet à entrer, et à condition qu'il soit actif (FORWARDÉ), la trame passera par le filtre FORWARD.
ACCEPT signifie que le paquet est autorisé à passer.
REJECT est utilisé pour renvoyer un paquet erroné en réponse au paquet qui correspond . (donc il y a une trace que tu existes sur le net)
DROP signifie que le paquet est détruit. (ici tu es en mode furtif).

Autoriser le trafic local :

iptables -I INPUT -i lo -j ACCEPT

On autorise les ports nécessaires à notre configuration serveur :

iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 143 -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 traité est le TCP (on ne traite 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 autorise les pings :

iptables -A INPUT -p icmp -j ACCEPT

Autoriser les connexions déjà établies (Pour permettre à une connexion déjà ouverte de recevoir du trafic : ):

iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

On bloque tout le reste :

iptables -A INPUT -i eth0 -j DROP

On veut voir la liste de nos règles :

iptables -L -v -n --line-numbers

Chain INPUT (policy ACCEPT 8494 packets, 845K bytes)
num   pkts    bytes       target         prot    opt   in       out     source               destination
1        0           0           ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:21
2     3468     147K       ACCEPT     all      --    lo        *       0.0.0.0/0            0.0.0.0/0
3      184      13852      ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
4        0           0           ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25
5        0           0           ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53
6      416     53480       ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
7        0           0           ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:110
8        0           0           ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:111
9        0          0            ACCEPT     tcp     --    eth0    *       0.0.0.0/0            0.0.0.0/0           tcp dpt:143
10      14     1080         ACCEPT     icmp  --      *       *       0.0.0.0/0            0.0.0.0/0
11       0         0            ACCEPT     all      --     eth0   *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
12      43     6246         DROP         all      --     eth0    *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 16167 packets, 11M bytes)
num   pkts bytes target     prot opt in     out     source               destination

Par exemple pour supprimer la règle INPUT de la ligne 2 vous devrez faire :

iptables -D INPUT 2

Pour réinitialiser le parfeu :

iptables -F

En cas de problème comme par exemple « vous ne pouvez plus accédez à votre serveur en ssh » il y a toujours la possibilité de faire un hard reboot depuis le manager de ovh (si vous louez votre serveur chez ovh), par contre si vos règles de filtrages sont chargées au démarrage de la machine et qu'elles bloquent tout, il n'y aura plus grand chose à faire à part demander une réinstallation du serveur...

Charger les règles du parefeu au démarrage du serveur :

Avant de laisser le système charge les règles de votre parefeu au démarrage, je vous conseille de le laisser fonctionner un moment pour voir si cela marche...

On va créer un fichier bash, un programme en mode console si vous voulez...la 1ere ligne d'un fichier bash doit être
#!/bin/bash

on va créer ce fichier dans le repertoire /etc/init.d/ comme ca il sera chargé au démarrage du serveur

nano /etc/init.d/mon_firewall

#!/bin/bash

## note: mieux vaut eviter les accents dans un fichier bash

## on reinitialise le firewall
 
iptables -F

## Autoriser le trafic local

iptables -I INPUT -i lo -j ACCEPT

## On autorise les ports necessaires a notre configuration serveur :

iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 143 -j ACCEPT

## On autorise les pings entrants

iptables -A INPUT -p icmp -j ACCEPT

## autoriser les connexions deja etablies

iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

## on bloque tout les reste

iptables -A INPUT -i eth0 -j DROP

On donne les droits 700 au fichier /etc/init.d/mon_firewall pour le rendre exécutable et on lance l’exécutable pour voir si c'est ok

chmod 700 /etc/init.d/mon_firewall
/etc/init.d/mon_firewall

Remarque : mieux vaut ouvrir le port 53 (dns) en tcp et udp, car j'ai eu des soucis de validation des dns avec un .fr de la art de l'afnic

Bannir une IP précise


iptables -I INPUT 1 -s 111.222.111.222 -j DROP 
Vos commentaires

Laisser un commentaire

Votre commentaire sera en attente de modération, validation NON automatique

Votre nom (obligatoire) :


Email ou site internet (facultatif) (nécessaire si vous souhaitez être prévenu d'une réponse):


Image/photo (facultatif) (JPG, JPEG, PNG ou GIF) (image de partition concernant le question par exemple):

Javascript doit être activé