Ajout 2017-04-22 : ajout des remarques sur les déconnexions périodiques de l’opérateur, et sur les paramètres persist et maxfail de pppd

La "cible" finale …​ et l’étape du jour

J’aimerais pouvoir faire des trucs à distance, mais sans avoir sur place une connexion permanente (pas d’adsl) pour des questions de coût, de maintenance.

L’idée c’est d’installer sur place un raspberry pi (v1 parce que j’en ai un qui traine) qui serait alimenté en permanence, vu que ça ne consomme quasiment rien.

Ensuite on déclencherait la connexion 3G en envoyant un SMS au numéro de la carte SIM. Et on finit par une connexion VPN vers une adresse IP prédéfinie (car généralement via une clé 3G on reçoit une adresse "privée" en 10.A.B.C qui n’est pas joignable directement).

À terme en plus on prendra soin des éléments additionnels :

  • on montera le filesystem en lecture seule pour ne pas avoir de soucis de carte SD

  • on le redémarre une fois par jour au cas où quelque chose a planté.

Dans le post d’aujourd’hui, je montrerai 3 façons de créer une connexion 3G avec une clé 3G (un modem usb quoi) sous Linux.

À titre personnel, j’ai finalement décidé d’utiliser la méthode pppd car c’est celle qui est la plus "bas niveau", et donc à mon avis la plus fiable.

Les autres points évoqués ci-dessus feront l’objet d’autres posts !

Modem

J’ai une vieille clé 3G "Option ICON 225" de 2008 et une carte SIM Free-Mobile avec un forfait à 2€.

Elle est reconnue par défaut par la Debian, avec le pilote hso, qui créé des périphérique /dev/ttyHS*.

Pour savoir quel fichier sert à quoi, on regardera dans /sys :

find /sys/devices/ -name 'hsotype' | xargs grep ''
.../ttyHS0/hsotype:Control
.../ttyHS1/hsotype:Application
.../ttyHS2/hsotype:Diagnostic
.../ttyHS3/hsotype:Modem

Le device pour le modem (3G/SMS) est ttyHS3.

Déconnexions automatiques

Ajout 2017-04-22 : Pour information, j’ai constaté qu’on était périodiquement déconnecté du réseau de l’opérateur :

  • au bout de 120 minutes (2 heures) dans le cas d’une inactivité totale (aucun paquet émis/reçus)

  • au bout de 720 minutes (12 heures) même si des données transitent régulièrement

Pour cette raison, j’ai ajouté la remarque sur les options persist et maxfail de pppd.

Désactivation du code PIN

Pour être sûr qu’on ne soit pas embêtés par le code PIN de la carte SIM, on va le désactiver.

On installe un terminal série :

sudo apt-get install picocom

Attention : le user qui lance picocom doit faire partie du groupe dialout ou bien être root !

On branche la clé avec la carte SIM, puis on lance un terminal série :

picocom /dev/ttyHS3

On tape d’abord AT et on doit recevoir OK, pour voir que la communication série avec le modem se passe bien.

Ensuite on constate qu’on nous demande le code PIN :

AT+CPIN?
+CPIN: SIM PIN
OK

On regarde l’obligation de déverrouillage systématique (1 veut dire qu’on doit entrer le code PIN à chaque branchement) :

AT+CLCK="SC",2
+CLCK: 1
OK

On désactive l’obligation de déverrouillage (ici code PIN 1234)

AT+CLCK="SC",0,"1234"
OK

Ensuite on constate qu’on ne nous demande plus le code PIN :

AT+CPIN?
+CPIN: READY
OK

On quitte picocom en faisant Ctrl+a puis Ctrl+q.

Maintenant, plus aucun code ne sera nécessaire lors des débranchements/redémarrage de la clé 3G.

Connexion avec NetworkManager

Quand on dispose d’une interface graphique, rien de plus simple avec NetworkManager :

  • faire un clic sur l’icône du NetworkManager, et sélectionner l’option `Activer la connexion mobile"

  • on obtient une association avec le point réseau Free (itinérance UMTS/HSDPA) mais la connexion 3G n’est pas établie

  • cliquer sur Nouvelle connexion mobile…​

  • cliquer sur Suivant, sélectionner France, sélectionner Free Mobile, cliquer sur Suivant

  • Dans la liste déroulant, sélectionner l’option Free-Mobile, contrôler le nom du point d’accès "APN" qui apparait free.

  • Attention: Si ce n’est pas free qui apparaît en tant qu’APN, sélectionner l’autre option Free-Mobile !

  • Cliquer sur Suivant puis sur Appliquer

Lors de la première connexion, on nous demandera un mot de passe : saisir free puis entrée. Ce mot de passe sera mémorisé pour la suite.

Pour se connecter, cliquer sur l’option Free Mobile Free-mobile du menu de NetworkManager.

Pour se déconnecter, cliquer sur l’option Se déconnecter du menu de NetworkManager.

Connexion avec WVDIAL

Installer le package wvdial

sudo apt-get install wvdial

Configurer /etc/wvdial.conf :

[Dialer Defaults]
Modem Type = Analog Modem
ISDN = 0
Modem = /dev/ttyHS3
Baud = 115200
Init1 = AT
Init3 = ATZ
Init4 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init5 = AT+CGDCONT=1,"IP","free"
Stupid mode = 1
Phone = *99#
New PPPD = yes
Check Def Route = 1
Username = free
Password = free

On teste la connexion via sudo wvdial :

--> WvDial: Internet dialer version 1.61
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: AT
AT
OK
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1,"IP","free"
AT+CGDCONT=1,"IP","free"
OK
--> Modem initialized.
--> Sending: ATDT*99#
--> Waiting for carrier.
ATDT*99#
CONNECT 7200000
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Sun Apr 16 11:48:25 2017
--> Pid of pppd: 14091
--> Using interface ppp0
--> pppd: ���v[18]z�
--> pppd: ���v[18]z�
--> pppd: ���v[18]z�
--> pppd: ���v[18]z�
--> pppd: ���v[18]z�
--> local  IP address 10.47.118.140
--> pppd: ���v[18]z�
--> remote IP address 10.64.64.64
--> pppd: ���v[18]z�
--> primary   DNS address 212.27.40.240
--> pppd: ���v[18]z�
--> secondary DNS address 212.27.40.241
--> pppd: ���v[18]z�

On interrompt la connexion via Ctrl-C

^CCaught signal 2:  Attempting to exit gracefully...
--> Terminating on signal 15
--> pppd: ���v[18]z�
--> Connect time 0.6 minutes.
--> pppd: ���v[18]z�
--> pppd: ���v[18]z�
--> pppd: ���v[18]z�
--> Disconnecting at Sun Apr 16 11:49:04 2017

Configurer /etc/network/interfaces :

# auto ppp0
iface ppp0 inet wvdial

Pour activer la connexion : sudo ifup ppp0

Après quelques secondes, on constate que ça marche via ppp0 :

$ ip route
default dev ppp0  scope link
10.64.64.64 dev ppp0  proto kernel  scope link  src 10.191.207.59
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=352 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=352 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=56 time=329 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 329.094/344.814/352.735/11.136 ms

On désactive la connexion : sudo ifdown ppp0

Connexion avec PPPD

Installer le package pppd

sudo apt-get install pppd

On contrôle/définit les options par défaut /etc/ppp/options :

asyncmap 0
auth
crtscts
lock
hide-password
modem
lcp-echo-interval 30
lcp-echo-failure 4
noipx

On définit le script de discussion avec le provider /etc/ppp/chat/freemobile.chat :

#ECHO ON
ABORT 'BUSY'
ABORT 'ERROR'
ABORT 'NO ANSWER'
ABORT 'NO CARRIER'
'' AT
OK ATZ
OK 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0'
OK AT+CGDCONT=1,"IP","free"
OK ATDT*99#

On définit les options pour le fournisseur /etc/ppp/peers/freemobile :

115200
connect 'chat -v -t 60 -f /etc/ppp/chat/freemobile.chat'
noauth

Ajout 2017-04-22 : Si vous voulez que la connexion reste active en permanence une fois lancée, ajouter aussi les options suivantes :

persist
maxfail 0

Pour débugger ce qui se passe : sudo tail -f /var/log/message

On active la connexion : pon freemobile

Apr 16 12:11:00 localhost pppd[15397]: pppd 2.4.6 started by root, uid 0
Apr 16 12:11:01 localhost chat[15399]: abort on (BUSY)
Apr 16 12:11:01 localhost chat[15399]: abort on (ERROR)
Apr 16 12:11:01 localhost chat[15399]: abort on (NO ANSWER)
Apr 16 12:11:01 localhost chat[15399]: abort on (NO CARRIER)
Apr 16 12:11:01 localhost chat[15399]: send (AT^M)
Apr 16 12:11:01 localhost chat[15399]: expect (OK)
Apr 16 12:11:01 localhost chat[15399]: AT^M^M
Apr 16 12:11:01 localhost chat[15399]: OK
Apr 16 12:11:01 localhost chat[15399]:  -- got it
Apr 16 12:11:01 localhost chat[15399]: send (ATZ^M)
Apr 16 12:11:01 localhost chat[15399]: expect (OK)
Apr 16 12:11:01 localhost chat[15399]: ^M
Apr 16 12:11:01 localhost chat[15399]: ATZ^M^M
Apr 16 12:11:01 localhost chat[15399]: OK
Apr 16 12:11:01 localhost chat[15399]:  -- got it
Apr 16 12:11:01 localhost chat[15399]: send (ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0^M)
Apr 16 12:11:02 localhost chat[15399]: expect (OK)
Apr 16 12:11:02 localhost chat[15399]: ^M
Apr 16 12:11:02 localhost chat[15399]: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0^M^M
Apr 16 12:11:02 localhost chat[15399]: OK
Apr 16 12:11:02 localhost chat[15399]:  -- got it
Apr 16 12:11:02 localhost chat[15399]: send (AT+CGDCONT=1,"IP","free"^M)
Apr 16 12:11:02 localhost chat[15399]: expect (OK)
Apr 16 12:11:02 localhost chat[15399]: ^M
Apr 16 12:11:02 localhost chat[15399]: AT+CGDCONT=1,"IP","free"^M^M
Apr 16 12:11:02 localhost chat[15399]: OK
Apr 16 12:11:02 localhost chat[15399]:  -- got it
Apr 16 12:11:02 localhost chat[15399]: send (ATDT*99#^M)
Apr 16 12:11:02 localhost pppd[15397]: Serial connection established.
Apr 16 12:11:02 localhost pppd[15397]: Using interface ppp0
Apr 16 12:11:02 localhost pppd[15397]: Connect: ppp0 <--> /dev/ttyHS3
Apr 16 12:11:03 localhost pppd[15397]: PAP authentication succeeded
Apr 16 12:11:07 localhost pppd[15397]: Could not determine remote IP address: defaulting to 10.64.64.64
Apr 16 12:11:07 localhost pppd[15397]: local  IP address 10.103.160.93
Apr 16 12:11:07 localhost pppd[15397]: remote IP address 10.64.64.64
Apr 16 12:11:07 localhost pppd[15397]: primary   DNS address 212.27.40.240
Apr 16 12:11:07 localhost pppd[15397]: secondary DNS address 212.27.40.241

On constate que ça marche via ppp0 :

$ ip route
default dev ppp0  scope link
10.64.64.64 dev ppp0  proto kernel  scope link  src 10.191.207.59
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=107 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=126 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=56 time=125 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 126.383/140.820/168.964/19.905 ms

Pour désactiver la connexion : poff

Apr 16 12:45:20 localhost pppd[2493]: Terminating on signal 15
Apr 16 12:45:20 localhost pppd[2493]: Connect time 0.5 minutes.
Apr 16 12:45:20 localhost pppd[2493]: Sent 480 bytes, received 252 bytes.
Apr 16 12:45:20 localhost pppd[2493]: Connection terminated.
Apr 16 12:45:21 localhost pppd[2493]: Exit.

Pour activer la connexion : sudo pon freemobile

On désactive la connexion : sudo poff

Routage restreint

Si on ne souhaite pas que la route par défaut soit utilisée via la connexion 3G, mais plutôt définir des routes spécifiques :

  • d’abord ajouter nodefaultroute à /etc/ppp/peers/freemobile

  • ensuite, créer un script qui devra être exécutable et qui sera exécuté quand l’interface devient up

On l’appellera /etc/ppp/ip-up.d/0100local_freemobile et il aura avec le contenu suivant :

#!/bin/sh
SPECIFIC_ROUTE="8.8.8.8"
if test "${CALL_FILE}" = "freemobile"
then
    /sbin/ip route replace ${SPECIFIC_ROUTE} dev ${PPP_IFACE}
fi

Les paramètres et variable d’environnements utilisables dans ce script sont décrits dans man pppd section SCRIPTS. Ce script est appelé par /etc/ppp/ip-up qui lui-même est automatiquement appelé par pppd quand l’interface ip est disponible.

Une fois la connexion établie, on affiche le routage : ip route

default via 192.168.1.1 dev eth0
8.8.8.8 dev ppp0  scope link
10.64.64.64 dev ppp0  proto kernel  scope link  src 10.92.216.131
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.3  metric 202

On voit dans cette table de routage que seul le trafic vers 8.8.8.8 partira via la connexion 3G ppp0 (et aura donc une latence plus élevée). Le reste du trafic partira via la route par défaut (s’il y en a une !) et aura donc une latence faible vu que ce serait de l’ADSL ou de la fibre. Vérifions tout ça.

Traffic via la connexion 3G :

$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=628 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=506 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=316 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 316.072/483.529/628.004/128.381 ms

Traffic hors connexion 3G :

$ ping -c 3 8.8.4.4
PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
64 bytes from 8.8.4.4: icmp_seq=1 ttl=58 time=2.34 ms
64 bytes from 8.8.4.4: icmp_seq=2 ttl=58 time=1.77 ms
64 bytes from 8.8.4.4: icmp_seq=3 ttl=58 time=2.48 ms
--- 8.8.4.4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.773/2.203/2.488/0.309 ms

De cette manière, on peut restreindre le trafic qui consomme le forfait 3G de l’abonnement !