Installation
|
pacman -S openvpn easy-rsa
|
Génération des certificats
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.
|
cd /etc/easy-rsa
export EASYRSA=$(pwd)
export EASYRSA_VARS_FILE=/etc/easy-rsa/vars
easyrsa init-pki
easyrsa build-ca
|
/etc/easy-rsa/vars
|
set_var EASYRSA_ALGO ec
set_var EASYRSA_CURVE secp521r1
set_var EASYRSA_DIGEST "sha512"
|
|
dd if=/dev/urandom of=pki/.rnd bs=256 count=1
|
|
cp /etc/easy-rsa/pki/ca.crt /etc/openvpn/server/
cd /etc/easy-rsa
easyrsa init-pki
easyrsa gen-req servername nopass
cp /etc/easy-rsa/pki/private/servername.key /etc/openvpn/server/
openssl dhparam -out /etc/openvpn/server/dh.pem 2048
openvpn --genkey --secret /etc/openvpn/server/ta.key
cd /etc/easy-rsa
easyrsa sign-req server servername
mv /etc/easy-rsa/pki/issued/servername.crt /etc/openvpn/server/
|
|
cd /etc/easy-rsa
easyrsa init-pki
easyrsa gen-req client1 nopass
easyrsa sign-req client client1
mkdir /etc/easy-rsa/pki/signed
|
Configuration
Configuration Serveur
|
cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server/server.conf
|
/etc/openvpn/server/server.conf
|
port 1194
;dev tap
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
push "route 192.168.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"
tls-auth ta.key 0
tls-crypt ta.key
compress lz4-v2
push "compress lz4-v2"
user nobody
group nobody
|
Server routing
|
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
|
|
sysctl -w net.ipv4.ip_forward=1
cat /proc/sys/net/ipv4/ip_forward
|
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
|
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
port 443
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
|
sudo cp /usr/share/openvpn/examples/client.conf /etc/openvpn/client/client.conf
|
/etc/openvpn/client.conf
|
client
dev tun
proto udp
remote vpn.domain.net 1194
remote vpn.domain.net 443
user nobody
group nobody
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
tls-crypt ta.key
cipher AES-256-CBC
auth-user-pass
auth-user-pass /path/vpn-login
route-delay 2
float
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
|
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
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
|
Permet de générer un fichier de configuration *.ovpn
|
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
|
systemctl start openvpn-server@<configuration>
openvpn /etc/openvpn/server/server.conf
ip a
|
Utilisation Client
|
sudo openvpn /etc/openvpn/client/client.conf
ip a
curl ipinfo.io
|
|
sudo pacman -S networkmanager-openvpn
|
 |
Il faut redémarrer (l'ordinateur?) pour que le plugin soit pris en charge. |
 |
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
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
|
openssl pkcs12 -export -inkey client.key -in client.crt -certfile ca.crt -name MyClient -out client.p12
|
- importer le certificat p12
- 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
|
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
/etc/iproute2/rt_tables
|
199 vpn
|
|
sudo ip rule add from [server_ip] table vpn
sudo ip route add to [network] dev eth0 table vpn
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
|
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
|
sudo pacman -S openvpn
|
|
sudo pacman -S easy-rsa
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"
|
|
cd /usr/share/easy-rsa
source ./vars
./clean-all
./build-ca
./build-key-server <server name>
./build-dh
./build-key <client name>
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
|
cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server/server.conf
|
/etc/openvpn/server/server.conf
|
port 1194
;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
server 10.8.0.0 255.255.255.0
push "route 192.168.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"
tls-auth /etc/openvpn/server/ta.key 0
user nobody
group nobody
|
|
sysctl -w net.ipv4.ip_forward=1
cat /proc/sys/net/ipv4/ip_forward
|
De manière persistante
/etc/sysctl.d/30-ipforward.conf
|
net.ipv4.ip_forward=1
|
Test du serveur
|
openvpn /etc/openvpn/server/server.conf
ip addr show
|
Service
|
systemctl start openvpn-server@<configuration>
|
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
port 443
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
|
pacman -S openvpn
|
|
pacman -S easy-rsa
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="???"
|
|
sudo su
cd /usr/share/easy-rsa
source ./vars
./clean-all
./build-ca
./build-key <client name>
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
|
sudo cp /usr/share/openvpn/examples/client.conf /etc/openvpn/client/client.conf
|
/etc/openvpn/client.conf
|
remote mon.serveur.fr 1194
user nobody
group nobody
ca /etc/openvpn/client/ca.crt
auth-user-pass
route-delay 2
float
|
Test du client
|
sudo openvpn /etc/openvpn/client/client.conf
ip addr show
|
|
sudo pacman -S networkmanager-openvpn
|
 |
Il faut redémarrer (l'ordinateur?) pour que le plugin soit pris en charge. |
 |
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
|
openssl pkcs12 -export -inkey client.key -in client.crt -certfile ca.crt -name MyClient -out client.p12
|
- importer le certificat p12
- 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
|
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
|