« OpenVPN » : différence entre les versions
(→Ubuntu) |
|||
(43 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 75 : | Ligne 75 : | ||
# sur le serveur, déplacer le fichier servername.crt | # sur le serveur, déplacer le fichier servername.crt | ||
mv /etc/easy-rsa/pki/issued/servername.crt /etc/openvpn/server/ | mv /etc/easy-rsa/pki/issued/servername.crt /etc/openvpn/server/ | ||
</kode> | </kode> | ||
Ligne 162 : | Ligne 147 : | ||
group nobody | group nobody | ||
</filebox> | </filebox> | ||
=== Server routing === | |||
<kode lang='bash'> | |||
# 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 | |||
</kode> | |||
=== [https://wiki.archlinux.org/index.php/Internet_sharing#Enable_packet_forwarding Autoriser l'IPv4 forwarding] === | === [https://wiki.archlinux.org/index.php/Internet_sharing#Enable_packet_forwarding Autoriser l'IPv4 forwarding] === | ||
Ligne 201 : | Ligne 197 : | ||
# Serveur OpenVPN | # Serveur OpenVPN | ||
proto udp | 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) | # Downgrade privileges after initialization (non-Windows only) | ||
Ligne 223 : | Ligne 220 : | ||
# demande du login et du password à chaque connexion | # demande du login et du password à chaque connexion | ||
auth-user-pass | 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 | # Delay n seconds after connection establishment, before adding routes | ||
Ligne 231 : | Ligne 230 : | ||
# Autorise le change d'adresse IP et de port du client, utile si le serveur utilise DHCP pour fournir une adresse IP au client. | # 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 | 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"' | |||
</filebox> | </filebox> | ||
=== Client routing === | |||
<kode lang='bash'> | |||
# 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 | |||
</kode> | |||
== [https://wiki.archlinux.org/index.php/OpenVPN#ovpngen ovpngen] == | == [https://wiki.archlinux.org/index.php/OpenVPN#ovpngen ovpngen] == | ||
Ligne 259 : | Ligne 285 : | ||
# sur le serveur | # sur le serveur | ||
ip | ip a | ||
# x: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100 | # x: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100 | ||
# link/none | # link/none | ||
Ligne 270 : | Ligne 296 : | ||
# Si tout fonctionne bien la commande doit rester ouverte et le dernier message devrait être : Initialization Sequence Completed | # Si tout fonctionne bien la commande doit rester ouverte et le dernier message devrait être : Initialization Sequence Completed | ||
ip | ip a | ||
# une interface réseau du nom de tap0 ou tun0 doit apparaître | # une interface réseau du nom de tap0 ou tun0 doit apparaître | ||
# test your ip address | |||
curl ipinfo.io | |||
</kode> | </kode> | ||
Ligne 280 : | Ligne 309 : | ||
{{warn | Il faut redémarrer (l'ordinateur?) pour que le plugin soit pris en charge.}} | {{warn | Il faut redémarrer (l'ordinateur?) pour que le plugin soit pris en charge.}} | ||
== [https:// | == [https://openvpn.net/vpn-server-resources/faq-regarding-openvpn-connect-android/ OpenVPN Connect application Android] == | ||
{{warn | Cette application fonctionne seulement avec TUN}} | {{warn | Cette application fonctionne seulement avec TUN}} | ||
{{info | Générer un certificat pour le client ({{boxx|client.crt client.key}}) et utiliser les mêmes {{boxx|ca.crt ta.key}} que le serveur}} | {{info | Générer un certificat pour le client ({{boxx|client.crt client.key}}) et utiliser les mêmes {{boxx|ca.crt ta.key}} que le serveur}} | ||
=== unified form === | === unified form === | ||
<filebox fn=profil.ovpn lang=bash> | <filebox fn=profil.ovpn lang=bash> | ||
client | client | ||
dev tun | dev tun | ||
remote vpn.domaine.fr | remote vpn.domaine.fr 1194 udp | ||
resolv-retry infinite | resolv-retry infinite | ||
nobind | nobind | ||
persist-key | persist-key | ||
persist-tun | persist-tun | ||
verb | verb 3 | ||
keepalive 10 120 | keepalive 10 120 | ||
cipher AES-256-CBC | |||
#keysize 256 | |||
#link-mtu 1558 | |||
comp-lzo | comp-lzo | ||
remote-cert-tls server | remote-cert-tls server | ||
<ca> | <ca> | ||
# ca.crt | |||
-----BEGIN CERTIFICATE----- | -----BEGIN CERTIFICATE----- | ||
. . . | . . . | ||
Ligne 309 : | Ligne 336 : | ||
<cert> | <cert> | ||
# [client].crt | |||
-----BEGIN CERTIFICATE----- | -----BEGIN CERTIFICATE----- | ||
. . . | . . . | ||
Ligne 314 : | Ligne 342 : | ||
<key> | <key> | ||
# [client].key | |||
-----BEGIN RSA PRIVATE KEY----- | -----BEGIN RSA PRIVATE KEY----- | ||
. . . | . . . | ||
Ligne 320 : | Ligne 349 : | ||
key-direction 1 | key-direction 1 | ||
<tls-auth> | <tls-auth> | ||
# ta.key | |||
-----BEGIN OpenVPN Static key V1----- | -----BEGIN OpenVPN Static key V1----- | ||
. . . | . . . | ||
Ligne 377 : | Ligne 407 : | ||
== Options error: --explicit-exit-notify can only be used with --proto udp == | == Options error: --explicit-exit-notify can only be used with --proto udp == | ||
Si le protocol {{boxx|tcp}} est utilisé, commenter la ligne {{boxx|explicit-exit-notify 1}} | Si le protocol {{boxx|tcp}} est utilisé, commenter la ligne {{boxx|explicit-exit-notify 1}} | ||
== [https://kindlund.wordpress.com/2007/11/19/configuring-multiple-default-routes-in-linux/ Web server unreachable from outside LAN when VPN client is on] == | |||
<filebox fn='/etc/iproute2/rt_tables' lang='bash'> | |||
# create a new policy routing table entry for routing vpn traffic | |||
# table 199, named vpn | |||
199 vpn | |||
</filebox> | |||
<kode lang='bash'> | |||
# 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 | |||
</kode> | |||
<filebox fn='config.ovpn'> | |||
up /etc/openvpn/client-route | |||
down /etc/openvpn/client-route | |||
</filebox> | |||
<filebox fn='/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 | |||
</filebox> | |||
= [https://wiki.archlinux.org/index.php/OpenVPN Serveur OpenVPN OLD] = | = [https://wiki.archlinux.org/index.php/OpenVPN Serveur OpenVPN OLD] = |
Dernière version du 24 février 2021 à 17:44
Installation
# 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.
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" |
dd if=/dev/urandom of=pki/.rnd bs=256 count=1 |
Serveur
# 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
# 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
# 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
# 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
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
# 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
# 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
# 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
# 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
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
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
# créer un certificat au format p12 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
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 |
# 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
# 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
# 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" |
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:
Les clients ont besoin des fichiers suivant dans /etc/openvpn/client:
|
Configuration du serveur
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
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
# 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
# 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
# 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
# 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="???" |
# 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
|
Configuration du client
# 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
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
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:
|
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
# créer un certificat au format p12 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 |