OpenVPN

De Banane Atomic
Aller à la navigationAller à la recherche
La version imprimable n’est plus prise en charge et peut comporter des erreurs de génération. Veuillez mettre à jour les signets de votre navigateur et utiliser à la place la fonction d’impression par défaut de celui-ci.

Installation

Bash.svg
# le paquet openvpn contient le client et le serveur
pacman -S openvpn easy-rsa

Génération des certificats

Certificate Authority (CA)

Pour plus de sécurité, il est recommandé que la machine CA soit différente du serveur.
Ce sera la machine qui permettra la génération de certificat, elle n'a pas besoin d'être allumée en permanence.

Bash.svg
cd /etc/easy-rsa
export EASYRSA=$(pwd)
export EASYRSA_VARS_FILE=/etc/easy-rsa/vars

# (ré)initialise le dossier /etc/easy-rsa/pki
easyrsa init-pki

# créé le fichier /etc/easy-rsa/pki/ca.crt
# demande CA KEy Passphrase et Common Name (server name)
easyrsa build-ca
# les fichiers suivant sont aussi créé
# /etc/easy-rsa/pki/index.txt
# /etc/easy-rsa/pki/private/ca.key
# /etc/easy-rsa/pki/serial
/etc/easy-rsa/vars
# The default crypto mode is rsa; ec can enable elliptic curve support.
set_var EASYRSA_ALGO		ec
set_var EASYRSA_CURVE		secp521r1

# Cryptographic digest to use
set_var EASYRSA_DIGEST		"sha512"

Can't load /usr/share/easy-rsa/pki/.rnd into RNG

Bash.svg
dd if=/dev/urandom of=pki/.rnd bs=256 count=1

Serveur

Bash.svg
# sur le server: copier le fichier ca.crt dans /etc/openvpn/server/
cp /etc/easy-rsa/pki/ca.crt /etc/openvpn/server/

# sur le server:
cd /etc/easy-rsa

easyrsa init-pki

# créé les fichiers request et clé
# /etc/easy-rsa/pki/reqs/servername.req
# /etc/easy-rsa/pki/private/servername.key
easyrsa gen-req servername nopass

# copier la clé dans /etc/openvpn/server/
cp /etc/easy-rsa/pki/private/servername.key /etc/openvpn/server/

# créé le fichier de paramètres Diffie-Hellman (only if you are using TLS without elliptic curves)
openssl dhparam -out /etc/openvpn/server/dh.pem 2048

# créé la clé HMAC
openvpn --genkey --secret /etc/openvpn/server/ta.key

# sur la machine CA, signer la request
cd /etc/easy-rsa

# créé le fichier /etc/easy-rsa/pki/issued/servername.crt
easyrsa sign-req server servername

# sur le serveur, déplacer le fichier servername.crt 
mv /etc/easy-rsa/pki/issued/servername.crt /etc/openvpn/server/

Client

Bash.svg
# depuis n'importe quelle machine: serveur, client ou autre
cd /etc/easy-rsa
# (ré)initialise le dossier /etc/easy-rsa/pki si besoin
easyrsa init-pki
# créé les fichiers request et clé
# /etc/easy-rsa/pki/reqs/client1.req
# /etc/easy-rsa/pki/private/client1.key 
easyrsa gen-req client1 nopass

# cas où la machine CA est aussi le serveur VPN
# pas besoin de copier le fichier *.req depuis le serveur VPN vers la machine CA
# créé le fichier /etc/easy-rsa/pki/issued/client1.crt
easyrsa sign-req client client1

# sur le client
mkdir /etc/easy-rsa/pki/signed
# y copier le fichier client1.crt

Configuration

Configuration Serveur

Bash.svg
# copier le fichier de configuration d'exemple
cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server/server.conf
/etc/openvpn/server/server.conf
port 1194

# Mode routé (tun) ou bridge (tap)
# TUN / Routing: Les clients appartiennent à un sous-réseau (10.8.0.x). Les communications entre le LAN et le sous-réseau sont routées.
# TAP / Bridging: Les clients font partie du LAN du serveur. 
;dev tap
dev tun

# fichiers du dossier /etc/openvpn/server
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

# plage d'adressage du réseau virtuel
server 10.8.0.0 255.255.255.0

# permet aux clients d’accéder au réseau 192.168.0.0/24 
push "route 192.168.0.0 255.255.255.0"

# forcer les clients à utiliser le VPN pour toutes leurs communications réseau
push "redirect-gateway def1 bypass-dhcp"

# forcer le serveur DNS des clients
push "dhcp-option DNS 10.8.0.1"

# extra security
tls-auth ta.key 0
# nouvelle formulation
tls-crypt ta.key

# Enable compression on the VPN link and push the option to the client
compress lz4-v2
push "compress lz4-v2"

# reduce the OpenVPN daemon's privileges
user nobody
group nobody

Server routing

Bash.svg
# automatically added routes
10.8.0.0/24 via 10.8.0.2 dev tun0 
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1 

local 10.8.0.1 dev tun0 table local proto kernel scope host src 10.8.0.1 

ff00::/8 dev tun0 table local metric 256 pref medium

Autoriser l'IPv4 forwarding

Bash.svg
sysctl -w net.ipv4.ip_forward=1

cat /proc/sys/net/ipv4/ip_forward
# 1

De manière persistante:

/etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

Utiliser le port TCP 443

Les échanges de données OpenVPN ressemble aux données échangées via une connexion SSL.
Ce qui rend le port 443 idéal pour masquer l'utilisation d'OpenVPN et ainsi s'affranchir des restrictions réseau.

/etc/openvpn/server/server.conf
proto tcp  # par défaut à udp
port 443   # par défaut à 1194
# Any non-OpenVPN traffic that goes to port 443 has to be forwarded to the port 4545
port-share 127.0.0.1 4545
Penser à modifier le port d'écoute de tous les sites web 443 → 4545
Les serveurs web voient toutes les connexions en provenance de 127.0.0.1

Configuration Client

Bash.svg
# copier le fichier de configuration d'exemple
sudo cp /usr/share/openvpn/examples/client.conf /etc/openvpn/client/client.conf
/etc/openvpn/client.conf
client
dev tun

# Serveur OpenVPN
proto udp
remote vpn.domain.net 1194
remote vpn.domain.net 443  # if the previous ones fail, try to connect to this one

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody

# fichiers du dossier /etc/openvpn/client
ca ca.crt
cert client.crt
key client.key

# extra security
tls-auth ta.key 1
# si tls-crypt est utilisé à la place de tls-auth dans la config serveur
tls-crypt ta.key

# même cipher que le serveur
cipher AES-256-CBC

# demande du login et du password à chaque connexion
auth-user-pass
# read the file /path/vpn-login to get the login and password
auth-user-pass /path/vpn-login

# Delay n seconds after connection establishment, before adding routes
# This option is designed to be useful in scenarios where DHCP is used to set tap adapter addresses.
# The delay will give the DHCP handshake time to complete before routes are added.
route-delay 2

# Autorise le change d'adresse IP et de port du client, utile si le serveur utilise DHCP pour fournir une adresse IP au client.
float

# execute multiple scripts after TCP/UDP socket bind and TUN/TAP open
up '/bin/bash -c "/etc/openvpn/update-resolv-conf; /etc/openvpn/client-route"'
down '/bin/bash -c "/etc/openvpn/update-resolv-conf; /etc/openvpn/client-route"'

Client routing

Bash.svg
# automatically added routes with ProtonVPN
# [vpn_local_ip]=10.19.0.71
# [vpn_external_ip]=107.181.180.169
0.0.0.0/1 via 10.19.0.1 dev tun1
10.19.0.0/16 dev tun1 proto kernel scope link src [vpn_local_ip]
[vpn_external_ip] via 192.168.0.254 dev eth0 
128.0.0.0/1 via 10.19.0.1 dev tun1
broadcast 10.19.0.0 dev tun1 table local proto kernel scope link src [vpn_local_ip]
local [vpn_local_ip] dev tun1 table local proto kernel scope host src [vpn_local_ip]
broadcast 10.19.255.255 dev tun1 table local proto kernel scope link src [vpn_local_ip]
fe80::/64 dev tun1 proto kernel metric 256 pref medium
local fe80::12dc:7ad9:1a86:84b3 dev lo table local proto unspec metric 0 pref medium
ff00::/8 dev tun1 table local metric 256 pref medium

# automatically added routes on Android
default dev tun0 table 1036 proto static scope link
10.8.0.1 dev tun0 table 1036 proto static scope link
10.8.0.4/30 dev tun0 table 1036 proto static scope link
192.168.0.0/24 dev tun0 table 1036 proto static scope link

ovpngen

Permet de générer un fichier de configuration *.ovpn

Bash.svg
# installer ovpngen
yaourt ovpngen

ovpngen vpn.domain.fr \
/etc/openvpn/server/ca.crt \
/etc/easy-rsa/pki/issued/client1.crt \
/etc/easy-rsa/pki/private/client1.key \
/etc/openvpn/server/ta.key > client1.ovpn

Windows

Exemple de fichier de configuration: C:\Program Files\OpenVPN\sample-config\client.ovpn

Utilisation

Utilisation Serveur

Bash.svg
# démarrer OpenVPN avec le fichier de configuration /etc/openvpn/server/<configuration>.conf
systemctl start openvpn-server@<configuration>

# tester le serveur en le démarrant manuellement
openvpn /etc/openvpn/server/server.conf

# sur le serveur
ip a
# x: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
#     link/none
#     inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0

Utilisation Client

Bash.svg
sudo openvpn /etc/openvpn/client/client.conf
# Si tout fonctionne bien la commande doit rester ouverte et le dernier message devrait être : Initialization Sequence Completed

ip a
# une interface réseau du nom de tap0 ou tun0 doit apparaître

# test your ip address
curl ipinfo.io

Network Manager

Bash.svg
sudo pacman -S networkmanager-openvpn
Il faut redémarrer (l'ordinateur?) pour que le plugin soit pris en charge.

OpenVPN Connect application Android

Cette application fonctionne seulement avec TUN
Générer un certificat pour le client (client.crt client.key) et utiliser les mêmes ca.crt ta.key que le serveur

unified form

profil.ovpn
client
dev tun
remote vpn.domaine.fr 1194 udp
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
keepalive 10 120
cipher AES-256-CBC
#keysize 256
#link-mtu 1558
comp-lzo
remote-cert-tls server
<ca>
# ca.crt
-----BEGIN CERTIFICATE-----
. . .
</ca>

<cert>
# [client].crt
-----BEGIN CERTIFICATE-----
. . .
</cert>

<key>
# [client].key
-----BEGIN RSA PRIVATE KEY-----
. . .
</key>

key-direction 1
<tls-auth>
# ta.key
-----BEGIN OpenVPN Static key V1-----
. . .
</key>

Android Keychain

Bash.svg
# créer un certificat au format p12
openssl pkcs12 -export -inkey client.key -in client.crt -certfile ca.crt -name MyClient -out client.p12
  1. importer le certificat p12
  2. importer le fichier de profil sans les directives ca, cert et key
profil.ovpn
client
dev tun
remote vpn.domaine.fr
resolv-retry infinite
nobind
persist-key
persist-tun
verb 1
keepalive 10 120
port 1194
proto udp
cipher BF-CBC
comp-lzo
remote-cert-tls server

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
. . .
</key>

Router le traffic dans le tunnel VPN

Bash.svg
ip link set dev tun0 up mtu 1500
ip addr add dev tun0 local 10.8.0.134 peer 10.8.0.133

ip route add {SERVER_OPENVPN}/32 via {GATEWAY}
ip route add 0.0.0.0/1 via 10.8.0.133
ip route add 128.0.0.0/1 via 10.8.0.133
ip route add 10.8.0.1/32 via 10.8.0.133

Erreurs

TCP/UDP: Socket bind failed on local address [AF_INET][undef]:443: Address already in use (errno=98)

nginx utilise déjà le port 443.
Stopper nginx, démarrer openvpn, démarrer nginx.

Options error: --explicit-exit-notify can only be used with --proto udp

Si le protocol tcp est utilisé, commenter la ligne explicit-exit-notify 1

Web server unreachable from outside LAN when VPN client is on

/etc/iproute2/rt_tables
# create a new policy routing table entry for routing vpn traffic
# table 199, named vpn
199 vpn
Bash.svg
# use routing table vpn for traffic from [server_ip]
sudo ip rule add from [server_ip] table vpn

# add route to [network] (192.168.0.0/24) in the routing table vpn
# allow to not freeze local ssh connections
sudo ip route add to [network] dev eth0 table vpn

# add default route via [router_ip] in the routing table vpn
# allow outside calls to reach web server
sudo ip route add default via [router_ip] table vpn
config.ovpn
up /etc/openvpn/client-route
down /etc/openvpn/client-route
/etc/openvpn/client-route.sh
#!/bin/bash

[ "$script_type" ] || exit 0
[ "$dev" ] || exit 0

case "$script_type" in
  up)
    ip rule add from [server_ip] table vpn
    ip route add to [network] dev eth0 table vpn
    ip route add default via [router_ip] table vpn
    ;;
  down)
    ip rule del from [server_ip] table vpn
    ip route del to [network] dev eth0 table vpn
    ip route del default via [router_ip] table vpn
    ;;
esac

Serveur OpenVPN OLD

TUN ou TAP

TUN / Routing

Les clients appartiennent à un sous-réseau (10.8.0.x). Les communications entre le LAN et le sous-réseau sont routées.

TAP / Bridging

Les clients font partie du LAN du serveur.

Installation du serveur

Bash.svg
# installation du serveur openvpn
# le paquet contient le client et le serveur
sudo pacman -S openvpn

Créer un Public Key Infrastructure pour le serveur et les clients

Bash.svg
# Installing the easy-rsa scripts
sudo pacman -S easy-rsa

# copier les fichiers pour les éditer
cp -r /usr/share/easy-rsa /root

Optionnel: changer les valeurs par défaut du script de génération:

/root/easy-rsa/vars
export KEY_COUNTRY="FR"
export KEY_PROVINCE="Mon département"
export KEY_CITY="Ma ville"
export KEY_ORG="Nom de domaine par exemple"
export KEY_EMAIL="admin@domain.fr"
export KEY_OU=""
export KEY_NAME="OpenVPN Server"

export KEY_CN="domain-CA"
Bash.svg
cd /usr/share/easy-rsa

# Export the environment variables.
source ./vars

# Delete any previously created certificates.
./clean-all

# Générer le certificat de la Certificate Authority (CA).
./build-ca
# → certificat ca.crt
# → clé privée ca.key

# Générer le certificat du serveur
# server name doit être unique
./build-key-server <server name>
# Ne pas entrer de challenge password ou de company name
# sign and commit
# → certificat <server name>.crt
# → clé privée <server name>.key
# → <server name>.csr
# → 01.pem

# generates the Diffie-Hellman parameters .pem file needed by the server.
./build-dh
# → dh2048.pem

# Générer les certificats des clients
# client name doit être unique
./build-key <client name>
# Ne pas entrer de challenge password ou de company name
# sign and commit
# → certificat <client name>.crt
# → clé privée <client name>.key
# → <client name>.csr
# → 02.pem

# Generate a secret Hash-based Message Authentication Code (HMAC)
openvpn --genkey --secret /root/easy-rsa/keys/ta.key
Make sure that the generated files are backed up, especially the ca.key and ca.crt files, since if lost you will not be able to create any new, nor revoke any compromised certificates, thus requiring the generation of a new Certificate Authority (CA) certificate, invalidating the entire PKI infrastructure.
Le serveur a besoin des fichiers suivant dans /etc/openvpn/server:
  • ca.crt
  • server.crt
  • dh2048.pem (public)
  • server.key
  • ta.key

Les clients ont besoin des fichiers suivant dans /etc/openvpn/client:

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

Configuration du serveur

Bash.svg
cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server/server.conf
/etc/openvpn/server/server.conf
port 1194

# Mode routé (tun) ou bridge (tap)
;dev tap
dev tun

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key

dh /etc/openvpn/server/dh2048.pem

# plage d'adressage du réseau virtuel
server 10.8.0.0 255.255.255.0

# permet aux clients d’accéder au réseau 192.168.0.0/24 
push "route 192.168.0.0 255.255.255.0"

# forcer les clients à utiliser le VPN pour toutes leurs communications réseau
push "redirect-gateway def1 bypass-dhcp"

# forcer le serveur DNS des clients
push "dhcp-option DNS 10.8.0.1"

# For extra security
tls-auth /etc/openvpn/server/ta.key 0

# reduce the OpenVPN daemon's privileges
user nobody
group nobody

autoriser l'IPv4 forwarding

Bash.svg
sysctl -w net.ipv4.ip_forward=1

cat /proc/sys/net/ipv4/ip_forward
# 1

De manière persistante

/etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1

Test du serveur

Bash.svg
# démarrer le service manuellement
openvpn /etc/openvpn/server/server.conf

# sur le serveur
ip addr show
# x: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
#     link/none
#     inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0

Service

Bash.svg
# démarrer OpenVPN avec le fichier de configuration /etc/openvpn/server/<configuration>.conf
systemctl start openvpn-server@<configuration>

Utiliser le port TCP 443

Les échanges de données OpenVPN ressemble aux données échangées via une connexion SSL.
Ce qui rend le port 443 idéal pour masquer l'utilisation d'OpenVPN et ainsi s'affranchir des restrictions réseau.

/etc/openvpn/server/server.conf
proto tcp  # par défaut à udp
port 443   # par défaut à 1194
# Any non-OpenVPN traffic that goes to port 443 has to be forwarded to the port 4545
port-share 127.0.0.1 4545
Penser à modifier le port d'écoute de tous les sites web 443 → 4545
Les serveurs web voient toutes les connexions en provenance de 127.0.0.1

Client OpenVPN OLD

Installation du client

Bash.svg
# installation du client openvpn
# le paquet contient le client et le serveur
pacman -S openvpn

Create a Public Key Infrastructure Using the easy-rsa Scripts

Bash.svg
# Installing the easy-rsa scripts
pacman -S easy-rsa

# copier les fichiers pour les éditer
cp -r /usr/share/easy-rsa /root

Changer les valeurs par défaut du script de génération:

/root/easy-rsa/vars
export KEY_COUNTRY="FR"
export KEY_PROVINCE="Mon département"
export KEY_CITY="Ma ville"
export KEY_ORG="Nom de domaine par exemple"
export KEY_EMAIL="admin@domain.fr"
export KEY_OU=""
export KEY_NAME="???"
export KEY_CN="???"
Bash.svg
# passer en super-utilisateur car le source ne peut être utilisé avec sudo
sudo su

cd /usr/share/easy-rsa

# Export the environment variables.
source ./vars

# Delete any previously created certificates.
./clean-all

# Generate the Certificate Authority (CA) certificate.
# Réutiliser celui du serveur (ca.crt) ?
./build-ca

# Generates a client certificate. Make sure that the client name (Common Name when running the script) is unique.
# Note: Do not enter a challenge password or company name when the script prompts you for one.
./build-key <client name>

# Generate a secret Hash-based Message Authentication Code (HMAC)
# Réutiliser celui du serveur (ta.key) ?
openvpn --genkey --secret ./keys/ta.key
Le client OpenVPN a besoin des fichiers suivant dans le dossier /etc/openvpn/client
  • client.crt (public)
  • client.key
  • ta.key (private)

Configuration du client

Bash.svg
# copier le fichier de configuration d'exemple
sudo cp /usr/share/openvpn/examples/client.conf /etc/openvpn/client/client.conf
/etc/openvpn/client.conf
; Serveur OpenVPN
remote mon.serveur.fr 1194

; To drop privileges. 
user nobody
group nobody

; chemin vers le fichier ca.crt
ca /etc/openvpn/client/ca.crt

; demande du login et du password à chaque connexion
auth-user-pass

; Delay n seconds after connection establishment, before adding routes
; This option is designed to be useful in scenarios where DHCP is used to set tap adapter addresses.
; The delay will give the DHCP handshake time to complete before routes are added.
route-delay 2

; Autorise le change d'adresse IP et de port du client, utile si le serveur utilise DHCP pour fournir une adresse IP au client.
float

Test du client

Bash.svg
sudo openvpn /etc/openvpn/client/client.conf
# Si tout fonctionne bien la commande doit rester ouverte et le dernier message devrait être : Initialization Sequence Completed

ip addr show
# une interface réseau du nom de tap0 ou tun0 doit apparaître

Network Manager

Bash.svg
sudo pacman -S networkmanager-openvpn
Il faut redémarrer (l'ordinateur?) pour que le plugin soit pris en charge.

OpenVPN Connect application Android

Cette application fonctionne seulement avec TUN
Générer un certificat pour le client (client.crt client.key) et utiliser les mêmes ca.crt ta.key que le serveur

unified form

Utiliser le script ovpn-writer.sh pour générer le profil:

./ovpn-writer.sh vpn.domain.com ca.crt client.crt client.key ta.key > client.ovpn

Puis supprimer les lignes ca [inline], cert [inline] et key [inline]
profil.ovpn
client
dev tun
remote vpn.domaine.fr
resolv-retry infinite
nobind
persist-key
persist-tun
verb 1
keepalive 10 120
port 1194
proto udp
cipher BF-CBC
comp-lzo
remote-cert-tls server
<ca>
-----BEGIN CERTIFICATE-----
. . .
</ca>

<cert>
-----BEGIN CERTIFICATE-----
. . .
</cert>

<key>
-----BEGIN RSA PRIVATE KEY-----
. . .
</key>

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
. . .
</key>

Android Keychain

Bash.svg
# créer un certificat au format p12
openssl pkcs12 -export -inkey client.key -in client.crt -certfile ca.crt -name MyClient -out client.p12
  1. importer le certificat p12
  2. importer le fichier de profil sans les directives ca, cert et key
profil.ovpn
client
dev tun
remote vpn.domaine.fr
resolv-retry infinite
nobind
persist-key
persist-tun
verb 1
keepalive 10 120
port 1194
proto udp
cipher BF-CBC
comp-lzo
remote-cert-tls server

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
. . .
</key>

Router le traffic dans le tunnel VPN

Bash.svg
ip link set dev tun0 up mtu 1500
ip addr add dev tun0 local 10.8.0.134 peer 10.8.0.133

ip route add {SERVER_OPENVPN}/32 via {GATEWAY}
ip route add 0.0.0.0/1 via 10.8.0.133
ip route add 128.0.0.0/1 via 10.8.0.133
ip route add 10.8.0.1/32 via 10.8.0.133