Mais euh, chef, je travaille sous Linux, moi, ça va pas être évident votre bidule VPN qui marche que sous Windows.

Ah, bah t'as bien un double boot, non ?, qu'il me fait.

Un double-boot ? Sooo 1998, chef.
Non, je n'ai pas de double-boot, j'ai une machine virtuelle pour les Worderies absconses, mais pas de double-boot.

Il a donc fallu se retrousser les manches et se convaincre qu'on allait pas se prendre le chou pour rien pendant des semaines, que ça allait marcher nickel. Follow my lead, ça vaut le détour (hint: pour les impatients qui auraient peu de tolérance pour le suspense, à la fin, le héros réussi à se connecter).

Préambule

Le système VPN utilisé pour les connexions Orange Business Everywhere est un système IPSec, tout ce qu'il y a de plus conventionnel et interopérable. Bon point pour Orange. Un peu de doc ne serait pas inutile pour éviter d'avoir à deviner les options des tunnels à l'aveuglette, mais je sais, je rêve un peu.

Les paramètres de la connexion VPN sont contenus dans un fichier .spd, qui n'est rien d'autre qu'un fichier de règles de base de registres. Ces règles sont utilisées par le logiciel SoftRemoteLT de SafeNet, qui est installé par le kit de connexion Business Everywhere pour gérer et activer les connexions VPN.

Ça va décevoir les mêmes impatients qui se disent "Kékinousoule avec son VPN. Moi, tout ce que je veux, c'est une IP sur le modem 3G.", mais sans VPN, pas de connexion. L'APN 3G vous donnera bien une IP, mais seul le trafic IPSec est autorisé à circuler. Donc pas de VPN, pas d'Internet. C'est dur, mais c'est comme ça.

Les ingrédients

Avant de se lancer dans la tambouille, il faut l'inventaire de ce qu'on veut, de ce qu'on a et de ce dont on a besoin.

  • ce qu'on veut, c'est facile, c'est se connecter au VPN professional avec sa distrib Linux préférée.
  • ce qu'on a, c'est variable. Dans le cas qui nous préoccupe (enfin vous préoccupe, parce que moi, je m'en cogne, ma connexion elle marche, lalalère), ça consiste en :
    • une carte PCMCIA 3G Orange GX301, qui n'est autre qu'une carte Option GlobeTrotter GT MAX HSUPA E rebrandée.
    • la carte SIM associée, et son code PIN (que nous appellerons 0000 afin de conserver son anonymat)
    • un ensemble de logins et de mots de passe, utilisables sur les différents réseaux idoines (3G, Wifi Orange, Wifi-Partners-Business-Everywhere-In-The-World-But-You-Have-To-Pay-For-It™)
    • un fichier de politique de sécurité, du genre TPCOP-XXX-3DES.SPD, qui n'est autre
  • ce dont on a besoin : la clé PSK pour établir la connexion VPN. Ça, généralement, on ne l'a pas, mais elle est contenue dans le fichier .spd, donc on l'a quand même un peu. Elle n'est pas en clair, bien sûr, ça serait beaucoup trop facile. Mais, il existe un moyen de la récupérer, un peu comme pour les connexions vpnc Cisco. More on that later.

Le matos

Alors y'a des gens qui disent que Linux ça sucks parce que niveau support matériel, c'est trop naze par rapport à Windows qui supporte tout le matériel du monde de la terre. Vu comme ils causent, y'a de fortes chances pour qu'ils n'aient pas beaucoup plus d'une douzaine d'années. Ou qu'ils souffrent d'hydrocéphalie. L'un n'excluant d'ailleurs pas l'autre.
Quoi qu'il en soit, quand j'ai inséré (délicatement) la carte 3G dans mon slot PCMCIA, j'ai le bonheur, je dois dire un peu incrédule dans un premier temps, de voir mon noyau 2.6.35 chanter ainsi :

[59638.824081] pcmcia_socket pcmcia_socket0: pccard: CardBus card inserted into slot 0
[...]
[59638.824538] ohci_hcd 0000:04:00.0: enabling device (0000 -> 0002)
[...]
[59638.882306] usb usb9: New USB device found, idVendor=1d6b, idProduct=0001
[59638.882314] usb usb9: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[59638.882321] usb usb9: Product: OHCI Host Controller
[59638.882325] usb usb9: Manufacturer: Linux 2.6.35-trunk-amd64 ohci_hcd
[59638.882331] usb usb9: SerialNumber: 0000:04:00.0
[59638.882674] hub 9-0:1.0: USB hub found
[59638.882689] hub 9-0:1.0: 1 port detected
[59642.124085] usb 9-1: new full speed USB device using ohci_hcd and address 2
[59642.339311] usb 9-1: New USB device found, idVendor=0af0, idProduct=7011
[59642.339320] usb 9-1: New USB device strings: Mfr=1, Product=2, SerialNumber=4
[59642.339327] usb 9-1: Product: Globetrotter HSUPA Modem  
[59642.339332] usb 9-1: Manufacturer: Option N.V.
[59642.339336] usb 9-1: SerialNumber: Serial Number
[59642.346268] hso0: Disabled Privacy Extensions

Victoire ultime, j'ai un device ! Et même des /dev/ttyHSx, c'est trop l'extase.

Donc pour résumer, y'a rien à faire : ti plug, et ti play. Plus de Ozerocdoff, de louseries udev ou de driver à compiler, comme avant. Maintenant, tu peux toujours prétendre que t'en as bavé pour que ton OS reconnaisse ta carte, mais tu passeras juste pour un gros mytho.

Gimme gimme gimme, an IP for my hso0

Maintenant, qu'on a un device, il nous faut une IP. C'est le but, hein, je vous rappelle.

Alors là, c'est comme pour le matos :

  • soit on fait des trucs à la main, parce qu'on se sent un peu Bear Grylls sur les bords, et on gère ses commandes AT soi-même. Rien de bien compliqué, tout est documenté.
  • soit on fait confiance à la modernité du progrès et on laisse ModemManager faire le boulot.

Moi je suis une larve, donc je laisse mon network-manager se débrouiller tout seul. Il faut quand même lui donner un peu d'infos, c'est pas Mme Soleil non plus :

  • l'APN est transpac.net
  • le username est votre nom d'utilisateur Buisness Everywhere, du type user@yourbusiness.fr.op
  • le mot de passe n'a aucune importance, j'ai mis prout, c'est vous dire.

On n'a pas non plus besoin de numéro à composer, les cartes Option utilisent des instructions AT_OWANCALL et AT_OWANDATA qui font de l'IP directement. J'ai pas tout compris, mais ça a l'air cool.

Tellement je suis sympa, je vous ai mis un screenshot de la connexion que j'utilise, dans le plasma-widget-networkmanagement de KDE4 (c'est le truc qui gère NetworkManager, pour nous, les hommes du futur). Ça se configure sous l'onglet "Mobile Broadband", en tant que connexion de type GSM.

Paramètres de connexion Mobile Broadband

Avec tout ça, quand on clique dessus, ça vous connecte, et ça vous file une adresse IP. Et là, c'est trop la joie dans votre cœur.

La clé PSK

À la joie et la félicité qu'ont provoquées l'immaculée apparition d'une adresse IP sur votre nouveau device, vont succéder la mélancolie et la tristesse de constater que malgré cette IP toute belle et toute brillante, vous ne pouvez toujours pas twitter votre bonheur. Pas de gateway, pas de DNS, et surtout, pas de trafic. Coincé dans son IP, qu'on est.

Quand on vous dit qu'on a besoin d'un VPN. Faut nous croire, quoi.

Et surtout, quand on se rapelle qu'il nous manque le sésame, la clé PSK, pour initier notre connexion IPSec, c'est la déprime totale.

Heureusement, il y a findus, enfin surtout les développeurs de SoftRemote, qui ont eu l'amabilité de laisser une faille de sécurité dans leur logiciel. Merci les gars. Merci d'avoir pensé aux types qui, comme moi, voudraient faire plaisir à leur patron et se connecter au VPN d'entreprise tout en gardant la tête haute et le Linux vaillant. Merci d'avoir pensé que la clé PSK serait aussi bien rangée, stockée en clair en mémoire, que cryptée dans le fichier de conf. Je vous passe les détails, tout est très bien expliqué.

Là où ça devient relou, c'est que depuis qu'on leur a fait remarquer que c'était pas le meilleur endroit pour ranger ses clés, ils l'ont comblée, cette faille. Et nous alors ? Comment qu'on fait maintenant ?

Bah on appelle Marty McFly, et on repart en 2005. Je vous conseille un Windows XP (si besoin formolisé dans une VM, ça marche très bien). Et il faut ensuite partir à la chasse à la version vulnérable de SoftRemote, ie. inférieure à 10.7.2. C'est bien évidemment introuvable.

Une fois tous ces éléments réunis, il suffit d'importer le .spd magique dans SafeNet, de sortir son pmdump du fourreau, et la force doit révéler le secret de la clé ancestrale. Je vous conseille de vérifier la lecture de la PSK dans le dump mémoire en créant une nouvelle connexion avec votre propre PSK, pour vérifier le format sous lequel elle apparaît dans le dump. La partie sur les 2 derniers caractères de la clé sont répétés n'est pas forcément vraie à chaque coup.

Openswan

Maintenant qu'on a notre clé PSK, on peut s'atteler à la configuration de nos tunnels VPN. Nos tunnels, parce qu'Orange, dans sa grande bonté, en fournit trois :

  • une connexion utilisable sur le lien 3G/GPRS (GPRS)
  • une connexion utilisable sur le wifi Orange (WIFI)
  • une connexion utilisable n'importe où (VPNIPSec)

Pour construire notre fichier de confifuration IPSec, il nous faut les adresses IP des passerelles IPSec utilisées pour chacune des connections. C'est facile, c'est dans le fichier .spd :

$ egrep "IPADDR|TREENAME" TPCOP-XXX-3DES.SPD | grep -v 00000000
"TREENAME"="Other Connections"
"TREENAME"="DHCPS"
"TREENAME"="WIFI"
"IPADDR"=dword:<hexnumber>
"TREENAME"="GPRS"
"IPADDR"=dword:<hexnumber>
"TREENAME"="VPNIPsec"
"IPADDR"=dword:<hexnumber>

Alors là, je vous entends déjà :

Meuh, c'est pas des IP, tes trucs, là

Et si, c'est juste leur représentation hexadécimale. Look :

$ ipcalc 7f000001
Address:   127.0.0.1  [...]

Voilà, il suffit de donner les adresse hexa à ipcalc pour retrouver la notation pointée traditionnelle.

Ensuite, je vous la fait courte, on installe Openswan (apt-get install openswan, dur, hein ?), et on colle sa config dans /etc/ipsec.conf :

# /etc/ipsec.conf - Openswan IPsec configuration file

version 2.0     # conforms to second version of ipsec.conf specification

# basic configuration
config setup
    nat_traversal=yes
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey

conn VPNIPSec
    type=tunnel
    keyexchange=ike
    pfs=yes
    right=<IP de la connexion VPNIPSec, extraite du fichier .spd>
    rightsubnet=0.0.0.0/0
    rightxauthserver=yes
    rightmodecfgserver=yes
    left=%defaultroute
    leftnexthop=%defaultroute
    leftxauthclient=yes
    leftmodecfgclient=yes
    leftxauthusername=<votre utilisateur Business Everywhere, type user@mybusiness.fr.op>
    authby=secret
    keylife=23h
    auto=add

conn WIFI
    type=tunnel
    keyexchange=ike
    pfs=yes
    right=<IP de la connexion VPNIPSec, extraite du fichier .spd>
    rightsubnet=0.0.0.0/0
    rightxauthserver=yes
    rightmodecfgserver=yes
    left=%defaultroute
    leftnexthop=%defaultroute
    leftxauthclient=yes
    leftmodecfgclient=yes
    leftxauthusername=<votre utilisateur Business Everywhere, type user@mybusiness.fr.op>
    authby=secret
    keylife=23h
    auto=add

conn GPRS
    type=tunnel
    keyexchange=ike
    pfs=yes
    right=<IP de la connexion VPNIPSec, extraite du fichier .spd>
    rightsubnet=0.0.0.0/0
    rightxauthserver=yes
    rightmodecfgserver=yes
    left=%defaultroute
    leftnexthop=%defaultroute
    leftxauthclient=yes
    leftmodecfgclient=yes
    leftxauthusername=<votre utilisateur Business Everywhere, type user@mybusiness.fr.op>
    authby=secret
    keylife=23h
    auto=add

Et encore un coup, toujours à la ramener, hein ?

Et la clé PSK, on la met pas ? On s'est fait chier pour la trouver, quand même...

Si si, ça arrive, mais comme c'est un secret super-secret, on la met dans /etc/ipsec.secrets

: PSK "<la clé PSK extraite du .spd à la sueur de notre front>"
@<votre utilisateur Business Everywhere, type user@mybusiness.fr.op> : XAUTH "<le mot de passe Business Everywhere correspondant>"

Avec tout ça, si ça connecte pas, faut envisager de changer de métier.

# /etc/init.d/ipsec restart
ipsec_setup: Stopping Openswan IPsec...
ipsec_setup: Starting Openswan IPsec U2.6.28-g6a7ed31d-dirty/K2.6.35-trunk-amd64...
# ipsec whack --name GPRS --listen --initiate
002 listening for IKE messages
002 forgetting secrets
002 loading secrets from "/etc/ipsec.secrets"
002 loading secrets from "/var/lib/openswan/ipsec.secrets.inc"
002 "GPRS" #1: initiating Main Mode
104 "GPRS" #1: STATE_MAIN_I1: initiate
003 "GPRS" #1: received Vendor ID payload [RFC 3947] method set to=109 
002 "GPRS" #1: enabling possible NAT-traversal with method 4
002 "GPRS" #1: transition from state STATE_MAIN_I1 to state STATE_MAIN_I2
106 "GPRS" #1: STATE_MAIN_I2: sent MI2, expecting MR2 
003 "GPRS" #1: received Vendor ID payload [Cisco-Unity]
003 "GPRS" #1: received Vendor ID payload [Dead Peer Detection]
003 "GPRS" #1: ignoring unknown Vendor ID payload [0091e636d24e07787114756a579d4d29]
003 "GPRS" #1: received Vendor ID payload [XAUTH]
003 "GPRS" #1: NAT-Traversal: Result using RFC 3947 (NAT-Traversal): i am NATed
002 "GPRS" #1: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
108 "GPRS" #1: STATE_MAIN_I3: sent MI3, expecting MR3 
002 "GPRS" #1: Main mode peer ID is ID_IPV4_ADDR: '<adresse IP de la connexion GPRS>'
002 "GPRS" #1: transition from state STATE_MAIN_I3 to state STATE_MAIN_I4
004 "GPRS" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=oakley_3des_cbc_192 prf=oakley_md5 group=modp1024}
002 "GPRS" #1: XAUTH: Answering XAUTH challenge with user='user@mybusiness.fr.op'
002 "GPRS" #1: transition from state STATE_XAUTH_I0 to state STATE_XAUTH_I1
004 "GPRS" #1: STATE_XAUTH_I1: XAUTH client - awaiting CFG_set
002 "GPRS" #1: XAUTH: Successfully Authenticated
002 "GPRS" #1: transition from state STATE_XAUTH_I0 to state STATE_XAUTH_I1
004 "GPRS" #1: STATE_XAUTH_I1: XAUTH client - awaiting CFG_set
002 "GPRS" #1: setting client address to <adresse IP sur le réseau distant>
002 "GPRS" #1: setting ip source address to <adresse IP sur le réseau distant>
002 "GPRS" #1: transition from state STATE_XAUTH_I0 to state STATE_XAUTH_I1
004 "GPRS" #1: STATE_XAUTH_I1: XAUTH client - awaiting CFG_set
002 "GPRS" #2: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW {using isakmp#1 msgid:77d7065c proposal=defaults pfsgroup=OAKLEY_GROUP_MODP1024}
117 "GPRS" #2: STATE_QUICK_I1: initiate
003 "GPRS" #2: ignoring informational payload, type IPSEC_RESPONDER_LIFETIME msgid=77d7065c
002 "GPRS" #2: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
004 "GPRS" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x7f6938e9 <0xa1029b0c xfrm=3DES_0-HMAC_MD5 NATOA=none NATD=none DPD=none}

W00t!

Intégration

Si on vivait dans un monde idéal, on n'aurait même pas besoin de configurer IPSec à la main, on pourrait faire ça dans une belle GUI cliqua-cliqua. Mais certains ont décidé que le monde serait cruel.

Heureusement, la cruauté n'empêche pas la liberté, ni les rustines. Merci, Network-Manager, de nous donner notre connexion quotidienne, et de nous permettre de coller des p'tits trucs qui vont bien dans ton dispatcher.

# cat /etc/NetworkManager/dispatcher.d/99vpngprs
#!/bin/bash

IF=$1
STATUS=$2

# GPFS VPN connexion start
if [ "$IF" = "hso0" ] && [ "$STATUS" = "up" ]; then
        /etc/init.d/ipsec restart
        ipsec auto --add GPRS
        ipsec whack --name GPRS --listen --initiate
fi

# GPFS VPN connexion stop
if [ "$IF" = "hso0" ] && [ "$STATUS" = "down" ]; then
        ipsec whack --name GPRS --terminate
fi

Vous voyez le genre ?