UFW un frontend Iptables
Ce post présente UFW un outil simplifié de configuration d’iptable sur son serveur dédié, il est disponible sur les distributions Ubuntu et Debian. Pour rappel, iptables, et ip6tables pour l’IPv6, sont deux outils d’administration du module netfilter au sein du noyau qui permettent la manipulation des paquets IP. Ces deux utilitaires sont extrêmement puissants et utilisés principalement pour
- mettre en place des règles de filtrage des paquets IP (firewall)
- partager une connexion internet (NAT)
- l’historisation du trafic réseau (log)
Toute bonne administration d’un serveur linux passe donc par la maîtrise d’iptables, et soyons honnêtes ce n’est pas un outil simple prendre en main. Comme souvent sur internet, on trouvera beaucoup trop de tuto qui sont soit mauvais soit simplistes, et dans tous les cas, on voit toujours trop de gens qui
- pensent qu’ils n’ont pas besoin d’iptables puisque leur serveur fonctionne… pour le moment
- débarquent sur les forum paniqués, leur serveur venant d’être hacké ou fermé car il a servi pour un DDoS
Pourtant, UFW propose une solution simple pour tous les débutants ou les plus flemmards qui n’ont pas envie de passer une journée à configurer/débuguer leur config iptables. Si la prise en main est aisée, UFW conserve la polyvalence d’iptables en permettant d’intégrer les règles les plus complexes.
Installation et Avertissement
UFW fonctionne très bien et sans problème sur les noyaux officiels de debian et ubuntu. Attention aux autres, notamment ceux d’OVH qui ne sont pas toujours compilés avec les modules nf_conntrack par exemple. Si vous utilisez la formule VPS Classic d’OVH, oubliez UFW, votre VPS est hébergé par OpenVZ et n’a donc pas son propre noyau.
Le piège classique, quand on manipule iptables ou UFW, est de s’interdir l’accès au shell SSH. Par défaut, UFW accepte le trafic icmp (ping, traceroutes, etc.) et ignore le reste. La première chose à faire est donc d’autoriser l’accès SSH avant d’activer UFW et de bien vérifier après, même si la connexion SSH active n’a pas sauté, que l’on peut toujours se connecter ! Une fois ces chausse-trapes contournés, UFW est fool-proof.
Pour installer UFW sur votre Debian ou Ubuntu, passez en root les commandes suivantes :
1 2 3 4 5 6 7 8 9 | root@server:~# apt-get install ufw [...] root@server:~# ufw allow 22/tcp Rules updated Rules updated (v6) root@server:~# ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup root@server:~# |
Si jamais vous vous êtes enfermés dehors, il vous faudra, via un accès console, KVM, OVH mode rescue ou n’importe quoi d’autre fourni par votre hébergeur, désactiver UFW soit avec un ufw disable
ou en modifiant le paramètre ENABLE dans /etc/ufw/ufw.conf
1 2 3 4 5 6 | root@server:~# sudo ufw disable Firewall stopped and disabled on system startup root@server:~# cat /etc/ufw/ufw.conf | grep -A 3 boot # Set to yes to start on boot. If setting this remotely, be sure to add a rule # to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp' ENABLED=no |
Quelques Règles de Base
Si vous hébergez un serveur web avec SSL, il vous faut ouvrir les ports 80 et 443 en tcp pour permettre l’accès :
1 2 3 4 5 6 | root@server:~# ufw allow 80/tcp Rule added Rule added (v6) root@server:~# ufw allow 443/tcp Rule added Rule added (v6) |
Attention, ces règles s’appliquent à toutes les interfaces en IPv4 et IPv6, pour ouvrir le trafic sur une seule interface, dans cette exemple celle d’un serveur TeamSpeak 3 :
1 2 | root@server:~# ufw allow proto tcp to 192.168.0.73 port 9987 Rule added |
Si l’on souhaite imposer un « rate limiting », UFW propose une règle qui, par défaut, limite le nombre de connexions depuis une même IP source à 6 sur les 30 dernières secondes. Cela peut être utile en cas de DDoS ou pour se protéger d’une attaque par force brute :
1 2 3 | root@server:~# ufw limit 22/tcp Rule updated Skipping unsupported IPv6 'limit' rule |
Listing des Règles et Suppression
Pour afficher toutes les règles utilisateurs mises en place :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | root@server:~# ufw status numbered Status: active To Action From -- ------ ---- [ 1] 22/tcp LIMIT IN Anywhere [ 2] 80/tcp ALLOW IN Anywhere [ 3] 443/tcp ALLOW IN Anywhere [ 4] 192.168.0.73 9987/tcp ALLOW IN Anywhere [ 5] 22/tcp ALLOW IN Anywhere (v6) [ 6] 80/tcp ALLOW IN Anywhere (v6) [ 7] 443/tcp ALLOW IN Anywhere (v6) root@server:~# |
Si la règle 5 n’a pas d’utilité, par exemple le daemon SSH n’écoute pas sur les adresses IPv6 :
1 2 3 4 5 | root@server:~# ufw delete 5 Deleting: allow 22/tcp Proceed with operation (y|n)? y Rule deleted (v6) |
N’oubliez pas que les règles sont interprétées dans l’ordre affiché, autrement dit, un DENY précédé d’un ALLOW sur les même conditions ne sera jamais pris en compte. Dans tous les cas, la politique par défaut étant « DENY », tout ce qui n’est pas autorisé sera rejeté. Pour insérer une règle au bon endroit, utiliser l’option insert
1 2 | root@server:~# ufw insert 4 allow to 192.168.0.73 port 53 proto udp Rule inserted |
Les Logs
Si vous souhaitez garder une trace dans les logs de UFW des paquets refusés, acceptés etc. utilisez l’option logging
. Par défaut, quand les logs sont activés, ils sont sur le niveau « low ». On peut augmenter ce niveau mais attention au remplissage des disques surtout sur un serveur très actif :
1 2 3 4 | root@server:~# ufw logging on Logging enabled root@server:~# ufw logging medium Logging enabled |
Un tour sur le man ufw
fourni les différents niveaux de logs :
- low logs all blocked packets not matching the default policy (with rate limiting), as well as packets matching logged rules
- medium log level low, plus all allowed packets not matching the default policy, all INVALID packets, and all new connections. All logging is done with rate limiting.
- high log level medium (without rate limiting), plus all packets with rate limiting
- full log level high without rate limiting
Règles Avancées
Si vous avez suivi ce post jusque là, vous disposez maintenant grâce à UFW d’une configuration iptables assez solide pour un serveur basique. Mais comment gérer des configurations plus poussées ? Pas de soucis, UFW fournit un framework pour adapter son comportement par défaut et gérer les règles non supportées par l’interface utilisateur. Par exemple, UFW dispose de son propre fichier sysctl.conf qui vient remplacer les valeurs de celui du système. Par exemple, pour activer le routage, il suffit de dé-commenter les lignes suivantes dans /etc/ufw/sysctl.conf
1 2 3 4 5 | root@server:~# cat /etc/ufw/sysctl.conf | grep -A 3 route # Uncomment this to allow this host to route packets between interfaces #net/ipv4/ip_forward=1 #net/ipv6/conf/default/forwarding=1 #net/ipv6/conf/all/forwarding=1 |
Attention, la politique par défaut de UFW étant DROP pour ces chaînes, vous voudrez peut-être modifier ce comportement dans le fichier /etc/default/ufw
:
1 2 3 4 | root@server:~# cat /etc/default/ufw | grep -A 2 forward # Set the default forward policy to ACCEPT, DROP or REJECT. Please note that # if you change this you will most likely want to adjust your rules DEFAULT_FORWARD_POLICY="DROP" |
Ou alors, vous préférerez rajouter des règles par protocole pour le routage. Rajoutez-les dans le fichier /etc/ufw/before.rules
dans la chaîne ufw-before-forward
.
Pour activer le NAT sur le subnet 192.168.1.0/24, il suffit de rajouter à la fin du fichier /etc/ufw/before.rules
1 2 3 4 | *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE COMMIT |
Vous l’aurez remarqué, les syntaxes sont les mêmes que pour iptables-restore
et ip6tables-restore
. C’est normal, UFW s’en sert pour injecter ses règles dans le netfilter. Par contre, autant l’interface utilisateur de UFW est accessible à tous, autant il est fortement recommandé de comprendre iptables avant de jouer avec le framework. Je peux conseiller un bon tutoriel sur cette page.
Pour Conclure
On ne le répétera jamais assez. Un firewall est indispensable pour tout équipement connecté à Internet, que ce soit un serveur dédié ou son propre PC. UFW répond à ce besoin avec simplicité sans pour autant abandonner la souplesse qu’offre iptables. Il ne reste plus vraiment d’excuse pour ne pas s’y mettre.