Un enregistreur de VoIP avec un Raspberry Pi

Un truc un peu technique, amusant, après une question que je m’étais posé : est-il possible d’enregistrer des appels VoIP ? Dans certains cas, la réponse est oui, et assez facilement en plus.
Raspberry_Pi_Logo.svg

La raison de base, c’est que je reçois du spam et que ça m’amuse de dire aux gens « Cet appel est enregistré » (sans mentir), ce qui déstabilise bien les gens en face (oui, c’est puéril, mais drôle).

Mon installation est particulière, ce qui simplifie paradoxalement les choses : je n’utilise pas une ligne téléphonique classique ni la VoIP de mon FAI, mais une ligne VoIP fournie par OVH. J’ai donc un téléphone classique connecté à un boîtier Linksys PAP2T, qui fait office de bridge. Le boîtier est donc relié à mon réseau.

L’idée est simple : intercepter le trafic entre le boîtier et OVH et analyser le contenu.

Pour l’interception, c’est en fait très simple : j’ai juste placé un Raspberry Pi (2) entre mon routeur et mon boîtier. Il est équipé d’une seconde interface réseau (un adaptateur USB qui traînait dans mes cartons) et quelques lignes suffisent à stocker le trafic sur la carte SD du Raspberry. J’ai utilisé le tutorial présenté là, très simple à mettre en oeuvre. La solution limite à environ 50 mégabits/s selon son auteur, ce qui est largement au-dessus de mes besoins : le codec VoIP utilisé transmet la voix à 64 kb/s.

Le Raspberry Pi sur le boîtier VoIP

Le Raspberry Pi sur le boîtier VoIP

Pour des questions pratiques, j’ai monté un point de partage AFP pour accéder rapidement aux données (il y a d’excellents tutoriaux sur MacGeneration). Ca fonctionne assez bien, même si le fonctionnement n’est pas totalement optimal pour deux raisons. La première, c’est que je stocke sur une carte SD directement : même si la quantité de données est négligeable (en gros, ~2 Mo/heures sans les appels), elle écrit en permanence (un futur projet utilisera un simple disque dur). La seconde est inhérente au fonctionnement du truc : le principe est de capturer ce qui passe dans le câble, donc les données que je récupère sur mon ordinateur sont recapturées automatiquement et je dois de temps en temps vider manuellement les données.

Les données

Les données

La seconde étape, le contenu. En fait, c’est encore plus simple : une fois le trafic capturé avec TCPDump, Wireshark (qui existe pour Mac OS X en natif) peut directement lire une conversation. Il faut ouvrir le fichier pcapng, éventuellement le fusionner avec le suivant si vous découpez les interceptions (je sauve par trancher de 30 minutes), choisir Téléphonie -> VoIP Calls et sélectionner les appels, un bouton permet ensuite d’écouter les conversations directement.

Une conversation

Une conversation

Deux points importants tout de même. Le premier, c’est que Wireshark est franchement instable dans ce mode et qu’il plante régulièrement. Le second, c’est que ça fonctionne uniquement avec le code G711 pour la VoIP, pas avec le codec G729, plus courant. Dans mon cas, j’ai simplement forcé le G711a dans l’interface de mon boîtier VoIP.

Plus intéressant, il est aussi possible de sauver directement les conversations. Il faut faire Téléphonie -> RTP -> Flux RTP, ensuite cliquer sur Analyse et enfin sur Save. Il est possible de sauver soit la conversation complète, soit le flux entrant, soit le flux sortant. Le fichier en sortie est en PCM, parfaitement lisible par VLC ou QuickTime.

Sauver

Sauver


QuickTime X lit parfaitement le tout

QuickTime X lit parfaitement le tout

Au final, c’est assez pratique pour un usage précis. C’est surtout efficace dans ma configuration particulière, et nettement plus compliqué à mettre en oeuvre avec la téléphonie d’un FAI, qui utilise généralement un VLAN dédié (et sûrement un autre codec que le G711), mais ça montre qu’intercepter de la VoIP n’est pas quelque chose hors de portée d’un amateur. Ca mériterait un peu plus de finitions sur certains points et un effacement automatique des traces, mais comme c’est pour un usage ponctuel, ce n’est pas un souci.