Création d’un VPN Site-to-Site

Written by Sebastien Lambot on . Posted in Réseaux, Unix / Linux

Un tunnel VPN (Virtual Private Network) permet de connecter deux réseaux distants comme si ils étaient sur le même LAN. sa mise en plce nécessite quelques connaissances en réseaux mais n’est pas bien compliquée.

Design

Le site-to-site VPN peut être résumé par la schéma suivant:

vpn_schema2

Prérequis: 2 sites ayant chacun un subnet différent, un serveur DNS, et une adresse IP WAN statique ou un FQDN.

Quel type de VPN?

Il existe plusieurs technologies VPN, dont nous en retiendrons 2 principales:

  • IPSec: recommandé pour du site-to-site avec des IP WAN statiques, intégré à la plupart des OS.
  • OpenVPN: recommandé pour du client-to-site et du site-to-site avec des IP WAN dynamiques.

(L2TP et PPTP n’étant pas sécurisés, nous vous déconseillons de les utiliser)

Matériel

Dans le cadre de cet article, nous utiliserons un PFsense2 en mode routeur derrière un modem BBox Belgacom pour le site 1 (site principal), tandis que pour le site 2 nosu utiliserons un firewall/routeur PFsense2 connecté en PPPoE.

Pour des encryptions plus lourdes, je vous recommande d’ajouter à vos serveurs VPN des cartes d’encryption hardware afin de soulager les processeurs de tous ces calculs.

IPSec site-to-site

La configuration va se faire en plusieurs étapes:

  1. configuration VPN sur les PFsense des sites 1 et 2
  2. mise en place des firewall rules IPSec sur les PFsense des sites 1 et 2
  3. Ajout du DNS distant
  4. mise en place des règles firewall pour l’interface WAN du site 2
  5. « port triggering » et « port forwarding » sur le modem BBox du site 1
  6. Activation du tunnel
  7. troubleshooting

Configuration VPN des PFsense

Allez dans le menu « VPN > IPSec > onglet Tunnels », activez IPSec et ajoutez une entrée (phase 1 sur 2 de la création du tunnel).

  • Entrez le « remote gateway » qui correspond à l’adresse IP WAN ou au FQDN de l’autre site.
  • Configurez « My identifier » et « Peer identifier », qui représentent les identifiants de connexions du site 1 et du site 2. J’ai choisi d’utiliser des « distinguished names » auxquels j’ai assigné les FQDN de mes 2 sites, mais vous pouvez très bien choisir une des autres options, du moment que la configuration soit identique sur les 2 sites (en inversant bien sûr les infos « local » et « remote »).
  • Entrez la clé qui sera utilisée pour l’authentification. N’hésitez pas à en créer une longue, vous ne devrez de toute façon pas la retenir.
  • Pour l’algorithme d’encryption, j’ai opté pour du AES en 256 bits avec un hash en SHA256 et une clé sur 1024bits. C’est la configuration recommandée pour une connexion correctement sécurisée.
  • Et enfin vous pouvez désactiver le NAT-traversal, pusique les protocoles nécessaires seront correctement acheminés d’un point à un autre.

vpn_phase1

Une fois que c’est fait, vous pouvez créer les paramètres de la phase 2 (le signe « + » sous l’entrée que vous venez de créer):

  • Choisissez « tunnel IPv4 » et entrez les informations concernant les réseaux locaux et distants afin qu’un routage correct puisse se faire.
    Seul le trafic spécifié sera routé au travers du tunnel VPN, le trafic local et internet sera donc traité normalement.
    Petite astuce: si vous voulez diriger l’entièreté du trafic vers le tunnel VPN, il suffit de mettre 0.0.0.0/0 comme « remote network » sur le PFSense du site distant.
  • Spécifiez également les protocole ESP et sélectionnez uniquement les algorithmes d’encryption et de hashages configurés précédemment (AES 256 et SHA256)
  • Le champ « automatically ping host » est optionnel et n’est pas rempli en général. Il permet de fournir l’adresse IP d’une machine du réseau distant afin de la pinger de temps en temps pour garder le tunnel actif, ce qui n’est pas nécessaire puisque le tunnel le fait automatiquement.

vpn_phase2a

Après avoir enregistré vos changements, vous devriez obtenir ceci:

vpn_phase2

Le bouton entouré en rouge sert à redémarrer le service VPN (racoon).

Création des Firewall Rules propres au tunnel

Dans le menu « Firewall > Rules > onglet IPSec », ajoutez les règles suivantes, ceci permettra d’autoriser les communications au travers du tunnel (ainsi que l’ICMP pour les ping):

vpn_fw1

Ajout du DNS distant

Dans le menu « Services > DNS Forwarder », tout en bas de la page, ajoutez un « Domain Overrides » (sur les PFsense des sites 1 et 2, en adaptant les valeurs):

vpn_dns

 

« Domain » est le domaine distant (il peut être le même que votre domaine local). Vous devez également indiquer l’IP du serveur DNS distant dans le champ « IP address ».
L’IP source correspond à l’IP de votre serveur DNS local.

Règles firewall sur le PFsense du site 2 (PPPoE)

Ces règles vont servir à laisser entrer les connections IPSec sur l’interface WAN du PFsense du site 2 (connecté en PPPoE).
Allez dans le menu « Firewall > Rules » et créez les règles suivantes sur l’interface WAN:

vpn_fw_pppoe

Port Triggering et Port Forwarding sur le modem BBox2

Sur le site 1, nous disposons d’un PFsense en mode routeur, car les connections entrantes arrivent sur notre BBox2.
Afin que celle-ci gère correctement le trafic lié au tunnel VPN IPSec, nous devons lui configurer quelques paramètres:

  1. Configurer le port forwarding dans le menu « Advanced Settings > LAN Servers » en redirigeant le port 500 (ISAKMP) vers le serveur VPN:
    vpn_bbox1La « Local IP Address » est l’adresse IP du PFsense du côté WAN.
  2. Dans le menu « Advanced Settings > Firewall > Port Triggering », ajoutez le triggering des protocoles 50 (ESP) et 51 (AH) lorsque le port 500 UDP est utilisé:
    vpn_bbox2

Activation du tunnel

Pour activer le tunnel, vous devez aller sur le PFsense (peu importe le site), dans le menu « Status > IPSec ». Après avoir cliqué sur le bouton de connexion, vous devriez obtenir ceci:

vpn_status

 

Si vous obtenez une flèche verte, votre tunnel est établi et vous pouvez dès à présent le tester en pingant une adresse IP ou un nom DNS du site distant.
N’hésitez pas à faire un test de bande-passante avec iperf ou xjperf (le même mais en GUI Java pour les adeptes de Windows) afin de pouvoir comparer avec une config en OpenVPN par exemple.
Dans mon cas, la bande-passante entre les sites correspond à l’upload rate de chacun des sites:

vpn_iperf2 vpn_iperf1

Si par contre vous continuez à avoir une croix jaune (ou que votre ping a foiré), je vous invite à lire la section Troubleshooting (après avoir revérifié que tous les points ci-dessus ont étés configurés correctement).

Troubleshooting

Si votre tunnel ne parvient pas à s’établir, je vous conseille d’aller dans le menu « Status > IPSec > onglet Logs », de faire un « Clear Log » (sur les 2 PFSense) et de relancer la connexion afin de voir quels sont les messages d’erreurs.

Il est primordial de vérifier les logs sur les 2 PFsense car si le message peut paraître peu clair sur un site (genre « timeout reached, could not complete phase1 »), il peut être beaucoup plus explicite sur l’autre.

Si aucun log n’apparaît sur le serveur VPN distant, il s’agit soit d’un problème dans vos règles firewall, soit d’une erreur au niveau des records DNS du serveur VPN local, ce qui arrive fréquemment lors du changement d’adresse IP WAN lorsque l’on utilise des enregistrements DDNS.
Un petit conseil, vérifiez en premier lieu que les adresses IP publiques des deux sites soient correctes dans les logs. Si elles ne le sont pas, il se peut que le cache DNS conserve une ancienne adresse IP. Pour corriger celà, vérifiez que vos Dynamic DNS sont à jour (« Services > Dynamic DNS ») et redémarrez le service dnsmasq (« Status > Services »).

Une fois que vous obtenez un message d’erreur pertinent, je vous invite à consulter les forums, car vous n’êtes sûrement pas le premier à être confronté à un tel problème.

OpenVPN site-to-site

L’implémentation d’OpenVPN est un peu plus simple et fonctionne en mode client-serveur, contrairement à IPSec.

La configuration se fait en plsuieurs étapes:

  1. Configuration du serveur OpenVPN (site 1)
  2. Création des règles firewall et des port forwarding
  3. configuration du client OpenVPN (site 2)
  4. Test et troubleshooting

Configuration du serveur OpenVPN (site 1)

La création du serveur OpenVPN se fait dans le menu « VPN > OpenVPN > Server »:

vpn_openvpn_config

Pour du site-to-site, l’authentification par shared key est tout-à-fait suffisante. Le tunnel est créé sur un port UDP car en cas de perte de paquets, ceux-ci seront retransmis, ce qui ferait double usage avec TCP et affecterait légèrement les performances.

Pour l’algorithme d’encryption, il est recommandé d’utiliser AES-256 qui présente une sécurité suffisamment élevée pour le moment. La clé sera générée automatiquement dès que la config aura été sauvée. Vous pourrez revenir sur cette page par la suite pour copier la clé;

Dans les paramètres suivants, l' »IPv4 Tunnel Network » définit le subnet utilisé à l’intérieur du tunnel. Vous pouvez lui assigner le subnet 10.0.8.0/30 comme recommandé. Les adresses de ce subnet ne seront utilisées que par le VPN.

Il vous faut ensuite spécifier les subnet des « Local Network » et « Remote Network » (192.168.2.0/24 et 192.168.100.0/24 pour notre exemple).

Je vous recommande également d’activer la compression LZO, qui permet d’observer un gain significatif au niveau de la bande-passante du tunnel.

Si votre serveur PFSense est virtualisé, vous devrez configurer son vswitch pour que celui-ci soit dans le mode promiscuous, sinon certains paquets liés au tunnel ne pourront pas passer.

Création des règles firewall et du port forwarding

Sur l’interface WAN du site 1, vous pouvez configurer la règle suivante:

vpn_openvpn_fw

Et sur l’interface OpenVPN des sites 1 et 2, vous pouvez ajouter les 2 règles permettant le trafic TCP/UDP et ICMP:

vpn_openvpn_fw2Ensuite, au niveau de la BBox, il faut créer la redirection du port 1194 (par défaut) vers notre serveur OpenVPN dans le menu « LAN Servers »:

vpn_openvpn_bboxConfiguration du client OpenVPN (site 2)

Commencez par copier la clé générée automatiquement sur la page de config du serveur OpenVPN, nous en aurons besoin pour configurer le client.

Sur le PFSense du site 2, dans le menu « VPN > OpenVPN > client », il suffit de configurer le client avec les infos correspondant au serveur, les champs ont quasi les mêmes intitulés.

Test et troubleshooting

Dans le menu « Status > OpenVPN », vous pourrez voir directement le statut du tunnel OpenVPN. Normalement celui-c doit être UP et indiquera les clients connectés ainsi que la quantité de données transférée.

Les logs se trouvent dans le menu « Status > Systme Logs > OpenVPN » et sont souvent assez explicites.

Pour tester la bande-passante de votre tunnel, vous pouvez lancer un test iperf. Si vous avez activé la compression LZO, ne vous étonnez pas d’avoir un taux de transfert supérieur à l’upload de votre ligne:

openvpn_iperf

En cas de perte de connexion, le tunnel OpenVPN tente de se reconnecter automatiquement toutes les minutes (environ).

Pour éviter les problèmes liés aux updates de Dynamic DNS, il est recommandé d’installer le package « cron » et de modifier la ligne contenant la commande d’update dyndns pour qu’elle soit exécutée toutes les 15 minutes (au lieu d’être exécutée uniquement à 1:01):

*/15	*	*	*	*	root	/usr/bin/nice -n20 /etc/rc.dyndns.update

Conclusion

D’un point de vue personnel, je trouve que OpenVPN est plus simple à configurer et offre de meilleures performances grâce à sa compression.

Mis à part ces différences, les 2 technologies se valent tout-à-fait et le choix entre l’une ou l’autre dépend des préférences de chacun, ainsi que de la compatibilité avec d’autres matériels (comme par exemple les Cisco ASA qui ne supportent pas OpenVPN).

Nous n’avons vu qu’une utilisation basique des fonctionnalités, il existe plein de paramètres supplémentaires qui peuvent être ajoutés à la config pour des besoins plus particuliers. N’hésitez pas à consulter la doc et les forums pour en savoir plus.

Tags: , ,

Trackback from your site.

Comments (2)

  • VPN | Pearltrees

    |

    […] Création d'un VPN Site-to-Site. Un tunnel VPN (Virtual Private Network) permet de connecter deux réseaux distants comme si ils étaient sur le même LAN. sa mise en plce nécessite quelques connaissances en réseaux mais n’est pas bien compliquée. Design Le site-to-site VPN peut être résumé par la schéma suivant: Prérequis: 2 sites ayant chacun un subnet différent, un serveur DNS, et une adresse IP WAN statique ou un FQDN. Quel type de VPN? Il existe plusieurs technologies VPN, dont nous en retiendrons 2 principales: IPSec: recommandé pour du site-to-site avec des IP WAN statiques, intégré à la plupart des OS.OpenVPN: recommandé pour du client-to-site et du site-to-site avec des IP WAN dynamiques. (L2TP et PPTP n’étant pas sécurisés, nous vous déconseillons de les utiliser) Matériel Dans le cadre de cet article, nous utiliserons un PFsense2 en mode routeur derrière un modem BBox Belgacom pour le site 1 (site principal), tandis que pour le site 2 nosu utiliserons un firewall/routeur PFsense2 connecté en PPPoE. […]

    Reply

  • Sebastien Lambot

    |

    Avec un peu de recul, les solutions VPN intégrées aux firewalls SOPHOS sont bien plus faciles à mettre en place et à sécuriser. La combinaison d’un firewall SOPHOS et d’un RED (Remote Ethernet Device) est le moyen le plus rapide et le plus aisé de créer un (ou plusieurs) VPN site-to-site.

    Reply

Leave a comment

You must be logged in to post a comment.