Configurer RouterOS comme client OpenVPN

⚠️
Les ressources de cet article ne sont pas supposées être utilisé en production, il y a une multitude de paramètres à affiner avant un passage en production.

Pré-requis

Pour réaliser les étapes suivantes, nous aurons besoins de :

  • RouterOS 7.7
  • OpenVPN 2.4.7
  • OpenSSL/LibreSSL 3.3.6

En dehors de ces versions, vous devrez peut-être adapter les instructions.

Configuration requise du serveur OpenVPN

À l’heure de la version 7.7rc2 de RouterOS, celle-ci ne supporte pas encore tls-auth, donc dans la configuration du serveur le paramètre doit être absent ou commenté avec #.

De même, RouterOS ne supporte pas la compression LZO, ainsi dans la configuration serveur, commenter comp-lzo no et ajouter push "comp-lzo no".

Sur 7.7rc2, nous avons le support de la connectivité UDP.

Voici un exemple de la configuration serveur.

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/openvpn.server.io.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/openvpn.server.iovfgb.crt
dh /etc/openvpn/pki/dh.pem
#tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

cipher AES-256-CBC
auth sha1

proto udp4
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
#comp-lzo no

### Route Configurations Below
route 192.168.254.0 255.255.255.0

### Push Configurations Below
push "block-outside-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "comp-lzo no"
push "compress stub-v2"

Obtenir un fichier client.ovpn

Selon le serveur, le service ainsi que les choix techniques, il existe beaucoup de méthodes pour obtenir un fichier client OpenVPN.

Pour les besoins de cet article, nous avons utilisé PiVPN afin de créer la configuration du serveur de même que celle des clients.

Par exemple, il existe aussi l’image docker 🐳 kylemanna/openvpn qui permet rapidement de mettre en place un serveur.

Une fois le fichier .ovpn récupéré (ou les différents fichiers), nous allons extraire les informations nécessaires à la configuration de RouterOS.

Préparer les certificats pour RouterOS

Notre fichier utilisateur ressemble à ça,

client
nobind

#ROS: Mode ip
dev tun

remote-cert-tls server

#ROS: Connect To / Port / Protocol
remote openvpn.server.io 1194 udp

#ROS: Clé privée
<key>
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIqCo7o53TV4YCAggA
**REDACTED**
1IyGuqUkRXJd2HY1SC3i3w==
-----END ENCRYPTED PRIVATE KEY-----
</key>

#ROS: Certificat client
<cert>
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIRAPVtgQ89n79UIpllih8JZjUwDQYJKoZIhvcNAQELBQAw
**REDACTED**
4iasQhOPIRyN4vIMIU2IRLuycLS29OFiKo0dB3EOa/c0zZk7683LnxKv/Q==
-----END CERTIFICATE-----
</cert>

#ROS: Certificat de l'autorité de certification
<ca>
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUXb0Dr/Lrq6q3mhdgzUfNAoCmhjswDQYJKoZIhvcNAQEL
**REDACTED**
4JqvkASv/EK0BkLec83s4Y1Pcppx+h+5YeTz2/+T4g==
-----END CERTIFICATE-----
</ca>
key-direction 1
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
d4b81257b426595a5d3faaf040a362ae
**REDACTED**
90863f9cdf9e1eb6d3815f6443a6383c
-----END OpenVPN Static key V1-----
</tls-auth>

redirect-gateway def1

Extraire les certificats et la clé

Nous allons extraire le certificat du serveur, le certificat client et la clé.

La clé arrive par défaut sous sa forme chiffrée dans la configuration.

C’est la data qui se trouve entre <key>…</key>, RouterOS échouera à la lire directement, donc nous allons devoir la convertir avant son import.

Le certificat client entre<cert>…</cert>, et le certificat de l’autorité de certification <ca>…<⁣/ca> sont à extraire également.

On peut ouvrir le fichier avec un éditeur de texte et copier-coller les différentes sections dans les fichiers ca.pem, client.pem, client.pem ou en shell avec grep.

grep -Poz '(?s)\K<key>(.*)</key>?' client.ovpn | sed -E '/<?key>/d' > client.key
grep -Poz '(?s)\K<cert>(.*)</cert>?' client.ovpn | sed -E '/<?cert>/d' > client.pem
grep -Poz '(?s)\K<ca>(.*)</ca>?' client.ovpn | sed -E '/<?ca>/d' > ca.pem
🍎
Les opérations réalisées avec le terminal ci-dessus utilisent la version gnu de grep, par défaut sous macOS indisponible, elle peut être installée avec brew install grep.
Pour la compatibilité, les commandes sont préfixées avec g, c'est pourquoi on doit utiliser ggrep et non grep avec macOS.

Déchiffrer la clé

Maintenant, nous allons créer un fichier pem qui va nous permettre d’importer le tout dans RouterOS, cependant, la clé est actuellement sous sa forme chiffrée donc nous allons la déchiffrer.

openssl rsa -in ./client.key -out ./client.key

Si tout est bon, la clé est déchiffrée. Dans le contenu

----BEGIN ENCRYPTED PRIVATE KEY----- devient ----BEGIN RSA PRIVATE KEY-----

Création du fichier PEM

À présent, créons le fichier pem contenant le la clé, le certificat client et le certificat de l’autorité de certification.

cat ca.pem client.pem client.key > certificate.pem

Le certificat client.pem ressemble à ça,

-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUXb0Dr/Lrq6q3mhdgzUfNAoCmhjswDQYJKoZIhvcNAQEL
**REDACTED**
4JqvkASv/EK0BkLec83s4Y1Pcppx+h+5YeTz2/+T4g==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIRAPVtgQ89n79UIpllih8JZjUwDQYJKoZIhvcNAQELBQAw
**REDACTED**
4iasQhOPIRyN4vIMIU2IRLuycLS29OFiKo0dB3EOa/c0zZk7683LnxKv/Q==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA0WuDisr2CPUkBGSl09I+dg/aSdc2Hj4TRN4WcGRoq7I3Al+N
**REDACTED**
FZ4b5HGNV1kBgcIMmWC8+vrNAFEwawA0goYtcsri4SjcybEZRfU=
-----END RSA PRIVATE KEY-----

L’ordre des certificats dans le fichier PEM a son importance, RouterOS les importe de manière séquentielle et s’il ne peut trouver le certificat auquel correspond la clé, ou le certificat permettant de vérifier l’autorité de certification, il ignorera ces derniers ou ne les approuvera pas.

Ainsi l’ordre de lecture est en premier le certificat CA, puis le certificat client et la clé privée. Cela évite de répéter l’opération d’import 3 fois.

Configuration de l’interface OpenVPN-Client sur RouterOS

Avec winbox

Import du fichier PEM

Allons dans Files, ensuite, téléversons le fichier certificate.pem que nous avons créé plus haut,

Ajout des certificats au gestionnaire de RouterOS

Dans le menu System, Certificates, cliquons sur Import.

Dans Name, on peut changer la racine du nom du certificat ou le laisser la valeur par défaut prise depuis le nom du fichier que l’on va importer.

Indiquons le fichier que l’on a téléversé comme File Name.

La Passphrase reste vide, car on a déchiffré la clé juste avant et nous n’avons pas chiffré le contenu du fichier PEM.

Une fois ajouté, deux lignes sont apparues dans le gestionnaire.

Dans mon exemple certificat.pem_0 avec les attributs K et T et certificat.pem_1 avec juste T en attribut.

Double-cliquez sur celui ayant les attributs KT, c’est le certificat client et renommons-le en openvpn_client par exemple.

Faisons de même pour le second et renommons-le en openvpn_ca.

📌
Le K signifie que la clé pour ce certificat est présente dans le gestionnaire
Le T signifie que le certificat est approuvé (trusted) dans le gestionnaire.

Le fait d’ajouter un certificat autosigné implique que la vérification ne peut se faire qu’avec le certificat de l’autorité de certification depuis laquelle nous l’avons demandé.
Si le certificat de l’autorité de certification (CA) est absent, lors de la configuration de l’interface OpenVPN-client, l’option Verify Server Certificate doit être désactivé, sinon la vérification du certificat client échouera et la connexion ne s’établira pas.

Création du profil Point-to-Point

Dans le menu PPP, nommons-le ovpn, dans le volet Protocols, définissons IPv6 sur no, MPLS sur no, Compression sur yes et Encryption sur required.

Ajout de l’interface OpenVPN-client

Dans le menu Interfaces, dans le volet Interface, ajoutons une interface OVPN Client.

On fait correspondre les différents champs au contenu du fichier client.ovpn, l’User correspond à l'username de profil OpenVPN, les paramètres Auth. et Cipher sont à adapter de votre serveur OpenVPN.

Dans notre exemple, je n’ai pas coché l’ajout de la route par défaut ainsi que de celles qui seraient poussées par le serveur, car cela routerait tout le trafic sortant de RouterOS au travers du tunnel une fois ouvert.

Indiquons le profil PPP ovpn que l’on a créé juste avant. Faisons Apply puis vérifions dans le volet Status que tout est bon.

Et z’est parti 🎉

Désormais, à l’aide d’un autre client du même serveur OpenVPN, on doit pouvoir exécuter un ping vers l’IP du matériel exécutant RouterOS.

Pour connaitre l’adresse obtenue par le serveur, on peut la voir dans les logs du serveur ainsi que le menu IP, Addresses à la ligne de l’interface OpenVPN-Client.

📃
Si pour raison inconnue, cela ne fonctionne pas, il faut regarder les logs de RouterOS et ceux du serveur OpenVPN.
Cela donne une grande aide pour corriger les options de chiffrement qui ne seraient pas les bonnes par rapport au serveur et bien d’autres paramètres qui ne seraient pas cohérents.

Avec la console

Voici la version console des étapes ci-dessus.

Ces étapes impliquent d’avoir l’accès SCP pour téléverser le fichier PEM sur RouterOS et l’accès console (voir la configuration dans IP, Services).

Import du fichier PEM avec SCP

scp ./certificat.pem admin@192.168.167.250:certificat.pem

Ajout des certificats au gestionnaire de RouterOS

/certificate/import \
    file-name=certificat.pem \
    name=openvpn \
    passphrase=""

La sortie doit afficher comme ce qui suit

certificates-imported: 2
private-keys-imported: 1
files-imported: 1
decryption-failures: 0
keys-with-no-certificate: 0

Renommage des certificats importés

/certificate/set openvpn_1 name="openvpn_ca"
/certificate/set openvpn name="openvpn_client"

Création du profil Point-to-Point

/ppp/profile/add \
    use-ipv6=no \
    use-compression=yes \
    use-encryption=required \
    use-mpls=no \
    name=ovpn

Ajout de l’interface OpenVPN-client

/interface/ovpn-client/add \
    connect-to="openvpn.server.io" \
    port=1194 \
    mode=ip \
    protocol=udp \
    user="utilisateur" \
    profile=ovpn \
    certificate=openvpn_client \
    verify-server-certificate=yes \
    tls-version=any \
    auth=sha1 \
    cipher=aes256-cbc \
    add-default-route=no \
    route-nopull=yes

Et z’est parti 🎉

Importing a pem certificat - MikroTik
Mikrotik router as OpenVPN Client
configure your mikrotik routerboard as an openvpn client