Blog

  • Wireguard, le nouveau VPN ?

    Wireguard, le nouveau VPN ?

    Il y a PPTP, L2TP, IPsec, SSTP, OpenVPN … et le petit « nouveau » Wireguard. Quels avantages trouvons-nous à utiliser ce nouvel outil ?

    Un système VPN intégré dans les kernels et performant

    Wireguard a un avantage assez intéressant vis à vis de ses concurrents, c’est qu’il n’y a aucun daemon qui tourne, c’est le noyau (kernel) qui fait tourner directement la solution. Ainsi, en principe, tant le kernel est vivant, les connexions VPN sont fonctionnelles, on bénéficie également de performances accrues puisque l’intégration est directe

    IPSec par exemple, sous Linux,vous demandera strongSwan par exemple pour que les tunnels fonctionnent

    Le système fonctionne très bien sous Windows, Linux et FreeBSD

    Une sécurité renforcée

    Grâce à un code minimaliste (seulement ~4 000 lignes de code contre ~100 000 pour OpenVPN), WireGuard limite les risques de vulnérabilités et facilite les audits de sécurité. Il utilise également un chiffrement moderne par l’utilisation de protocoles éprouvés comme ChaCha20 (chiffrement) et Poly1305 (authentification), combinés à des clés éphémères pour une protection maximale.

    Une configuration très simple

    Grâce à un système de clé privée / publique et quelques paramètres à indiquer dans le fichier de configuration, il est possible d’avoir une solution de VPN fonctionnelle très rapidement

    Dans quel(s) cas est-il utilisé chez Devclic ?

    Nous nous en servons beaucoup pour fournir des accès distant à notre réseau (pour nos collaborateurs par exemple), là où par exemple, nous ne voulons pas déployer une alternative comme une FTTH ou bien une FTTO

    Il permet facilement d’implémenter du Split Tunnel, ce qui veut dire que vous pouvez choisir de facilement router les paquets vers votre tunnel ou laisser la connexion normale les prendre en charge

    Nous nous en servons également pour interconnecter logiquement, certaines parties de notre réseau, si par exemple, nous réalisons un extend to cloud vers un cloud provider quelconque.

    Comment le configurer facilement ?

    Après avoir installé wireguard, on doit générer une clé privée et une clé publique, pour cela, wireguard propose une commande pour ce faire

    # Génération de la clé privée
    wg genkey > private/server.key
    # Génération de la clé publique
    wg pubkey < private/server.key > public/server.key

    Sur chaque client, on réalise cette opération.

    Concernant le serveur, on renseigne la clé privée que nous avons générée et sur les clients, on renseigne un Peer contenant la publickey du serveur

    Chaque Peer sur le serveur doit contenir la clé publique associée au client et côté client, il faut réaliser l’inverse, renseigner sa clé privée et fournir la clé publique au serveur

    [Interface]
    Address = 192.168.250.1/24
    ListenPort = 51820 # listener port
    PrivateKey = XXXXXXXXX
    Table = off
    
    [Peer]
    AllowedIPs = 192.168.250.2/32
    PublicKey = XXXXXXXXX
    
    
    [Peer]
    AllowedIPs = 192.168.250.3/32
    PublicKey = XXXXXXXXXX

    Une petite erreur que nous avons rencontrée au niveau de la partie Address qui est dans l’interface. Il faut bien renseigner le masque réseau global et non un /32. Si vous ne le faites pas, une partie des paquets ne sera pas gérée correctement.

    Le /32 ne soit se mettre uniquement que sur le Peer

  • Notre collecte 4G/5G permet de repousser les limites de la fibre

    Notre collecte 4G/5G permet de repousser les limites de la fibre

    Un client nous a contacté avec un besoin de pouvoir consulter des caméras installées, dans une copropriété, à distance. Après multiples recherches auprès des opérateurs grand public, aucun n’était capable de lui apporter une solution en utilisant la fibre optique, c’est là que nous avons mis tout notre savoir-faire et agilité à son service

    La problématique rencontrée

    Aucun opérateur grand public n’était capable de fournir un lien FTTH, en effet, sur les 100 logements, 100 prises ont été affectées et aucune prise en réserve n’est présente, rendant impossible l’utilisation de la FTTH dans ce cas précis (autrement, nous aurions déployé une FTTH à la place d’une connexion 4G / 5G)

    Notre porte de collecte 4G+/5G+ multi-opérateurs à la rescousse

    Depuis 2023, nous avons une collecte multi-opérateurs, à savoir Orange, SFR, Bouygues Telecom, nous permettant ainsi de couvrir de très nombreux besoins, du moment qu’une antenne 4G / 5G est à proximité du lieu.

    Cette porte de collecte nous permet d’attribuer des adresses IP publiques ou privées et de réaliser des interconnexions assez complexes, ce qui nous offre un champs de possibilité assez important

    Quelle solution avons-nous déployée ?

    Grâce à des tests terrain, nous avons pu choisir le meilleur réseau disponible et c’est Orange qui a été choisi pour cette copropriété.

    Déployé dans la chaufferie, un modem Telktonika GSM 4G+ / 5G+, géré par nos soins, est connecté au système de videosurveillance.

    Techniquement, le modem se connecte à nos LNS (L2TP Network Server) en vue d’établir un tunnel L2TP, ce tunnel L2TP se voit attribuer une adresse IP privée qui est transformée en un NAT sur une adresse IP publique, donnant un accès internet complet au système de vidéosurveillance.

    Le client, à travers un outil sur smartphone ou bien un ordinateur, peut consulter l’historique des mouvements enregistrés par les caméras et stockés sur l’enregistreur local

    En terme de tarif

    La solution coute moins cher qu’un abonnement FTTH classique, avec un prix cible d’une vingtaine d’euros / mois. Seul le modem 4G+/5G+ nécessite un investissement aux alentours de 1000 euros mais cet équipement, de qualité, a tendance à être résistant et endurant

  • Comment retrouver le port du switch sur lequel votre Linux est connecté ?

    Comment retrouver le port du switch sur lequel votre Linux est connecté ?

    Il nous arrive fréquemment, pour ne pas dire très régulièrement de brancher de nouveaux serveurs sur des switchs présents en datacenter. Certains prévoient à l’avance l’emplacement des ports, d’autres prennent à la volée, nous sommes plus dans le deuxième cas mais comment faisons-nous pour retrouver le port du switch sur lequel nous venons de connecter le serveur ?

    CDP / LLDP à la rescousse

    Nous utilisons tout simplement ces protocoles que nous laissons activés en interne. Ces protocoles nous donnent des indications notamment qui est branché où et vers quoi

    VMWare le proposait nativement mais avec Proxmox ce n’est pas le cas ou bien n’importe quelle distribution Linux alors il y a une petite astuce et surtout un petit binaire, nommé LADVD

    Ce binaire va tout simplement simuler le comportement de CDP / LLDP et faire en sorte que votre switch voit votre Linux, ainsi, vous pourrez facilement trouver le port du switch où est branché votre serveur.

    C’est utile également si vous n’avez pas noté et référencé les ports et cela vous évite de vous déplacer en datacenter ou même chez votre client ! Nul besoin de bricoler avec les ports, ni même avec les MAC Adresses, une petite installation et c’est parti.

  • ProxySQL : le complément absolu pour MySQL / MariaDB

    ProxySQL : le complément absolu pour MySQL / MariaDB

    ProxySQL est un outil que nous utilisons fortement dès lors que nous sommes en présence de base de données MariaDB / MySQL. Il nous permet de facilement ajouter une couche entre le moteur de bases de données et l’applicatif pour

    • nous permettre de surveiller le trafic qui passe
    • obtenir des statistiques sur l’utilisation des requêtes notamment, celles les plus utilisées / consommatrices / lentes
    • ajouter une petite couche de firewalling sur les requêtes
    • du routage fin dans le cas d’un cluster de bases de données où on veut dédier des serveurs pour la lecture et d’autres pour l’écriture (cluster Galera)
    • ajouter du cache sur des requêtes alors que l’applicatif ne le supporte pas nativement

    ProxySQL a d’autres fonctionnalités que nous n’utilisons pas pour le moment car le cas ne s’est pas présenté, mais il est, par exemple, possible de modifier une requête et de la réécrire. L’idéal est de la corriger à la source mais quand cela n’est pas possible ou que cela demande un certain temps, ce petit « patch » peut vous sauver des productions.

    Comment fonctionne t-il ?

    C’est un daemon qui écoute sur le port 6033 … (les plus alertes auront noté l’utilisation du port du protocole MySQL à l’envers (3306)), et dispose d’un port de gestion qui est le port 6032. Ce port de gestion est utilisable avec le client classique MySQL ou MariaDB pour donner des instructions de configuration à ProxySQL

    ProxySQL écoute sur le port 6033 et se tient prêt à recevoir les connexions utilisateur. Ainsi, une application PHP, Java, Golang … se connectera sur le port 6033 et bénéficiera directement des fonctionnalités de ProxySQL.

    ProxySQL maintient un pool de connexion avec ses clients directs mais également avec le ou les serveurs de base de données. La mise en oeuvre est très simple, il suffit de modifier le port de l’application et c’est fait

    Quelques cas d’usage chez Devclic

    Surveillance du trafic en vue d’optimiser les performances

    Dans le cadre de notre activité d’infogérance, nous utilisons ProxySQL pour surveiller les bases de données que nous avons en gestion en l’activant sur les solutions de serveurs que nous infogérons.

    L’application se connecte à ProxySQL et nous avons alors un log complet de tout ce qui passe par celui-ci et pouvons identifier des requêtes qui sont lentes, non optimisées, la récurrence de celles-ci avec par exemple ce type de requêtes que nous demandons à ProxySQL

    select count_star,sum_time,(sum_time/count_star)/1000 as average_time_ms,digest_text  from stats_mysql_query_digest  where count_star > 100 order by average_time_ms desc limit 4;

    Nous avons alors en sortie la liste des 4 requêtes les plus appelées / consommatrices de temps

    Grâce à ces informations, nous pouvons tester la requête au moyen d’un EXPLAIN et voir les décisions qui sont prises par le moteur pour traiter la requête. On peut avoir la même chose avec le slowlog mais ici, on a une donnée rapide qui est le temps de la requête vis à vis du nombre de requête. Cela évite un long processus couteux de retraitement des logs

    Gestion de la charge dans le cas d’un cluster Galera

    Nous utilisons des clusters Galera pour la gestion des entrées DNS via des applications que nous avons développées et qui répondent au serveur DNS en lui fournissant les enregistrements DNS demandés.

    C’est un savant mélange entre génération à la volée d’enregistrements DNS et de données stockées dans des clusters Galera

    Dans le cas des maintenances que nous sommes amenés à réaliser, ProxySQL va router les requêtes vers les noeuds en fonction de contraintes que nous lui donnons et de l’état de chaque noeud Galera

    Au besoin, nous avons également la possibilité de mettre en place du cache sur des requêtes (exemple un flood sur le DNS)

    Nos noeuds Galera sont répartis entre 5 sites, l’application n’a aucune idée qu’elle fonctionne en cluster, c’est ProxySQL qui s’occupe de gérer cela.

  • En route vers Traefik 3

    En route vers Traefik 3

    Traefik est un load balancer permettant d’appliquer dynamiquement des configurations qui collent aux containers Docker faisant ainsi que la configuration de celui-ci est totalement dynamique grâce aux labels

    Nous l’utilisons depuis la version 1, puis nous sommes passés à la version 2 et dorénavant la version 3

    La version 3 apporte le support de HTTP 3, en effet, nous étions bloqués en version 2

    Pourquoi Traefik ?

    Comme nous le disions plus tôt, quand on a des containers, le plus simple pour les mettre en ligne est de définir la configuration avec des labels, afin que la Traefik se configure et utilise, si plusieurs backends sont présents, les backends déclarés et fasse le load balancing nativement

    Ce qui est surtout intéressant est que chaque container porte sa configuration de load balancing. Ainsi, si on détruit le container, la configuration est effacée avec

    Un autre avantage de Traefik est qu’il gère nativement toute la partie LetsEncrypt et ce, de façon dynamique. Si vous déclarez vouloir un certificat SSL LetsEncrypt, Traefik va se charger de le générer et de gérer le renouvellement. Il faut au passage que tout ceci soit disponible sur internet, sinon cela ne fonctionne pas.

    Comment nous déployons Traefik ?

    Traefik est déployé en entrée de réseau, et écoute les ports HTTP(s) les plus classiques, à savoir les ports 80 et 443.

    Nous lui dédions un sous-réseau nommé gateway ou ingress par exemple, dans lequel on viendra connecter les serveurs Web / load balancer / applications qui sont à présenter sur internet.

    Chaque application est ainsi connectée dans le réseau ingress / gateway avec une adresse IP qui lui est propre où traefik lui adressera le trafic reçu. Chaque application possède également son propre réseau applicatif qui lui est dédié, permettant ainsi une communication sans limite entre les différents composants la formant

    Voici un exemple de configuration :

    Pour la partie traefik

    services:
      reverse-proxy:
        image: traefik:v3
        container_name: traefik
        restart: "always"
        command:
          - "--accesslog=true"
          - "--api.insecure=true"
          - "--providers.docker=true"
          - "--providers.docker.network=gateway"
          - "--providers.docker.exposedbydefault=false"
          - "--entrypoints.web.address=:80"
          - "--entrypoints.websecure.address=:443"
          - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
          - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
          - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
          - "--certificatesresolvers.myresolver.acme.email=XXX@XXX.fr"
          - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
        ports:
          # The HTTP port
          - "80:80"
          - "443:443"
        volumes:
          - "./letsencrypt:/letsencrypt"
          # So that Traefik can listen to the Docker events
          - /var/run/docker.sock:/var/run/docker.sock
        networks:
          - default
        logging:
          driver: "json-file"
          options:
            max-size: "10M"
            max-file: "3"
    
    networks:
      default:
          name: gateway

    Pour une application (ici notre blog)

    services:
      blog_devclic_website:
          image: XXXXXXXX
          restart: always
          ulimits:
           memlock:
            soft: -1
            hard: -1
          networks:
            - default
          labels:
            - "traefik.enable=true"
            - "traefik.http.routers.blog_devclic_fr.rule=Host(`blog.devclic.fr`)"
    
    networks:
      default:
          name: gateway

    Notre blog n’a pas de base de données au sens propre, de ce fait, il n’a pas besoin d’un réseau dédié. Mais si vous avez une base de données quelconque, type MongoDB, MySQL ou autre, vous pouvez alors créer un réseau pour votre application et l’utiliser avec votre applicatif, cela vous permet de séparer la couche présentation des autres couches applicatives

    Et pour mettre à jour Traefik, nous utilisons watchtower, nous nous retrouvons ainsi, avec la dernière version de Traefik stable sans que nous ayons besoin de nous en occuper

    Pourquoi ne pas utiliser Nginx ?

    Nginx est utile comme serveur Web mais sait également faire reverse proxy. En l’occurrence ici, dans un monde de container, l’adresse IP du container peut changer et dans ce cas, vu que Nginx fait la résolution du nom au démarrage, il va vous falloir redémarrer Nginx également.

    C’est faisable mais Traefik n’a pas ce « défaut » (qui n’en est pas un en réalité). Traefik utilise le socket Docker et va donc être notifié de ce changement et changera sa configuration.

    Si nous utilisons Nginx, c’est pour déployer une application SPA par exemple (un frontend réalisé en VueJS, React, Svelte ou astro en full static). Devant Nginx, nous mettrons Traefik avec une règle pour router le trafic correctement vers celui-ci.

  • Rundeck ou l’outil qui peut vous aider

    Rundeck ou l’outil qui peut vous aider

    Rundeck ? vous ne connaissez encore pas ? Et bien c’est bien dommage car c’est un outil qui peut vous faciliter le travail pour gérer votre parc de serveurs et votre automatisation

    Un outil complet pour plusieurs usages

    Tout d’abord, il s’agit d’une interface web, développée en Java, s’occupant de lancer des commandes qui se trouvent dans des projets.

    Ces commandes peuvent être des scripts shell, des scripts Python, des commandes SSH et bien d’autres …

    L’intérêt de cet outil est qu’il va garder bien au chaud, votre liste de commandes préférées, une fois configurées, vous pourrez les lancer unitairement ou bien les orchestrer (comme par exemple les lancer de temps à autre) mais ce n’est pas tout, vous pouvez également les appeler à travers une API, tout en passant des paramètres

    L’avantage de Rundeck est que tout est tracé (on parle pas de fliquer ici …), de ce fait, il est possible de stocker sur du long terme le résultat des executions et si par exemple, on s’en sert pour lancer des playbook Ansible ou bien des formulas avec Salt, on a ainsi, tout ce qui a été exécuté, enregistré

    Avec cet outil, une fois configuré et en place, vous pouvez tout bonnement éviter d’utiliser votre bon vieux outil SSH, Rundeck vous servira de « framework de fonctions », à vous de choisir la fonction et de la lancer (à noter que cela peut être un workflow complet et non une commande unitaire)

    L’outil contient un vault, dans lequel il est possible de stocker des données et aussi des clés privées

    Dans quels cas l’utiliser ?

    • Lancement de playbook ansible
    • Remplacement de crons sur des serveurs (et donc éviter de stocker des choses dans les crontab)
    • Donner accès à des utilisateurs lambda à des fonctionnalités sans leur donner un accès aux serveurs
    • Appels de commandes au moyen d’un appel API (peut être utilisé pour de la CI / CD en vue d’effectuer le déploiement sur les serveurs finaux par exemple)
    • Librairie de commandes qui peuvent être lancées

    L’outil est complet et permet beaucoup de choses, à vous de librement l’implémenter pour vos besoins, en tout cas, il n’est pas utile d’avoir une longue formation, c’est très simple d’utilisation et peut rapidement être mis en œuvre