Un antispam téléphonique avec un Raspberry Pi

Si vous avez une ligne fixe, vous avez peut-être le même souci que moi : des appels indésirables. Je me suis inscrit à Bloctel mais certains continuent. Mais j’ai une solution efficace : un antispam physique avec un Raspberry Pi.

Mon problème est un peu idiot : j’utilise une ligne VoIP OVH avec un boîtier client (Linksys PAP2) depuis quelques années, avec un numéro donné (normalement) exclusivement à un cercle restreint, en gros la famille. Mais visiblement le numéro s’est retrouvé dans la nature, soit via mon ancienne banque, soit via OVH lui-même (aucune idée) et je reçois donc régulièrement des appels liés à mon ancien logement (j’ai déménagé il y a plus de 5 ans). Pour signaler des travaux, vérifier si je veux vendre, etc. Assez vite énervant.

La solution que j’utilise fonctionne assez bien : elle se base sur un Raspberry Pi qui va détecter l’appelant et effectuer un vrai antispam. Si le numéro est bloqué, l’appareil émet une tonalité de fax avant de raccrocher directement. Il nécessite assez peu de matériel : un Raspberry Pi (j’ai utilisé un 3, mais un modèle de base doit suffire) et un modem en USB.

Avant même de passer à la configuration (un peu laborieuse), le choix du modem va être un souci. Premièrement, oubliez les modems USB US Robotics. En plus d’être assez onéreux, ils fonctionnent mal dans le cas présent. La solution de base consiste à utiliser un modem Trendnet, largement disponible (le TFM-561U). C’est le modèle que j’avais en stock, mais il a des défauts : il n’a pas de seconde prise RJ11 et ne gère pas toutes les fonctions. De plus, il se limite à la technologie américaine – j’en reparle ensuite -. Globalement, c’est à éviter, donc. La solution consiste à utiliser un modem 56K avec deux prises, qui gère bien l’audio et offre toutes les fonctions. Mais, vous vous en doutez, ce n’est pas si simple. En fait, c’est un modem USB « OEM », et sa disponibilité est aléatoire. J’ai acheté une version Sewell il y a deux semaines, et il n’est plus disponible. Mais d’autres (en novembre 2016) proposent le même, en tout cas selon les photos : Sodial, Kalea, IIEasy, etc. Comptez entre 10 et 25 € environ pour ce modèle.

Le modem (avec deux prises RJ11)

Le modem (avec deux prises RJ11)

Le second problème vient de la signalisation de l’appelant. Selon les pays, la façon d’indiquer à un téléphone (ou un modem) le numéro de l’appelant change. Aux USA, le « Bellcore » est la norme, avec une transmission après la première sonnerie. En Europe, ça dépend des pays, avec du DTMF ou de l’ETSI (et même une technologie différente au Royaume-Uni). Le souci vient des modems : ils ne comprennent pas tous toutes les technologies. Le modem Trendnet cité dans le paragraphe précédent n’accepte par exemple que le Bellcore. Dans mon cas, je n’ai pas eu de soucis : mon boîtier VoIP Linksys était réglé en Bellcore et mon téléphone affiche bien le numéro de l’appelant. Après, il peut fonctionner dans d’autres technologies, c’est un simple réglage. Je n’ai aucune idée de la norme utilisée par les Box des opérateurs, mais je suppose qu’il s’agit de l’ETSI français.

La connexion va être simple : le modem en USB, un câble vers le mur, un autre vers le téléphone. Comme le modem USB Sewell a deux prises, c’est pratique.

Sur le Raspberry Pi, première étape : installer JCBlock.

wget http://jcblock.cvs.sourceforge.net/viewvc/jcblock/?view=tar -O jcblok.tar.gz
tar xzvf jcblok.tar.gz
cd jcblock
mv jcblock/ ../jcb
cd ..
cd jcb

Il faut créer des fichiers pour les données. Je vous conseille juste de mettre un commentaire (#) dans le fichier avant de sauver. Vous pouvez aussi simplement renommer les exemples, mais ils contiennent des données.

nano blacklist.dat
nano whitelist.dat
nano callerID.dat

Ici, ça va dépendre de votre modem. La commande que j’utilise ici est celle pour un modem Sewell, mais elle changer avec un modem Trendnet (ou un autre). La documentation explique pas mal de cas différents.

sudo apt-get install libasound2-dev
./makejcblockAT

Troisième étape, JCAdmin. Il s’agit d’une sorte de GUI pour le programme, qui permet une gestion un peu plus simple que d’éditer des fichiers DAT à la main. Il nécessite NodeJS dans une version récente, à installer manuellement. Attention, la version dépend de votre Raspberry.

wget https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-armv6l.tar.xz (si vous avez un Raspberry Pi B, B+, A, A+ ou Zero)
wget https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-armv7l.tar.xz (si vous avez un Raspberry Pi 2 ou 3)

tar -xvf node*.tar.xz
cd node*
sudo cp -R * /usr/local/

Maintenant, l’installation de JCAdmin.

git clone https://github.com/cosinekitty/jcadmin
cd jcadmin
./initialize

Pour le lancement des logiciels, nous allons créer deux scripts.

cd ~/
mkdir script
cd script

Le premier lance JCBlock. Il faut adapter le code aux répertoirs que vous avez choisis.

nano jcbloc.sh

Le contenu.

#!/bin/bash
cd /home/pi/jcb
./jcblockAT | tee -a jcblock.log

Le second lance l’interface.

nano jcadmin.sh

Vous devez utilisez un port pour la connexion à la GUI (8080 ou autre) et bien indiquer le chemin pour l’installation de JCBlock.

#!/bin/bash
cd /home/pi/jcadmin
node jcadmin.js 8080 /home/pi/jcb/ | tee -a jcadmin.log

Ensuite, il faut rendre les scripts exécutables et les placer dans /etc/rc.local pour un lancement au démarrage.

sudo chmod +x jcadmin.sh
sudo chmod +x jcblock.sh
sudo nano /etc/rc.local

Juste avant la ligne exit 0;.

/home/pi/script/jcblock.sh &
/home/pi/script/jcadmin.sh &

Dernier point, pratique sous macOS, l’annonce via Bonjour. Ca permet de voir le programme directement dans les liens Bonjour avec Safari. Commencez par installer Avahi et le nécessaire (c’est expliqué là).

sudo nano /etc/avahi/services/jcblock.service

Dans le service, quelques lignes. Attention au port, il doit être le même que dans le script.

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name>Antispam</name>
<service>
<type>_http._tcp</type>
<port>8080</port>
</service>
</service-group>

Pour terminer, un petit redémarrage.

Maintenant, ça donne quoi ?

L’interface affiche par défaut un journal des appels, et en cliquant sur un numéro, elle affiche la possibilité de changer le nom et de définir le type d’appelant. Safe n’est pas bloqué, Neutral ne l’est pas mais peut l’être et Blocked… l’est. Avec mon modem, une personne bloquée va entendre une tonalité de fax avant que le modem raccroche (après deux sonneries, à cause du Bellcore). Point intéressant, il est possible de blacklister depuis le téléphone : en pressant la touche *, le logiciel met l’appelant en liste noire. La fenêtre pour le faire reste assez courte : environ 7 secondes après avoir décroché (on entend un peu de bruit), vous avez 10 secondes pour presser la touche.

La liste des appels

La liste des appels


Un détail d'un appel

Un détail d’un appel

C’est en place depuis quelques jours, je vous en reparlerais peut-être un jour.