Par défaut sur Debian, la commande traceroute s’exécute en UDP. Très bien. Mais un problème se pose pour les plus paranoïaque d’entre nous, qui ont blindé à mort leur firewall (iptables dans notre exemple). En effet, les commandes traceroute se retrouvent bloquées par votre configuration firewall. Et c’est ballot. Je vous propose dans ce billet une solution, mais étant donné qu’il faut jouer un peu avec votre firewall, je vous déconseille de toucher à “iptables” si vous ne savez pas vraiment ce que vous faites… conseil d’ami 🙂
Il est judicieux de ne laisser que certains ports ouverts (en UDP et TCP), que ce soit en entrée OU en sortie. Et donc par défaut, il est préconisé de bloquer tous les ports, ce qui se fait via les commandes suivantes :
iptables -P FORWARD DROP iptables -P INPUT DROP iptables -P OUTPUT DROP
ATTENTION : ne faites pas ces commandes sans avoir au préalable autorisé certains ports, notamment le port SSH, sinon vous ne pourriez plus communiquer avec votre serveur.
Mais de ce fait, en interdisant les connexions INPUT & OUTPUT, et même si vous autorisez certains ports vers certaines adresses, les traceroute, généralement en UDP, seront bloqués. La solution est simple : autoriser l’ICMP et exécuter des traceroutes en mode ICMP.
Il faut tout d’abord accepter les connexions ICMP sur iptables :
iptables -A INPUT -p icmp -m comment --comment "icmp" -j ACCEPT iptables -A FORWARD -p icmp -m comment --comment "icmp" -j ACCEPT iptables -A OUTPUT -p icmp -m comment --comment "icmp" -j ACCEPT
Puis, pour faire un traceroute :
traceroute -I yahoo.fr
Vous pouvez faire un petit alias, que vous pouvez nommer “trace” comme moi, ou alors “traceroute” afin de surcharger la commande. Ainsi le flag -I sera automatiquement ajouté. Ajoutez la ligne suivante dans votre fichier ~/.bashrc ou dans /etc/bash.bashrc pour impacter tous les utilisateurs :
alias trace='traceroute -I'
Vous n’avez plus qu’à vous reconnecter à une session SSH pour charger ce nouvel alias. Have fun !