Comment configurer un pare-feu à l'aide d'Iptables sur Ubuntu 12.04
Statut : Obsolète
Cet article couvre une version d'Ubuntu qui n'est plus prise en charge. Si vous utilisez actuellement un serveur exécutant Ubuntu 12.04, nous vous recommandons fortement de mettre à niveau ou de migrer vers une version prise en charge d'Ubuntu :
- Mise à niveau vers Ubuntu 14.04.
- Mise à niveau d'Ubuntu 14.04 vers Ubuntu 16.04
- Migrer les données du serveur vers une version prise en charge
Raison: Ubuntu 12.04 a atteint sa fin de vie (EOL) le 28 avril 2017 and no longer receives security patches or updates. This guide is no longer maintained.
Voir plutôt :
Ce guide peut toujours être utile comme référence, mais peut ne pas fonctionner sur d'autres versions d'Ubuntu. S'il est disponible, nous vous recommandons fortement d'utiliser un guide écrit pour la version d'Ubuntu que vous utilisez. Vous pouvez utiliser la fonctionnalité de recherche en haut de la page pour trouver une version plus récente.
À propos d'Iptables
Afin de rendre un serveur plus sécurisé après la configuration initiale, Ubuntu est livré avec iptables qui est le pare-feu par défaut de la distribution. Au départ, bien que le pare-feu Ubuntu soit configuré, il est configuré pour autoriser tout le trafic entrant et sortant sur un serveur privé virtuel. Pour activer une protection plus forte sur le serveur, nous pouvons ajouter quelques règles iptables de base.
Les règles iptables proviennent d'une série d'options qui peuvent être combinées pour créer chaque processus spécifique. Chaque paquet qui traverse le pare-feu est vérifié par chaque règle dans l'ordre. Dès qu'il correspond à une règle, le paquet suit l'action associée, sinon il continue sur la ligne.
Noter: Ce tutoriel couvre la sécurité IPv4. Sous Linux, la sécurité IPv6 est maintenue séparément d'IPv4. Par exemple, "iptables" ne gère que les règles de pare-feu pour les adresses IPv4, mais il a un équivalent IPv6 appelé "ip6tables", qui peut être utilisé pour maintenir les règles de pare-feu pour les adresses réseau IPv6.
Si votre VPS est configuré pour IPv6, n'oubliez pas de sécuriser vos interfaces réseau IPv4 et IPv6 avec les outils appropriés. Pour plus d'informations sur les outils IPv6, reportez-vous à ce guide : Comment configurer les outils pour utiliser IPv6 sur un VPS Linux
Commandes Iptables
Bien que ce tutoriel passe en revue un nombre limité de commandes qui fourniraient à un serveur une sécurité de base, il existe une variété de cas nuancés et spécifiques qui peuvent être développés pour iptables. Vous trouverez ci-dessous certaines des commandes les plus utiles pour développer un pare-feu pour votre VPS, mais gardez à l'esprit qu'il s'agit d'une courte liste et qu'il existe une variété d'autres options.
-A: (Append), adds a rule to iptables -L: (List), shows the current rules -m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command. --cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid -p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all". --dport: (port), refers to the the port through which the machine connects -j: (jump), this command refers to the action that needs to be taken if something matches a rule perfectly. It translates to one of four possibilities: -ACCEPT: the packet is accepted, and no further rules are processed -REJECT: the packet is rejected, and the sender is notified, and no further rules are processed -DROP: the packet is rejected, but the sender is not notified, and no further rules are processed -LOG: the packet is accepted but logged, and the following rules are processed -I: (Insert), adds a rule between two previous ones -I INPUT 3: inserts a rule to make it the third in the list -v: (verbose), offers more details about a rule
Création des règles Iptables :
Si vous tapez ce qui suit, vous pouvez voir les règles iptables actuelles :
sudo iptables -L
Ils devraient ressembler à ceci :
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
Si vous avez un autre ensemble de règles en place ou si vous voulez recommencer à zéro, vous pouvez toujours rétablir les règles par défaut en les vidant et en les supprimant toutes :
sudo iptables -F
De plus, si vous souhaitez accélérer votre travail avec iptables, vous pouvez inclure -n dans la commande. Cette option désactive les recherches DNS et empêche la commande d'essayer de trouver l'inverse de chaque adresse IP dans l'ensemble de règles. Vous pouvez l'utiliser pour répertorier les règles, par exemple :
iptables -L -n
Un pare-feu de base
Dans l'état actuel des choses, les règles actuelles autorisent toutes les connexions, entrantes et sortantes. Il n'y a aucune mesure de sécurité en place. Au fur et à mesure que nous construisons la table, gardez à l'esprit que dès qu'un paquet est ACCEPTÉ, REJETÉ ou ABANDONNÉ, aucune autre règle n'est traitée. Par conséquent, les règles qui viennent en premier ont priorité sur les suivantes.
Lors de la création des règles, nous devons nous assurer de nous empêcher de bloquer accidentellement SSH (la méthode par laquelle nous nous sommes connectés au serveur).
Pour commencer, assurons-nous que toutes les connexions actuelles, toutes les connexions au moment de la création de la règle, resteront en ligne :
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Nous pouvons aller de l'avant et décomposer cela :
- -A indique à iptables d'ajouter une règle à la table.
- INPUT désigne cette règle comme faisant partie de la chaîne d'entrée.
- m conntrack suivi de --cstate ESTABLISHED,RELATED garantit que le résultat de cette règle ne s'appliquera qu'aux connexions actuelles et que celles qui leur sont liées sont autorisées
- -j ACCEPT indique au paquet à JUMP d'accepter et les connexions sont toujours en place.
Une fois que nous sommes assurés que toutes les connexions actuelles au serveur privé virtuel peuvent rester actives sans interruption, nous pouvons commencer à bloquer d'autres connexions non sécurisées.
Supposons que nous voulions bloquer tout le trafic entrant, à l'exception de ceux entrant sur 2 ports communs : 22 pour SSH et 80 pour le trafic Web. Nous procédons en autorisant tout le trafic sur les ports désignés avec les commandes suivantes :
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Dans ces deux commandes, l'option -p représente le protocole avec lequel la connexion est établie, dans ce cas tcp, tandis que l'option --dport spécifie le port par lequel le paquet est transmis.
Après avoir garanti que le trafic souhaitable passera par le pare-feu, nous pouvons terminer en bloquant tout le trafic restant d'accéder à notre serveur virtuel. Comme il s'agit de la dernière règle de la liste, tout le trafic correspondant à l'une des règles précédentes dans iptables ne sera pas affecté et sera traité comme nous l'avons configuré précédemment.
Créons une règle pour bloquer tout le trafic restant :
sudo iptables -P INPUT DROP
Avec cela, nous pouvons voir à quoi ressemblent nos règles mises à jour :
sudo iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:http
Nous avons presque fini. Cependant, il nous manque encore une règle. Nous devons fournir à notre VPS un accès en boucle. Si nous devions ajouter la règle maintenant sans autres qualificatifs, elle irait à la fin de la liste et, puisqu'elle suivrait la règle de bloquer tout le trafic, elle ne serait jamais mise en vigueur.
Afin de contrer ce problème, nous devons créer cette règle en premier dans la liste, en utilisant l'option INPUT :
sudo iptables -I INPUT 1 -i lo -j ACCEPT
- -I INPUT 1 place cette règle au début du tableau
- lo fait référence à l'interface de bouclage
- -j ACCEPT garantit alors que le trafic de bouclage sera accepté
Nous avons maintenant terminé la création d'un pare-feu de base. Vos règles devraient ressembler à ceci (on peut voir les détails de l'iptable en tapant -v) :
sudo iptables -L -v
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo any anywhere anywhere 1289 93442 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED 2 212 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes) pkts bytes target prot opt in out source destination
Cependant, dès que le serveur virtuel redémarre, les règles iptables seront effacées. La prochaine étape consistera à enregistrer et à restaurer les règles iptables.
Enregistrement des règles Iptables
Bien que les règles iptables soient efficaces, elles seront automatiquement supprimées si le serveur redémarre. Pour s'assurer qu'ils restent en vigueur, nous pouvons utiliser un package appelé IP-Tables persistent.
Nous pouvons l'installer en utilisant apt-get :
sudo apt-get install iptables-persistent
Lors de l'installation, il vous sera demandé si vous souhaitez enregistrer les règles iptables à la fois dans les règles IPv4 et dans les règles IPv6. Dites oui aux deux.
Vos règles seront alors enregistrées dans /etc/iptables/rules.v4 et /etc/iptables/rules.v6.
Une fois l'installation terminée, démarrez iptables-persistent en cours d'exécution :
sudo service iptables-persistent start
Après tout redémarrage du serveur, vous verrez que les règles restent en place.