Présentation de mon « cloud » personnel

Je possède une plateforme en ligne me permettant entre autres d’assouvir ma curiosité IT mais également de répondre à plusieurs besoins – que je me suis moi-même créé, d’ailleurs. Après avoir eu pendant longtemps un serveur (généralement sous Debian), il y a quelques temps j’ai décidé de passer sur une plateforme virtualisée afin de séparer chaque fonctionnalité de mon nuage et de gérer les choses plus facilement. Initialement sous Proxmox VE, je suis passé sous VMware après l’avoir pratiqué dans un contexte professionnel. Le but de cet article est d’essayer de présenter ce nuage, ce que j’en fais, comment je l’ai pensé et comment il vit.

Tout d’abord, ce nuage est basé sur une seule machine physique. Il s’agit d’un serveur que je loue chez SoYouStart qui est le milieu de gamme de chez OVH (l’entrée de gamme étant assurée par Kimsufi et le haut de gamme par OVH lui-même). Sa configuration est la suivante :

  • CPU : AMD Opteron 4334 à 6 coeurs, 6 threads et 3.1 GHz
  • RAM : 32 Go DDR3 1333 MHz
  • HDD : 2 x 3 To SATA, configurés en RAID 1
Il s’agit de la configuration OP-SAT-1-32. Après plusieurs années sur un modèle moins puissant fonctionnant sous Proxmox VE, j’ai fait ce choix car les 32 Go de RAM sont le minimum dont j’ai besoin dans le cadre de la virtualisation afin de ne pas dimensionner un peu court les machines ; le processeur plutôt puissant suffit à toutes les tâches et ne peine pas face à de multiples décodages de vidéos en 1080p sur Plex ; les disques durs, bien que simples SATA en 7200rpm suffisent même si le confort des SSD que j’ai pu essayer manque à l’appel, en ayant en contrepartie un espace suffisant pour tout type de machine virtuelle.
La couche de virtualisation est un VMware ESXi 6.5u1. Elle héberge donc – entre autres, je ne vais présenter que les machines qui sont permanentes – :
  • 1 appliance pfSense, fonctionnant sous BSD ;
  • 2 contrôleurs de domaine sous Windows Server 2012 R2 ;
  • 1 serveur de fichiers sous Windows Server 2012 R2 ;
  • 1 serveur applicatif sous Windows Server 2012 R2 ;
  • 1 serveur RDP sous Windows Server 2012 ;
  • 2 serveurs multimédia Plex sous Debian ;
  • 1 serveur applicatif sous Debian ;
  • 1 serveur VPN sous Debian ;

L’appliance pfSense : 1 vCPU et 512 Mo de RAM

J’en ai déjà parlé dans ce billet. pfSense est un serveur BSD pouvant entre autres remplir le rôle de routeur/pare-feu. Etant donné qu’à la différence de Proxmox VE qui permet de faire du NAT nativement grâce à iptables, l’adoption de VMware m’a forcé à passer par une solution tierce pour mettre en réseau mes machines virtuelles derrière un pare-feu en n’utilisant qu’une seule IP publique. Mon serveur fonctionne donc avec deux adresses IP : l’une utilisée par la carte physique, l’autre en IP failover utilisée par l’interface virtuelle de pfSense et qui sert d’IP publique pour mes machines virtuelles et de base pour le routage des paquets vers les bons ports.

Les contrôleurs de domaine : 1 vCPU, 2 Go de RAM et 120 Go d’espace disque par DC

Je pourrais très bien fonctionner avec un seul contrôleur de domaine étant donné que je ne possède qu’un seul serveur pour héberger toutes mes machines et qu’il n’y a aucune notion de haute disponibilité. Cependant, ayant déjà eu le cas d’un contrôleur de domaine complètement planté suite à une mise à jour qui s’est mal déroulé sur une précédente infrastructure personnelle, je préfère en avoir deux fonctionnant de concert ce qui me permet de toujours avoir le domaine même si une mise à jour ou un plantage grave arrive sur l’un (corruption du fichier VMDK par exemple, ce qui m’est déjà arrivé).
Le premier porte tous les rôles (FSMO, PDC…), les deux ont le rôle DNS et ont été installés avec l’interface graphique. C’est un point que je souhaite changer prochainement et qui fera sans doute l’objet d’un billet. Ayant toutes les consoles d’administration sur une autre machine, je ne m’y connecte que très rarement et fonctionner uniquement en mode core pourrait limiter la consommation – déjà très faible – de ressources.

Le serveur de fichiers : 2 vCPU, 3 Go de RAM et 3 disques virtuels pour un total de 720 Go

Ce serveur fonctionnant sous 2012 R2 me sert pour stocker une partie de mon OneDrive, ainsi qu’héberger divers espaces partagés entre les machines (sources d’applications, scripts, téléchargements, bases de données…). J’y stocke également les sauvegardes des serveurs Windows que je réalise grâce à l’outil intégré. Afin d’avoir une compatibilité maximale avec les applications, ce serveur fait fonctionner un serveur FTP fonctionnant sous FileZilla.

Le serveur applicatif sous Windows : 2 vCPU, 3 Go de RAM et 2 disques virtuels de 120 Go

J’utilise cette VM pour faire fonctionner des applications qui ont besoin d’un environnement Windows (ou qui sont plus faciles à faire fonctionner ou configurer sous Windows). Je m’en sers principalement pour faire fonctionner un serveur Minecraft personnel ou d’autres serveurs de jeux, afin de ne pas avoir à conserver les fichiers et exécuter le serveur dédié sur mon propre PC personnel. Cela me permet également de donner accès à des personnes de ma famille qui sont en dehors de mon réseau personnel. 

Le serveur RDP : 2 vCPU, 2 Go de RAM et 120 Go d’espace disque

C’est ce serveur qui permet de rebondir sur le reste du réseau et le seul RDP à être ouvert sur l’extérieur. Plutôt que d’ouvrir les RDP ou les bureaux graphiques des autres machines, j’ai préféré tout fermer et ne laisser l’accès que depuis cette seule machine afin de limiter le nombre de ports à nater. Cette VM possède ensuite tous les clients nécessaires à la connexion aux services VMware de l’hyperviseur, aux bureaux graphiques des machines Linux, PuTTY pour le SSH, sans oublier les consoles d’administration pour les services répartis sur les serveurs. Plus qu’un serveur de rebond, il s’agit également d’un serveur d’administration et c’est sur cette machine que je réalise la majorité de mes scripts. Pour des questions de sécurité, la connexion à cette machine se fait avec un autre compte utilisateur que les autres machines Windows, ce compte n’ayant aucun autre droit sur le domaine (et mon compte utilisateur standard n’ayant aucun droit sur le serveur RDP, seul mon compte d’administration ayant des droits transverses).

Les 2 serveurs Plex : 4 vCPU, 4 Go de RAM et 50 Go d’espace disque pour le premier, 1 vCPU, 2 Go de RAM et 100 Go d’espace disque pour le second

Pourquoi deux serveurs Plex ? Car ils fonctionnent différemment.
Le premier serveur Plex, avec sa grosse configuration, est dédié à la diffusion de contenu vidéo. Films, séries, concerts, émissions TV… tout ce qui peut demander une bonne puissance de calcul en cas de diffusion sur un appareil qui ne peut décoder le flux directement (comme un iPad). Comme je l’ai expliqué dans ce billet, le contenu n’est pas stocké directement sur le serveur, mais en ligne, sur Google Drive. J’utilisais auparavant Amazon Drive mais le blocage complet de l’API suivi d’un changement des grilles tarifaires m’a fait résilier mon abonnement pour me diriger vers celui de Google, qui s’est avéré plus fiable, plus rapide pour pas beaucoup plus cher dans l’absolu (8 euros par mois contre 70 euros à l’année). Afin de supporter le streaming sur plusieurs appareils (généralement un seul, mais 3 devant être un nombre géré sans problème avec du 1080p), il a fallu dimensionner correctement la machine et 4 cœurs virtuels sont suffisants.
Le deuxième serveur Plex à la configuration bien plus modeste est dédié à la diffusion de contenu audio. La musique est stockée directement sur le disque de la machine virtuelle afin de ne pas avoir à faire des appels à l’API de Google Drive sans arrêt à chaque changement de piste, sans compter que 100 Go sont aisément disponibles sur l’hyperviseur.

Le serveur applicatif Debian : 2 vCPU et 2 Go de RAM pour 120 Go d’espace disque

Cette VM héberge un serveur web, un serveur de base de données MySQL, ainsi que quelques autres applicatifs web. L’usage est principalement local, certaines applications dont je me sers peuvent avoir besoin d’une base de données, par exemple. Grâce à des scripts conçus sous Webmin, les bases de données ainsi que certains fichiers sont sauvegardés sur le serveur de fichiers, qui lui-même les sauvegarde par la suite sur OneDrive, ce qui me permet de pouvoir restaurer à un instant T si besoin.

Le serveur VPN : 1 vCPU et 1 Go de RAM pour 10 Go d’espace disque

Afin de pouvoir profiter de réseaux Wi-Fi publics sans me sentir « nu », ce petit serveur VPN est idéal. Fonctionnant sur une base d’OpenVPN Access Server, l’installation et la configuration se font très facilement, et des clients existent aussi bien pour les ordinateurs que les appareils mobiles. Je m’en sers dès que je suis sur un réseau Wi-Fi qui n’est pas celui que j’utilise à la maison. 
Et c’est déjà pas mal ! J’ai également possédé pendant quelques temps un serveur de messagerie personnel, lié à mon nom de domaine, dont je me servais à des fins personnelles, connecté à mes clients de messagerie ou accessible via un webmail. Fonctionnant sous Debian avec Postfix et Dovecot, lorsque j’ai repensé intégralement l’architecture en adoptant VMware, j’ai décidé de ne pas conserver la messagerie personnelle. Trop peu d’utilité et de confort par rapport à mon usage : sauvegarde horaire de la boîte aux lettres, adresse considérée chez certains destinataires comme spam, difficulté de configuration… Concernant le dimensionnement des machines, il est plutôt large, et d’ailleurs, si toutes les machines devaient occuper 100% de leurs vCPU, cela saturerait l’hyperviseur ; cependant, très peu de risque que cela arrive. En moyenne, le CPU tourne entre 5 et 10% de ses capacités, avec une moyenne à 30% lors de la diffusion de médias via Plex. Actuellement, le serveur en est à 245,24 jours de fonctionnement… et ça n’est pas prêt de s’arrêter.

Accéder à un serveur FTP situé derrière un routeur

Un ami qui partait en vacances et qui souhaitait sauvegarder les vidéos de son drone afin de pouvoir libérer la mémoire interne avait besoin d’un espace en ligne pour déposer les fichiers car sa tablette Android n’avait pas une capacité suffisante. J’ai donc ouvert sur le web mon serveur FTP personnel situé sur mon Cloud personnel. Je vais donc détailler les quelques pas nécessaires à la bonne configuration du serveur FTP afin qu’on puisse y accéder depuis le web même si il est situé derrière un routeur.

J’ai réalisé cette opération en me servant d’un routeur virtuel pfSense car mon serveur FTP est hébergé sur un serveur vSphere ESXi, ainsi que de FileZilla Server pour Windows, sur un 2012 R2. Pour des raisons de simplicité, j’ai utilisé le port 21 afin d’éviter des incompatibilités avec les clients FTP disponibles sur Android.

Etant donné qu’il est placé derrière un routeur, le serveur ne doit pas agir en mode actif, mais en mode passif. Le mode passif nécessite d’être configuré dans FileZilla, car afin de fonctionner correctement, il faut lui spécifier l’IP externe de la machine physique, c’est à dire, par exemple, 87.32.38.143, et non l’IP du serveur FTP sur le réseau local, qui pourrait être 192.168.1.2. Ensuite, un range de ports pour que le mode passif fonctionne, et le tour est joué.

A titre d’exemple, j’ai utilisé le range de ports 30000-30100 car il n’était utilisé par aucune autre application sur l’hyperviseur.

Il faut maintenant ouvrir et router correctement les ports, ce qui n’a rien de difficile. Sur pfSense, il m’a suffit de rediriger vers le serveur FTP les requêtes TCP sur le port 21 sur le range 30000 à 30100. Le test montre bien que tout communique sans problème :

Création d’un routeur et pare-feu pour un serveur ESXi avec l’appliance pfSense

Lorsque je suis passé de Proxmox VE qui est un hyperviseur basé sur Debian à vSphere ESXi, il m’a fallu trouver une nouvelle solution pour faire du routage d’adresses vers mes machines virtuelles car je ne veux pas utiliser une adresse IP par machine virtuelle. Si Proxmox VE permet cela nativement car basé sur Debian il possède iptables, ESXi n’a rien par défaut. Cependant, grâce à pfSense, il est possible d’ajouter cette fonctionnalité, pour peu que l’on soit en mesure d’avoir une deuxième IP différente de celle de l’ESXi à affecter (chez les prestataires louant des serveurs, une telle IP est généralement appelée une IP failover).

pfSense est une appliance faisant office – entre autres – de pare-feu, de routeur, de serveur DHCP, de serveur DNS, etc. basée sur BSD. Il existe une version gratuite que l’on peut récupérer sur le site web officiel. Dans cet article, je vais donc expliquer comment utiliser pfSense pour faire du NAT sur un serveur ESXi.

J’ai réalisé ces manipulations sur un serveur vSphere ESXi de test en version 6.0u2 – avec une licence gratuite. Je pars du principe que vous avez un minimum de connaissances de l’interface web ou du vClient, par conséquent je ne vais pas systématiquement réaliser des captures d’écran ou détailler le chemin à effectuer pour trouver où effectuer les réglages. Les captures d’écran peuvent être agrandies en cliquant dessus pour une meilleure visibilité.

1. Préparation côté vSphere

Le rôle de l’appliance va être de capter le trafic venant de l’internet pour le bloquer ou le rediriger vers les machines virtuelles hébergées. On va donc avoir deux vSwitch : un qui va servir pour le LAN, dans lequel nous placerons toutes les machines virtuelles ainsi que l’appliance pfSense, et un autre vSwitch qui servira pour le WAN, sur lequel seule l’appliance sera connectée.

Etant donné qu’il est évidemment nécessaire que le vSwitch WAN soit celui qui soit relié physiquement à la carte réseau du serveur, celui qui est créé par défaut par vSphere sera le vSwitch WAN. Il faut donc créer un nouveau vSwitch qui sera celui pour le LAN.

On valide en laissant les options par défaut, et on arrive normalement à quelque chose comme ceci – j’ai renommé l’étiquette du WAN afin qu’elle soit plus lisible.

Il faut maintenant récupérer l’ISO de pfSense, téléchargeable sur le site officiel. Une fois le fichier récupéré, on l’envoie sur le datastore puis on crée la machine virtuelle. pfSense occupe très très peu de ressources : 1 vCPU, 512 Mo de RAM et un disque virtuel de 8 Go suffisent. Lors de la création, le type d’OS à sélectionner sera « Free BSD ».

Ne pas oublier d’ajouter une deuxième carte réseau à l’appliance. Sous BSD, em0 sera le WAN et em1 le LAN.

Ensuite, il est nécessaire de modifier les paramètres de la machine virtuelle avant de la démarrer et d’installer le système. En effet, sur la carte WAN, nous allons déclarer l’adresse MAC de l’adresse IP que nous allons affecter à pfSense. Dans le cadre d’un serveur loué chez OVH par exemple, nous allons prendre une IP failover et utiliser l’adresse MAC de celle-ci. La carte LAN gardera une adresse MAC automatique gérée par vSphere.

L’adresse MAC de notre carte WAN sera celle de l’IP failover ou du matériel possédant cette IP.

Ensuite, il suffit de monter l’ISO depuis le datastore et de connecter le lecteur optique virtuel pour pouvoir démarrer la machine et laisser l’autoboot de pfSense agir.

2. Installation de pfSense

En démarrant pfSense, l’installeur va démarrer automatiquement si le mode rescue n’est pas sélectionné. Le premier écran permet de configurer rapidement l’installation.

Les options par défaut vont bien, bien qu’il soit possible de configurer le clavier, cela n’importe peu car une fois le système redémarré, nous allons rebasculer sur un clavier en-us. A l’étape suivante, nous allons choisir la « Quick / Easy Install » et le « Standard Kernel ». Ensuite, nous allons redémarrer. Par défaut, l’accès à l’interface d’administration est 192.168.1.1 et les logins admin / pfsense. Après le premier redémarrage, le système va se préconfigurer, cela peut prendre quelques minutes. A l’issue, il est possible de configurer l’appliance via le web ou via la console. L’installation est terminée lorsque nous arriverons sur cet écran post-boot.

C’est le moment de vérifier que tout est bien configuré. Normalement le WAN ressort sur l’interface em0 (sur VMware, cela doit être la carte WAN, situé sur le vSwitch0, avec l’adresse MAC de l’IP failover, la première carte de la machine) et le LAN ressort sur l’interface em1 (carte LAN, situé sur le vSwitch que nous avons créé au début, avec une MAC automatique, la deuxième carte de la machine).

3. Configuration de base de pfSense

Attention : la console de pfSense utilise un clavier en-us. Il est possible de changer la disposition du clavier en accédant au shell, cependant étant donné le peu de manipulations à faire en console, nous allons rester sur ce type de clavier.

La première chose à faire une fois l’écran accessible est de configurer les deux cartes. Même si l’interface LAN possède la bonne IP, nous allons faire une passe sur les deux. Nous allons donc saisir 1 comme option, et répondre à quelques questions :

  1. Création de VLAN : cela n’est pas important au départ, et peut très bien attendre la configuration par le web. Nous allons donc répondre « No » pour l’instant.
  2. L’interface pour le WAN nous est demandée. Il s’agit donc de notre première carte réseau sur la machine, donc em0 pour pfSense.
  3. L’interface pour le LAN nous est demandée : em1.
  4. Nous n’avons pas d’autres interfaces, nous laissons le champ vide et validons.
  5. Une confirmation est demandée : il suffit de valider.

Un petit temps de traitement est nécessaire et on retombe normalement sur l’écran principal. Nous allons maintenant configurer les adresses des deux interfaces.

En premier, l’interface WAN.

Il nous faut renseigner l’adresse IP WAN (l’IP failover, ou celle reliée à l’adresse MAC que nous avons saisi auparavant), le masque de sous-réseau et enfin la passerelle. Dans le cas d’une IP failover, il est fort probable que la passerelle soit l’IP en .254 à la fin. Ensuite, à moins d’avoir une IPv6, la seconde partie peut être passée – sinon, le même raisonnement que pour l’IPv4 est à appliquer. Ensuite, il est demandé si l’on veut basculer l’interface web sur du HTTP au lieu du HTTPS.

On revient ensuite à l’écran de base et nous allons répéter cette configuration mais pour la deuxième interface.

La configuration de la carte LAN est plus simple. 192.168.1.1 devient la passerelle pour les autres VM.

Il est possible d’activer le DHCP sur l’interface LAN à la fin de la configuration. Etant donné que nous allons installer une seule machine virtuelle sur la plateforme, cela a peu d’importance. Si l’option est sélectionnée, alors la plage d’adresses que le serveur pourra attribuer est demandée. La configuration de base est terminée, pfSense fonctionne.

4. Pour aller un peu plus loin

Nous allons déployer une machine virtuelle toute simple afin de tester le bon fonctionnement de pfSense et accéder à l’interface web bien plus pratique que le shell BSD. Une machine virtuelle fonctionnant sous Debian GNU/Linux fera parfaitement l’affaire. La petite image « netinst » pèse moins de 300 Mo et nécessite une connexion internet pour s’installer : le test idéal.

Une seule carte réseau pour la VM, celle du LAN.

Je ne vais pas faire une passe sur l’installation d’un système Debian. Cependant, l’installateur a bien pu configurer la machine virtuelle automatiquement grâce au DHCP que j’ai activé – sans cela, il aurait fallu saisir une adresse IP – par exemple 192.168.1.2 – et pfSense offre bien internet à la VM qui a pour IP de sortie notre IP failover, car les paquets sont téléchargés depuis les miroirs de Debian au fil de l’installation :

L’image « netinst » de Debian a besoin d’internet pour récupérer les paquets qui ne font pas partie du système de base. La machine a donc bien accès au net.

pfSense fonctionne donc très bien, puisqu’il est accessible et que l’appliance a fourni une adresse IP à ma machine virtuelle. On peut donc désormais se connecter à l’interface d’administration et passer par le petit assistant de configuration. Normalement, tout a été configuré par nos soins via la console – rien n’est à modifier pour l’instant. Enfin, à la fin, il est conseillé de changer le mot de passe d’administration.

Une fois libre, il est possible d’accéder à tout un tas de paramètres différents, mais nous allons seulement nous intéresser à la partie NAT dans ce billet, car les possibilités de pfSense sont très larges (sur mon infra perso, je m’en sers également comme serveur DHCP et DNS, par exemple). En allant dans Firewall > NAT, il est possible de créer des règles de redirection de ports. Par exemple, si je veux accéder en RDP à une machine VM Windows, il me suffit de créer une règle et de demander la redirection des bons ports :

Si 192.168.1.12 est l’IP de ma machine Windows, tout ce qui arrive sur le port 3389 de l’interface WAN (donc l’IP failover) est redirigé vers le port 3389 de ma machine Windows. Une fois la règle enregistrée, la configuration de pfSense doit être validée pour qu’elle rentre en action.

Pour faire un test de bon fonctionnement, je vais ouvrir le port 22 et le rediriger vers la VM.

L’écran de NAT de pfSense. Il est possible de catégoriser et de trier toutes les règles.

Une fois la configuration appliquée, il ne me reste plus qu’à ouvrir un client SSH et à tenter de me connecter.

La connexion est ouverte, je suis bien connecté en SSH sur ma VM depuis une machine extérieure.

Et voilà 😉

Afin de clore cet article, deux autres petites choses :

  • Il existe un paquet BSD pour les vmtools afin que la machine s’interface mieux avec ESXi. Dans System > Package Manager, il suffit de rechercher Open-VM-Tools et d’installer le paquet.
  • Dans Diagnostics > Backup & Restore, il est possible de faire un export XML de toute la configuration de pfSense. Cette sauvegarde est importante car en cas de crash, il est possible depuis l’install de pfSense de lui donner ce fichier XML pour que toute la configuration soit restaurée à l’identique.
L’écran des baux DHCP (Status > DHCP Leases), à partir duquel on peut transformer un bail temporaire en une réservation.