Première rédaction de cet article le 6 novembre 2009
Le 19 mai 2009, la Chine a connu sa plus grande panne de l'Internet. Sur le moment, de nombreux articles ont été publiés, sans détails pratiques la plupart du temps, à part le fait qu'il s'agirait d'un problème lié au DNS. Le 5 novembre, à la réunion OARC à Pékin, Ziqian Lu, de China Telecom, a fait un remarquable exposé détaillant les causes de la panne.
C'est un bel exercice de transparence, avec plein de détails techniques. Je ne suis pas sûr que les opérateurs Internet français en fassent autant, si une telle panne frappait la France.
Donc, le 19 mai vers 21 h, heure locale, les téléphones se mettent à sonner : « l'Internet est en panne ». China Telecom, mais également d'autres FAI, constate à la fois que les utilisateurs se plaignent mais que le trafic a chuté considérablement. Les « tuyaux » ne sont donc pas surchargés, bien au contraire. En outre, le service n'est pas complètement interrompu : parfois, cela marche encore un peu. En raison de la baisse du trafic, on soupçonne un problème dans le routage. Il faut un certain temps pour que quelqu'un remarque ces lignes dans le journal des serveurs de noms récursifs du FAI :
19-May-2009 22:21:13.186 client: warning: client 218.77.186.180#51939: recursive-clients soft limit exceeded, aborting oldest query 19-May-2009 22:21:13.213 client: warning: client 59.50.182.161#1151: recursive-clients soft limit exceeded, aborting oldest query
Et la vérité se fait jour : le problème est dans le service DNS récursif. La majorité des requêtes DNS échouent. Quelques unes passent, ce qui explique que l'Internet ne semble pas complètement en panne à certains utilisateurs. Comme presque toutes les activités Internet dépendent du DNS, le trafic réseau chute.
Pour résumer la panne, il y avait bien une attaque
DoS mais, comme au
billard, l'attaque n'a pas frappé directement
les serveurs DNS. L'attaque a touché un service très populaire,
Baofeng, qui distribue de la vidéo et de la
musique. Les attaquants frappent un serveur de jeux en ligne et
l'arrêtent. Rien d'extraordinaire, ce genre de choses arrive tous les
jours sur l'Internet. Sauf que l'attaque stoppe également certains des
serveurs du domaine baofeng.com
, qui partagent la
même infrastructure. Et que les logiciels clients de Baofeng, devant
la panne, réagissent en faisant encore plus de requêtes DNS, qui
restent sans réponse. Le logiciel résolveur utilisé par tous les FAI
chinois, BIND, a une
limite sur le nombre de requêtes DNS récursives en attente, 1000 par
défaut. En temps normal, c'est largement suffisant mais, ici elle était
vite remplie par les innombrables requêtes en attente des serveurs de baofeng.com
.
Si vous gérez un récurseur BIND, vous pouvez voir l'état des
requêtes en cours avec rndc
:
% rndc status ... recursive clients: 13/1900/2000
Le dernier chiffre est la limite dure au nombre de requêtes en attente
(il se règle avec l'option recursive-clients
dans
named.conf
). L'avant-dernier est la limite
« douce » à partir de laquelle BIND commencera à laisser tomber des
requêtes, provoquant le message ci-dessus. Le premier chiffre est le
nombre de requêtes actuellement en attente.
En raison du nombre de clients attendant
baofeng.com
,
cette limite a été vite
dépassée, supprimant toute résolution DNS, même pour les domaines
n'ayant rien à voir avec Baofeng. Pour votre récurseur, faites le
calcul : prenez la différence entre la limite douce et le nombre de
clients en temps normal (ici, c'est 1900 - 13, mettons 1900) et
divisez là par le taux de requêtes : cela vous donnera une idée du
nombre de secondes que vous pourrez tenir en cas de panne. Ici, si le
taux de requêtes est de 100 par seconde (ce qui est une valeur pour un
petit FAI), vous avez droit à seulement dix-neuf secondes de marge en
cas de panne d'un gros domaine très populaire... La plupart des
récurseurs ont probablement une valeur de
recursive-clients
trop basse.
Conclusion : si quelqu'un réussit à planter tous les serveurs DNS de
google.com
ou ebay.com
, il
peut théoriquement planter tout le DNS et donc tout l'Internet.
Dans le cas chinois, tous les résolveurs étaient des BIND (comme c'est probablement le cas dans la plupart des pays). Il n'a pas été possible de tester avec d'autres résolveurs comme Unbound mais rien n'indique qu'ils auraient fait mieux. Le choix des développeurs de BIND était d'avoir un tableau de taille limitée pour les requêtes en attente. Si ce tableau était par contre dynamique, le récurseur aurait, à la place, avalé toute la mémoire du serveur.
Quelques-uns des articles les moins mal informés qui ont été publiés sur cette panne :
Merci à Ziqian Lu pour ses explications détaillées.
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)