Table des matières
L'objectif de ce beau projet est de permettre de recevoir et envoyer des SMS à partir d'un ordinateur en utilisant une carte SIM qui borne toujours au même endroit.
Nous allons pour cela installer la solution raspiSMS sur une Raspberry Pi munie d'un clef USB 3G.
RaspiSMS et Clef 3G
Pour information, mon ordinateur personnel utilise Ubuntu 20.04.
Par ailleurs, ma box internet possède un IP fixe, je n'ai donc pas eu à résoudre ce problème.
Clef 3G
J'ai commandé une clef 3G Huawei E3531.
À noter qu'il existe deux modèles différents de cette clef, la Stick et la HiLink, vendues sous le même nom, et qu'il est impossible de savoir laquelle vous aurez avant de la brancher dans l'ordi ; entraînant des configurations différentes. En ce qui me concerne, je me suis retrouvé avec une HiLink.
Pour l’anecdote, une fois branché, ce modèle prend le pas sur la connexion Internet, et ce détail a son importance car les 50Mo mensuels de data du forfait à 0€ de chez Free peuvent partir en quelques minutes, voire quelques secondes, en fonction de votre usage sur le moment. Prendre donc soin de couper la connexion le plus tôt possible, pour ne pas vous retrouver comme moi avec un “hors forfait” de plus de 10€ en 2 minutes. Soit dans l'interface web qui se sera ouverte, soit avec le menu réseau.
Carte SIM
Comme évoqué plus haut, étant abonné chez Free, j'ai commandé une carte SIM avec le forfait à 0€. Ici aussi, ne faites pas comme moi, et essayez de commander une taille de carte correspondant à la clef 3G. Pour la E3531, le slot est adapté à une carte SIM standard. Sinon, il existe des adaptateurs.
Raspberry Pi
J'ai utilisé une Rasberry Pi 4 de 2Go, mais j'imagine que ça doit être compatible avec des modèles plus vieux. J'y ai installé une Debian 11 Bullseye avec Raspberry Pi Imager.
Sur l'interface, il y a un bouton d'option avec un petit engrenage, il est important d'y préciser que l'on souhaite que le SSH soit pris en charge, et d'y configurer le WiFi.
Je vous invite aussi, pour des raisons de sécurité, à choisir un autre nom d'utilisateur que le très répandu pi. Dans notre cas, pour la suite du tuto, ce sera smsos.
Gestion des adresses IP
Pour des raisons de confort et de sécurité, j'ai attribué des IP fixes à mon ordi et à la Raspberry Pi. De cette manière, je peux d'une part plus facilement configurer le firewall de la Raspbetrry Pi pour qu'elle n'accepte que mon ordi en SSH, et d'autre part toujours connaître l'IP de la Pi pour pouvoir m'y connecter.
Sur l'interface en ligne de la Freebox :
- Paramètre de la Freebox > Réseau Local > WiFi (pour récupérer les adresses MAC de la Pi et de l'ordi).
- Puis aller dans DHCP > Beaux Statiques (pour attribuer les IP fixes).
Redémarrer la Pi et votre ordi pour que ces régalages soient appliqués.
Pour l'exemple, mon ordi sera en 192.168.0.99 et la Raspberry Pi en 192.168.0.77
Connexion en SSH
Si vous avez attribué une IP fixe à la Pi, vous n'aurez pas besoin de la chercher pour vous y connecter. Sinon il y a cette commande nmap qui vous permettra de l’obtenir :
sudo nmap -sn 192.168.0.0-255
Pour se connecter :
ssh smsos@192.168.0.77
Sécurité
Dans la mesure où la Raspberry Pi fera office de serveur web pour accéder à la gestion des SMS depuis n'importe où, elle sera exposée aux affres de la cyber malveillance. Il est donc prudent d'appliquer quelques mesures de sécurité.
Nous sommes pas ici sur des mesures très poussées, c'est plus pour le principe. Ça reste malgré tout efficace pour des attaques non ciblées.
Il est préconisé de supprimer l'utilisateur “pi”, mais, si vous avez créé votre image système avec rpi-imager en spécifiant un autre nom d'utilisateur ou d'utilisatrice, ce n'est plus nécessaire.
SSH
On peut, par exemple, dès à présent, changer le port de connexion SSH, qui est traditionnellement le 22, et lui attribuer le port 42 (au choix).
sudo nano /etc/ssh/sshd_config
Puis décommenter et modifier la ligne :
Port 42
Pour appliquer :
sudo service ssh restart
Désormais, pour se connecter il faudra utiliser la commande :
ssh smsos@192.168.0.77 -p 42
Firewall
Pour limiter l'utilisation du SSH à mon seul ordi, je n'ai autorisé que mon adresse IP, pour l'exemple, ici, sur le port 42.
J'ai pour cela installé le firewall ufw :
sudo apt install ufw
Puis j'ai appliqué cette règle assez explicite :
sudo ufw allow from 192.168.0.99 to any port 42
Il peut être aussi utile de n'ouvrir sur l'extérieur que les ports nécessaires pour accéder à Apache (le serveur web) :
sudo ufw allow 80 sudo ufw allow 443
Pour activer le firewall :
sudo ufw enable
Pour voir si les règles ont bien été prises en compte :
sudo ufw status verbose
Fail2Ban
Pour restreindre les accès multiples, on peut utiliser Fail2Ban :
sudo apt install fail2ban
RaspiSMS
L'installation de RaspiSMS est très simple. Elle est détaillée ici par l'équipe du projet, mais je vous la recopie pour que la page soit complète :
Ajouter le dépôt
J'ai installé les paquets nécessaires à l'utilisation d'APT avec SSL, avec cette succession de commandes :
sudo apt update -y sudo apt install -y apt-transport-https gnupg2 curl echo "deb https://apt.raspisms.fr/ buster contrib" | sudo tee -a /etc/apt/sources.list.d/raspisms.list curl https://apt.raspisms.fr/conf/pub.gpg.key | sudo apt-key add - sudo apt update -y
Installer le paquet raspisms
sudo apt install raspisms
Il m'a été demandé des infos pour configurer MySQL et le serveur SMTP. Pour ma part, faute d'avoir les infos, je n'ai pas renseigner le serveur SMTP, mais ça n'a pas empêché l'installation d'aboutir et le serveur de fonctionner.
Récupérer les identifiants
L'identifiant et le mot de passe pour la (première) connexion peuvent être récupérer en regardant dans le fichier .credential
sudo cat /usr/share/raspisms/.credentials
Une fois tout ceci fait, il m'a alors été possible d’accéder à l'interface web depuis mon ordi en allant à l'adresse locale :
192.168.0.99/raspisms
Gammu
Ce logiciel va faire l'interface entre la clef 3G et raspiSMS.
J'ai passé des jours à essayer de configurer la clef Huawei E3531 sans succès. Dans la mesure où deux modèles différents de la clef sont distribués avec le même nom, les informations que l'on trouve sont parfois contradictoires en fonction de l'usage que l'on veut en avoir. Ainsi, certains veulent passer du mode Stick au mode HiLink, d'autres veulent l'inverse. Et, encore maintenant, je ne sais pas trop quel mode j'utilise. Car oui, il est possible de passer d'un mode à l'autre.
Pour information mon lsusb d'origine m'affichait la clef ainsi (je le mentionne car j'imagine qu'un jour quelqu'un va tomber sur cette page par ce biais) et je n'avais aucun ttyUSB dans mon /dev :
Bus 001 Device 017: ID 12d1:14dc Huawei Technologies Co., Ltd. E33372 LTE/UMTS/GSM HiLink Modem/Networkcard
De ce que j'en ai compris, 12d1 est l'ID du vendeur, ici Huawei ; 14dc est l'ID du produit ici la clef dans son mode HiLink.
Ce qui l'on va chercher à faire, c'est à changer l'ID du produit, car cela rendra compte que l'on a changé de mode. Mode qui, en l'état ne permet pas d'envoyer de SMS avec Gammu (mais le permet avec l'interface web HiLink).
Je ne vais pas essayer de vous expliquer ce que je n'ai pas compris. Je reste encore complètement circonspect devant le fait que ça marche, mais ça marche.
J'ai installé un paquet qui s'appelle usb-modeswitch :
sudo apt-get install usb-modeswitch
J'ai créé un fichier qui s'appelle 12d1:1f01 :
sudo nano /etc/usb_modeswitch.d/12d1:1f01
Et j'ai collé dedans :
TargetVendor=0x12d1 TargetProduct=0x1f01 MessageContent="55534243123456780000000000000011062000000100000000000000000000"
J'ai redémarré, et j'ai obtenu cette ligne :
Bus 001 Device 004: ID 12d1:155e Huawei Technologies Co., Ltd. HUAWEI Mobile
Et dans mon /dev j'avais :
/ttyUSB0 /ttyUSB1 /ttyUSB2
Reste que la configuration de Gammu avec gammu-config ne marche pas pour autant. Et ce, quel que soit le /dev/ttyUSB que je lui propose.
Alors j'ai essayé de forger à la main un fichier de configuration en faisant :
sudo nano /etc/gammurc
Et en collant le contenu suivant :
[gammu] device = /dev/ttyUSB0 connection = at19200 name = Phone on USB serial port synchronizetime = yes gammucoding = utf8 [gammu1] device = /dev/ttyUSB1 connection = at19200 name = Phone on USB serial port synchronizetime = yes gammucoding = utf8 [gammu2] device = /dev/ttyUSB2 connection = at19200 name = Phone on USB serial port synchronizetime = yes gammucoding = utf8
Et ça a marché…
- Je suis allé sur le serveur raspiSMS de ma Pi avec le navigateur de mon ordi, dans “téléphone” j'ai “Ajouter un téléphone”.
- Dans “type de téléphone”, j'ai renseigné “Gammu”.
- Et dans “fichier de configuration”, j'ai mis /etc/gammurc
… et j'ai pu envoyer et recevoir des SMS avec l'interface web.
Il existe une procédure pour attribuer un nom fixe au /ttyUSB afin de le retrouver facilement, mais elle n'est pas exploitable par ma bidouille de gammurc. Mais dans la mesure où je n'ai que la clef 3g comme périphérique USB et qu'elle restera toujours dans le même slot, je ne rencontre pas de problème de non reconnaissance de la clef.
DMZ
Enfin, pour pouvoir accéder au serveur depuis l'extérieur, j'ai créé une DMZ avec ma Freebox :
Connexion Internet > Gestion des port > DMZ : puis j'ai renseigné l'adresse IP de la Raspberry Pi.
Et désormais, je peux envoyer et recevoir des SMS en tapant dans un navigateur l'adresse IP de ma Freebox suivit de /raspisms
\o/