Chargement en cours

Relier plusieurs sites via VPN avec pfSense (OpenVPN)

Relier plusieurs sites via VPN avec pfSense (OpenVPN)

OpenVPN S2S multi-sites sur topologie Hub&Spoke.

Dans le monde professionnel, il n’est pas rare que l’on puisse vous demander comment connecter diffĂ©rents sites Ă  un siĂšge principal. Il existe plusieurs mĂ©thodes bien-entendu, mais ici nous allons utiliser notre bon vieux pfSense ainsi que la technologie OpenVPN pour rĂ©aliser une topologie de type « Hub & Spoke », c’est-Ă -dire que nous aurons un site central (Paris), et deux sites distants qui seront en mode Clients (New-York, et Bruxelles).

Étant donnĂ© qu’une image vaut mieux que mille mots, voici un rapide schĂ©ma :

Les deux flĂšches orange symbolisent la liaison OpenVPN Ă  destination du serveur, le siĂšge central.

CÎté réseau, nous aurons donc ceci :

  • prs-fw-01 :
    • WAN, 192.168.1.50/24
    • LAN, 192.168.10.1/24
  • bxl-fw-01 :
    • WAN, 192.168.1.60/24
    • LAN, 192.168.20.1/24
  • ny-fw-01 :
    • WAN, 192.168.1.70/24
    • LAN, 192.168.30.1/24

Classique, mais efficace. A noter qu’ici chaque rĂ©seau LAN possĂšde un subnet diffĂ©rent, ce qui est prĂ©conisĂ© par OpenVPN (sinon vous allez vous amuser avec le NAT et autre…). Par rapport au rĂ©seau utilisĂ© pour le tunnel VPN lui-mĂȘme, nous opterons pour un 10.0.0.0/27, ce qui nous offrira une trentaine d’hĂŽtes disponibles, de quoi voir aisĂ©ment venir si cette fameuse sociĂ©tĂ© fictive dĂ©sire s’implĂ©menter sur d’autres sites 😉 

Sans plus tarder, allons-y !

I) Installation des pfSense, et création de la CA

Ayant dĂ©jĂ  fait bon nombre d’articles sur l’installation/configuration de base d’un pare-feu/routeur pfSense, je ne vais pas re-dĂ©tailler tout le processus ici. Sachez simplement que pour le moment, les adresses IP ont juste Ă©tĂ© setupĂ©es, rien de plus.

Bien, désormais, nous allons créer notre CA (Certificate Authority) sur notre firewall de Paris, et ensuite nous allons pouvoir générer deux certificats clients que nous copierons sur celui de Bruxelles et de New-York.

Vous l’aurez compris, ici nous n’allons pas utiliser de simple pre-shared keys, mais bien des certificats. Rassurez-vous, c’est bien moins complexe qu’il n’y paraĂźt !

Donc, pour crĂ©er notre CA (ici, elle sera créée directement sur le pfSense, mais sachez que j’ai rĂ©alisĂ© un article expliquant comment crĂ©er une CA dĂ©diĂ©e via easyRsa, disponible juste ici), nous nous rendons dans la partie System puis Cert. Manager et nous cliquons sur Add :

Ensuite, il convient d’ajuster les paramĂštres Ă  vos besoins, mais globalement on choisi un nom descriptif, on coche Ă©ventuellement la case Randomize Serial, le type de clĂ© (je vous conseille ECDSA quand c’est possible, ici la courbe utilisĂ©e Ă  savoir prime256v1 est compatible avec OpenVPN donc pas de soucis), puis on renseigne ensuite les paramĂštres plus classique (CN, Country Code, Province, City…).

Et c’est tout ! Notre CA est dĂ©sormais fonctionnelle. On pourrait Ă©ventuellement crĂ©er une CRL (fichier regroupant les diffĂ©rents certificats rĂ©voquĂ©s), mais ici cela reste un lab donc nous sauterons cette Ă©tape.

Vient ensuite la crĂ©ation de certificats pour nos deux sites distants ! Ici nous allons faire ça « proprement », c’est-Ă -dire que si vous ĂȘtes du genre pressĂ©, vous pouvez directement crĂ©er les deux certificats clients sur le pfSense principal (Paris ici en l’occurence), et les envoyer aux deux autres, ou bien vous pouvez vous rendre sur les deux autres et crĂ©er une CSR (une demande de certificat, pour faire simple), puis importer cette CSR sur le pfSense principal pour les signer et gĂ©nĂ©rer les deux certificats.

Bref, rendons-nous donc sur celui de Bruxelles, toujours dans la partie Cert. Manager !

Ici, on remplis donc les champs de maniĂšre classique, en choisisant bien le Certificate Type Ă  User certificate en bas de page. Et c’est tout !

Ensuite, dans la partie Certificates, nous avons un bouton permettant d’exporter la requĂȘte fraĂźchement créée :

On exporte le fichier, et on retourne sur Paris, toujours dans la partie Certificates :

Ici, on choisit donc Sign a CSR, on choisi la CA Root qui va signer le certificat (celle créée en dĂ©but d’article), puis on colle les donnĂ©es CSR dans l’endroit prĂ©vu, et c’est tout ! Bien vĂ©rifier qu’en bas de page User Certificate soit toujours choisi, et le compte est bon. Au passage, vous verrez sur la droite de la capture d’Ă©cran le contenu du fichier CSR.

On valide, et la demande est signée !

Pour ensuite mettre Ă  jour notre demande sur le pare-feux de Bruxelles, il nous faut donc exporter le certificat en cliquant sur l’icĂŽne adĂ©quat (Ă  ce stade, nous sommes toujours sur celui de Paris) :

Maintenant, avec ce fichier .crt en poche, on retourne une fois de plus sur celui de Bruxelles pour le mettre Ă  jour. Il nous suffit de cliquer sur « Update CSR » (l’icĂŽne en forme de crayon…), toujours dans la partie Certificates, puis de coller le contenu du certificat :

On valide, et le tour est jouĂ© ! Notre certificat est bien signĂ© 😀

Bien-entendu, il convient de rĂ©pĂ©ter cette opĂ©ration pour celui de New-York. L’avant-derniĂšre Ă©tape cĂŽtĂ© certificats est donc de crĂ©er un dernier certificat, mais un certificat de type Server cette-fois ci, qui sera donc toujours notre firewall de Paris. Rien de trĂšs compliquĂ© en soit, vous commencez Ă  connaĂźtre :

Et enfin (promis, on touche au but !) il convient d’exporter le certificat de notre CA Root sur nos deux clients. Pour ce faire, on se rend dans la partie CAs, puis nous cliquons sur le bouton Export certificate :

Ensuite, on clique sur Add sur nos clients et on importe notre certificat, rien de plus facile !

Cette-fois, c’est fini pour de bon cĂŽtĂ© certificats ! Passons au VPN lui-mĂȘme…

II) Création du serveur OpenVPN sur prs-fw-01

Toujours sur notre firewall principal, nous allons donc sans surprise dans la partie OpenVPN puis Servers.

Ici, nous rentrons notamment les informations suivantes :

  • Server Mode: Peer to Peer SSL/TLS ;
  • Local Port: 1194 (mais libre Ă  vous de le changer) ;
  • TLS Configuration: Use a TLS Key + Automatically generate a TLS Key
  • Peer Certificate Authority: CA-PARIS-01 (notre CA Root gĂ©nĂ©rĂ©e en dĂ©but) ;
  • Server Certificate: celui créé en dernier, certificat pour le firewall de Paris ;
  • ECDH Curve: prime256v1 ;
  • Data Encryption Algorithms: valeurs par dĂ©faut, Ă  noter que si vous possĂ©dez un pare-feu physique sous ARM, restreindre le choix de l’algorithme Ă  CHACHA peut ĂȘtre un bon choix, car les processeurs ARM n’ont pas les jeux d’instructions pour AES ;
  • Certificate Depth: One (Client + Server). Nous aurons créé une CA Intermedite (voir un autre de mes articles), nous aurions pu augmenter la profondeur ;
  • IPv4 Tunnel Network: 10.0.0.0/27 ;
  • IPv4 Local Network: 192.168.10.0/24 ;
  • IPv4 Remote Networks: 192.168.20.0/24,192.168.30.0/24 ;
  • Custom Options: ici nous pouvons Ă©ventuellement rajouter « tls-version-min 1.3 » pour des raisons de sĂ©curitĂ©, mais nous n’allons pas le faire ici. Cela peut ĂȘtre cependant trĂšs intĂ©ressant dans le cadre de VPN client-2-site !

Et c’est tout ! Pas si mal tout de mĂȘme… on peut donc valider et voilĂ  notre serveur créé.

Passons donc aux clients désormais !

III) Configuration des clients OpenVPN

Commençons par Bruxelles, à noter que ce que nous allons faire ici sera donc à répliqué sur Paris aussi.

Toujours dans la partie OpenVPN, on se rend sur Clients cette-fois ci, puis Add.

Les champs intéressants sont les suivants :

  • Server Mode: Peer to Peer (SSL/TLS) ;
  • Server Host: 192.168.1.50 ;
  • TLS Configuration: Use a TLS Key, + copier/coller la clĂ© TLS créée sur le serveur OpenVPN (sur le firewall de Paris donc) ;
  • Peer Certificate Authority: CA-PARIS-01 ;
  • Client certificate: CERT-OPENVPN-BXL-FW-01 ;
  • IPv4 Tunnel Network: 10.0.0.0/27 ;
  • IPv4 Remote Network: 192.168.10.0/24 ;
  • Gateway creation: Both (mĂȘme si nous n’utilisons pas IPv6 ici) ;

Et c’est tout bon ! On peut donc valider, et rĂ©aliser le mĂȘme processus cĂŽtĂ© New-York.

En redémarrant ensuite le service OpenVPN cÎté serveur (et éventuellement cÎté Client), vous devriez obtenir ceci :

Nos deux sites sont bien reliĂ©s ! Mais se pose alors une question… au niveau du routage, si un client prĂ©sent Ă  Paris souhaite communiquer avec New-York ou bien Bruxelles, comment pfSense sait quelle route emprunter ?

C’est ce que nous allons voir ici !

IV) RĂšgles de pare-feux, Client Specific Overrides, et tests finaux

Car oui, la premiĂšre Ă©tape avant toute chose est d’autoriser la communication… donc pour cela, rendez-vous dans Firewall, puis Rules, et enfin OpenVPN :

Ici nous rajoutons une simple rĂšgle autorisant tout le trafic, ni plus, ni moins ! Libre Ă  vous de l’adapter bien-entendu.

Ensuite, on peut vĂ©rifier si Paris arrive Ă  ping l’interface LAN de Bruxelles et de New-York :

Ce n’est pas le cas… pas de soucis, on va vĂ©rifier ça par la suite. Quid de Bruxelles ou New-York Ă  destination du LAN de Paris justement ?

Ah ! Ici, ça fonctionne ! Donc nos clients arrivent Ă  accĂ©der au LAN de notre site principal, mais ce dernier n’arrive pas Ă  accĂ©der Ă  leurs LAN…

Et oui, il faut indiquer Ă  pfSense (ou plutĂŽt, Ă  OpenVPN) quel chemin utiliser pour quel LAN… on se rend donc dans la partie Client Specific Overrides d’OpenVPN, sur notre firewall de Paris.

Ici, il faudra donc rajouter une premiĂšre configuration pour BXL puis ensuite pour NY. Rien de trĂšs sorcier :

On choisi notre serveur OpenVPN (nous n’en avons qu’un), puis on renseigne le CN du certificat utilisateur utilisĂ© par le client distant, avec une Ă©ventuellement description (ici j’ai remis le CN mais libre Ă  vous de mettre autre chose).

Plus bas on ré-écrit les paramÚtres réseaux, càd le network pour le tunnel VPN, le LAN, et enfin le Remote network.

Et c’est tout, Ă  faire de mĂȘme pour celui de NY en adaptant les valeurs bien-entendu.

Et désormais, si on retente un ping de NY par exemple vers Paris :

Toujours fonctionnel, et maintenant de Paris Ă  NY :

It works désormais ! Vous avez donc votre VPN Site-to-Site sur base de topologie Hub&Spoke ! Pas mal !

Cet article est Ă  prĂ©sent terminĂ©, j’espĂšre comme d’habitude vous avoir appris quelques bricoles voir plus, et je vous reviens bientĂŽt pour d’autres articles (aprĂšs une bonne pĂ©riode Ă  bas-rĂ©gime) ! 😉

10 comments

comments user
Bergeon Gaël

Bonjour Anthony,

Un petit commentaire pour te remercier du travail que tu as fait !
J’ai testĂ© plusieurs solutions pour relier les 2 sites distants en VPN au siĂšge de mon entreprise, aprĂšs quelques couacs je suis tomber sur ton Blog, et ta solution fonctionne Ă  merveille ! 😊
Encore merci pour le travail effectuĂ©, surtout au niveau des certificats ou ça devient vite un casse-tĂȘte.

Gaël

    comments user
    Mairien Anthony

    Hello Gaël,

    Merci Ă  toi d’avoir pris le temps de lire mon blog mais aussi de laisser un commentaire !

    Ca fait vraiment plaisir, et ravi d’avoir aidĂ© 🙂 !

      comments user
      Gaël

      Avec plaisir !
      Au cas oĂč, Ă  partir du moment ou j’ai paramĂ©trĂ© les rĂšgles Client Specific Overrides, les liaisons fonctionne, Mais aprĂšs redĂ©marrage des services OpenVPN, mes 2 sites distants ont la mĂȘme IP virtuel, Ă  savoir 10.0.0.0 !
      Ça fonctionne toujours et je trouve ça Ă©trange d’ailleurs

      Est-ce normal pour toi ?

        comments user
        Mairien Anthony

        LĂ  comme ça je pencherai plus pour un bug d’affichage… surtout si c’est une adresse rĂ©seau qu’ils ont (10.0.0.0)… as-tu essayĂ© de redĂ©marrer le service OpenVPN ? Ou mĂȘme entiĂšrement les deux pfSense ?

          comments user
          g

          J’ai redĂ©marrĂ© tous les services mais pas les PfSenses, en prod donc un peu compliquĂ©. Je reproduis l’infra en virtuel sur VmWare chez moi pour faire des tests !

comments user
Grisvald

Bonjour, j’ai appliquĂ© votre procĂ©dure mais cela ne fonctionne pas et j’obtiens dans les logs OpenVPN l’erreur AEAD Decrypt error: cipher final failed. Avez vous une idĂ©e s’il vous plait ?

    comments user
    Mairien Anthony

    Hello Grisvald, on dirait une erreur par rapport aux algorithmes de chiffrement… as-tu vĂ©rifiĂ© que les mĂȘmes algorithmes sont choisis pour les clients et le serveur ?

    Par exemple si tu utilises du AES ou du CHACHA-POLY cĂŽtĂ© serveur, les clients doivent ĂȘtre configurĂ©s de la mĂȘme façon.

      comments user
      Grisvald

      Merci d’avoir rĂ©pondu. Oui j’ai essayĂ© avec du CHACHA-POLY seul de chaque cĂŽtĂ© ou la conf par dĂ©faut mais toujours la mĂȘme message d’erreur.

        comments user
        Grisvald

        Bonjour,
        cela fonctionne enfin.
        J’ai utilisĂ© une autre procĂ©dure que je vous donne si cela peut vous servir : https://docs.netgate.com/pfsense/en/latest/recipes/openvpn-s2s-tls.html
        J’y ai notĂ© quelques diffĂ©rences comme la durĂ©e du certificat serveur, la dĂ©claration des rĂ©seaux du VPN…
        En tout cas, je vous remercie d’avoir rĂ©pondu Ă  ma question et de faire vivre votre site.
        Bon courage Ă  vous

comments user
TCHEMEBE

J aimerai avoir booster mes connaissances avec des sujets pratique de ce genre