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
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
.
K
signifie que la clé pour ce certificat est présente dans le gestionnaireLe
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.
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 🎉