Une raspberry pi comme routeur 3g avec VPN passthrough

France Télécom ne disposant pas des moyens technologiques pour tirer une ligne jusqu'à chez moi en ce début de 21e siècle, il m'a fallu trouver une alternative pour accéder à internet. Un peu dans la cambrousse, on doit pas être assez rentables pour que monsieur Orange daigne utiliser du cuivre pour nous. Pas d'ADSL donc.

Voyons les autres solutions qui s'offrent à moi :

Aucune de ces solutions n'offre de garantie quant à la qualité de ligne ou de débit. Quitte à investir dans du matériel me suis-je dis, autant qu'il soit réutilisable en cas de déménagement.

J'ai donc opté pour la solution 3G.

Le kit de connexion se compose donc de :

Auxquels s'ajoutent un hub réseau, un hub USB alimenté de récup' pour l'alim de la rpi et de la clé 3g, plus une carte sd qui trainait par là. On s'en tire donc pour un budget de 150€.

Les manips décrites ici ne décrivent pas la sécurisation de la configuration. Pour bien faire, il faudrait aussi sécuriser ssh :

Base

On effectue toutes les manipulations en tant que root :

sudo su 

On commence en installant une raspbian de base sur la carte SD, qu'on peut alléger de tous les logiciels liés à l'interface graphique vu qu'on en aura pas besoin.

On accède à la rpi branchée sur le réseau local en SSH.

Installation des logiciels nécessaires

 apt-get install wvdial ppp dnsmasq usb-modeswitch 

Configuration de la clé 3G huawei E3131H-2

Une fois le système démarré, un petit lsusb doit retourner :

 $ lsusb | grep Huawei 
 Bus 001 Device 007: ID 12d1:15ca Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard 

On a donc une clé avec un VID de 12d1 et un PID de 15ca. La clé est en mode stockage, la faute au lecteur de carte SD intégré. Pour la switcher en mode modem, on utilise usb-modeswitch :

 echo '"## Huawei E3131 (Variant)   TargetVendor= 0x12d1 TargetProductList="1506" MessageContent="55534243123456780000000000000011062000000100000000000000000000"' > /etc/usb_modeswitch.d/12d1:15ca 

On peut ensuite changer le mode de la clé avec :

 usb_modeswitch -c /etc/usb_modeswitch.d/12d1:15ca 

Un nouveau lsusb nous donne:

 $ lsusb | grep Huawei 
 Bus 001 Device 007: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard 

Configuration de wvdial

$ cat /etc/wvdial.conf


; Si on doit entrer un code pin pour débloquer la SIM, on décommente les lignes suivantes et on change CPIN=xxxx
;[[Dialer pin]]
;Modem = /dev/ttyUSB0
;Baud = 115200
;Init1 = AT+CPIN=0000

[[Dialer Defaults]]
Init1 = ATZ
Init2 = ATE1
Init3 = AT+CGDCONT=1,"IP","ebouygtel.com"
Stupid Mode = 1
MessageEndPoint = "0x01"
Modem Type = Analog Modem
ISDN = 0
Phone = *99#
Modem = /dev/ttyUSB0
Username = { }
Password = { }
Baud = 460800
Auto Reconnect = on

Ici, ebouygtel.com est l'APN de Bouygues Telecom pour les connexions 4G/3G.

On lance la connexion ainsi :

 wvdial & disown 

Un petit ifconfig nous montre la connexion active :

$ ifconfig ppp0 ppp0 Link encap:Point-to-Point Protocol

    inet addr:10.85.xx.xx  P-t-P:10.64.64.64  Mask:255.255.255.255 
    UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1 
    RX packets:312948 errors:1 dropped:0 overruns:0 frame:0 
    TX packets:220381 errors:0 dropped:0 overruns:0 carrier:0 
    collisions:0 txqueuelen:3  
    RX bytes:356761362 (340.2 MiB)  TX bytes:38262825 (36.4 MiB) 
Ajout de règles Iptables

Pour pouvoir accéder à internet, on doit activer l'ip forwarding et ajouter des règles entre l'interface ppp0 (3g/wan) et eth0 (Lan) :

echo "1" > /proc/sys/net/ipv4/ip_forward
# pour conserver ce réglage au démarrage
echo "net.ipv4.ip_forward=1" | tee -a /etc/sysctl.conf
#NAT eth0 <> ppp0
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT

Pour que ces réglages se chargent au démarrage :

# on sauvegarde les regles dans un fichier
iptables-save > /etc/iptables.ipv4.nat
#on active l'execution de /etc/rc.local
chmod +x /etc/rc.local

On ajoute cette ligne dans /etc/rc.local avant 'exit 0':

iptables-restore < /etc/iptables.ipv4.nat 

On doit pouvoir pinger google.com depuis la rpi à ce stade.

Configuration de dnsmasq

Dnsmasq est un serveur dhcp/dns très léger, d'ou son intérêt. On doit simplement modifier ces valeurs dans /etc/dnsmasq.conf

interface=eth0
dhcp-range=192.168.0.2,192.168.0.20,12h 

Ici, on aura 19 adresses à offrir.

Configuration de l'IP statique d'eth0

On doit indiquer à l'interface 'eth0' quelle sera son IP en local. On édite donc /etc/network/interfaces et on édite ainsi :

auto eth0

    #iface eth0 inet dhcp 
    iface eth0 inet static 
    address 192.168.0.1 
    network 192.168.0.0 
    netmask 255.255.255.0 

On ajoute tant qu'on y est de quoi lancer la connexon 'ppp0' au démarrage :

  auto ppp0
  iface eth0 inet wvdial 

Redémarrage

On éteint la rpi et on la déconnecte du lan.

On connecte un ordi, en direct ou via un hub, sur le port rj45 de la rpi, et on y accède désormais en SSH via l'IP définie plus tôt, ici 192.168.0.1.

Normalement, l'ordi connecté à la rpi via le câble peut accéder à internet. Si ce n'est pas le cas vérifier que ppp0 est bien up et que les règles iptables sont en place :

 ifconfig ppp0
 iptables -S FORWARD 

Openvpn Passthrough

On peux installer 'openvpn' pour faire passer tout le traffic de la rpi par un VPN. Pour 'proprifier' mon internet, moi, j'utilise du vpn FDN, parce que je suis sûr que des gens consciencieux et compétents sont derrières. (Pour l'histoire, FDN, c'est le plus vieux FAI de france encore en activité, et c'est une asso.)

 apt-get install openvpn 

On récupère les fichiers de config de son fournisseur VPN, et on les mets dans /etc/openvpn

Ensuite, on ajoute d'autres règles 'iptables' pour forwarder via le VPN :

#openvpn
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I INPUT -i tun+ -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -I POSTROUTING -o tun+ -j MASQUERADE

On sauve tout ça :

iptables-save > /etc/iptables.ipv4.nat 

et on lance le vpn :

openvpn /etc/openvpn/config.ovpn 

Normalement, on a accès à internet, et on peut vérifier sur whoer.net qu'on a bien une IP du range du fournisseur VPN.

Bilan

Sans l'antenne

Le dongle 3g est collé à la fenêtre, le signal est de 8 sur 30.

 $ comgt -d /dev/ttyUSB2   SIM ready 
 Waiting for Registration..(120 sec max) 
 Registered on Home network: "Bouygues Telecom",2 
 Signal Quality: 8,99 

Sans antenne

Avec l'antenne

L'antenne est reliée au dongle 3g, posée en extérieur, à une hauteur d'environ 2 mètres du sol, et orientée à la louche vers une antenne à 5 km. Le signal passe à 10.

 $ comgt -d /dev/ttyUSB2   SIM ready 
 Waiting for Registration..(120 sec max) 
 Registered on Home network: "Bouygues Telecom",2 
 Signal Quality: 10,99 

Avec antenne

Installation définitive

C'est déjà un succès pour moi, car je retrouve un débit digne d'une ligne ADSL de base, bien suffisant pour du web/mail/ssh...

À terme, l'antenne sera installée sur le toit, et sera orientée plus minutieusement, avec une inclinaison de ~ 30°, ce qui devrait faire gagner encore quelques dB...

À suivre !

Sources

http://www.instructables.com/id/Raspberry-Pi-as-a-3g-Huawei-E303-wireless-Edima/?ALLSTEPS

http://www.raspberrypi.org/forums/viewtopic.php?t=92594&p=646656

https://www.thefanclub.co.za/how-to/how-setup-usb-3g-modem-raspberry-pi-using-usbmodeswitch-and-wvdial

https://www.alionet.org/showthread.php?22664-Cl%E9-3G-Bouygues-Comment-faire