iptables -j DROP sauve le monde.

Posted on Feb 6, 2006

Avertissement : si le titre de cette entrée ne vous dit rien c'est que le reste sera trop technique, vous pouvez sereinement passer à autre chose.

Ce dimanche matin, je remarque que la connexion ADSL à la maison est un peu faiblarde. Un petit tour sur les stats de nowwhat me montre que l'upload est saturée depuis 1h du matin environ. Pas de coupable intérieur. Mon réflexe habituel, regarder la queue de mail. J'y trouve plus de 2000 mails en attente, la moitié pour une adresse anonyme hébergée par mon nymserver perl de type 1, l'autre moitié des bounces tous pour la même adresse.

Analysons le problème. Un mail arrive prétendant provenir de l'adresse A pour l'adresse locale anonyme B. On accepte (c'est une adresse locale valide), mais le processus de livraison du mail se vautre. Le script perl a déterminé que l'utilisateur est hors quota, et un bounce avec une adresse d'expéditeur nulle est envoyé à l'adresse A. À ce niveau là c'est un peu de ma faute. En rejettant le mail après l'avoir accepté on est vulnérable aux forges d'expéditeurs et on peut causer du spam par rebond. Mais bon. Parfois on peut difficilement faire sans, et je ne vais pas patcher un script perl alors qu'une [version améliorée de nymserver](/soft/nymbaron) est en cours de développement.

Là où les choses se compliquent, c'est que le serveur responsable pour l'adresse A décide de répondre à chacun de mes bounces en renvoyant un message à l'adresse B. En contradiction flagrante avec les protocoles de mail. Dans la foulée, il y a quelque part un doublement du flux, histoire de pimenter les choses. Le point limitant de ce foutu positive feedback loop étant mon upload d'ADSL résidentiel à 512kbs, peu de dégâts ont été causés; mais si j'avais eu une connexion plus musclée voire que — horreur — je paie au débit utilisé, ça m'aurait fait moins rigoler.

La solution après un blacklisting local lui aussi copieusement ignoré par la machine distante (on n'est pas à une violation des protocoles près) a été d'envoyer les requêtes smtp provenant de la machine dans un trou noir, grâce à une simple règle iptables qui fait le titre de cette entrée. C'est les petites joies de l'administration sous un unix, on a (presque) toujours un couteau suisse sous la main qui résoud le problème du moment. Et parfois c'est une ogive nucléaire.