Openvpn

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Serveur
Protocole udp
Port 1194
Configuration Iptables iptables -I INPUT 2 -p udp --dport 1194 -j ACCEPT

Préparation

Dans un premier temps, il faudra avoir une connexion à Internet, utiliser un serveur DNS et désactiver SELinux.

Pour ceux qui auraient manqué des étapes, les voici:

Assurez-vous d'avoir installé le dépôt EPEL car OpenVPN vient de cette source.

Une fois ces étapes effectuées, entrons dans le vif du sujet !

Use case 1 : client - serveur en mode tunnel (unidirectionnel) - Avec le script (pour CentOS 8 et plus)

Partie serveur

Téléchargez le script directement depuis GitHub:

# curl https://raw.githubusercontent.com/Angristan/openvpn-install/master/openvpn-install.sh > openvpn-install.sh

Passons le bit d’exécution à 1:

# chmod +x openvpn-install.sh

Lancez le script:

# ./openvpn-install.sh

Une fois le script démarré, il faut répondre à quelques questions. La première est l'adresse IP d'écoute d'Openvpn. Il faut indiquer l'interface par laquelle les clients VPN vont se connecter:

I need to know the IPv4 address of the network interface you want OpenVPN listening to.
Unless your server is behind NAT, it should be your public IPv4 address.
IP address: 192.168.100.130

La deuxième est l'adresse IP publique. Ici, vous avez deux choix, soit:

    • vous indiquez l'IP publique de votre routeur (calculée automatiquement par le script) et vous faites du PAT sur votre routeur (habituellement UDP:1194)
    • vous indiquez l'IP privée de la question précédente si c'est pour une connexion dans un LAN (comme dans cette exemple)
It seems this server is behind NAT. What is its public IPv4 address or hostname?
We need it for the clients to connect to the server.
Public IPv4 address or hostname: 192.168.100.130

Ensuite le script vous propose de faire du NAT IPv6. Cela dépend de votre IP (v4 ou v6):

Do you want to enable IPv6 support (NAT)? [y/n]: n

Le script vous demande ensuite sur quel port vous voulez que le serveur Openvpn écoute. Vous pouvez laisser le choix par défaut:

What port do you want OpenVPN to listen to?
   1) Default: 1194
   2) Custom
   3) Random [49152-65535]
Port choice [1-3]: 1

Ensuite vient le choix du protocole. La encore, le choix par défaut UDP est très bien:

What protocol do you want OpenVPN to use?
UDP is faster. Unless it is not available, you shouldn't use TCP.
   1) UDP
   2) TCP
Protocol [1-2]: 1

Le script propose plusieurs choix pour le serveur DNS utilisé par le client. Si vous configurez ce VPN dans le cadre d'un entreprise, privilégiez les serveurs DNS internes, si c'est pour un usage personnel, vous pouvez utiliser les serveurs de Google ou autres:

What DNS resolvers do you want to use with the VPN?
   1) Current system resolvers (from /etc/resolv.conf)
   2) Self-hosted DNS Resolver (Unbound)
   3) Cloudflare (Anycast: worldwide)
   4) Quad9 (Anycast: worldwide)
   5) Quad9 uncensored (Anycast: worldwide)
   6) FDN (France)
   7) DNS.WATCH (Germany)
   8) OpenDNS (Anycast: worldwide)
   9) Google (Anycast: worldwide)
   10) Yandex Basic (Russia)
   11) AdGuard DNS (Anycast: worldwide)
   12) NextDNS (Anycast: worldwide)
   13) Custom
DNS [1-12]: 9

Vous pouvez activer la compression ou non. Il est recommandé de ne pas le faire puisque l'attaque VORACLE exploite des vulnérabilités liées au algorithme de compression:

Do you want to use compression? It is not recommended since the VORACLE attack make use of it.
Enable compression? [y/n]: n

Pour le choix du chiffrement utilisé, laissez tout par défaut:

Do you want to customize encryption settings?
Unless you know what you're doing, you should stick with the default parameters provided by the script.
Note that whatever you choose, all the choices presented in the script are safe. (Unlike OpenVPN's defaults)
See https://github.com/angristan/openvpn-install#security-and-encryption to learn more.

Customize encryption settings? [y/n]: n

Le script vous prévient que tout est terminé est qu'il va procéder à l'installation:

Okay, that was all I needed. We are ready to setup your OpenVPN server now.
You will be able to generate a client at the end of the installation.
Press any key to continue...

Partie cliente

Après l'installation du serveur, le script vous propose de créer un fichier de configuration pour un client. Indiquez le nom du client et validez:

Tell me a name for the client.
The name must consist of alphanumeric character. It may also include an underscore or a dash.
Client name: tala

On vous propose ensuite de protéger le fichier par un mot de passe, faites comme vous voulez:

Do you want to protect the configuration file with a password?
(e.g. encrypt the private key with a password)
   1) Add a passwordless client
   2) Use a password for the client
Select an option [1-2]: 1

Et voila, le fichier client portant l'extension ovpn et dans le répertoire du script !

Use case 1 : client - serveur en mode tunnel (unidirectionnel) - Manuellement (jusqu'à CentOS 7)

Dans ce cas d'utilisation (use case), nous allons utiliser un serveur CentOS et un client Seven. Le client, situé sur Internet, pourra accéder aux services de l'entreprise comme s'il était physiquement connecté au LAN.

C'est le use case le plus commun comme, par exemple, des commerciaux qui veulent accéder à leur PGI (Progiciel de Gestion Intégré) alors qu'ils sont à l'autre bout du monde.

Serveur-client-vpn.png

Partie serveur

Installation

Premièrement, installons les packages nécessaires.

  • Pour CentOS 6, il suffit d'installer les packages de base:
# yum -y install openvpn easy-rsa
  • Pour CentOS 7, il faut télécharger la version 2 de easy-rsa, qui contient tous les scripts de création de certificats:
# yum -y install openvpn
# curl -k https://www.tala-informatique.fr/wiki/images/1/1b/Easy-rsa_2.0.tar.gz -o easy-rsa_2.0.tar.gz
# mkdir -p /etc/openvpn/easy-rsa
# tar -zxf easy-rsa_2.0.tar.gz -C /etc/openvpn/easy-rsa

OpenVPN est livré avec un fichier de configuration exemple que nous allons copier dans le bon répertoire:

# cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

Configuration

Éditons le fichier maintenant qu'il est au bon endroit:

  • Sur CentOS 6:
# vi /etc/openvpn/server.conf
  • Sur CentOS 7
#vi /etc/openvpn/server/server.conf
  • CentOS 6:

Nous allons dé-commenter la ligne suivante qui permet de router le trafic qui vient du client à travers le tunnel VPN:

push "redirect-gateway def1 bypass-dhcp"
  • CentOS 7 :

Nous allons ajouter les lignes suivantes:

push "redirect-gateway autolocal def1"
push "redirect-gateway def1"

La ligne suivante doit être décommentée car elle permet de préciser quel serveur DNS le client doit utiliser. Si vous avez un serveur DNS sur votre réseau, mettez son IP ici, sinon utilisez le serveur de Google:

push "dhcp-option DNS 8.8.8.8"

Les lignes suivantes doivent être décommenteés pour signifier à OpenVPN d'utiliser l'utilisateur et le group nobody. Cela permet d'augmenter la sécurité.

user nobody
group nobody

Pour résumer:

CentOS6 CentOS 7
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
log openvpn.log
status openvpn-status.log
verb 3
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway autolocal def1"
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 3
explicit-exit-notify 1

Création des clés

Mise en place

Le serveur utilise un certificat pour monter un tunnel SSL avec le client. Cela nécessite une autorité de certification, pour délivrer des certificats, une paire certificat/clé pour le serveur et une paire certificat/clé pour le client.

Nous allons utiliser une librairie qui nous permet de créer tous les fichiers dont nous allons avoir besoin: easy-rsa.

Tout d'abord, créons un dossier pour stocker tous ces fichiers:

# mkdir -p /etc/openvpn/easy-rsa/keys

Copions les fichiers nécessaires (à faire uniquement sur CentOS 6) :

# cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

Informations du certificat

Nous allons inscrire les informations du certificat dans le fichier /etc/openvpn/easy-rsa/vars pour ne pas avoir à les saisir à chaque fois:

export KEY_COUNTRY="FR"
export KEY_PROVINCE="Herault"
export KEY_CITY="Juvignac"
export KEY_ORG="Tala Informatique"
export KEY_EMAIL="root@tala.informatique.fr"
export KEY_OU="Informatique"

Création de l'autorité de certification

# cd /etc/openvpn/easy-rsa
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key
...................................................+++
...................................................................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Herault]:
Locality Name (eg, city) [Juvignac]:
Organization Name (eg, company) [Tala Informatique]:
Organizational Unit Name (eg, section) [Informatique]:
Common Name (eg, your name or your server's hostname) [Tala Informatique CA]:
Name [EasyRSA]:
Email Address [root@tala.informatique.fr]:

Génération du certificat serveur

Pour le serveur, ne pas mettre de mot de passe lorsque l'on vous pose la question.

# ./build-key-server server
Generating a 2048 bit RSA private key
.............+++
.........+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Herault]:
Locality Name (eg, city) [Juvignac]:
Organization Name (eg, company) [Tala Informatique]:
Organizational Unit Name (eg, section) [Informatique]:
Common Name (eg, your name or your server's hostname) [server]:
Name [EasyRSA]:
Email Address [root@tala.informatique.fr]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'Herault'
localityName          :PRINTABLE:'Juvignac'
organizationName      :PRINTABLE:'Tala Informatique'
organizationalUnitName:PRINTABLE:'Informatique'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'root@tala.informatique.fr'
Certificate is to be certified until Oct 14 17:16:17 2025 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Nous allons également avoir besoin de clés Diffie Hellman pour procéder à la vérification des certificats de manière sécurisée. Pour les générer, nous allons utiliser le script build-dh et copier tous les fichiers dans /etc/openvpn:

# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...

# cd /etc/openvpn/easy-rsa/keys
# cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

Démarrage et enregistrement du serveur

  • CentOS 6:
# service openvpn start
# chkconfig openvpn on
  • CentOS 7:
# systemctl start openvpn@server
# systemctl enable openvpn@server

Activation du routage

Il faut activer le routage, comme on le ferait sur un pare-feu, pour que les clients qui sont sur le sous-réseau du VPN puissent accéder au réseau sur lequel se trouve la passerelle OpenVPN.

Tout d'abord paramétrons le pare-feu pour faire du NAT:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -F FORWARD
# service iptables save

Enfin, activons le routage dans le fichier /etc/sysctl.conf:

net.ipv4.ip_forward = 1

Rechargeons les paramètres du noyau:

# sysctl -p

Partie cliente

Installation du client

Premièrement, installez le client OpenVPN sur la machine Windows, Mac ou Linux en récupérant l’exécutable ici : https://openvpn.net/index.php/open-source/downloads.html

Génération du certificat client

Comme pour la partie serveur, la première étape est la génération des clés.

Cela se fait sur le serveur OpenVPN:

# cd /etc/openvpn/easy-rsa
# ./build-key client
Generating a 2048 bit RSA private key
...........+++
............+++
writing new private key to 'client.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Herault]:
Locality Name (eg, city) [Juvignac]:
Organization Name (eg, company) [Tala Informatique]:
Organizational Unit Name (eg, section) [Informatique]:
Common Name (eg, your name or your server's hostname) [client]:
Name [EasyRSA]:
Email Address [root@tala.informatique.fr]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'Herault'
localityName          :PRINTABLE:'Juvignac'
organizationName      :PRINTABLE:'Tala Informatique'
organizationalUnitName:PRINTABLE:'Informatique'
commonName            :PRINTABLE:'client'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'root@tala.informatique.fr'
Certificate is to be certified until Oct 14 17:22:18 2025 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Récupération des fichiers

Il va falloir maintenant récupérer les trois fichiers suivants:

  • ca.crt
  • client.crt
  • client.key

Ils se trouvent dans le répertoire /etc/openvpn/easy-rsa/keys du serveur.

Fichier de configuration

Il faut créer le fichier de configuration, client.ovpn, qui va nous permettre de nous connecter au serveur dont voici le contenu:

client
dev tun
proto udp
remote !!!adresse IP du serveur OpenVPN!!! 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
remote-cert-tls server
<ca>
!!!! Contenu du fichier ca.crt !!!!
</ca>
<cert>
!!!! Contenu du fichier client.crt !!!!
</cert>
<key>
!!!! Contenu du fichier client.key!!!!
</key>

Adaptez:

  • l'adresse IP du serveur OpenVPN;
  • les contenus des fichiers commencent par le mot BEGIN et se terminent par le mot END

Mise en place

Dans cet exemple, nous allons utiliser un client Windows Seven. Il faut copier le fichier précédent dans le répertoire C:\Program Files\OpenVPN\config, puis démarrer la connexion:

Start ovpn client connexion.png

Une fois la connexion montée, le message suivant devrait apparaître:

Ovpn client connexion ok.png

Use case 2 : client - serveur bidirectionnel

Dans ce cas d'utilisation, nous allons utiliser un serveur CentOS et un client Seven. Le client, situé sur Internet, pourra accéder aux services de l'entreprise comme s'il était physiquement connecté au LAN. La différence avec le mode tunnel, c'est que le client est dans le même sous-réseau que le serveur OpenVPN et non sur un réseau virtuel interne.

Partie serveur

Les parties suivantes sont identiques au mode tunnel:

La partie activation du routage n'est plus utile puisque le client termine l'extrémité de tunnel dans le même sous-réseau que le serveur OpenVPN.

Création du pont

Voyons maintenant ce qui change. L'adaptateur tap0 va servir d’extrémité de tunnel et sera ponté (bridge) avec l'adaptateur eth0. Ce mécanisme, détaillé ici, va rassembler les deux interfaces précédentes sous une troisième interface nommée br0.

On va donc créer les trois interfaces comme suit :

DEVICE=br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.1.200
NETMASK=255.255.255.0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
BRIDGE=br0
DEVICE=tap0
TYPE=tap
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
BRIDGE=br0

Fichier ifcfg-br0

Fichier ifcfg-eth0

Fichier ifcfg-tap0

Pour que la configuration automatique de tap0 se fasse, il faut installer le paquetage tunctl :

#yum -y install tunctl
Warning manual.jpg

Dans cet exemple, le sous-réseau de destination est 192.168.1.0/24, ce qui force le client à ne pas se trouver dans le même sous-réseau lors de l'établissement du tunnel.

Si c'est le cas, le client aura deux adaptateurs dans le même sous-réseau ce qui posera des problèmes de routage évident...

On redémarre la partie réseau :

# service network restart

On peut utiliser les commandes habituelle pour s'assurer du bon fonctionnement des interfaces réseaux :

# brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29d7745a       no              eth0
                                                        tap0

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:d7:74:5a brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:fed7:745a/64 scope link
       valid_lft forever preferred_lft forever
3: tap0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/ether 5e:52:54:72:ab:6d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5c52:54ff:fe72:ab6d/64 scope link
       valid_lft forever preferred_lft forever
10: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:0c:29:d7:74:5a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.200/24 brd 192.168.50.255 scope global br0
    inet6 fe80::20c:29ff:fed7:745a/64 scope link
       valid_lft forever preferred_lft forever

Configuration

Éditons le fichier de configuration du serveur :

# vi /etc/openvpn/server.conf

Le fichier doit contenir les lignes suivantes :

; Partie sur le tunnel
port 1194
proto udp
dev tap0

; Partie sur les clés / certificats
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem

server-bridge 192.168.50.253 255.255.255.0 192.168.50.50 192.168.50.60

; Partie sur la sécurité
user nobody
group nobody
keepalive 10 120
cipher AES-256-CBC
comp-lzo
persist-key

; Partie sur les logs
status openvpn-status.log
log openvpn.log
verb 5

On termine par le démarrage du serveur et son enregistrement dans le chargeur de démarrage.

Partie cliente

Les parties suivantes sont identiques au mode tunnel:

Fichier de configuration

Il faut créer le fichier de configuration, client.ovpn, qui va nous permettre de nous connecter au serveur dont voici le contenu:

client
dev tap0
proto udp
remote !!!adresse IP du serveur OpenVPN!!! 1194

cipher AES-256-CBC
resolv-retry infinite
nobind
persist-key
comp-lzo

verb 3
<ca>
!!!! Contenu du fichier ca.crt !!!!
</ca>
<cert>
!!!! Contenu du fichier client.crt !!!!
</cert>
<key>
!!!! Contenu du fichier client.key!!!!
</key>

Adaptez:

  • l'adresse IP du serveur OpenVPN;
  • les contenus des fichiers commencent par le mot BEGIN et se terminent par le mot END

Use case 3 : passerelle site-to-site unidirectionnel

Dans ce cas de figure, nous avons un ou plusieurs sites secondaires qui ont besoin d'accéder aux ressources disponibles sur un site principal.

C'est le cas d'utilisation de tous les magasins franchisés ou grandes enseignes. Leurs stocks, informations de paiement, etc... remontent à Paris, au niveau de la maison mère.

Dans ce cas précis, nous allons minimiser l'impact de la mise en place du tunnel VPN sur le réseau existant. C'est souvent l'attitude à adopter quand on est prestataire externe et qu'il faut intégrer un nouveau service dans une architecture réseau existante et non maîtrisée.

Nous allons placer un client OpenVPN dans la DMZ publique pour ne pas intervenir sur le routeur déjà en place, excepté pour ajouter une règle de routage.

Site-to-site-uni-vpn.png

Partie serveur

Suivez exactement les mêmes instructions que dans le use case 1.

Redirection du trafic vers la passerelle

N'oubliez pas de mettre une règle Iptables sur le pare-feu pour rediriger le trafic UDP 1194 :

# iptables -t nat -A PREROUTING -i eth0 -p udp --dport 1194 -j DNAT --to 192.168.1.200

Partie cliente

Dans ce use case nous allons utiliser un CentOS comme client OpenVPN.

Installation

# yum -y install openvpn

Configuration

Dans ce use case, on peut reprendre la même configuration que pour la partie précédente

Renommez le fichier client.ovpn en client.conf et placez-le dans le répertoire /etc/openvpn.

Démarrage

Pour démarrer notre client OpenVPN nous allons utiliser la commande suivante :

  • CentOS 6:
# service openvpn start
  • CentOS 7:
# systemctl start openvpn@client
# systemctl enable openvpn@client

Le tunnel est maintenant monté, il ne reste plus qu'à informer le routeur des réseaux qui se trouvent derrière le client OpenVPN.

Configuration du routage

Sur le routeur/pare-feu de sortie, il nous faut ajouter une règle de routage pour rediriger correctement le trafic à l'intérieur du tunnel VPN.

Nous allons partir du postulat suivant:

  • le réseau derrière le tunnel est 192.168.50.0/24;
  • l'adresse IP du client OpenVPN est 192.168.1.200/24;
  • l'interface réseau du pare-feu connecté à la DMZ publique est eth1 ou FastEthernet0/1.

Sur CentOS

Avec la commande ip:

# ip route add 192.168.50.0/24 via 192.168.1.200

Pour rendre ce paramètre persistant, il faut créer le fichier /etc/sysconfig/network-scripts/route-eth1:

192.168.50.0/24 via 192.168.30.1 dev eth1

Sur Cisco

Vous pouvez trouver plus d'informations ici :

(config) ip route 192.168.50.0 255.255.255.0 192.168.1.200

Camouflage des réseaux du site secondaire

Les réseaux présents sur le site secondaire ne sont pas connus du serveur OpenVPN, il faut donc les camoufler:

# iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Use case 3 : routeur de sortie site-to-site unidirectionnel

Dans ce use case, nous avons la main sur le routeur de sortie et nous allons le configurer pour y déployer le client OpenVPN.

Site-to-site-router-uni-vpn.png

Partie serveur

Suivez exactement les mêmes instructions que dans le use case 1.

La seule différence et que nous allons désactiver la fonction de passerelle par défaut du serveur OpenVPN. En effet, si vous avez bien remarqué, dès que le tunnel est monté, tout le trafic qui sort du client OpenVPN passe forcement par le tunnel et sort donc au niveau du site principal... Ce qui risque de ne pas être très optimisé pour le trafic Internet issu du site secondaire.

Pour réaliser cela, nous allons laisser la ligne suivante commentée:

push "redirect-gateway def1 bypass-dhcp"

Cependant, il faut annoncer les réseaux qui se trouvent derrière le serveur OpenVPN, pour que le trafic soit routé correctement:

push "route 192.168.1.0 255.255.255.0"
push "route 192.168.2.0 255.255.255.0"
push "route 192.168.3.0 255.255.255.0"

Dans ce cas, nous annonçons les réseaux 192.168.1.0/24, 192.168.2.0/24 et 192.168.3.0/24 derrière le serveur OpenVPN. J'attire votre attention sur le fait que ces réseaux ne doivent pas être utilisés sur le site secondaire. Sinon, dès que le tunnel sera monté, le trafic sera redirigé vers le site principal.

Cela donne le fichier server.conf suivant:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.1.0 255.255.255.0"
push "route 192.168.2.0 255.255.255.0"
push "route 192.168.3.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
log openvpn.log
status openvpn-status.log
verb 3

Partie cliente

Nous allons suivre les mêmes instructions que pour la partie passerelle.

Use case 4 : site-to-site bidirectionnel

Rien de plus simple, pour avoir une communication bidirectionnelle, il suffit de répéter les étapes des parties serveur et client sur les deux machines OpenVPN.

Vous aurez donc deux fichiers de configuration dans le répertoire /etc/openvpn: client.conf et server.conf.

Les logs

On peut voir dans les logs les connexions des clients:

Sun Oct 18 20:27:01 2015 192.168.100.129:49196 [client] Peer Connection Initiated with [AF_INET]192.168.100.129:49196

Liste de révocation

Configuration du serveur

La liste de révocation permet d'invalider les certificats qui ne sont plus autorisés à se connecter au serveur VPN.

Pour cela, il faut tout d'abord ajouter la ligne suivante à la fin du fichier /etc/openvpn/server.conf :

crl-verify /etc/openvpn/easy-rsa/keys/crl.pem

Révocation

Pour révoquer un certificat il faut utiliser le script suivant qui se trouve dans le répertoire /etc/openvpn/easy-rsa :

# cd /etc/openvpn/easy-rsa
# ./revoke-full client-a-revoquer

Remplacez juste client-a-revoquer par le nom du client à révoquer pour que :

  • la ligne correspondante dans /etc/openvpn/easy-rsa/keys/index.txt débute pas un R (REVOKE);

Ci-dessous un extrait du fichier index.txt avec un premier certificat révoqué (R) et un deuxième valide (V)

# cat keys/index.txt
R       251220225949Z   151223230021Z   0A      unknown /C=FR/ST=Herault/L=Juvignac/O=Tala Informatique/OU=Informatique/CN=tomasini/name=EasyRSA/emailAddress=root@tala.informatique.fr
V       251221042518Z           0C      unknown /C=FR/ST=Herault/L=Juvignac/O=Tala Informatique/OU=Informatique/CN=jcf/name=EasyRSA/emailAddress=root@tala.informatique.fr
  • le fichier /etc/openvpn/easy-rsa/keys/crl.pem soit généré avec les informations de révoquation.

Pour le lire utilisez la commande suivante:

# openssl crl -in keys/crl.pem -text
Certificate Revocation List (CRL):
        Version 1 (0x0)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: /C=FR/ST=Herault/L=Juvignac/O=Tala Informatique/OU=Informatique/CN=Tala Informatique CA/name=EasyRSA/emailAddress=root@tala.informatique.fr
        Last Update: Dec 23 23:13:54 2015 GMT
        Next Update: Jan 22 23:13:54 2016 GMT
Revoked Certificates:
    Serial Number: 0A
        Revocation Date: Dec 23 23:00:21 2015 GMT
    Serial Number: 0B
        Revocation Date: Dec 23 23:02:54 2015 GMT
    Signature Algorithm: sha256WithRSAEncryption
         9f:02:36:c6:a1:85:7f:1c:9a:b2:19:36:ad:8b:c1:4a:d1:5a:
         96:32:91:f3:19:06:99:d4:88:d7:98:3a:fd:7c:b9:cd:e2:97:
         da:e1:26:42:df:e2:a7:d0:fd:cd:be:40:ba:32:22:5a:6a:c6:
         96:28:61:af:40:f2:65:47:54:36:6c:50:4d:f4:79:21:a8:80:
         58:6c:20:60:bd:d1:d7:83:70:53:84:0f:f7:8b:21:5d:0b:a7:
         56:e6:73:60:96:7c:b4:d4:08:54:0d:08:33:db:0a:e5:85:a1:
         f8:05:fb:2a:11:ed:e4:ac:d2:5b:4c:e0:a0:5a:df:77:bc:22:
         a4:9b:79:e2:9b:1a:05:c9:ad:73:5d:05:6c:f9:71:fc:62:dc:
         2b:b3:11:31:c8:b0:64:30:f1:93:b9:8d:f8:f2:06:d0:06:78:
         2d:c8:0d:90:c4:a1:c9:22:a6:85:68:a7:18:95:35:92:35:f1:
         ca:32:35:fb:bd:dc:aa:bd:e2:41:09:14:a1:f0:39:7f:1b:de:
         92:89:a4:33:73:4f:36:2a:90:a7:18:b6:f5:db:b6:e3:f5:0d:
         35:e7:38:07:87:0a:71:db:de:c9:c1:19:9d:fd:b6:e1:b1:03:
         15:ee:24:be:bd:e3:06:aa:bb:ac:d5:d6:cc:af:50:4e:78:53:
         a9:ba:4f:9c
-----BEGIN X509 CRL-----
MIICMjCCARowDQYJKoZIhvcNAQELBQAwgcAxCzAJBgNVBAYTAkZSMRAwDgYDVQQI
EwdIZXJhdWx0MREwDwYDVQQHEwhKdXZpZ25hYzEaMBgGA1UEChMRVGFsYSBJbmZv
cm1hdGlxdWUxFTATBgNVBAsTDEluZm9ybWF0aXF1ZTEdMBsGA1UEAxMUVGFsYSBJ
bmZvcm1hdGlxdWUgQ0ExEDAOBgNVBCkTB0Vhc3lSU0ExKDAmBgkqhkiG9w0BCQEW
GXJvb3RAdGFsYS5pbmZvcm1hdGlxdWUuZnIXDTE1MTIyMzIzMTM1NFoXDTE2MDEy
MjIzMTM1NFowKDASAgEKFw0xNTEyMjMyMzAwMjFaMBICAQsXDTE1MTIyMzIzMDI1
NFowDQYJKoZIhvcNAQELBQADggEBAJ8CNsahhX8cmrIZNq2LwUrRWpYykfMZBpnU
iNeYOv18uc3il9rhJkLf4qfQ/c2+QLoyIlpqxpYoYa9A8mVHVDZsUE30eSGogFhs
IGC90deDcFOED/eLIV0Lp1bmc2CWfLTUCFQNCDPbCuWFofgF+yoR7eSs0ltM4KBa
33e8IqSbeeKbGgXJrXNdBWz5cfxi3CuzETHIsGQw8ZO5jfjyBtAGeC3IDZDEocki
poVopxiVNZI18coyNfu93Kq94kEJFKHwOX8b3pKJpDNzTzYqkKcYtvXbtuP1DTXn
OAeHCnHb3snBGZ39tuGxAxXuJL694waqu6zV1syvUE54U6m6T5w=
-----END X509 CRL-----

Finalisation

N'oublions pas de redémarrer le serveur pour prendre en compte tous ces paramètres:

  • CentOS 6:
# service openvpn restart
  • CentOS 7:
# systemctl restart openvpn@server

Au niveau du client, quand on veut se connecter avec le certificat révoqué on obtient cette ligne :

Thu Dec 24 18:57:46 2015 TLS_ERROR: BIO read tls_read_plaintext error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Un joli : certificate verify failed