diff --git a/.env_file b/.env_file index f90377b..0b0a3dc 100644 --- a/.env_file +++ b/.env_file @@ -1,5 +1,5 @@ SHELL=/bin/bash -SESSION_MANAGER=local/PC1:@/tmp/.ICE-unix/1759,unix/PC1:/tmp/.ICE-unix/1759 +SESSION_MANAGER=local/PC1:@/tmp/.ICE-unix/3072,unix/PC1:/tmp/.ICE-unix/3072 NVM_RC_VERSION= COLORTERM=truecolor XDG_CONFIG_DIRS=/etc/xdg @@ -8,16 +8,16 @@ XDG_MENU_PREFIX=xfce- TERMINATOR_DBUS_PATH=/net/tenshu/Terminator2 LC_ADDRESS=fr_FR.UTF-8 LC_NAME=fr_FR.UTF-8 -SSH_AUTH_SOCK=/tmp/ssh-XXXXXXvfx608/agent.1967 +SSH_AUTH_SOCK=/tmp/ssh-XXXXXXrzbF1h/agent.3180 XDG_CONFIG_HOME=/home/yann/.config -TERMINATOR_UUID=urn:uuid:db3e7f6b-9c02-422e-b47a-3f267d0ea244 +TERMINATOR_UUID=urn:uuid:375d27cf-00fb-47c4-9303-f63e68d3fe1b DESKTOP_SESSION=xfce LC_MONETARY=fr_FR.UTF-8 -SSH_AGENT_PID=1968 +SSH_AGENT_PID=3181 EDITOR=nano GTK_MODULES=canberra-gtk-module:canberra-gtk-module XDG_SEAT=seat0 -PWD=/home/yann/media/chirpy +PWD=/srv/media/chirpy LOGNAME=yann XDG_SESSION_DESKTOP=xfce XDG_SESSION_TYPE=x11 @@ -29,12 +29,12 @@ HOME=/home/yann LC_PAPER=fr_FR.UTF-8 LANG=fr_FR.UTF-8 XDG_CURRENT_DESKTOP=XFCE -VTE_VERSION=7804 +VTE_VERSION=8002 XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 TERMINATOR_DBUS_NAME=net.tenshu.Terminator21a9d5db22c73a993ff0b42f64b396873 XDG_CACHE_HOME=/home/yann/.cache NVM_DIR=/home/yann/.config/nvm -GEM_HOME=/home/yann/.local/share/gem/ruby/3.3.0/gems +GEM_HOME=/home/yann/.local/share/gem/ruby/3.4.0/gems XDG_SESSION_CLASS=user TERM=xterm-256color LC_IDENTIFICATION=fr_FR.UTF-8 @@ -52,10 +52,10 @@ LC_TIME=fr_FR.UTF-8 GTK3_MODULES=xapp-gtk3-module:xapp-gtk3-module XDG_DATA_DIRS=/usr/local/share:/usr/share BROWSER=firefox -PATH=/home/yann/.local/share/gem/ruby/3.3.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl +PATH=/home/yann/.local/share/gem/ruby/3.4.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/yann/.local/bin:/home/yann/.local/bin GDMSESSION=xfce DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus MAIL=/var/spool/mail/yann LC_NUMERIC=fr_FR.UTF-8 -OLDPWD=/home/yann/media _=/usr/bin/env +OLDPWD=/home/yann diff --git a/Gemfile b/Gemfile index af81707..33502d8 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ source "https://rubygems.org" gemspec -gem "html-proofer", "~> 5.0", group: :test +gem "html-proofer", "~> 5.0.10", group: :test platforms :mingw, :x64_mingw, :mswin, :jruby do gem "tzinfo", ">= 1", "< 3" diff --git a/_includes/Yan-IT-Tools.html b/_includes/Yan-IT-Tools.html deleted file mode 100644 index 77b06e6..0000000 --- a/_includes/Yan-IT-Tools.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -yannick - - - - - - - - - - - - - - - - - - - - - -

IT-Tools est un projet open source créé par Corentin Thomasset, un français (de Lyon), et qui contient de nombreux outils organisés en plusieurs catégories. Le projet est disponible sur GitHub et il y a également une version en ligne accessible à l'adresse it-tools.tech.

- - -
- - 
- - -
- - 
- - -
- - 
- - -
- - 
- - -
- - 
- - -
- - 
- -

À cela s'ajoutent d'autres outils pour vérifier le format d'un IBAN, obtenir des statistiques sur un texte (nombre de mots, nombre de caractères, etc.), ou encore transformer un texte en ASCII Art.

-

Déployer IT-Tools avec Docker

- -

Dans cette partie de l'article, nous verrons comment auto-héberger IT-Tools sur un poste de travail ou un serveur à l'aide de Docker. Vous pouvez utiliser Docker Desktop ou le moteur Docker sous Linux.

-
-

Nous allons utiliser un fichier Docker Compose pour déclarer le seul et unique conteneur à créer pour faire tourner ce projet.

- -

mkdir /opt/docker-compose/it-tools

- -

cd /opt/docker-compose/it-tools

- -

nano docker-compose.yml

- -

Indiquez le code suivant dans le fichier docker-compose.yml :

- -

services:

- -

    it-tools:

- -

        image: 'ghcr.io/corentinth/it-tools:latest'

- -

        ports:

- -

            - '7474:80'

- -

        restart: unless-stopped

- -

        container_name: it-tools

- -

Dans ce fichier Docker Compose, nous définissons un service nommé it-tools basé sur l’image Docker ghcr.io/corentinth/it-tools:latest dans sa dernière version. Cette image provient du registre GitHub Container Registry. Le service du conteneur sera exposé sur le port 7474 de la machine hôte, ce qui permet d’accéder à l’application via l’URL http://localhost:7474 (ou à distance en indiquant l'adresse IP / le nom d'hôte). Vous pouvez ajuster cette valeur avec le numéro de port de votre choix.

- -

À titre d'information, et pour rappel, la directive restart: unless-stopped garantit que le conteneur redémarre automatiquement en cas d’arrêt ou de redémarrage de Docker (sauf s’il a été arrêté manuellement). Enfin, l’option container_name permet de nommer explicitement le conteneur it-tools (nom avec lequel il sera visible avec un docker ps).

- -

Remarque : il n'y a pas de volume à prévoir pour le stockage persistant, car cette application ne stocke pas de données.

- -

Quand c'est fait, il ne vous reste plus qu'à lancer la création du conteneur IT-Tools. Voici la commande à exécuter en étant positionné dans le répertoire où se situe le fichier Docker Compose :

- -

sudo docker compose up -d

- -

Quelques secondes plus tard, le conteneur démarre.

- - -
- - 
- -

À partir d'un navigateur, vous pouvez accéder à l'interface d'IT-Tools : http://<IP de votre machine Docker>:7474.

- - -
- - 
- - - diff --git a/_includes/Yan-WireGuard_Mesh_VPN.html b/_includes/Yan-WireGuard_Mesh_VPN.html deleted file mode 100644 index bd5ae0d..0000000 --- a/_includes/Yan-WireGuard_Mesh_VPN.html +++ /dev/null @@ -1,576 +0,0 @@ - - - - - -yannick - - - - - - - - - - - - - - - - - - - - - -

Un réseau maillé est une topologie de réseau dans laquelle les nœuds d'infrastructure établissent des connexions directes, dynamiques et non hiérarchiques avec autant d'autres nœuds que possible et collaborent entre eux. Un réseau maillé est conçu pour acheminer efficacement les données entre les appareils et les clients. Il aide les organisations à établir une connexion uniforme et ininterrompue sur l'ensemble d'une zone physique. Un réseau maillé permet la communication entre les appareils via un réseau privé virtuel (VPN) sans dépendre d'un serveur central.

- -

WireGuard est un programme VPN (réseau privé virtuel) révolutionnaire, conçu pour fonctionner pratiquement partout et sur plusieurs plateformes. Comparé aux autres logiciels VPN, WireGuard se distingue par sa vitesse supérieure, sa sécurité renforcée et sa simplicité d'utilisation.

- -

Ce tutoriel démontre l'utilisation de WireGuard pour établir un réseau maillé privé, permettant la création d'une connexion sécurisée et exclusive entre différents serveurs et instances.

- -

Pour suivre ce tutoriel de configuration du VPN maillé WireGuard, vous devez disposer de quatre serveurs Linux Ubuntu 22.04 avec une adresse IP publique statique et un protocole UDP/51820 accessible depuis Internet. Nous utiliserons les noms et adresses IP suivants pour les nœuds (nodes) VPN :

-

 

- -
-

Name

-
-

Public IP

-
-

Allowed IPs

-
-

Node1

-
-

11.11.11.1

-
-

10.0.1.1

-
-

Node2

-
-

11.11.11.2

-
-

10.0.2.1

-
-

Node3

-
-

11.11.11.3

-
-

10.0.3.1

-
-

Node4

-
-

11.11.11.4

-
-

10.0.4.1

-
- -

 

-

Tableau 1. *Paramètres d'adresse IP pour l'échantillon de maillage WireGuard*

- - -
- -
- -

Topologie VPN maillée WireGuard

- -

- -

Vous pouvez configurer WireGuard Mesh VPN en suivant les étapes principales suivantes :

-
  1. 1.Installation de WireGuard sur les serveurs Ubuntu  

  2. 2.Génération manuelle de clés privées et publiques  

  3. 3.Permettre aux nœuds VPN d'accéder aux réseaux locaux via d'autres nœuds VPN  

  4. 4.Génération manuelle des fichiers de configuration WireGuard  

  5. 5.Démarrage du serveur WireGuard et activation au démarrage  

  6. 6.Vérification de la connectivité VPN maillée  

-

AVERTISSEMENT

- -

Accès privilégié à votre système Linux en tant que root ou via la commande sudo .

- -

Toutes les commandes ci-dessous doivent être exécutées avec les privilèges root , soit directement en tant qu'utilisateur root, soit en utilisant la commande sudo .

-

Installation de WireGuard

- -

Les serveurs Linux Ubuntu 22.04 seront configurés comme nœud VPN WireGuard. Vous pouvez facilement installer WireGuard sur tous les nœuds VPN Ubuntu en suivant les étapes suivantes :

- -

Assurez-vous que vos nœuds Ubuntu sont à jour en exécutant la commande suivante :

- -

sudo apt update && sudo apt upgrade -y

- -

Installez WireGuard lui-même et toutes ses dépendances en exécutant la commande suivante :

- -

sudo apt install wireguard wireguard-tools

- -

Après avoir installé WireGuard, suivez les étapes ci-dessous pour configurer davantage votre serveur.

-

Génération

- -

L'un des principaux avantages de WireGuard est qu'il repose sur des primitives cryptographiques de pointe. Il permet de créer un tunnel VPN sécurisé en chiffrant votre connexion à l'aide d'une paire de clés cryptographiques. Chaque homologue doit posséder ses propres clés privée et publique pour garantir la sécurité des communications dans les deux sens. Pour utiliser WireGuard, chaque nœud doit générer sa propre paire de clés, puis échanger ses clés publiques.

- -

Notez que sur le VPN WireGuard, la clé privée ne quitte jamais son nœud. L'importance réside dans le fait que seule la clé privée peut potentiellement usurper l'identité de ce nœud lors de la négociation d'une session WireGuard. Par conséquent, seul ce nœud spécifique est capable de coder les paquets provenant de lui-même ou de décoder les paquets qui lui sont destinés. Il est crucial de garder cela à l'esprit : les connexions des nœuds WireGuard sont chiffrées de bout en bout, selon le principe de l'accès réseau Zero Trust (ZTNA).

- -

Vous pouvez suivre les étapes suivantes pour générer des paires de clés privées et publiques pour tous les nœuds VPN maillés :

- -

Exécutez la commande suivante sur le serveur Ubuntu pour générer une paire de clés publique/privée pour le nœud n°1.

- -

wg genkey | sudo tee /etc/wireguard/node1_private.key | wg pubkey | sudo tee /etc/wireguard/node1_public.key

- -

Exécutez la commande suivante pour générer une paire de clés publique/privée pour le nœud n° 2.

- -

wg genkey | sudo tee /etc/wireguard/node2_private.key | wg pubkey | sudo tee /etc/wireguard/node2_public.key

- -

Exécutez la commande suivante pour générer une paire de clés publique/privée pour le nœud n° 3.

- -

wg genkey | sudo tee /etc/wireguard/node3_private.key | wg pubkey | sudo tee /etc/wireguard/node3_public.key

- -

Exécutez la commande suivante pour générer une paire de clés publique/privée pour le nœud n° 3.

- -

wg genkey | sudo tee /etc/wireguard/node3_private.key | wg pubkey | sudo tee /etc/wireguard/node3_public.key

- -

Cela enregistrera les clés privées et publiques dans le /etc/wireguardrépertoire.

- -

avertissement

- -

La clé privée ne doit jamais être partagée avec qui que ce soit et doit toujours être conservée en sécurité.

- -

conseil

- -

Veuillez noter les paires de clés qui seront utilisées pour mettre à jour le fichier de configuration WireGuard dans les étapes suivantes.

-

Permettre aux nœuds VPN d'accéder aux réseaux locaux

- -

Vous pouvez autoriser l'accès au réseau/LAN de chaque site pour tous les nœuds VPN via WireGuard. Pour cela, vous devrez peut-être configurer les règles du pare-feu, notamment la redirection IP et la NAT.

- -

Pour que le serveur VPN puisse acheminer les paquets entre les nœuds VPN et le réseau local, vous devez activer la redirection IP sur tous les nœuds WireGuard. Suivez les instructions ci-dessous pour activer la redirection IP sur tous vos nœuds :

- -

Ouvrez le fichier des variables système pour le modifier.

- -

sudo nano /etc/sysctl.conf

- -

Ajoutez ou supprimez le commentaire de la ligne suivante en supprimant le # au début de la ligne.

- -

net.ipv4.ip_forward=1

- -

Enregistrez le fichier et quittez l'éditeur.

- -

Ouvrez /etc/ufw/sysctl.confet décommentez ces lignes :

- -

net/ipv4/ip_forward=1

- -

net/ipv6/conf/default/forwarding=1

- -

net/ipv6/conf/all/forwarding=1

- -

Appliquez les modifications avec la commande ci-dessous. Cette -poption chargera les paramètres sysctl depuis /etc/sysctl.confle fichier. Cette commande conservera les modifications après un redémarrage du système.

- -

sudo sysctl -p

-

Génération

- -

Commençons par configurer WireGuard en créant un nouveau fichier de configuration appelé wg0.confdans le /etc/wireguarddossier de chaque nœud.

- -

Vous pouvez créer des fichiers de configuration WireGuard pour chaque nœud en suivant les étapes suivantes :

- -

Ouvrir wg0.confle fichier à l'aide d'un éditeur.

- -

sudo nano /etc/wireguard/wg0.conf

- -

Ajoutez les directives suivantes au fichier de configuration. La configuration ci-dessous permettra à votre serveur WireGuard d'accepter 51820et d'autoriser les connexions vers un nœud dont la clé publique correspond à la clé privée générée précédemment.

- - -
- -
- -

# Name: Node1

- -

[Interface]

- -

PrivateKey = (contents-of-node1-privatekey)

- -

Address = (Node1-VPN-IP )

- -

ListenPort = 51820

- -

[Peer]

- -

# Node2

- -

PublicKey = (contents-of-node2-publickey)

- -

Endpoint = (Node2-Public-IP:51820)

- -

AllowedIPs = (Node2-VPN-IP), (Node2-LAN-Network-IP)

- -

PersistentKeepalive = 25

-

 

-

[Peer]

- -

# Node3

- -

PublicKey = (contents-of-node3-publickey)

- -

Endpoint = (Node3-Public-IP:51820)

- -

AllowedIPs = (Node3-VPN-IP), (Node3-LAN-Network-IP)

- -

PersistentKeepalive = 25

-

 

-

[Peer]

- -

# Node4

- -

PublicKey = (contents-of-node4-publickey)

- -

Endpoint = (Node4-Public-IP:51820)

- -

AllowedIPs = (Node4-VPN-IP), (Node4-LAN-Network-IP)

- -

PersistentKeepalive = 25

- -

- - -
- -
- -

- -

Enregistrez et fermez le fichier.

- -

Répétez les étapes 1 à 3 sur tous les nœuds VPN, en remplaçant le nom , la clé privée , la clé publique , le point de terminaison et les adresses IP autorisées par les valeurs correctes pour chaque nœud.

- -

Après avoir effectué les étapes ci-dessus, vous devriez disposer de fichiers de configuration VPN WireGuard sur tous les nœuds VPN, similaires aux fichiers d'exemple ci-dessous. N'utilisez pas les clés privées et publiques fournies dans les fichiers d'exemple suivants ; utilisez vos propres paires générées dans la première section.

- -

Le fichier de configuration VPN WireGuard généré pour Node1 ressemble à ceci :

- - -
- -
- -

Le fichier de configuration VPN WireGuard généré pour Node2 ressemble à ceci :

- - -
- -
- -

Le fichier de configuration VPN WireGuard généré pour Node3 ressemble à ceci :

- - -
- -
- -

Le fichier de configuration VPN WireGuard généré pour Node4 ressemble à ceci :

- - -
- -
-

Démarrage du serveur WireGuard et activation

- -

Maintenant que la configuration est terminée, nous sommes prêts à démarrer le serveur. WireGuard dispose d'un wrapper pratique appelé « » wg-quickqui permet de démarrer de nouvelles interfaces sans avoir à entrer dans les détails de la configuration.

- -

Vous devez démarrer le service WireGuard sur tous les nœuds VPN. Pour démarrer le service WireGuard et activer l'interface WireGuard ( wg0), exécutez la commande suivante sur le serveur :

- -

sudo wg-quick up wg0

- -

Cela chargera le fichier de configuration /etc/wireguard/wg0.confet vous devriez voir une sortie comme celle ci-dessous après avoir démarré avec succès l'interface :

- - -
- -
- -

Pour arrêter le service WireGuard sur un nœud VPN, exécutez la commande suivante :

- -

sudo wg-quick down wg0

- -

Vous pouvez utiliser le service systemd pour démarrer WireGuard en exécutant la commande suivante :

- -

sudo systemctl start wg-quick@wg0.service

- -

- -

Vous pouvez vérifier l'état et la configuration de WireGuard avec les commandes suivantes. Son statut doit être actif (sorti).

- -

- -

sudo wg show wg0

- -

- -

Vous devriez voir un résultat similaire à celui ci-dessous :

- - -
- -
- -

- -

Pour activer automatiquement l'interface WireGuard au démarrage du système, exécutez la commande suivante :

- -

- -

sudo systemctl enable wg-quick@wg0

- -

- -

Maintenant que le serveur WireGuard est opérationnel, il est prêt à accepter les connexions aux nœuds VPN.

- -

-

Vérification de la connectivité VPN Mesh

- -

Vous pouvez exécuter la commande suivante sur chaque nœud VPN pour vérifier l’état de l’interface WireGuard :

- -

ip a show wg0

- -

Vous devriez voir une sortie similaire à celle ci-dessous pour Node1 :

- -

6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000

- -

link/none

- -

inet 10.0.1.1/24 scope global wg0

- -

valid_lft forever preferred_lft forever

- -

Vous pouvez essayer d'accéder à tous les autres nœuds depuis chaque nœud VPN en exécutant la commande ping. Chaque homologue VPN répond à la commande ping de l'autre homologue, indiquant que la connexion VPN est active.

- -

Dans notre exemple, exécutez les commandes suivantes sur le nœud 1. Vous devriez alors accéder à tous les homologues VPN :

- -

- -

ping 10.0.2.1

- -

64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=1.87 ms

- -

64 bytes from 10.0.2.1: icmp_seq=2 ttl=64 time=0.992 ms

- -

64 bytes from 10.0.2.1: icmp_seq=3 ttl=64 time=1.37 ms

- -

64 bytes from 10.0.2.1: icmp_seq=4 ttl=64 time=1.21 ms

- -

64 bytes from 10.0.2.1: icmp_seq=5 ttl=64 time=1.57 ms

- -

64 bytes from 10.0.2.1: icmp_seq=6 ttl=64 time=1.43 ms

- -

--- 10.0.2.1 ping statistics ---

- -

6 packets transmitted, 6 received, 0% packet loss, time 5008ms

- -

rtt min/avg/max/mdev = 0.992/1.577/1.873/0.607 ms

- -

ping 10.0.3.1

- -

64 bytes from 10.0.3.1: icmp_seq=1 ttl=64 time=1.87 ms

- -

64 bytes from 10.0.3.1: icmp_seq=2 ttl=64 time=0.992 ms

- -

64 bytes from 10.0.3.1: icmp_seq=3 ttl=64 time=1.37 ms

- -

64 bytes from 10.0.3.1: icmp_seq=4 ttl=64 time=1.21 ms

- -

64 bytes from 10.0.3.1: icmp_seq=5 ttl=64 time=1.57 ms

- -

64 bytes from 10.0.3.1: icmp_seq=6 ttl=64 time=1.43 ms

- -

--- 10.0.3.1 ping statistics ---

- -

6 packets transmitted, 6 received, 0% packet loss, time 5008ms

- -

rtt min/avg/max/mdev = 0.992/1.577/1.873/0.607 ms

- -

ping 10.0.4.1

- -

64 bytes from 10.0.4.1: icmp_seq=1 ttl=64 time=1.87 ms

- -

64 bytes from 10.0.4.1: icmp_seq=2 ttl=64 time=0.992 ms

- -

64 bytes from 10.0.4.1: icmp_seq=3 ttl=64 time=1.37 ms

- -

64 bytes from 10.0.4.1: icmp_seq=4 ttl=64 time=1.21 ms

- -

64 bytes from 10.0.4.1: icmp_seq=5 ttl=64 time=1.57 ms

- -

64 bytes from 10.0.4.1: icmp_seq=6 ttl=64 time=1.43 ms

- -

--- 10.0.4.1 ping statistics ---

- -

6 packets transmitted, 6 received, 0% packet loss, time 5008ms

- -

rtt min/avg/max/mdev = 0.992/1.577/1.873/0.607 ms

-

Génération automatique

- -

La configuration manuelle d'un nombre important de nœuds dans un réseau maillé WireGuard est une tâche chronophage. Pour ajouter un nouveau nœud au réseau VPN maillé, l'administrateur doit modifier les paramètres du nœud O(n2) à chaque ajout de client.

- -

Plusieurs outils de maillage WireGuard permettent la création automatique de paramètres WireGuard pour une gestion fluide de vos réseaux maillés. Les outils de maillage WireGuard les plus courants sont présentés ci-dessous :

-
  1. 1.Tailscale  

  2. 2.Headscale  

  3. 3.Netmaker  

  4. 4.Wesher  

  5. 5.Netbird  

  6. 6.wgmesh  

  7. 7.wiresmith  

  8. 8.VxWireguard-Generator  

-

Dans ce tutoriel, nous utiliserons un script Python nommé WireGuard Mesh Configurator, wgmesh pour produire les fichiers de configuration de nos nœuds.

- -

Vous pouvez suivre les étapes suivantes sur l'un de vos nœuds VPN ou sur une machine Linux locale pour générer automatiquement les fichiers de configuration de maillage WireGurad :

- -

Installez les packages git, python3-pip et python3 en exécutant la commande suivante :

- -

apt install git python3-pip python3 libncurses-dev -y

- -

Clonez le référentiel GitHub du configurateur de maillage WireGuard, wgmeshen exécutant la commande suivante :

- -

git clone https://github.com/k4yt3x/wg-meshconf

- -

Exécutez les commandes suivantes pour entrer dans votre répertoire et installer les packages requis pourwgmesh :

- -

cd wg-meshconf

- -

pip install 'wg-meshconf@git+https://github.com/k4yt3x/wg-meshconf.git'

- -

Exécutez la commande suivante pour démarrer un nouveau fichier de base de données, car vous devez d'abord y ajouter les informations des pairs. Par défaut, le fichier de base de données est nommé database.csv. Vous pouvez également spécifier le nom du fichier via -d :

- -

wg-meshconf init

- -

Vous devez ajouter tous les homologues VPN à la base de données. Saisissez la commande suivante pour chaque homologue VPN à ajouter :

- -

wg-meshconf addpeer NAME --address VPN_IP_ADDRESS --address LAN_IP_ADDRESS --endpoint PUBLIC_IP_ADDRESS

- -

Cette commande générera automatiquement une nouvelle clé privée si elle n'est pas spécifiée et définira les valeurs par défaut de ListenPort sur 51820.

- - -
- -
- -

Répétez cette étape pour tous les homologues VPN de votre réseau maillé. Dans notre exemple, nous exécutons les commandes suivantes :

- -

wg-meshconf addpeer NODE1 --address 10.0.1.1 --endpoint 11.11.11.1

- -

wg-meshconf addpeer NODE2 --address 10.0.2.1 --endpoint 11.11.11.2

- -

wg-meshconf addpeer NODE3 --address 10.0.3.1 --endpoint 11.11.11.3

- -

wg-meshconf addpeer NODE4 --address 10.0.4.1 --endpoint 11.11.11.4

- -

- -

Exécutez la commande suivante pour vous assurer que vos pairs ont été ajoutés correctement.

- -

wg-meshconf showpeers

- -

Vous devriez voir un tableau similaire à celui ci-dessous :

- -

- -

- -

----------------------------------------------------------------------------------------------

- -

-- NAME -- ADDRESS -- LISTENPORT --             PRIVATEKEY                      -- ENDPOINT --

- -

----------------------------------------------------------------------------------------------

- -

-- NODE1 -- 10.0.1.1 -- 51820 -- KHpX3JsGa1EQSqWzy32SatTMwiJTckFIqmIK+e+T/FQ= -- 11.11.11.1 --

- -

----------------------------------------------------------------------------------------------

- -

-- NODE2 -- 10.0.2.1 -- 51820 -- GAT/al+KhZwSVw95XxAuOZ+ezs5qtgJgMpp3i0TNP0Y= -- 11.11.11.2 --

- -

----------------------------------------------------------------------------------------------

- -

-- NODE3 -- 10.0.3.1 -- 51820 -- sLXHpUKvNIbZRqVeIMKb3gW+tK9NK0ECIbJPGCulN3w= -- 11.11.11.3 --

- -

----------------------------------------------------------------------------------------------

- -

-- NODE4 -- 10.0.4.1 -- 51820 -- EJYvbLKcWqxzcQD1EESkZbdhjCS3R/A2RCFxh0CBjHE= -- 11.11.11.4 --

- -

----------------------------------------------------------------------------------------------

- -

Pour générer les fichiers de configuration du VPN maillé WireGuard pour tous les homologues, exécutez la commande suivante. Pour exporter les paramètres d'un homologue spécifique, indiquez simplement son nom. Les fichiers de configuration seront nommés en fonction de ceux des homologues. Par défaut, tous les fichiers de configuration sont automatiquement enregistrés dans un sous-dossier appelé « output ».

- -

wg-meshconf genconfig

- -

Vous pouvez afficher les fichiers de configuration de WireGuard à l'aide de catla commande suivante. Dans notre exemple, nous pouvons afficher le fichier de configuration de Node1 en exécutant la commande suivante :

- -

cat output/Node1.conf

- -

Transférez les fichiers de configuration WireGuard générés vers chaque nœud VPN en utilisant la technique de votre choix, comme SFTP. Assurez-vous que la configuration est enregistrée /etc/wireguard/wg0.confafin d'utiliser la wg-quickfonction de configuration accélérée.

- -

Connectez-vous à chaque nœud.

- -

Démarrez le service WireGuard et testez les connexions VPN comme décrit dans la section précédente.

- -

Vous avez réussi à établir un réseau maillé avec WireGuard, permettant à vos nœuds d'interagir entre eux de manière sécurisée et privée. En l'absence de serveur central, le réseau restera opérationnel même en cas de panne de l'un des homologues.

-

Qu'est-ce que l'architecture Hub et Spoke

- -

La topologie en étoile est une configuration réseau dans laquelle un périphérique central, appelé hub, est interconnecté à plusieurs autres périphériques, appelés spokes, afin d'échanger et de communiquer des données. Ce système offre une méthode simple et efficace pour diriger et superviser les données sur un réseau, à l'exception du hub qui représente un point de défaillance unique. Le hub central sert d'intermédiaire pour toutes les communications, facilitant la configuration des paramètres de sécurité et la surveillance du trafic. L'architecture en étoile est reconnue pour sa simplicité, sa capacité à gérer la croissance et ses fonctionnalités de sécurité améliorées, ce qui en fait une option intéressante pour les entreprises.

- -

En règle générale, les utilisateurs de VPN, y compris les utilisateurs de WireGuard, établissent une structure « hub and spoke », dans laquelle chaque périphérique client (tel qu'un ordinateur de bureau) se connecte à un « concentrateur » central ou à une passerelle VPN.

- -

La configuration de WireGuard est simplifiée : chaque nœud du réseau dispose des informations essentielles : clé publique, adresse IP publique et numéro de port de chaque nœud souhaité pour une connexion directe. Pour assurer une connectivité complète entre 10 nœuds, chaque nœud doit connaître 9 nœuds homologues, ce qui donne 90 points de terminaison de tunnel distincts. Un réseau en étoile est composé d'un nœud central et de 9 nœuds périphériques reliés par des rayons, ce qui simplifie considérablement sa structure. Le nœud central possède souvent une adresse IP fixe et une ouverture de pare-feu, facilitant sa découverte par tous les utilisateurs. Il peut ensuite recevoir des connexions entrantes de nœuds situés à des adresses IP différentes, même derrière un pare-feu, conformément à l'approche classique des protocoles Internet client-serveur.

-

Quels sont les inconvénients de l'architecture Hub and Spoke

- -

Le modèle en étoile est efficace, mais il présente quelques inconvénients. Principalement, la plupart des organisations contemporaines ne possèdent pas de site spécifique qu'elles souhaitent identifier comme hub central. Elles possèdent plusieurs bureaux, des zones géographiques variées, plusieurs centres de données cloud et des clouds privés virtuels (VPC), entre autres. La conception d'un VPN en étoile ne permet pas aux nœuds de communiquer entre eux. Généralement, dans les configurations VPN classiques, les entreprises établissent un concentrateur VPN unique, puis des tunnels supplémentaires (souvent utilisant IPsec) reliant d'autres sites. Les utilisateurs distants sont dirigés vers le concentrateur VPN situé à un endroit, d'où leur trafic est ensuite acheminé vers sa destination finale située à un autre endroit.

- -

La mise à l'échelle est complexe avec cette configuration VPN classique en étoile. Il convient de noter que les utilisateurs distants peuvent être ou non à proximité du concentrateur VPN. S'ils sont éloignés, ils subiront des retards importants lors de l'établissement de la connexion. De plus, le centre de données souhaité peut être éloigné du concentrateur VPN. Dans ce cas, la latence augmentera considérablement. Prenons l'exemple d'un employé new-yorkais tentant d'établir une connexion avec un serveur new-yorkais via le concentrateur VPN de l'entreprise situé au siège social en Californie.

-

Comment WireGuard résout-il le problème de l'architecture Hub and Spoke

- -

WireGuard présente des caractéristiques distinctes et un ensemble de tunnels ultra-légers. Ces tunnels sont suffisamment légers pour permettre la mise en place d'une configuration multi-hub sans difficulté. Le VPN maillé WireGuard permet des connexions directes entre tous les nœuds, permettant ainsi à chaque nœud de se connecter à tous les autres. Chaque nœud est connecté à chaque nœud du réseau VPN maillé WireGuard de manière efficace et fiable.

- -

Il est cependant essentiel que chaque centre de données soit équipé d'une adresse IP statique, d'un port pare-feu ouvert et d'un ensemble spécifique de clés WireGuard. Lors de l'ajout d'un nouvel utilisateur, il sera nécessaire de diffuser la nouvelle clé aux cinq serveurs. Lors de l'ajout d'un nouveau serveur, il sera nécessaire de diffuser sa clé à chaque utilisateur. Cependant, cela nécessite environ cinq fois plus d'efforts qu'un hub unique, ce qui représente une charge de travail minime.

-

Maillage vs. Hub-and-Spoke

- -

Un réseau maillé, ou réseau entièrement connecté, est un réseau dans lequel chaque nœud est directement connecté à tous les autres. La topologie maillée garantit des canaux de communication efficaces et sans entrave entre toutes les parties impliquées. Cependant, son administration devient complexe et difficile lorsque le nombre de nœuds augmente en raison du nombre de connexions.

- -

En comparaison, un réseau en étoile est plus simple, car chaque étoile se connecte directement au hub. La centralisation peut optimiser la coordination des activités, mais elle engendre une dépendance vis-à-vis du hub central. Un contrôle centralisé est plus adapté lorsqu'un contrôle centralisé est nécessaire ; en revanche, un réseau entièrement connecté est préférable lorsqu'un contact direct entre toutes les parties est essentiel.

- -

- -

- - - diff --git a/_includes/metadata-hook.html~ b/_includes/metadata-hook.html~ new file mode 100644 index 0000000..f215a93 --- /dev/null +++ b/_includes/metadata-hook.html~ @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/_includes/search-loader.html b/_includes/search-loader.html index db9a3c5..7d2deef 100644 --- a/_includes/search-loader.html +++ b/_includes/search-loader.html @@ -56,7 +56,7 @@ if (value === '') { return `${value}`; } else { - return `
${value}
`; + return `
${value}
`; } } diff --git a/_includes/update-list20250322.html b/_includes/update-list20250322.html deleted file mode 100644 index 93684c3..0000000 --- a/_includes/update-list20250322.html +++ /dev/null @@ -1,40 +0,0 @@ - - -{% assign MAX_SIZE = 5 %} - -{% assign all_list = '' | split: '' %} - -{% for post in site.posts %} - {% assign datetime = post.last_modified_at | default: post.date %} - - {% capture elem %} - {{- datetime | date: "%Y%m%d%H%M%S" -}}::{{- forloop.index0 -}} - {% endcapture %} - - {% assign all_list = all_list | push: elem %} -{% endfor %} - -{% assign all_list = all_list | sort | reverse %} - -{% assign update_list = '' | split: '' %} - -{% for entry in all_list limit: MAX_SIZE %} - {% assign update_list = update_list | push: entry %} -{% endfor %} - -{% if update_list.size > 0 %} -
-

{{- site.data.locales[include.lang].panel.lastmod -}}

- -
- -{% endif %} diff --git a/_layouts/home.html b/_layouts/home.html index 33fffa5..8709d95 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -84,15 +84,6 @@ refactor: true
- - - {% include datetime.html date=post.date lang=lang %} - - {% if post.last_modified_at %} - - {% include datetime.html date=post.last_modified_at lang=lang %} - {% endif %} - {% if post.categories.size > 0 %} diff --git a/_layouts/home.html~ b/_layouts/home.html~ new file mode 100644 index 0000000..2d81be5 --- /dev/null +++ b/_layouts/home.html~ @@ -0,0 +1,130 @@ +--- +layout: default +refactor: true +--- + +{% include lang.html %} + +{% assign all_pinned = site.posts | where: 'pin', 'true' %} +{% assign all_normal = site.posts | where_exp: 'item', 'item.pin != true and item.hidden != true' %} + +{% assign posts = '' | split: '' %} + + + +{% assign visible_start = paginator.page | minus: 1 | times: paginator.per_page %} +{% assign visible_end = visible_start | plus: paginator.per_page %} + +{% if all_pinned.size > visible_start %} + {% if all_pinned.size > visible_end %} + {% assign pinned_size = paginator.per_page %} + {% else %} + {% assign pinned_size = all_pinned.size | minus: visible_start %} + {% endif %} + + {% for i in (visible_start..all_pinned.size) limit: pinned_size %} + {% assign posts = posts | push: all_pinned[i] %} + {% endfor %} +{% else %} + {% assign pinned_size = 0 %} +{% endif %} + + + +{% assign normal_size = paginator.posts | size | minus: pinned_size %} + +{% if normal_size > 0 %} + {% if pinned_size > 0 %} + {% assign normal_start = 0 %} + {% else %} + {% assign normal_start = visible_start | minus: all_pinned.size %} + {% endif %} + + {% assign normal_end = normal_start | plus: normal_size | minus: 1 %} + + {% for i in (normal_start..normal_end) %} + {% assign posts = posts | push: all_normal[i] %} + {% endfor %} +{% endif %} + +
+ {% for post in posts %} +
+ + {% assign card_body_col = '12' %} + + {% if post.image %} + {% assign src = post.image.path | default: post.image %} + {% unless src contains '//' %} + {% assign src = post.media_subpath | append: '/' | append: src | replace: '//', '/' %} + {% endunless %} + + {% assign alt = post.image.alt | xml_escape | default: 'Preview Image' %} + + {% assign lqip = null %} + + {% if post.image.lqip %} + {% capture lqip %}lqip="{{ post.image.lqip }}"{% endcapture %} + {% endif %} + +
+ {{ alt }} +
+ + {% assign card_body_col = '7' %} + {% endif %} + +
+
+

{{ post.title }}

+ +
+

{% include post-description.html %}

+
+ + + +
+ +
+
+
+ {% endfor %} +
+ + +{% if paginator.total_pages > 1 %} + {% include post-paginator.html %} +{% endif %} diff --git a/_layouts/home20250809.html b/_layouts/home20250809.html new file mode 100644 index 0000000..e232949 --- /dev/null +++ b/_layouts/home20250809.html @@ -0,0 +1,129 @@ +--- +layout: default +refactor: true +--- + +{% include lang.html %} + +{% assign all_pinned = site.posts | where: 'pin', 'true' %} +{% assign all_normal = site.posts | where_exp: 'item', 'item.pin != true and item.hidden != true' %} + +{% assign posts = '' | split: '' %} + + + +{% assign visible_start = paginator.page | minus: 1 | times: paginator.per_page %} +{% assign visible_end = visible_start | plus: paginator.per_page %} + +{% if all_pinned.size > visible_start %} + {% if all_pinned.size > visible_end %} + {% assign pinned_size = paginator.per_page %} + {% else %} + {% assign pinned_size = all_pinned.size | minus: visible_start %} + {% endif %} + + {% for i in (visible_start..all_pinned.size) limit: pinned_size %} + {% assign posts = posts | push: all_pinned[i] %} + {% endfor %} +{% else %} + {% assign pinned_size = 0 %} +{% endif %} + + + +{% assign normal_size = paginator.posts | size | minus: pinned_size %} + +{% if normal_size > 0 %} + {% if pinned_size > 0 %} + {% assign normal_start = 0 %} + {% else %} + {% assign normal_start = visible_start | minus: all_pinned.size %} + {% endif %} + + {% assign normal_end = normal_start | plus: normal_size | minus: 1 %} + + {% for i in (normal_start..normal_end) %} + {% assign posts = posts | push: all_normal[i] %} + {% endfor %} +{% endif %} + +
+ {% for post in posts %} +
+ + {% assign card_body_col = '12' %} + + {% if post.image %} + {% assign src = post.image.path | default: post.image %} + {% unless src contains '//' %} + {% assign src = post.media_subpath | append: '/' | append: src | replace: '//', '/' %} + {% endunless %} + + {% assign alt = post.image.alt | xml_escape | default: 'Preview Image' %} + + {% assign lqip = null %} + + {% if post.image.lqip %} + {% capture lqip %}lqip="{{ post.image.lqip }}"{% endcapture %} + {% endif %} + +
+ {{ alt }} +
+ + {% assign card_body_col = '7' %} + {% endif %} + +
+
+

{{ post.title }}

+ +
+

{% include post-description.html %}

+
+ + + +
+ +
+
+
+ {% endfor %} +
+ + +{% if paginator.total_pages > 1 %} + {% include post-paginator.html %} +{% endif %} diff --git a/_layouts/home20250809.html~ b/_layouts/home20250809.html~ new file mode 100644 index 0000000..2d81be5 --- /dev/null +++ b/_layouts/home20250809.html~ @@ -0,0 +1,130 @@ +--- +layout: default +refactor: true +--- + +{% include lang.html %} + +{% assign all_pinned = site.posts | where: 'pin', 'true' %} +{% assign all_normal = site.posts | where_exp: 'item', 'item.pin != true and item.hidden != true' %} + +{% assign posts = '' | split: '' %} + + + +{% assign visible_start = paginator.page | minus: 1 | times: paginator.per_page %} +{% assign visible_end = visible_start | plus: paginator.per_page %} + +{% if all_pinned.size > visible_start %} + {% if all_pinned.size > visible_end %} + {% assign pinned_size = paginator.per_page %} + {% else %} + {% assign pinned_size = all_pinned.size | minus: visible_start %} + {% endif %} + + {% for i in (visible_start..all_pinned.size) limit: pinned_size %} + {% assign posts = posts | push: all_pinned[i] %} + {% endfor %} +{% else %} + {% assign pinned_size = 0 %} +{% endif %} + + + +{% assign normal_size = paginator.posts | size | minus: pinned_size %} + +{% if normal_size > 0 %} + {% if pinned_size > 0 %} + {% assign normal_start = 0 %} + {% else %} + {% assign normal_start = visible_start | minus: all_pinned.size %} + {% endif %} + + {% assign normal_end = normal_start | plus: normal_size | minus: 1 %} + + {% for i in (normal_start..normal_end) %} + {% assign posts = posts | push: all_normal[i] %} + {% endfor %} +{% endif %} + +
+ {% for post in posts %} +
+ + {% assign card_body_col = '12' %} + + {% if post.image %} + {% assign src = post.image.path | default: post.image %} + {% unless src contains '//' %} + {% assign src = post.media_subpath | append: '/' | append: src | replace: '//', '/' %} + {% endunless %} + + {% assign alt = post.image.alt | xml_escape | default: 'Preview Image' %} + + {% assign lqip = null %} + + {% if post.image.lqip %} + {% capture lqip %}lqip="{{ post.image.lqip }}"{% endcapture %} + {% endif %} + +
+ {{ alt }} +
+ + {% assign card_body_col = '7' %} + {% endif %} + +
+
+

{{ post.title }}

+ +
+

{% include post-description.html %}

+
+ + + +
+ +
+
+
+ {% endfor %} +
+ + +{% if paginator.total_pages > 1 %} + {% include post-paginator.html %} +{% endif %} diff --git a/_sass/base/_typography.scss b/_sass/base/_typography.scss index 4cf3964..8141ed1 100644 --- a/_sass/base/_typography.scss +++ b/_sass/base/_typography.scss @@ -241,7 +241,10 @@ main { border-bottom: solid 2px rgba(210, 215, 217, 0.75); th { - @extend %table-cell; + /* @extend %table-cell;*/ + padding: 5px; + border: 1px solid #C2C0C0; + background-color: #55608f; } } @@ -258,7 +261,10 @@ main { } td { - @extend %table-cell; + /*@extend %table-cell;*/ + padding: 5px; + border: 1px solid #C2C0C0; + border-collapse: collapse; } } } /* tbody */ diff --git a/_sass/themes/_dark.scss b/_sass/themes/_dark.scss index 8c2f6ea..8149faf 100644 --- a/_sass/themes/_dark.scss +++ b/_sass/themes/_dark.scss @@ -59,8 +59,8 @@ --toc-highlight: rgb(116, 178, 243); --toc-popup-border-color: #373737; --tag-hover: rgb(43, 56, 62); - --tb-odd-bg: #252526; /* odd rows of the posts' table */ - --tb-even-bg: rgb(31, 31, 34); /* even rows of the posts' table */ + --tb-odd-bg: #696666; /* odd rows of the posts' table */ + --tb-even-bg: #363434; /* 1F1F22 -> rgb(31, 31, 34) even rows of the posts' table */ --tb-border-color: var(--tb-odd-bg); --footnote-target-bg: rgb(63, 81, 181); --btn-share-color: #6c757d; diff --git a/assets/css/jekyll-theme-chirpy.scss b/assets/css/jekyll-theme-chirpy.scss index aed06e8..4ee54e0 100644 --- a/assets/css/jekyll-theme-chirpy.scss +++ b/assets/css/jekyll-theme-chirpy.scss @@ -7,11 +7,3 @@ {%- endif -%} '; -/* append your custom style below */ -h2 { - color: #73EF35; /* red */ -} - -h3 { - color: #DAA520; /* blue */ -} diff --git a/assets/js/toc.js~ b/assets/js/toc.js~ new file mode 100644 index 0000000..3e0ddeb --- /dev/null +++ b/assets/js/toc.js~ @@ -0,0 +1,9 @@ +document.querySelector("main h2, main h3")&&tocbot.refresh({ + tocSelector:"#toc", + contentSelector:".content", + ignoreSelector:"[data-toc-skip]", + headingSelector:"h2, h3, h4, h5, h6", + orderedList:!1, + scrollSmooth:!1, + collapseDepth: 6 +}); diff --git a/chirpy.service b/chirpy.service new file mode 100644 index 0000000..9997c92 --- /dev/null +++ b/chirpy.service @@ -0,0 +1,11 @@ +[Unit] +Description=service chirpy + +[Service] +EnvironmentFile=/srv/media/chirpy/.env_file +WorkingDirectory=/srv/media/chirpy +ExecStart=/home/yann/.local/share/gem/ruby/3.4.0/bin/bundle exec jekyll build --incremental --watch +Restart=on-abort + +[Install] +WantedBy=default.target diff --git a/tools/init.sh b/tools/init.sh new file mode 100755 index 0000000..d710182 --- /dev/null +++ b/tools/init.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash +# +# Init the environment for new user. + +set -eu + +# CLI Dependencies +CLI=("git" "npm") + +ACTIONS_WORKFLOW=pages-deploy.yml + +RELEASE_HASH=$(git log --grep="chore(release):" -1 --pretty="%H") + +# temporary file suffixes that make `sed -i` compatible with BSD and Linux +TEMP_SUFFIX="to-delete" + +_no_gh=false + +help() { + echo "Usage:" + echo + echo " bash /path/to/init [options]" + echo + echo "Options:" + echo " --no-gh Do not deploy to Github." + echo " -h, --help Print this help information." +} + +# BSD and GNU compatible sed +_sedi() { + regex=$1 + file=$2 + sed -i.$TEMP_SUFFIX -E "$regex" "$file" + rm -f "$file".$TEMP_SUFFIX +} + +_check_cli() { + for i in "${!CLI[@]}"; do + cli="${CLI[$i]}" + if ! command -v "$cli" &>/dev/null; then + echo "Command '$cli' not found! Hint: you should install it." + exit 1 + fi + done +} + +_check_status() { + if [[ -n $(git status . -s) ]]; then + echo "Error: Commit unstaged files first, and then run this tool again." + exit 1 + fi +} + +_check_init() { + if [[ $(git rev-parse HEAD^1) == "$RELEASE_HASH" ]]; then + echo "Already initialized." + exit 0 + fi +} + +check_env() { + _check_cli + _check_status + _check_init +} + +reset_latest() { + git reset --hard "$RELEASE_HASH" + git clean -fd + git submodule update --init --recursive +} + +init_files() { + if $_no_gh; then + rm -rf .github + else + ## Change the files of `.github/` + temp="$(mktemp -d)" + find .github/workflows -type f -name "*$ACTIONS_WORKFLOW*" -exec mv {} "$temp/$ACTIONS_WORKFLOW" \; + rm -rf .github && mkdir -p .github/workflows + mv "$temp/$ACTIONS_WORKFLOW" .github/workflows/"$ACTIONS_WORKFLOW" + rm -rf "$temp" + fi + + # Cleanup image settings in site config + _sedi "s/(^timezone:).*/\1/;s/(^.*cdn:).*/\1/;s/(^avatar:).*/\1/" _config.yml + + # remove the other files + rm -rf tools/init.sh tools/release.sh _posts/* + + # build assets + npm i && npm run build + + # track the CSS/JS output + _sedi "/^_sass\/vendors/d" .gitignore + _sedi "/^assets\/js\/dist/d" .gitignore +} + +commit() { + git add -A + git commit -m "chore: initialize the environment" -q + echo -e "\n> Initialization successful!\n" +} + +main() { + check_env + reset_latest + init_files + commit +} + +while (($#)); do + opt="$1" + case $opt in + --no-gh) + _no_gh=true + shift + ;; + -h | --help) + help + exit 0 + ;; + *) + # unknown option + help + exit 1 + ;; + esac +done + +main