ToutSurTout.biz
Le lulz de la VOIP - Tome 3 : Numericable


Chez Numericable, avec un modem/routeur Netgear de 2011 (donc probablement le Netgear CG3100L), il est possible de s'enregistrer sur un serveur/proxy SIP externe perso avec Jitsi/Linphone (Ekiga peine parfois : il s'enregistre sans problème et se désinscrit aussitôt de sa propre volonté (« Erreur de transfert »...). Il est tout aussi possible d'émettre des appels. Tout ça fonctionne en WiFi et en filaire.

En revanche, au moindre appel entrant, BOOOM, la box reboot. Le reboot se produit pile-poil à la réception du message SIP INVITE. On remarque que le reboot désactive parfois le WiFi ou fait perdre la clé WPA2. Priceless. Attention, pour que cela se produise, il faut d'abord passer le NAT donc être un paquet d'une connexion existante (même IP source, même port source, même IP dest, même port dest), ça limite les dégâts possibles. wink

On remarque que :
   * Ce comportement se produit uniquement si le serveur/proxy SIP écoute sur 5060, ce qui fait qu'il envoie des paquets UDP SIP avec sport=5060 ;

   * Ce comportement se produit uniquement avec SIPoUDP. Aucun problème avec SIPoTCP, même si le serveur/proxy écoute sur 5060 ;

   * La box ne répond pas à l'INVITE donc c'est vraiment l'INVITE entrant la cause du problème.

   * On remarque que ça concerne tout paquet arrivant avec sport=5060, peu importe son contenu. Même un paquet de bourrage fait planter la box. La seule condition est que ce paquet dépasse 1645 octets. Rien à voir avec la fragmentation puisque le paquet est fragmenté bien avant ce seuil. Ça sent le buffer overflow des familles.

Une recherche sur le web montre que c't'un problème connu : http://www.justneuf.com/forum/topic/126 … ins-ports/ , http://www.netgear-forum.com/forum/inde … opic=62375 , http://cablebox-news.com/forums/ne-peux … t1605.html , entre autres.

Cela vient de la SIP ALG du modem/routeur Netgear. En cherchant sur le web, on trouve des tonnes d'occurrences... Et Netgear est loin d'être le seul constructeur à avoir une SIP ALG défectueuse (voir http://www.voip-info.org/wiki/view/Routers+SIP+ALG )... C'quoi une SIP ALG, d'abord ? Sous Netfilter, on nomme ça un nat helper (ou juste helper) : ça inspecte un protocole donné connu pour avoir des problèmes avec le NAT car faisant transiter des informations de couche 3/4 en couche 7 (FTP, SIP, IRC,...) afin d'y récupérer les ports sur lesquels la communication va continuer/avoir lieu et ainsi de pouvoir laisser passer les nouvelles connexions qui auront lieu sur ces ports en les considérant relatives à une connexion principale déjà ouverte.

Aucune option dans la NCBox permet de virer la SIP ALG de Netgear donc pour avoir de la VOIP en état de marche, il reste : VPN ou changer le port d'écoute du serveur/proxy SIP ou passer en TCP ou, solution intéressante : restreindre la liste des codecs afin que l'offre SDP ne fasse pas exploser la taille du paquet SIP INVITE au-delà de 1645 octets.

Ce dernier point se fait côté serveur SIP. Exemple avec Asterisk : il faut ajouter ce qui suit dans sip.conf, section « general » (ou sur un peer SIP donné concerné par le problème) :
« disallow=all
allow=speex32
allow=speex16
allow=alaw
allow=ulaw »

Pour mettre ce problème amusant en évidence, il faut un compte SIP sur un serveur/proxy externe et on peut utiliser mon bout de Python pour générer des faux INVITE SIP : http://www.guiguishow.info/wp-content/u … eINVITE.py