A. Introduction

Cela fait maintenant 1 an que j'ai mis en place, chez moi, un boitier VPN (basé sur un Raspberry Pi) fixe qui me permet d'avoir un accès internet propre et respectueux de la neutralité du net en passant par mon FAI associatif préféré à savoir FDN. Sauf que dès le départ son utilisation se limitait à mon réseau local domestique.

Ainsi, je suis tombé un peu par hasard sur le projet de boitier VPN mobile lancé par LDN, renommé entre temps la brique internet, et je me suis dit que le concept de mobilité était une excellente idée que je devais reprendre. Je me suis donc lancé sur un projet similaire à celui de LDN réadapté à mes besoins et à mon matériel.

Je vais vous présenter ci-dessous ce que j'ai réalisé afin d'obtenir un boitier VPN mobile opérationnel. Des fonctionnalités se sont rajoutées au fur et à mesure de mes besoins. De plus, j'ai dans l'idée prochainement d'ajouter une connexion VPN anonymisante ainsi qu'un accès au réseau Tor si besoin. La finalité de ce projet est de disposer d'un accès Internet propre et/ou anonymisant et/ou non-bridé depuis à-peu-près n'importe où.

Par contre, contrairement à LDN, l'idée essentielle de mon boîtier n'est pas l'auto-hébergement mais bien la mobilité. Ainsi, les services proposés sur Internet se limiteront à un accès SSH et à une page Web statique (celle-là même sur laquelle vous êtes) destinée à présenter cet outil.

Bonne découverte ;)

B. Matériel

  • Un Raspberry PI B
  • Une antenne Wi-Fi faisant Point d'accès
  • Une carde SD de 8 ou 16 Go
  • Un câble réseau Ethernet catégorie 6
  • Une batterie au lithium afin d'être autonome (optionnel)
  • Un adaptateur secteur micro-USB pour brancher le Raspberry PI
  • Un sticker de notre FAI préféré :p
  • C. Système

    C.1. Le système d'exploitation Raspbian

    Concernant le système d'exploitation, j'ai choisi un système Raspbian non-officiel et minimaliste nommé DarkBasic qui correspond à une netinstall Debian simple. Vous disposerez de toutes les informations nécessaires pour l'installation de l'OS sur la carte SD sur le lien précédent.

    Pour éviter de trop solliciter ma carte mémoire, j'ai décidé d'éviter un trop grand nombre d'écriture. Ainsi j'ai notamment décidé de monter le répertoire /var/log en mémoire vive.

    $ sudo cat /etc/fstab
    tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
    tmpfs /var/spool tmpfs defaults,noatime,mode=1777 0 0
    tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0
    tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0

    D. Logiciels

    Avant de rentrer dans les détails techniques, je vais énumérer les différents rôles et services présents sur mon boitier.

  • Point d'accès Wi-fi pouvant servir également de PirateBox le cas échéant
  • Connexion à Internet en IPv4 et également en IPv6
  • Accès VPN vers un FAI associatif, un serveur dédié ou un prestataire spécialisé
  • Fourniture d'adresses IPv4 grâce à un service DHCP et distribution d'un préfixe IPv6 à l'aide d'un service d'auto-configuration stateless RADVD
  • Résolveur DNS autonome avec le support de DNSSEC
  • Client IRC et site Web statique
  • Un TOR boyau (accès au réseau TOR - projet en cours)
  • Accès à Internet via le partage de connexion d'un smartphone (en cours)
  • D.1. Configuration du point d'accès Wi-Fi

    L'idée est donc de fournir un accès Internet propre sans fil à différentes personnes via la technologie Wi-Fi. J'ai donc acheté une antenne Wi-Fi compatible avec Raspbian (attention lorsque vous vous procurez une antenne Wi-Fi à ce que le matériel soit détecté par le système et qu'un driver existe bien pour GNU/Linux). Nous aurons un Point d'accès avec un SSID visible et une sécurité WPA-TKIP avec une phrase de passe.

    Une fois l'antenne branchée et le système lancé, il est nécessaire d'installer les drivers qui vont bien :

    $ sudo aptitude install firmware-realtek

    Maintenant, vous devriez avoir une nouvelle interface réseau nommée wlan0 :

    $ sudo ifconfig
    wlan0 Link encap:Ethernet HWaddr dc:a9:14:45:1f:11
    inet adr:192.0.2.1 Bcast:192.0.2.255 Masque:255.255.255.0
    adr inet6: fe80::dda9:14ff:fe45:1f11/64 Scope:Lien
    adr inet6: 2001:db8:a:b::ffff/64 Scope:Global
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:1084560 errors:0 dropped:154 overruns:0 frame:0
    TX packets:1654836 errors:0 dropped:258 overruns:0 carrier:0
    collisions:0 lg file transmission:1000

    On va maintenant installer le paquet qui permet de mettre en oeuvre un Point d'accès Wi-Fi :

    $ sudo aptitude install hostapd

    Puis nous allons configurer l'outil à l'aide du fichier de configuration :

    $ sudo vim /etc/hostapd/hostapd.conf
    interface=wlan0
    ssid=WeMakeDataLove
    channel=6
    country_code=FR
    macaddr_acl=0
    auth_algs=1
    ignore_broadcast_ssid=0
    wpa=2
    wpa_passphrase=WeMakeDataPorn
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP
    driver=rtl871xdrv
    ieee80211n=1
    device_name=RTL8188CUS
    manufacturer=Realtek
    hw_mode=g

    Enfin, il nous reste à configurer l'interface wlan0 en IPv4 et en IPv6 et relancer le service HostAPD :

    $ sudo vim /etc/network/interfaces
    # interfaces(5) file used by ifup(8) and ifdown(8)
    auto lo
    iface lo inet loopback

    allow-hotplug eth0
    auto eth0
    iface eth0 inet dhcp

    allow-hotplug wlan0
    auto wlan0
    iface wlan0 inet static
    address 192.0.2.1
    netmask 255.255.255.0

    iface wlan0 inet6 static
    address 2001:db8:a:b::ffff
    netmask 64

    $ sudo service networking restart
    $ sudo service hostapd restart

    Vous devriez voir apparaître le réseau Wi-Fi nommé WeMakeDataLove sur une machine disposant d'une carte réseau Wi-Fi. Connectez-vous sur ce réseau à l'aide de la phrase de passe TKIP WeMakeDataPorn.

    D.2. Nettoyer son accès Internet à l'aide d'un VPN fourni par un FAI associatif

    Comme vous le savez peut-être, les grands telco et fournisseurs d'accès Internet ne respectent absolument pas la neutralité du net. Vous payez donc 30 euros par mois pour un accès à Internet très sale (blocage du port 25 chez Orange, priorisation de certains flux par rapport à d'autres, Surveillance en profondeur du trafic émis par les abonnés). Tout cela ne va certainement pas s'arranger avec le Projet de Loi sur le renseignement et la surveillance qui permettra notamment à l'état et certains acteurs publiques et privés de récupérer les métadonnées émises par les internautes français. Un certain nombre de personnes et d'associations s'inquiètent d'ailleurs énormément des abus qui pourraient subvenir à cause de cette futur loi.

    Dans ces conditions, si l'on souhaite disposer d'un accès propre respectant la neutralité du net "pour faire du vrai Internet et non du Minitel 2.0", il est nécessaire de se tourner vers des Fournisseurs d'Accès Internet associatifs. Leur idée majeure est de se réapproprier l'Internet en créant soi-même un petit bout du réseau. De plus, le fait d'être adhérent et non client du FAI change votre rapport à ce dernier, vous devenez acteur, responsable de ce qui se passe dans cette association et donc de votre morceau d'Internet. Cependant, beaucoup de personnes ne souhaitent pas sauter le pas car elles ont (la fausse) impression d'un sentiment de confort chez leur FAI commercial en bénéficiant de la télévision et du téléphone illimité par ADSL ou Fibre Optique. C'est dans ces cas-là que le VPN prend tout son sens. Si vous souhaitez en bénéficier, il faut adhérer à un FAI associatif proposant cette solution puis solliciter ce dernier afin de souscrire à leur offre VPN. Chez FDN, cela revient à 8 euros par mois.

    Sur le Raspberry, nous allons installé le client VPN nommé OpenVPN puis configurer ce dernier (la configuration ci-dessous est un exemple fourni par FDN ici) :

    $ sudo aptitude install openvpn
    $ sudo cat /etc/openvpn/fdn.conf

    # Copier-coller à partir d'ici, et modifiez la partie auth-user-pass si vous ne voulez pas avoir à taper votre mot de passe à chaque fois.
    # 8<----------------------

    # C'est nous qui prenons l'initiative de nous connecter au serveur.
    client

    # On route de l'IP, on ne fait pas de l'ethernet.
    dev tun

    # Il est préférable d'utiliser udp, le résultat fonctionne mieux. Il est
    # cependant notable que les restrictions d'accès Internet laissent souvent
    # plus facilement passer tcp. Essayez donc udp, et seulement s'il ne fonctionne
    # pas, essayez tcp.
    #proto udp
    proto tcp

    # Certains réseaux ont en fait une MTU bien inférieure à 1450. Dire aux connexions
    # TCP d'être très conservatives, pour que ça marche plus ou moins partout.
    mssfix 1300
    # En UDP, on peut s'assurer que ça passe de toutes façons en fragmentant au besoin
    # quand ça dépasse.
    # fragment 1300
    # Idéalement, ça devrait être détecté tout seul, mais c'est loin de toujours fonctionner...
    # mtu-disc yes

    # En udp, Prévenir le serveur quand on termine, permet de relancer
    # immédiatement sans attendre que le serveur se rende compte de la
    # déconnexion par timeout.
    #explicit-exit-notify

    # Les adresses des serveurs.
    <connection>
    remote vpn1.fdn.fr 1194
    </connection>
    <connection>
    remote vpn2.fdn.fr 1194
    <connection>
    # et l'on pioche aléatoirement
    remote-random

    # Éventuellement, on peut avoir besoin de passer par un proxy http, décommenter cette ligne en mettant l'adresse et le port du proxy.
    #http-proxy 192.0.2.1 8080

    # Pour windows: utiliser route.exe.
    # route-method exe

    # Attendre un peu avant d'ajouter les routes.
    route-delay 2

    # Ne pas utiliser un port local statique, on est client de toutes façons.
    nobind

    # Garder la clé en mémoire, pour ne pas avoir besoin de la relire lors d'un
    # redémarrage.
    persist-key
    # On peut éventuellement ne pas tuer l'interface du tunnel lors d'un redémarrage, mais cela pose problème si au redémarrage on change de serveur.
    # persist-tun

    # Décommenter cette ligne pour faire passer tout le trafic via le VPN:
    redirect-gateway def1
    # On peut aussi vouloir plutôt router seulement quelques destinations, par
    # exemple ici tout Gitoyen:
    #route 80.67.160.0 255.255.224.0

    # Décommenter cette ligne pour activer IPv6
    tun-ipv6
    # et corriger et décommenter cette ligne pour configurer l'IPv6 qu'on va utiliser
    # parmi le /48. Il faut remplacer xy par l'écriture hexadécimale de la fin de l'IPv6,
    # ou bien simplement regarder dans l'espace adhérent ce qu'elle vaut
    ifconfig-ipv6 2001:db8:a:a::1 2001:db8:c:a::ffff
    # et décommenter cette ligne pour faire passer tout le trafic IPv6 via le VPN:
    route-ipv6 ::/1
    #route-ipv6 8000::/1

    # Envoyer un login et un mot de passe. Pour éviter de taper à la main login
    # et mot de passe, vous pouvez ajouter à droite de "auth-user-pass" le nom d'un
    # fichier contenant ces deux informations, une par ligne.
    auth-user-pass

    # Un minimum de debug, c'est toujours bien.
    verb 3

    # Certificat permettant de vérifier que c'est bien à FDN que
    # l'on se connecte et donc à qui on donne notre mot de passe.

    -----BEGIN CERTIFICATE-----
    MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
    IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
    IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
    Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO
    BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi
    MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ
    ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
    CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ
    8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6
    zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y
    fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7
    w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc
    G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k
    epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q
    laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ
    QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU
    fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826
    YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w
    ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY
    gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe
    MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0
    IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy
    dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw
    czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0
    dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl
    aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC
    AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg
    b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB
    ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc
    nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg
    18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c
    gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl
    Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY
    sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T
    SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF
    CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum
    GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
    zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
    omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    MIIHWTCCBUGgAwIBAgIDCkGKMA0GCSqGSIb3DQEBCwUAMHkxEDAOBgNVBAoTB1Jv
    b3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAGA1UEAxMZ
    Q0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSc3VwcG9y
    dEBjYWNlcnQub3JnMB4XDTExMDUyMzE3NDgwMloXDTIxMDUyMDE3NDgwMlowVDEU
    MBIGA1UEChMLQ0FjZXJ0IEluYy4xHjAcBgNVBAsTFWh0dHA6Ly93d3cuQ0FjZXJ0
    Lm9yZzEcMBoGA1UEAxMTQ0FjZXJ0IENsYXNzIDMgUm9vdDCCAiIwDQYJKoZIhvcN
    AQEBBQADggIPADCCAgoCggIBAKtJNRFIfNImflOUz0Op3SjXQiqL84d4GVh8D57a
    iX3h++tykA10oZZkq5+gJJlz2uJVdscXe/UErEa4w75/ZI0QbCTzYZzA8pD6Ueb1
    aQFjww9W4kpCz+JEjCUoqMV5CX1GuYrz6fM0KQhF5Byfy5QEHIGoFLOYZcRD7E6C
    jQnRvapbjZLQ7N6QxX8KwuPr5jFaXnQ+lzNZ6MMDPWAzv/fRb0fEze5ig1JuLgia
    pNkVGJGmhZJHsK5I6223IeyFGmhyNav/8BBdwPSUp2rVO5J+TJAFfpPBLIukjmJ0
    FXFuC3ED6q8VOJrU0gVyb4z5K+taciX5OUbjchs+BMNkJyIQKopPWKcDrb60LhPt
    XapI19V91Cp7XPpGBFDkzA5CW4zt2/LP/JaT4NsRNlRiNDiPDGCbO5dWOK3z0luL
    oFvqTpa4fNfVoIZwQNORKbeiPK31jLvPGpKK5DR7wNhsX+kKwsOnIJpa3yxdUly6
    R9Wb7yQocDggL9V/KcCyQQNokszgnMyXS0XvOhAKq3A6mJVwrTWx6oUrpByAITGp
    rmB6gCZIALgBwJNjVSKRPFbnr9s6JfOPMVTqJouBWfmh0VMRxXudA/Z0EeBtsSw/
    LIaRmXGapneLNGDRFLQsrJ2vjBDTn8Rq+G8T/HNZ92ZCdB6K4/jc0m+YnMtHmJVA
    BfvpAgMBAAGjggINMIICCTAdBgNVHQ4EFgQUdahxYEyIE/B42Yl3tW3Fid+8sXow
    gaMGA1UdIwSBmzCBmIAUFrUyG9TH8+DmjvO90rA67rI5GNGhfaR7MHkxEDAOBgNV
    BAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAG
    A1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS
    c3VwcG9ydEBjYWNlcnQub3JnggEAMA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUH
    AQEEUTBPMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggr
    BgEFBQcwAoYcaHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBB
    MD8GCCsGAQQBgZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9y
    Zy9pbmRleC5waHA/aWQ9MTAwNAYJYIZIAYb4QgEIBCcWJWh0dHA6Ly93d3cuQ0Fj
    ZXJ0Lm9yZy9pbmRleC5waHA/aWQ9MTAwUAYJYIZIAYb4QgENBEMWQVRvIGdldCB5
    b3VyIG93biBjZXJ0aWZpY2F0ZSBmb3IgRlJFRSwgZ28gdG8gaHR0cDovL3d3dy5D
    QWNlcnQub3JnMA0GCSqGSIb3DQEBCwUAA4ICAQApKIWuRKm5r6R5E/CooyuXYPNc
    7uMvwfbiZqARrjY3OnYVBFPqQvX56sAV2KaC2eRhrnILKVyQQ+hBsuF32wITRHhH
    Va9Y/MyY9kW50SD42CEH/m2qc9SzxgfpCYXMO/K2viwcJdVxjDm1Luq+GIG6sJO4
    D+Pm1yaMMVpyA4RS5qb1MyJFCsgLDYq4Nm+QCaGrvdfVTi5xotSu+qdUK+s1jVq3
    VIgv7nSf7UgWyg1I0JTTrKSi9iTfkuO960NAkW4cGI5WtIIS86mTn9S8nK2cde5a
    lxuV53QtHA+wLJef+6kzOXrnAzqSjiL2jA3k2X4Ndhj3AfnvlpaiVXPAPHG0HRpW
    Q7fDCo1y/OIQCQtBzoyUoPkD/XFzS4pXM+WOdH4VAQDmzEoc53+VGS3FpQyLu7Xt
    hbNc09+4ufLKxw0BFKxwWMWMjTPUnWajGlCVI/xI4AZDEtnNp4Y5LzZyo4AQ5OHz
    0ctbGsDkgJp8E3MGT9ujayQKurMcvEp4u+XjdTilSKeiHq921F73OIZWWonO1sOn
    ebJSoMbxhbQljPI/lrMQ2Y1sVzufb4Y6GIIiNsiwkTjbKqGTqoQ/9SdlrnPVyNXT
    d+pLncdBu8fA46A/5H2kjXPmEkvfoXNzczqA6NXLji/L6hOn1kGLrPo8idck9U60
    4GGSt/M3mMS+lqO3ig==
    -----END CERTIFICATE-----


    # 8<----------------------
    # Copier-coller jusqu'ici.

    $ sudo /etc/init.d/openvpn restart

    Le VPN démarre, pour savoir s'il est dorénavant fonctionnel :

    $ sudo ip addr show tun0
    5: tun0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100link/none
    inet 80.67.160.1/24 brd 80.67.160.255 scope global tun0 valid_lft forever preferred_lft forever
    inet6 2001:db8:a:a::1/64 scope global valid_lft forever preferred_lft forever

    Vous pouvez maintenant communiquer avec Internet en passant par votre FAI associatif préféré !

    $ traceroute www.debian.org

    D.3. Routage, NAT et filtrage sur le boîtier

    Mon boitier est un routeur, il transmet ainsi les paquets provenant du réseau Wi-Fi à destination d'Internet ou d'autres réseaux et vice-versa. Il faut donc que j'active le routage sur celui-ci :

    $ sudo vim /etc/sysctl.conf

    # Uncomment the next line to enable packet forwarding for IPv4
    net.ipv4.ip_forward=1

    # Uncomment the next line to enable packet forwarding for IPv6
    # Enabling this option disables Stateless Address Autoconfiguration
    # based on Router Advertisements for this host
    net.ipv6.conf.all.forwarding=1

    $ sudo sysctl -w

    Maintenant que mon Raspberry est configuré pour être un routeur, je dois mettre en place du filtrage afin de sécuriser les accès entre le réseau Wi-Fi, le réseau Ethernet sur lequel est branché en filaire le boîtier et Internet. Je ne dois également pas oublier d'activer le NAT, une technologie qui me permet de faire communiquer un réseau dit privé vers Internet qui est un réseau public. Sous GNU/Linux, c'est l'outil NETFILTER qui s'occupe de cela.

    $ sudo vim /etc/init.d/netfilter

    #!/bin/bash
    # Script Netfilter
    ### BEGIN INIT INFO
    # Provides: netfilter
    # Required-Start:
    # Required-Stop:
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Start firewall daemon at boot time
    # Description: Custom Firewall scrip.
    ### END INIT INFO

    case "$1" in
    start)
    # On vide les anciennes règles
    iptables -F
    iptables -X
    iptables -Z

    # Mise en place des sécurités noyaux
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    echo 1 >/proc/sys/net/ipv4/conf/all/log_martians
    echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
    echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
    echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

    # Mise en place du NAT pour permettre au réseau Wi-Fi de communiquer sur Internet
    iptables -t nat -A POSTROUTING -o tun0 -s 192.0.2.0/24 -j MASQUERADE
    # Par défaut, on bloque les paquets provenant d'un réseau vers un autre réseau
    # On bloque ce qui arrive sur le Raspberry
    # On autorise tout ce qui sort du boîtier
    iptables -t filter -P FORWARD DROP
    iptables -t filter -P OUTPUT ACCEPT
    iptables -t filter -P INPUT DROP
    ip6tables -t filter -P FORWARD DROP
    ip6tables -t filter -P OUTPUT ACCEPT
    ip6tables -t filter -P INPUT DROP

    # On autorise toutes les connexions en localhost (boucle locale)
    iptables -t filter -A INPUT -i lo -j ACCEPT
    iptables -t filter -A OUTPUT -o lo -j ACCEPT
    ip6tables -t filter -A INPUT -i lo -j ACCEPT
    ip6tables -t filter -A OUTPUT -o lo -j ACCEPT

    # On autorise les réponses à une connexion préalablement établie
    iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    ip6tables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    ip6tables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    ip6tables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

    # On autorise tout type de flux provenant du réseau Wi-Fi à destination d'internet
    iptables -t filter -A FORWARD -i wlan0 -o tun0 -s 192.0.2.0/24 -m state --state NEW -j ACCEPT
    ip6tables -t filter -A FORWARD -i wlan0 -o tun0 -s 2001:db8:a:b::/64 -m state --state NEW -j ACCEPT

    # On autorise Internet à se connecter en ssh et en http sur le Raspberry PI
    iptables -t filter -A INPUT -i tun0 -p tcp -d 80.67.160.1 -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
    ip6tables -t filter -A INPUT -i tun0 -p tcp -d 2001:db8:a:a::1 -m multiport --dports 22,80 -m state --state NEW -j ACCEPT

    # On autorise les ping (icmp-echo) depuis Internet vers mon Raspberry PI
    iptables -t filter -A INPUT -i tun0 -p icmp --icmp-type echo-request -d 80.67.160.1 -m state --state NEW -j ACCEPT
    ip6tables -t filter -A INPUT -i tun0 -p ipv6-icmp --icmpv6-type echo-request -d 2001:db8:a:a::1 -m state --state NEW -j ACCEPT

    # On autorise les machines connectées au réseau Wi-Fi à se connecter sur le boîtier
    iptables -t filter -A INPUT -i wlan0 -m state --state NEW -j ACCEPT
    ip6tables -t filter -A INPUT -i wlan0 -m state --state NEW -j ACCEPT

    # On autorise les requêtes RA et NDP vers mon Raspberry PI
    ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
    ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
    ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT

    sleep 3
    echo -e "Starting firewall.. \n"
    ;;
    stop)
    /sbin/iptables -F
    /sbin/iptables -t nat -F
    /sbin/iptables -t mangle -F
    /sbin/iptables -P INPUT ACCEPT
    /sbin/iptables -P FORWARD ACCEPT
    /sbin/iptables -P OUTPUT ACCEPT

    /sbin/ip6tables -F
    /sbin/ip6tables -P INPUT ACCEPT
    /sbin/ip6tables -P FORWARD ACCEPT
    /sbin/ip6tables -P OUTPUT ACCEPT

    sleep 3
    echo -e "Stopping firewall.. \n"
    ;;
    *)
    ;;

    Comme vous pouvez le constater, les règles de filtrage sont minimalistes mais fonctionnelles. On aurait pu aller beaucoup plus loin et vous êtes bien entendu libre de le faire. Maintenant nous allons activer le firewall au démarrage de la machine :

    $ sudo update-rc.d netfilter defaults

    Voilà, les fonctions de base du VPN mobile sont opérationnelles. Mais il nous reste encore un certain nombre de services à mettre en place !

    E. Conclusion