Table des matières

OpenVPN

Installation d'un VPN

Préparation serveur

  1. Installer OpenVPN :
    apt-get install openvpn
  2. Copier EasyRSA (paquet facilitant la génération de certificats) dans le répertoire d'OpenVPN :
    cp -r /usr/share/easy-rsa/ /etc/openvpn
  3. Renommer /etc/openvpn/easy-rsa/vars.example en /etc/openvpn/easy-rsa/vars et éditer le fichier :
    export KEY_COUNTRY="FR"
    export KEY_PROVINCE="FR"
    export KEY_CITY="FR"
    export KEY_ORG="exemple.com"
    export KEY_EMAIL="exemple@exemple.com"

Création clés et certificats côté serveur

  1. Initialiser PKI :
    ./easyrsa init-pki
  2. Créer le CA :
    ./easyrsa build-ca nopass
  3. Générer la clé pour le serveur :
    ./easyrsa gen-req myserver nopass
  4. Signer le certificat du serveur avec le CA :
    ./easyrsa sign-req server myserver
  5. Générer les paramètres d'échanges de clés Diffie-Helman :
    ./easyrsa gen-dh
  6. Générer une clé statique :
    openvpn --genkey --secret ta.key
  7. Déplacer les certificats et clés dans le répertoire de openvpn :
    cd /etc/openvpn/easy-rsa/pki
    mv ca.crt dh.pem private/myserver.key issued/myserver.crt /etc/openvpn/server/
  8. Création d'un répertoire jail dans lequel le demon openvpn sera chrooté :
    mkdir /etc/openvpn/jail
  9. Création du fichier de conf server.conf

Exemple de configuration pour un VPN en tun utilisant le port 443 :

# Serveur TCP/443
mode server
proto tcp
port 443
dev tun

# Clés et certificats
ca ca.crt
cert myserver.crt
key myserver.key
dh dh.pem
tls-auth ta.key 0
cipher AES-256-CBC
 
# Réseau
server 10.0.0.0 255.255.255.0
keepalive 10 120
duplicate-cn
client-to-client

# Sécurité
user nobody
group nogroup
chroot /etc/openvpn/jail
persist-key
persist-tun
comp-lzo

# Log
verb 5
mute 20
status openvpn-status.log
log-append /var/log/openvpn.log

Création clés et certificats pour le client

  1. Générer la clé pour le client :
    ./easyrsa gen-req client1
  2. Signer le certificat du serveur avec le CA :
    ./easyrsa sign-req client client1
  3. Copier la clé et les certificats dans le répertoire client :
    cp pki/ca.crt /etc/openvpn/client/
    cp pki/issued/client1.crt /etc/openvpn/client/
    cp pki/private/client1.key /etc/openvpn/client/
  4. Création du fichier de conf client.ovpn avec les clés et certificats

Exemple d'un fichier de configuration client :

# Client
client
dev tun
proto tcp-client
remote 93.184.216.34 443
resolv-retry infinite
cipher AES-256-CBC
auth SHA512
auth-user-pass
persist-tun
persist-key
remote-cert-tls server
tls-client
comp-lzo
<ca>
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE----
XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN ENCRYPTED PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX
-----END ENCRYPTED PRIVATE KEY-----
</key>
key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX
-----END OpenVPN Static key V1-----
</tls-auth>

Redémarrer le serveur si l'interface tun0 n'est toujours pas présente

Configuration parfeu

On effectuera ici une configuration sous Nftables pour permettre la connexion à un VPN utilisant l'interface tun et le port 443

table inet filter {
    chain input {
        type filter hook input priority 0; policy accept;
        ../..
        Reste configuration
        ../..
        tcp dport https accept comment "Allow HTTPS"
        log prefix "Nftables_drop " drop
    }
}

table ip nat {
        chain prerouting {
                type nat hook prerouting priority -100; policy accept;
                }
        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                ip saddr 10.0.0.0/24 oif "eth0" masquerade
        }
}

Trucs divers

Sources/Docs