Mise en place d’Open VPN en mode bridge

openvpn_0Dans cet article, nous allons voir comment monter un serveur VPN bridgé avec OpenVPN sur Debian 7.

Vous le savez surement déjà, Un VPN permet d’établir une liaison entre deux réseaux locaux via une technique de tunnellisation (encapsulation des données à transmettre de façon chiffrée).

VPN_site-to-site

Le VPN « bridge », plus complexe à mettre en place, à l’avantage d’interagir sur la couche 2 du modèle OSI. Pour simplifier, lorsque vous établissez une connection VPN, c’est comme si vous vous branchez directement sur un switch du réseau distant.

Installation OpenVPN

Nous installons les paquets :

aptitude install openvpn openssl libssl-dev liblzo2-2 liblzo2-dev

Création certificat/clé

OpenVPN propose des scripts pour la création des certificats. Dans un premier temps, nous modifions les variables du script :
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
nano vars

On modifie les variables suivantes se trouvant à la fin du fichier:

# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=2048
[...]
export KEY_COUNTRY=FR
export KEY_PROVINCe=LORRAINE
export KEY_CITY=Metz
export KEY_ORG="MonEntreprise"
export KEY_EMAIL="contact@monentreprise.fr"

On donne les droits au fichier, on initialise les variables pour le script :
chmod +x vars
source ./vars

On créer le fichier index.txt et on ajoute le paramètre 1 au fichier serial
mkdir keys && touch keys/index.txt
echo 1 > keys/serial

A présent, nous pouvons utiliser les scripts :

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
./clean-all
./build-dh

Il faut renseigner le common name, j’ai personnellement mis le hostname de mon serveur :
./build-ca
« ROUTEUR » correspond au hostname de mon serveur, le common name doit être identique
./build-key-server ROUTEUR
« powtos » est le nom du client, le common name doit être identique
./build-key powtos

On copie les clés générées vers /etc/openvpn :
cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys /etc/openvpn

Création utilisateur OpenVPN

En cas d’intrusion sur le serveur par l’intermédiaire du VPN ,il est important que le processus d’OpenVPN fonctionne sur un utilisateur n’ayant aucun droit sur le système.
groupadd openvpn
useradd -d /dev/null -g openvpn -s /bin/false openvpn
chown openvpn:openvpn -R /etc/openvpn/

Configuration OpenVPN

On créer le fichier qui recevra les logs OpenVPN :
cd /var/log
mkdir openvpn
touch server.log

Nous créons à présent le fichier de configuration d’OpenVPN
nano /etc/openvpn/server.conf

# Local ip_machine
local 192.168.10.254
# Le port utilisé
port 1194
# TCP or UDP
proto tcp
# Interface réseau à monter (tap0 car bridgé)
dev tap0
# Certificat auto-signé de notre autorité de certification
ca keys/ca.crt
# Certificat serveur
cert keys/ROUTEUR.crt
# Clé serveur
key keys/ROUTEUR.key
# Paramètres cryptage
dh keys/dh2048.pem
ifconfig-pool-persist ipp.txt
# DHCP VPN
# server-bridge [@serveur] [mask] [@pool_début @pool_fin]
server-bridge 192.168.10.254 255.255.255.0 192.168.10.100 192.168.10.120
# Route pour atteindre le réseau local
# push "route @réseau mask"
push "route 192.168.10.0 255.255.255.0"
#Bypasse DHCP local
push "redirect-gateway def1 bypass-dhcp"
#DNS ( online.net dans mon cas)
push "dhcp-option DNS 62.210.16.6"
# Pour que les clients puissent se voir entre eux
client-to-client
# Ping toutes les 10 secondes, si pas de réponse au bout de 120 secondes, le tunnel est coupé
keepalive 10 120
# Compression pour accélérer le trafic
comp-lzo
#
persist-key
persist-tun
## Chemin du fichier de log
log-append /var/log/openvpn/server.log
# Niveau détail log de 0 à 9
verb 5

Création du pont

A présent, nous allons créer un script qui permet de créer notre interface Br0 ( bridge), cette interface permet de faire un pont entre eth1 ( local) et tap0 (VPN).
aptitude install bridge-utils
nano /etc/init.d/bridge-start

#!/bin/bash
# On créer un tunnel persistant en mode TAP.
openvpn --mktun --dev tap0
# On créer une nouvelle interface de type "bridge".
brctl addbr br0
# On ajoute l'interface du réseau DMZ et l'interface virtuelle TAP dans le bridge.
brctl addif br0 tap0
brctl addif br0 eth1
# On configure les interfaces en mode promiscuous (elles écoutent tout,
# mais n'ont pas d'adresses IP)
ifconfig eth1 0.0.0.0 promisc up
ifconfig tap0 0.0.0.0 promisc up
# On configure l'IP de l'interface "bridge" avec l'ancienne adresse de eth1.
ifconfig br0 192.168.10.254 netmask 255.255.255.0 broadcast 192.168.10.255
# On remet la passerelle par défaut, qui a été effacée
# lors de la création du bridge.
route add default gw 192.168.10.254 eth1
# On ajoute les routes pour atteindre les réseaux de la zone local.
route add -net 192.168.10.0 netmask 255.255.255.0

On créer ensuite le script bridge-stop :

#!/bin/bash
 ifconfig br0 down
 brctl delbr br0
 ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 up
 ifconfig eth1 192.168.10.254 netmask 255.255.255.0 broadcast 192.168.10.255 up

On donne les droits au script:
chmod +x /etc/init.d/bridge-start
chmod +x /etc/init.d/bridge-stop

Iptables

Il reste notre IPtable à configurer pour accepter les requêtes du VPN. Pour cela, on réutilisera le script firewall.sh créé précédemment.
nano /etc/init.d/firewall.sh

############## VPN ###########
 # Ouvrir port OpenVPN
 iptables -A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT
 # Autoriser NAT sur port OpenVPN
 iptables -t nat -I PREROUTING -p tcp -d 212.129.**.** --dport 1194 -j DNAT --to 192.168.10.254
 iptables -I FORWARD -p tcp -d 192.168.10.254 --dport 1194
 # Now set up the Linux firewall to permit packets to flow freely over the newly created tap0 and br0 interfaces
 iptables -A INPUT -i tap0 -j ACCEPT
 iptables -A INPUT -i br0 -j ACCEPT
 iptables -A FORWARD -i br0 -j ACCEPT

Démarrer OpenVPN

On exécute le script firewall.sh, bridge-start et OpenVPN :

/etc/init.d/firewall.sh
/etc/init.d/bridge-start
/etc/init.d/openvpn restart

ESXI

Si comme moi votre serveur VPN est une VM hébergé par ESXI, il faut activer le mode promiscious.

dans l’onglet mise en réseau :

VPN-ESXI

La configuration du VPN est à présent terminée, notre serveur VPN est fonctionnel, nous pouvons à présent  configurer le client.

Bookmarquez le permalien.
  • Fighter

    il manque pas mal d’info, si je comprend bien, notre réseau de base c’est 192.168.10.0 et le réseau vpn est sur la même adresse ? Oo

    et coté client, seul le client pourra voir toutes les machines du réseau A, le réseau B ne les verra pas sauf si elles sont connectés sur le vpn avec le client-to-client

    enfin c’est pas clair ou alors ça représente pas le schéma indiqué

  • powtos

    Salut,

    Le réseau à atteindre ou est installé le VPN est bien en 192.168.10.0 /24 ( tu peux mettre ce que tu veux). Bien évidemment, il faudra être sur une plage différente pour pouvoir atteindre ce réseau local..

    Une fois connecté au VPN bridge, tu as accès aux machine du réseau A ET B, sauf si t’as une plage commune entre les deux réseaux..