Point d'accès sécurisé par OpenVPN
Introduction
Ceci est la suite de Créer un point d'accès sécurisé avec hostAPd. Pourquoi me direz-vous ? Et bien, d'abord, pour la beauté de la chose. Ensuite, parce que certains clients font tout simplement planter mon point d'accès, qui tourne avec le module Madwifi. Donc j'ai voulu essayer autre chose.
Présentation
Le but recherché, et c'est très important de le souligner, est de créer un point d'accès sécurisé sans WEP ni WPA, ni WPA2. Le point d'accès apparaît comme non-sécurisé, mais si tout le monde peut s'y associer, ce n'est pas pour autant qu'il va être ouvert.
Je dispose toujours du même matériel :
- Une freebox basique (sans fonctions routeur ni wifi).
- Un PC (passerelle pour le reste du document) connecté directement à la freebox sous Debian/testing. Elle dispose de deux cartes réseau Ethernet RJ45 (filaire) qui sont identifiées par l'OS en tant que eth_adsl et eth_local. La freebox est reliée sur eth_adsl. Un firewall tourne entre eth_adsl et eth_local à l'aide d'iptables.
- Un switch branché sur eth_local, et sur lequel sont reliés deux clients de manière on ne peut plus classique.
- Une carte Wi-Fi D-Link DWL-G520 PCI avec chipset Atheros (le chipset importe beaucoup plus que la carte, croyez moi !!).
- Un ordinateur portable qui a un chipset Wifi Atheros fonctionnant avec ath9k.
<cadre type='alert'>Ce tutoriel décrit les opérations dans le sens logique d'une installation. Cependant, si vous le suivez dans l'ordre, il se peut que votre réseau se retrouve sans défense, et complètement accessible pendant un certain temps. Si vous voulez prendre le moins de risques possible, il est préférable de commencer par les règles IPTables</cadre>
Inconvénient par rapport au WPA / WPA2
- C'est plus compliqué à installer
- Les clients doivent pouvoir installer OpenVPN
Pré-requis
Malheureusement, je ne peux pas considérer que vous partez avec zéro connaissance. Mais voici la liste de ce qui doit déjà marcher sur votre installation :
- Le chipset Wifi doit être reconnu sur le serveur
- Le réseau doit être fonctionnel sur le serveur
- Le serveur dispose d'un serveur DHCP fonctionnel pour le réseau local.
- iptables doit être installé sur le serveur
- Le client doit avoir une carte Wifi qui marche
- Des notions de VPN sont conseillées.
Préparation du point d'accès
Toutes les commandes de cette partie sont à exécuter avec les droits du super utilisateur.
Création de l'interface réseau
Disposant d'une carte géré par le pilote madwifi, il me faut tout d'abord créer l'interface à l'aide de wlanconfig
. Cela permet de créer plusieurs interfaces virtuelles qui fonctionnent toutes sur la même carte réseau physique, mais dans des modes différents. Allons-y :
wlanconfig ath0 create wlandev wifi0 wlanmode ap
Cela crée une interface virtuelle nommée ath0 à partir de la carte wifi0 en mode "ap", c'est-à-dire "Access Point" soit "Point d'accès".
Ensuite, il faut fixer le SSID, c'est à dire le nom du réseau Wifi qui sera identifié par le client :
iwconfig ath0 essid "Mon OpenVPN"
Vous pouvez changer d'autres paramètres sur cette interface, comme le canal utilisé. Reportez-vous à la documentation de iwconfig
pour en savoir plus.
Et enfin, il faut démarrer l'interface nouvellement créée.
<cadre type='alert'>À partir de là, votre point d'accès peut-être rejoint par n'importe qui !
</cadre>
ifconfig ath0 192.168.1.254 netmask 255.255.255.0
Pour rendre cette configuration persistante, il suffit de modifier le fichier /etc/network/interfaces
sous Debian et d'y rajouter ces lignes :
- Interface pour le VPN
auto ath0
iface ath0 inet manual
madwifi-base wifi0
madwifi-mode ap
wireless-channel 9
address 192.168.1.254
netmask 255.255.255.0
broadcast 192.168.0.255
Installation de OpenVPN
Je suis sous Debian, donc si ça vous vexe pas, je vais décrire la procédure d'installation à la mode Debian :) Et c'est plutôt simple :
apt-get install openvpn
Pouf pouf, c'est fait. Pour les autres distributions, je doute que ce soit plus compliqué, OpenVPN étant un logiciel couramment utilisé.
Configuration de OpenVPN
Génération des certificats
Alors je ne vais pas réinventer la roue. Je vous renvoie au tutoriel d'Ubuntu pour la génération des fichiers du VPN
Création d'un VPN
J'ai donc un fichier monvpn.conf dans /etc/openvpn
qui ressemble à ça :
- Pour ne répondre au VPN que sur l'interface ath0
local 192.168.1.254
port 1194
proto udp
- Utilisation du mode routé
dev tun
- Fichiers générés à la section précédente
ca ca.crt
cert monvpn.crt
key monvpn.key # This file should be kept secret
dh dh1024.pem
- Adresse de l'interface de sortie du VPN
server 192.168.254.0 255.255.255.0
ifconfig-pool-persist ipp.txt
- Permet de faire passer tout le trafic du client à travers le VPN
push "redirect-gateway local"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log-append /var/log/openvpn.log
verb 3
J'ai mis des commentaires là où c'est important de comprendre. Les autres paramètres sont nécessaires, mais les garder intacts est une super bonne idée :)
Et après, il n'y a plus qu'à démarrer le VPN :
/etc/init.d/openvpn start
Normalement, cette commande est exécutée automatiquement lors du démarrage de la machine. Allez faire un tour dans /etc/default/openvpn
pour faire du démarrage sélectif de VPN.
Modification du pare-feu
C'est la partie la plus délicate. C'est celle qui m'a motivé à faire ce tutoriel :) Pour comprendre la suite, il faut comprendre le trajet d'un paquet arrivant par le VPN sur la passerelle :
- ath0 : un paquet arrive encapsulé et chiffré par le port 1194 en UDP
- Le processus OpenVPN, qui écoute sur le port et l'adresse lié à l'interface, reçoit ce paquet, le déchiffre et le renvoi au bon endroit. Comme le client envoie tous les paquets via l'adresse de l'interface créée par OpenVPN soit 192.168.254.1
- tun0 : reçoit donc le paquet en clair, et doit le transmettre à la bonne interface de sortie (car à part le ping, il n'y a rien à destination de cette interface).
- eth_adsl, eth_lan : selon la destination du paquet.
Sécurisation de l'interface ath0
Le but est déjà de verrouiller l'interface sans-fil pour ne laisser passer que deux flux :
- Le DHCP. Bah oui, on pourrait configurer les clients à la main, mais c'est quand même plus pratique d'avoir le DHCP qui s'occupe de ça. Et ce n'est pas bien dangereux d'avoir une IP si on ne peut rien faire avec. Pour les paranoïaques, j'imagine que cela pose un problème de sécurité, si jamais il y a des failles dans le serveur DHCP. Il faut savoir qu'en WPA, le chiffrement de la connexion se fait AVANT le DHCP, ce qui est mieux. C'est un inconvénient de cette solution. À vous de voir.
- Le tunnel OpenVPN. Normal.
Donc avec iptables, ça donne ça :
- ath0 : On accepte les paquets en UDP sur le port du VPN
iptables -t filter -A INPUT -i ath0 -p udp -m udp --dport 1194 -j ACCEPT
- ath0 : On accepte les paquets en UDP sur le port DHCP
iptables -t filter -A INPUT -i ath0 -p udp -m udp --dport 67 -j ACCEPT
- tun0 : Il faut bien que le VPN envoie et reçoive des paquets
iptables -t filter -A INPUT -i tun0 ACCEPT
- Ne tapez cette commande QUE si vous N'avez PAS d'autres règles déjà en place !
iptables -t filter -A INPUT -i "!ath0" ACCEPT
- Par défaut, on jette tous les paquets en entrée. La règle précédente vous permettra d'avoir encore accès
- à votre machine par le réseau câblé. Sinon, tout sera bloqué...
iptables -t filter -P INPUT DROP
- Les paquets ne doivent pas passer à travers une autre interface directement,
- mais doivent tous être délivré à OpenVPN.
- C'est très important !
iptables -t filter -A FORWARD -i ath0 DROP
- Maintenant, on fait la règle de NAT pour faire sortir les paquets déchiffré par OpenVPN sur Internet.
- Si on ne fait pas ça, seul les paquets à destination du réseau local arriveront à destination.
iptables -t nat -A POSTROUTING -s 192.168.254.1 -j MASQUERADE
Et comme moi, j'utilise ferm pour me simplifier la vie, voici le résumé dans une syntaxe lisible par ce logiciel :
- Activation du NAT (juste pour le VPN dans ce cas)
table nat {
chain POSTROUTING saddr 192.168.254.1 MASQUERADE;
}
table filter {
#Tout le trafic en sortie est autorisé
chain OUTPUT {
policy ACCEPT;
}
# On filtre tout ce qui arrive
chain INPUT {
policy DROP;
interface ath0 {
proto udp dport openvpn ACCEPT;
proto udp dport bootps ACCEPT;
}
interface tun0 ACCEPT;
# D'autres règles sont nécessaire pour que Internet marche.
interface eth_adsl {
# On accepte seulement les paquets qui reviennent
mod state state INVALID DROP;
mod state state (ESTABLISHED RELATED) ACCEPT;
}
}
# Interdiction de forwarder des paquets !
chain FORWARD interface ath0 {
DROP;
}
Bon à partir de là, vous pouvez respirer, il est normalement impossible de se connecter via l'interface ath0 sur votre réseau.
}
Préparation du client
Je ne dispose que d'un client sous Ubuntu, donc je ne détaillerai l'installation que pour ce système. Sachez que le client OpenVPN existe sous Windows, mais que la configuration se fait en éditant un fichier de configuration.
Ubuntu 8.10 avec NetworkManager
Il faut préalablement installer les deux paquets suivants :
apt-get install network-manager-openvpn openvpn
Ensuite, il suffit suivre les étapes suivantes :
- Cliquer sur l'icône du réseau, et sur "Connexions VPN" puis "Configurer le VPN"
- Cliquer sur "Ajouter"
- Paramètres
- Nom de la connexion : "Mon VPN"
- Passerelle : 192.168.1.254
- Authentification, Type : Certificat "TLS"
- Certificat de l'utilisateur : client.crt
- Certificat du CA : ca.crt
- Clé privée : client.key
- Private Key Password : le mot de passe utilisé pour la génération de la clé client
- Onglet Paramètres IPv4, cliquer sur le bouton "Routes..."
- Cocher la case "Ignorer les routes automatiquement obtenues", pour ignorer les routes obtenues avant la connexion VPN. Je sais, c'est pas clair du tout...
- Valider le tout
Ensuite, il suffit de se connecter au Wifi, et de lancer le VPN. C'est fait :)
Conclusion
Cette alternative à WPA n'est pas ultime. Normalement, WPA s'occupe de tout. Cependant, cela permet de fournir une solution lorsque le chipset ne supporte pas le WPA (ce qui se fait rare), ou bien que le pilote n'est pas assez mature pour être stable en production.
Copyright
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique 4.0 : https://creativecommons.org/licenses/by-sa/4.0/ |