Hextra theme (#1)

* Adapt theme
* Update Contents to match with new theme
* chore: few updates
* adapt HomePage
* Add icons and french version
* fix fr homepage
* Fix Netlab view
* Fix Netlab articles
* devpod post
* French version of DevPod
* my_first_lab
This commit is contained in:
D. Arnodo
2025-02-19 19:46:53 +01:00
committed by GitHub
parent 33f66e242f
commit b47a267dc0
52 changed files with 2059 additions and 324 deletions

3
.gitmodules vendored
View File

@@ -0,0 +1,3 @@
[submodule "themes/hextra"]
path = themes/hextra
url = https://github.com/imfing/hextra.git

45
content/_index.fr.md Normal file
View File

@@ -0,0 +1,45 @@
---
title: Damien's NoteBook
layout: hextra-home
---
<!-- markdownlint-disable MD033 MD034-->
<div class="hx-mt-6 hx-mb-6">
{{< hextra/hero-headline >}}
Bloc Note Personnel
pour les NetDevOps et SRE
{{< /hextra/hero-headline >}}
</div>
<div class="hx-mb-12">
{{< hextra/hero-subtitle style="margin:.3rem 0 2rem 0">}}
Documentation et NetLab à déployer,
Pour tester et pratiquer 🚀
{{< /hextra/hero-subtitle >}}
</div>
<div class="hx-mt-6"></div>
{{< hextra/feature-grid >}}
{{< hextra/feature-card
title="Documentations"
subtitle="Liste des documents et explications sur le concept de réseau ou de système"
link="documentation"
class="hx-aspect-auto md:hx-aspect-[1.1/1] max-md:hx-min-h-[340px]"
image="/images/documentation.png"
imageClass="hx-top-[40%] hx-left-[24px] hx-w-[180%] sm:hx-w-[110%] dark:hx-opacity-80"
style="background: radial-gradient(ellipse at 50% 80%,rgba(58, 56, 113, 0.1),hsla(0,0%,100%,0));"
>}}
{{< hextra/feature-card
title="NetLab"
subtitle="Des Labs pour s'entraîner"
link="netlab"
class="hx-aspect-auto md:hx-aspect-[1.1/1] max-lg:hx-min-h-[340px]"
image="/images/netlab.png"
imageClass="hx-top-[40%] hx-left-[36px] hx-w-[180%] sm:hx-w-[110%] dark:hx-opacity-80"
style="background: radial-gradient(ellipse at 50% 80%,rgba(203, 28, 66, 0.1),hsla(0,0%,100%,0));"
>}}
{{< /hextra/feature-grid >}}

45
content/_index.md Normal file
View File

@@ -0,0 +1,45 @@
---
title: Damien's NoteBook
layout: hextra-home
---
<!-- markdownlint-disable MD033 MD034-->
<div class="hx-mt-6 hx-mb-6">
{{< hextra/hero-headline >}}
Personal Notebook
for NetDevOps and SRE
{{< /hextra/hero-headline >}}
</div>
<div class="hx-mb-12">
{{< hextra/hero-subtitle style="margin:.3rem 0 2rem 0">}}
Documentation and NetLab to Deploy,
Tests and Practice 🚀
{{< /hextra/hero-subtitle >}}
</div>
<div class="hx-mt-6"></div>
{{< hextra/feature-grid >}}
{{< hextra/feature-card
title="Documentations"
subtitle="List of documentation and explanation about Network or System concept"
link="documentation"
class="hx-aspect-auto md:hx-aspect-[1.1/1] max-md:hx-min-h-[340px]"
image="/images/documentation.png"
imageClass="hx-top-[40%] hx-left-[24px] hx-w-[180%] sm:hx-w-[110%] dark:hx-opacity-80"
style="background: radial-gradient(ellipse at 50% 80%,rgba(58, 56, 113, 0.1),hsla(0,0%,100%,0));"
>}}
{{< hextra/feature-card
title="NetLab"
subtitle="Labs to practice"
link="netlab"
class="hx-aspect-auto md:hx-aspect-[1.1/1] max-lg:hx-min-h-[340px]"
image="/images/netlab.png"
imageClass="hx-top-[40%] hx-left-[36px] hx-w-[180%] sm:hx-w-[110%] dark:hx-opacity-80"
style="background: radial-gradient(ellipse at 50% 80%,rgba(203, 28, 66, 0.1),hsla(0,0%,100%,0));"
>}}
{{< /hextra/feature-grid >}}

View File

@@ -1,14 +1,7 @@
---
title: "NetOps"
date: 2024-08-01T15:19:38+02:00
draft: false
categories: "Documentations"
UseHugoToc: true
TocOpen: false
showToc: true
weight: 1
title: A Propos
toc: false
---
## Travail et missions d'un NetDevOps 🖥️🛠️📡
Le métier de NetDevOps est relativement nouveau dans l'industrie informatique. Il combine les compétences des développeurs et des opérations réseau pour fournir une infrastructure réseau agile et robuste, et améliorer la qualité de l'expérience utilisateur. Dans cet article, nous allons explorer les missions et les compétences d'un NetDevOps.

View File

@@ -1,12 +1,6 @@
---
title: "NetOps"
date: 2024-08-01T15:19:38+02:00
draft: false
categories: "Documentations"
UseHugoToc: true
TocOpen: false
showToc: true
weight: 1
title: About
toc: false
---
## Job and Missions of a NetDevOps 🖥️🛠️📡

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -1,18 +1,8 @@
---
title: "VXLAN Pour les débutants"
title: "VXLAN pour les débutants"
date: 2024-08-01T20:00:00+02:00
draft: false
categories: "Documentations"
tags:
- Network
- VXLAN
- Architecture
UseHugoToc: true
TocOpen: false
showToc: true
cover:
image: "/img/cover_vxlan_dummies.webp"
caption: "Building the Future of Networking: Exploring VLANs and VXLANs Across Scalable Digital Landscapes"
cascade:
type: docs
---
## Comprendre VLAN et VXLAN : Simplifié pour les non-techniciens
@@ -23,8 +13,6 @@ Nous aborderons également leurs limites, leurs cas dusage concrets, ainsi qu
Allons-y ! 🚀
---
## Qu'est-ce qu'un VLAN ? 🏢
**VLAN (Virtual Local Area Network)**, ou Réseau Local Virtuel, c'est comme organiser un grand immeuble de bureaux avec plusieurs départements : Marketing, Ventes, RH, et Informatique. Pour maintenir l'ordre, chaque département obtient son propre étage. De cette manière, les personnes du Marketing restent à leur étage, celles des Ventes au leur, et ainsi de suite.
@@ -42,8 +30,6 @@ Un **VLAN** fonctionne de manière similaire pour les réseaux informatiques. Il
- **Limite dID :** Historiquement, un VLAN est identifié sur 12 bits, permettant jusquà 4094 VLANs (de 1 à 4094). Pour une grande entreprise ou un datacenter, cela peut savérer insuffisant.
- **Isolation locale :** Les VLANs sont plutôt conçus pour un usage local (un même site ou un ensemble de switches connectés localement). Dès quon veut étendre ce concept à plusieurs sites, on a besoin de solutions plus avancées.
---
## Qu'est-ce que le VXLAN ? 🌆
**VXLAN (Virtual Extensible LAN)** va plus loin. Imaginez que votre entreprise grandisse et s'étende à plusieurs immeubles à travers la ville. Vous voulez toujours que les départements se sentent comme s'ils étaient sur leurs propres étages, même s'ils sont maintenant répartis dans différents endroits. Pour ce faire, vous créez un système virtuel qui connecte tous les étages à travers les bâtiments, de sorte que le Marketing au 3e étage d'un bâtiment soit toujours virtuellement connecté au Marketing du 3e étage d'un autre bâtiment.
@@ -56,8 +42,6 @@ Le **VXLAN** fait cela pour les réseaux. Il étend les VLANs à travers plusieu
- **Flexibilité :** Permet des conceptions de réseau plus grandes et dynamiques.
- **Connectivité :** Assure une communication fluide à travers des réseaux dispersés.
---
## Plongée technique dans le VXLAN 🔍
Le **VXLAN** a été développé pour répondre aux limites des VLANs traditionnels (scalabilité, étendue géographique). Il utilise un identifiant de réseau VXLAN (**VNI**) de 24 bits pour identifier jusqu'à **16 millions** de segments logiques, surpassant ainsi largement la limite de 4094 VLANs.
@@ -70,19 +54,15 @@ Lobjectif du **VXLAN** est de **prolonger la couche 2** à travers un réseau
> **En clair :** On encapsule les trames Ethernet (couche 2) dans un paquet UDP (couche 4), lui-même transporté par IP (couche 3).
---
![OSI Layers](media_layers.png#center)
![Couches OSI](couches_materielles.png#center)
> ✏️ **Les couches “matérielles”**
> [!NOTE]**Les couchesmatérielles”**
>
> - La couche **Liaison (2)** est communément gérée par des switches.
> - La couche **Réseau (3)** est communément gérée par des routeurs.
En encapsulant la couche 2 dans la couche 3, on profite des avantages du routage IP (souplesse, scalabilité) tout en conservant lisolation et la simplicité de la couche 2 pour les applications et machines virtuelles.
---
### VXLAN expliqué par lanalogie du transport de conteneurs 🚚 🚂
#### 1. Les camions (couches basses)
@@ -97,8 +77,6 @@ Quand il sagit de couvrir de plus longues distances ou de traverser des infra
Le train roule sur des rails (le **réseau IP**, couche 3). Les voies ferrées sont déjà construites et gérées pour trouver le meilleur itinéraire: elles assurent la convergence des routes et peuvent rediriger le trafic en cas de problème (panne, congestion, etc.). De la même façon, le réseau IP choisit automatiquement le chemin le plus optimal pour transporter les paquets VXLAN.
---
### Points clés à retenir
- **Superposition (Overlay)** : VXLAN est un système de transport «par-dessus» la couche 3 (les rails). Il permet dinterconnecter plusieurs réseaux de niveau 2 (les camions) comme sils nen formaient quun seul.
@@ -110,8 +88,6 @@ Le train roule sur des rails (le **réseau IP**, couche 3). Les voies ferrées s
![Container transport](transports.png#center)
---
## Cas d'usage concrets 🏭
- **Multi-datacenter :** Pour connecter plusieurs centres de données géographiquement dispersés, tout en gardant la sensation dun réseau unique au niveau 2.
@@ -119,8 +95,6 @@ Le train roule sur des rails (le **réseau IP**, couche 3). Les voies ferrées s
- **Migration de machines virtuelles :** Permettre la migration (VM Mobility) entre sites distants sans perdre la connectivité de couche 2.
- **Virtualisation massive :** Dans les environnements très denses (par ex. des centaines de milliers de machines virtuelles), lidentifiant VNI de 24 bits est indispensable.
---
## Contrôle du VXLAN : BGP EVPN et autres protocoles 🤝
Dans les déploiements modernes, surtout en datacenter, le VXLAN nest pas simplement configuré de manière statique. Il est souvent associé à un **contrôle de plan** via le protocole **BGP EVPN (Ethernet VPN)**.
@@ -128,15 +102,11 @@ Dans les déploiements modernes, surtout en datacenter, le VXLAN nest pas sim
- **BGP EVPN :** Permet déchanger les informations de tables MAC et IP entre les équipements, facilitant lautomatisation et lévolutivité.
- **Autres technologies :** Historiquement, on pouvait croiser dautres protocoles doverlay (NVGRE, STT), mais VXLAN sest imposé comme standard de fait.
---
## Considérations de performance ⚙️
- **Surcharge dencapsulation :** Le VXLAN ajoute un en-tête supplémentaire (8 octets + en-tête UDP/IP). Cela peut impacter la **taille maximale de trame (MTU)** et il faut souvent configurer un **Jumbo MTU** (généralement 9000 octets) pour éviter la fragmentation des paquets.
- **Résilience du réseau IP :** La fiabilité du tunnel VXLAN dépend de la qualité du réseau IP sous-jacent (routes, congestion, etc.).
---
## Exemple de configuration (pour les plus curieux) 💡
Voici un **extrait simplifié** dune configuration VXLAN sur un équipement Cisco NX-OS (les syntaxes varient selon les constructeurs) :
@@ -156,8 +126,6 @@ interface nve1
*Note :* Dans les environnements plus complexes, on configure également le plan de contrôle (par ex. BGP EVPN).
---
## En résumé 🎯
- **VLAN**
@@ -170,17 +138,13 @@ interface nve1
Le **VXLAN** répond aux besoins d'isolation à grande échelle, dépasse les limitations des tables d'adresses MAC des commutateurs et permet un déploiement flexible des services. De plus, associé à un plan de contrôle efficace (BGP EVPN), il simplifie grandement la gestion des réseaux modernes en **overlay**.
---
### Conclusion 🏁
En bref, si vous recherchez une **segmentation de base** pour votre réseau local, un **VLAN** est largement suffisant. Mais dès lors que vous voulez relier plusieurs sites, créer un réseau hautement virtualisé, ou dépasser la limite traditionnelle de 4094 VLANs, le **VXLAN** devient incontournable.
Que vous soyez un passionné de **Lab réseau**, un ingénieur NetOps, ou tout simplement curieux des dessous de linfrastructure informatique, comprendre ces deux notions vous aidera à mieux appréhender la magie qui se déroule lorsque vos données circulent de plus en plus loin, tout en conservant lillusion dêtre “chez soi” sur le même réseau local !
---
> **Envie daller plus loin ?**
> [!TIP] **Envie daller plus loin ?**
>
> - Regardez du côté du **BGP EVPN** pour le plan de contrôle du VXLAN.
> - Explorez la **configuration Jumbo MTU** pour optimiser vos performances.

View File

@@ -1,18 +1,8 @@
---
title: "VXLAN for Beginners"
date: 2024-08-01T20:00:00+02:00
draft: false
categories: "Documentation"
tags:
- Network
- VXLAN
- Architecture
UseHugoToc: true
TocOpen: false
showToc: true
cover:
image: "/img/cover_vxlan_dummies.webp"
caption: "Building the Future of Networking: Exploring VLANs and VXLANs Across Scalable Digital Landscapes"
cascade:
type: docs
---
## Understanding VLAN and VXLAN: Simplified for Non-Technicians
@@ -25,8 +15,6 @@ Well also cover their limitations, real-world use cases, and some technical p
Lets go! 🚀
---
## What is a VLAN? 🏢
**VLAN (Virtual Local Area Network)** is like organizing a large office building with multiple departments: Marketing, Sales, HR, and IT. To keep things orderly, each department gets its own floor. This way, Marketing stays on its floor, Sales stays on theirs, and so on.
@@ -44,8 +32,6 @@ A **VLAN** works similarly for computer networks. It divides a large physical ne
- **ID Limit:** Historically, a VLAN is identified by a 12-bit field, allowing up to 4094 VLANs (1 to 4094). For a large company or a datacenter, this might be insufficient.
- **Local Isolation:** VLANs are primarily designed for local use (on the same site or a connected set of switches). Extending this concept to multiple sites requires more advanced solutions.
---
## What is VXLAN? 🌆
**VXLAN (Virtual Extensible LAN)** goes further. Imagine your company grows and expands to multiple office buildings across the city. You still want each department to feel as if its on its own floor, even though theyre now spread out across different locations. To do this, you create a virtual system that connects all floors across buildings so that Marketing on the 3rd floor of one building is still virtually connected to Marketing on the 3rd floor of another building.
@@ -58,8 +44,6 @@ A **VLAN** works similarly for computer networks. It divides a large physical ne
- **Flexibility:** Enables larger, more dynamic network designs.
- **Connectivity:** Ensures seamless communication across dispersed networks.
---
## Technical Dive into VXLAN 🔍
**VXLAN** was developed to address the limitations of traditional VLANs (scalability, geographic reach). It uses a **VNI** (VXLAN Network Identifier) with 24 bits to identify up to **16 million** logical segments, far exceeding the 4094 VLAN limit.
@@ -72,19 +56,15 @@ The goal of **VXLAN** is to **extend Layer 2** across a Layer 3 (IP) network. Es
> **In simple terms:** Ethernet frames (Layer 2) are encapsulated inside a UDP packet (Layer 4), which is then carried by IP (Layer 3).
---
![OSI Layers](media_layers.png#center)
> ✏️ **The “Physical” Layers**
> [!NOTE] **The “Physical” Layers**
>
> - The **Link Layer (Layer 2)** is typically managed by switches.
> - The **Network Layer (Layer 3)** is typically managed by routers.
By encapsulating Layer 2 inside Layer 3, you benefit from the advantages of IP routing (flexibility, scalability) while preserving the isolation and simplicity of Layer 2 for applications and virtual machines.
---
### VXLAN Explained by the Container Transport Analogy 🚚 🚂
#### 1. Trucks (lower layers)
@@ -99,8 +79,6 @@ When its time to travel longer distances or through different infrastructures
The train runs on rails (the **IP network**, Layer 3). The railroad is already built and managed to find the best path; it ensures route convergence and can reroute traffic in case of issues (breakdowns, congestion, etc.). Similarly, the IP network automatically selects the optimal path to transport VXLAN packets.
---
### Key Takeaways
- **Overlay:** VXLAN is a transport system “on top of” Layer 3 (the rails). It interconnects multiple Layer 2 networks (the trucks) as if they were just one.
@@ -112,8 +90,6 @@ The train runs on rails (the **IP network**, Layer 3). The railroad is already b
![Container transport](transports.png#center)
---
## Real-World Use Cases 🏭
- **Multi-datacenter:** For connecting multiple geographically dispersed data centers while preserving the feel of a single Layer 2 network.
@@ -121,8 +97,6 @@ The train runs on rails (the **IP network**, Layer 3). The railroad is already b
- **Virtual Machine Migration:** Enabling VM mobility between distant sites without losing Layer 2 connectivity.
- **Massive Virtualization:** In highly dense environments (e.g., hundreds of thousands of virtual machines), the 24-bit VNI is indispensable.
---
## VXLAN Control: BGP EVPN and Other Protocols 🤝
In modern deployments, especially in data centers, VXLAN isnt just configured statically. Its often paired with a **control plane** via **BGP EVPN (Ethernet VPN)**.
@@ -130,15 +104,11 @@ In modern deployments, especially in data centers, VXLAN isnt just configured
- **BGP EVPN:** Exchanges MAC and IP table information between devices, facilitating automation and scalability.
- **Other Technologies:** Historically, other overlay protocols (NVGRE, STT) existed, but VXLAN has become the de facto standard.
---
## Performance Considerations ⚙️
- **Encapsulation Overhead:** VXLAN adds an extra header (8 bytes + UDP/IP header). This can affect the **Maximum Transmission Unit (MTU)** size, often requiring **Jumbo MTU** (usually 9000 bytes) to avoid packet fragmentation.
- **Resilience of the IP Network:** The tunnels reliability depends on the underlying IP networks quality (routes, congestion, etc.).
---
## Example Configuration (for the curious) 💡
Below is a **simplified excerpt** of a VXLAN configuration on a Cisco NX-OS device (syntax can vary by vendor):
@@ -158,8 +128,6 @@ interface nve1
*Note:* In more complex environments, the control plane (e.g., BGP EVPN) is also configured.
---
## Summary 🎯
- **VLAN**
@@ -172,17 +140,13 @@ interface nve1
**VXLAN** addresses the need for large-scale isolation, overcomes the limitations of switch MAC address tables, and allows for flexible deployment of services. Paired with an efficient control plane (BGP EVPN), it greatly simplifies the management of modern overlay networks.
---
### Conclusion 🏁
In short, if you need **basic segmentation** for your local network, **VLAN** is more than enough. But as soon as you want to connect multiple sites, build a highly virtualized network, or exceed the traditional 4094 VLAN limit, **VXLAN** becomes essential.
Whether youre a **network lab** enthusiast, a NetOps engineer, or simply curious about the underlying infrastructure, understanding these two concepts will help you better grasp the magic that happens when your data travels farther and farther while preserving the illusion of being “at home” on the same local network!
---
> **Want to learn more?**
> [!TIP] **Want to learn more?**
>
> - Check out **BGP EVPN** for VXLANs control plane.
> - Look into **Jumbo MTU configuration** to optimize performance.

View File

View File

View File

@@ -0,0 +1,16 @@
---
title: Documentation
cascade:
type: docs
---
<!-- markdownlint-disable MD033 MD034-->
{{< hextra/hero-subtitle >}}
Documentation complète et guides pratiques étape par étape
{{< /hextra/hero-subtitle >}}
{{< cards >}}
{{< card link="https://containerlab.dev/install/" title="ContainerLab" subtitle="Comment Installer ContainerLab" icon="endpoints" >}}
{{< card link="https://devpod.sh" title="DevPod" subtitle="Une manière simple de déployer Lab" icon="git" >}}
{{< /cards >}}

View File

@@ -0,0 +1,16 @@
---
title: Documentation
cascade:
type: docs
---
<!-- markdownlint-disable MD033 MD034-->
{{< hextra/hero-subtitle >}}
Comprehensive Documentation and Step-by-Step "How-To" Guides
{{< /hextra/hero-subtitle >}}
{{< cards >}}
{{< card link="https://containerlab.dev/install/" title="ContainerLab" subtitle="How to install ContainerLab" icon="endpoints" >}}
{{< card link="https://devpod.sh" title="DevPod" subtitle="Easy way to deploy Lab" icon="git" >}}
{{< /cards >}}

View File

@@ -0,0 +1,317 @@
---
title: "DevPod sur AWS"
date: 2025-02-11T20:00:00+02:00
weight: 1
cascade:
type: docs
---
## Sources
- [DevPod](https://devpod.sh/docs/what-is-devpod) ⚙️
- [DevContainer](https://containers.dev) 🐳
## Introduction 🚀
Dans cet article, je souhaite présenter un outil fantastique qui fait partie de la même famille que GitPod et Codespaces : **DevPod** ! Il vous permet de créer des environnements de développement sans effort — sans se retrouver bloqué par un fournisseur. 🔒❌
DevPod est basé sur l'architecture **DevContainer** et utilise les spécifications contenues dans un fichier [devcontainer.json](https://containers.dev) pour lancer votre environnement de développement. Personnellement, je l'utilise pour déployer rapidement des maquette réseau avec ContainerLab. 💻🧰
## Qu'est-ce qu'un DevContainer ? 🤔
Un conteneur de développement (souvent appelé « dev container ») vous permet d'utiliser un conteneur comme un environnement de développement complet. (Consultez la documentation officielle de [containers.dev](https://containers.dev) pour plus de détails.)
Décomposons cela :
Avez-vous déjà entendu l'expression « Ça marche sur ma machine » ? Si vous êtes développeur, vous avez sans doute rencontré ce problème en collaborant avec d'autres. Mais devinez quoi ? Les **DevContainers** résolvent le problème de la dérive des environnements en fournissant des environnements Docker cohérents et reproductibles. Adieu les maux de tête liés à l'installation ! 💆‍♀️
Avec les DevContainers, il vous suffit de :
1. Un dossier `.devcontainer` dans votre projet.
2. Un fichier `devcontainer.json` qui indique à VS Code comment configurer le conteneur.
3. Docker installé localement
La pierre angulaire du DevContainer est le fichier `devcontainer.json`. Par exemple :
```json
{
"name": "Python DevContainer",
"image": "mcr.microsoft.com/devcontainers/python:3.10",
"features": {
"docker-in-docker": "latest"
},
"extensions": [
"ms-python.python",
"ms-azuretools.vscode-docker"
]
}
```
**Que se passe-t-il ici ?** 🕵️‍♀️
- **"image"** Cela utilise un environnement Python 3.10 prêt à l'emploi.
- **"features"** Cela ajoute la prise en charge de Docker dans le conteneur.
- **"extensions"** Installe des extensions utiles pour Python et Docker dans VS Code.
Les DevContainers sont formidables pour le développement local, mais parfois vous avez besoin de plus de puissance — peut-être que vos charges de travail sont énormes, ou que vous souhaitez exécuter des laboratoires spécialisés. C'est là qu'intervient **DevPod**. 💪
**Pour pouvoir déployer facilement des laboratoires sur le Cloud**
## Qu'est-ce que DevPod ? 🤖
**DevPod** est un outil open-source qui vous permet de lancer des environnements de développement soit sur votre machine locale, soit dans le cloud de votre choix. Imaginez une version auto-hébergée et ultra-personnalisable de GitHub Codespaces. 🎉
Dans mes aventures quotidiennes en réseau, je déploie des configurations basées sur ContainerLab avec des DevContainers sur AWS. Voyons comment vous pouvez utiliser DevPod pour faire exactement cela (les détails sur ContainerLab suivront dans un autre article, promis!). 😜
## Fournisseur AWS 🌐
DevPod utilise des **Providers** (fournisseurs), qui sont des modules de configuration définissant où et comment DevPod lance votre environnement. Voici la liste des fournisseurs :
![Provider_list](provider.png#center)
Nous allons nous concentrer sur le **Provider AWS** — bien qu'il existe de nombreuses options de configuration :
![Provider_list](aws_options.png#center)
Avant de paniquer devant tous ces réglages, ne vous inquiétez pas. Si vous ne faites que quelques expérimentations, les valeurs par défaut conviennent généralement. 🙌
> [!NOTE] **Les avantages de l'open-source** 🎁
>
> Le fait que DevPod soit open-source signifie que vous pouvez jeter un œil sous le capot pour voir exactement comment il fonctionne. Consultez le code AWS [ici](https://github.com/loft-sh/devpod-provider-aws/tree/main) si vous êtes curieux.
## Fonctionnement du code AWS
Examinons ce que fait DevPod sur AWS en regardant le [code aws.go](https://github.com/loft-sh/devpod-provider-aws/blob/main/pkg/aws/aws.go). À un niveau global, il gère :
1. **Initialisation** : Lecture de la configuration et mise en place des clients du SDK AWS (avec des identifiants personnalisés si nécessaire).
2. **Réseautage** : Recherche ou création du sous-réseau, VPC et groupes de sécurité appropriés.
3. **Sélection de l'AMI** : Choix d'une AMI adaptée (par défaut, une image Ubuntu 22.04 récente) et détermination du périphérique racine.
4. **Configuration IAM** : Vérification qu'un rôle d'instance approprié et un profil d'instance existent, avec les politiques associées.
5. **Cycle de vie de l'instance** : Création, démarrage, arrêt, vérification du statut et suppression des instances.
6. **Injection de données utilisateur** : Génération d'un script (encodé en Base64) qui configure l'instance (ajoute des utilisateurs et des clés SSH) au premier démarrage.
7. **DNS optionnel** : Gestion des enregistrements Route 53 pour l'instance si la configuration l'exige.
De mon point de vue, deux points se distinguent comme étant potentiellement les plus critiques :
- **(#4) Configuration IAM**
- **(#6) Injection de données utilisateur**
### Pourquoi les points #4 et #6 sont-ils « délicats » ?
- **Configuration IAM** est principalement gérée par la fonction `CreateDevpodInstanceProfile`. Elle crée un rôle nommé `devpod-ec2-role` qui peut effectuer les opérations suivantes :
- **Opérations EC2** : Par exemple, il peut décrire ou arrêter des instances — en particulier l'instance qui lui est associée.
- **Opérations SSM** : En attachant la politique AmazonSSMManagedInstanceCore, l'instance peut être gérée par AWS Systems Manager.
- **Opérations KMS (optionnel)** : Si configuré, il peut exécuter `kms:Decrypt` sur une clé KMS spécifique, ce qui est utile pour gérer les données de session ou les secrets.
- **Injection de données utilisateur** est essentiellement un script de démarrage inséré dans l'instance sous forme de Base64. Ce script configure un utilisateur `devpod` avec des droits sudo, crée les dossiers SSH et insère votre clé publique dans le fichier approprié. Dans le code, [cela ressemble à](https://github.com/loft-sh/devpod-provider-aws/blob/9d2730c34ecee40cb42596c602381b92ad9c6682/pkg/aws/aws.go#L967-L980) :
```bash
useradd devpod -d /home/devpod
mkdir -p /home/devpod
if grep -q sudo /etc/groups; then
usermod -aG sudo devpod
elif grep -q wheel /etc/groups; then
usermod -aG wheel devpod
fi
echo "devpod ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/91-devpod
mkdir -p /home/devpod/.ssh
echo " + string(publicKey) + " >> /home/devpod/.ssh/authorized_keys
chmod 0700 /home/devpod/.ssh
chmod 0600 /home/devpod/.ssh/authorized_keys
chown -R devpod:devpod /home/devpod
```
Comme DevPod est open-source, vous pouvez facilement vérifier par vous-même. C'est un excellent outil d'apprentissage si vous souhaitez comprendre tous les rouages ! 🔩
## Rôles et politiques IAM
Vous devrez créer un utilisateur IAM et lui attacher une politique IAM qui accorde juste assez de permissions pour DevPod. Par exemple :
- **Actions EC2 :**
- Description : `ec2:DescribeSubnets`, `ec2:DescribeVpcs`, `ec2:DescribeImages`, `ec2:DescribeInstances`, `ec2:DescribeSecurityGroups`
- Gestion des instances : `ec2:RunInstances`, `ec2:StartInstances`, `ec2:StopInstances`, `ec2:TerminateInstances`, `ec2:CancelSpotInstanceRequests`
- Groupes de sécurité & Tags : `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTags`
- **Actions IAM :**
- `iam:GetInstanceProfile`, `iam:CreateRole`, `iam:PutRolePolicy`, `iam:AttachRolePolicy`, `iam:CreateInstanceProfile`, `iam:AddRoleToInstanceProfile`
- **Route 53 (optionnel) :**
- `route53:ListHostedZones`, `route53:GetHostedZone`, `route53:ChangeResourceRecordSets`
## Configuration AWS 🏗️
J'utilise généralement la console web AWS pour configurer cela, mais vous pouvez tout à fait le faire via la CLI.
### Étape 1 : Connectez-vous à la console AWS
1. Rendez-vous sur [AWS Management Console](https://aws.amazon.com/console/).
2. Utilisez un compte disposant des droits appropriés pour créer des ressources IAM.
### Étape 2 : Créer une politique IAM personnalisée
#### **A. Accédez à la console IAM**
- Dans le menu AWS, trouvez **IAM**.
#### **B. Créer une nouvelle politique**
1. Cliquez sur **Policies** dans le menu de gauche.
2. Cliquez sur **Create policy**.
#### **C. Passez à l'onglet JSON**
- Collez quelque chose comme ceci, en ajustant si nécessaire :
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EC2Actions",
"Effect": "Allow",
"Action": [
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeSecurityGroups",
"ec2:RunInstances",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances",
"ec2:CancelSpotInstanceRequests",
"ec2:CreateSecurityGroup",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateTags",
"ec2:DeleteTags"
],
"Resource": "*"
},
{
"Sid": "IAMActions",
"Effect": "Allow",
"Action": [
"iam:GetInstanceProfile",
"iam:CreateRole",
"iam:PutRolePolicy",
"iam:AttachRolePolicy",
"iam:CreateInstanceProfile",
"iam:AddRoleToInstanceProfile"
],
"Resource": "*"
},
{
"Sid": "Route53Actions",
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetHostedZone",
"route53:ChangeResourceRecordSets"
],
"Resource": "*"
}
]
}
```
- Cliquez sur **Next** (les tags sont optionnels), puis sur **Next: Review**.
#### **D. Vérifier et créer**
1. Nommez-la `DevpodToolPolicy` (ou comme vous le souhaitez).
2. Ajoutez une description facultative.
3. Cliquez sur **Create policy**.
### Étape 3 : Créer ou mettre à jour l'utilisateur IAM
#### **A. Créer un nouvel utilisateur (si nécessaire)**
1. Cliquez sur **Users** dans IAM.
2. Cliquez sur **Add user**.
3. Donnez-lui un nom (par exemple, `devpod-tool-user`).
4. Choisissez **Programmatic access** si vous souhaitez un accès via la CLI. 🤖
5. Cliquez sur **Next**.
#### **B. Attacher votre nouvelle politique**
1. Sur la page des permissions, choisissez **Attach policies directly**.
2. Cochez `DevpodToolPolicy`.
3. Cliquez sur **Create**.
4. Et voilà !
### Étape 4 : Vérifier et c'est fini
Retournez dans **Users** → **devpod-tool-user** → **Permissions** pour confirmer que `DevpodToolPolicy` est bien attachée. ✅
### Étape 5 : Utilisez ces identifiants
- Si vous avez créé un utilisateur programmatique, n'oubliez pas de noter l'**Access Key ID** et le **Secret Access Key**.
![devpod_user_sumup](devpod_user.png#center)
**Bonus** : Notez votre **ID VPC** (dans la section VPC sur AWS). Vous en aurez besoin lors de la configuration de DevPod.
## Configurer DevPod 🛠️
### 1. Configurer le profil AWS
```bash
aws configure --profile Devpod
```
Lorsqu'on vous le demande :
1. L'Access Key ID
2. Le Secret Access Key
3. La région par défaut (par exemple, `eu-west-1`)
4. Le format de sortie (je le laisse généralement vide)
### 2. Ajouter le profil à DevPod
1. Dans DevPod, créez un nouveau provider et choisissez **AWS**.
2. Sélectionnez la **région AWS** (par exemple, `eu-west-1`).
3. Développez les options AWS.
4. **Taille du disque AWS** : par exemple, 40GB pour commencer.
5. **Type d'instance** : par exemple, `t2.small`.
6. **Profil AWS** : sélectionnez `Devpod` (ou le nom que vous avez choisi).
7. **ID VPC AWS** : ajoutez votre VPC.
8. Vous pouvez laisser le reste par défaut.
Cliquez sur **Add Provider**.
![added_new_provider](new_provider.png#center)
## Tester un déploiement 🧪
### Déployer
Nous allons effectuer un test rapide en utilisant l'une des images Docker préconstruites :
1. Rendez-vous dans **Workspaces** dans DevPod.
2. Cliquez sur **Create Workspace**.
3. Choisissez votre nouveau provider **AWS**.
4. Choisissez votre IDE préféré (VS Code, etc.).
5. À droite, sélectionnez un exemple de démarrage rapide (par exemple, Python). 🐍
6. Cliquez sur **Create Workspace**.
![new_worspace](new_worskapce.png#center)
Attendez quelques instants, et votre environnement basé sur le cloud apparaîtra dans VS Code. 🎊
![vscode](vscode.png#center)
### Arrêter
Lorsque vous n'utilisez pas l'environnement, cliquez sur **Stop** pour éteindre l'instance EC2. Vous ne paierez que pour le stockage — aucun temps de calcul. Idéal pour votre portefeuille. 💰
![Stopped Instance](stopped_instance.png#center)
### Supprimer
Supprimer le workspace supprime toutes les ressources AWS associées à cet environnement, vous ne paierez donc pas un centime. Mais vous devrez redéployer si vous souhaitez l'utiliser à nouveau. ♻️
![Delete Instance](delete_instance.png#center)
## Conclusion 💡
En combinant **DevContainers** et **DevPod** sur **AWS**, vous pouvez créer des environnements de développement flexibles et autogérés qui évoluent avec votre croissance — sans être enfermé dans des plateformes spécifiques à un fournisseur. Dites adieu aux problèmes du « Ça marche sur ma machine ! » et accueillez un codage sans friction. 🚀✨
Amusez-vous bien ! 🎉

View File

@@ -0,0 +1,317 @@
---
title: "DevPod on AWS"
date: 2025-02-11T20:00:00+02:00
weight: 1
cascade:
type: docs
---
## Sources
- [DevPod](https://devpod.sh/docs/what-is-devpod) ⚙️
- [DevContainer](https://containers.dev) 🐳
## Introduction 🚀
In this article, Id like to showcase a fantastic tool that sits in the same family as GitPod and Codespaces: **DevPod**! It empowers you to create development environments effortlessly—without getting locked into any particular vendor. 🔒❌
DevPod is based on **DevContainer** architecture and uses the specs found in a [devcontainer.json](https://containers.dev) file to spin up your dev setup. Personally, I love it for quickly and reliably deploying Network Labs with ContainerLab. 💻🧰
## What a DevContainer Is 🤔
A development container (often called a “dev container”) lets you use a container as a full-featured dev environment. (Check out the official [containers.dev documentation](https://containers.dev) for more details.)
Lets break it down:
Have you ever heard the phrase “It works on my machine”? If youre a developer, youve probably run headfirst into this problem when collaborating with others. But guess what? **DevContainers** solve the mystery of environment drift by providing consistent, reproducible Docker-based environments. Bye-bye setup headaches! 💆‍♀️
Using DevContainers, you just need:
1. A `.devcontainer` folder in your project.
2. A `devcontainer.json` file that tells VS Code how to configure the container.
3. Docker installed locally
The backbone of the DevContainer is the `devcontainer.json` file. For example:
```json
{
"name": "Python DevContainer",
"image": "mcr.microsoft.com/devcontainers/python:3.10",
"features": {
"docker-in-docker": "latest"
},
"extensions": [
"ms-python.python",
"ms-azuretools.vscode-docker"
]
}
```
**Whats happening here?** 🕵️‍♀️
- **"image"** This uses a Python 3.10 environment thats ready to go.
- **"features"** This adds Docker support inside the container.
- **"extensions"** Installs useful Python and Docker extensions in VS Code.
DevContainers are awesome for local dev, but sometimes you need more muscle—maybe your workloads are huge, or you want to run specialized labs. Thats where **DevPod** comes in. 💪
**To be able to deployed lab easily on Cloud**
## What DevPod Is 🤖
**DevPod** is an open-source tool that lets you spin up dev environments either on your local machine or in the cloud of your choice. Imagine a self-hosted, super-customizable version of GitHub Codespaces. 🎉
In my day-to-day networking escapades, I deploy ContainerLab-based setups with DevContainers on AWS. Lets see how you can use DevPod to do exactly that (ContainerLab details will follow in another post, I promise!). 😜
## AWS Provider 🌐
DevPod uses **Providers**, which are like configuration modules that define where and how DevPod launches your environment. Heres the Provider list:
![Provider_list](provider.png#center)
Well focus on the **AWS Provider**—though there are many config options:
![Provider_list](aws_options.png#center)
Before you freak out at all those toggles, dont worry. If its just you tinkering, the defaults are usually fine. 🙌
> [!NOTE] **Open Source Perks** 🎁
>
> Being open-source means you can pop the hood and see exactly how DevPod works. Check out the AWS code [here](https://github.com/loft-sh/devpod-provider-aws/tree/main) if youre curious.
## How the AWS Code Works
Lets break down what DevPod will do on AWS by looking at the [aws.go code](https://github.com/loft-sh/devpod-provider-aws/blob/main/pkg/aws/aws.go). From a high-level, it handles:
1. **Initialization**: Reading configuration and setting up AWS SDK clients (with custom credentials if needed).
2. **Networking**: Finding or creating the appropriate subnet, VPC, and security groups.
3. **AMI Selection**: Choosing a suitable AMI (defaulting to a recent Ubuntu 22.04 image) and determining the root device.
4. **IAM Setup**: Ensuring an appropriate instance role and instance profile exist, complete with policies.
5. **Instance Lifecycle**: Creating, starting, stopping, checking status, and deleting instances.
6. **User Data Injection**: Generating a script (embedded as Base64) that configures the instance (sets up users and SSH keys) on first boot.
7. **Optional DNS**: Managing Route 53 records for the instance if the configuration calls for it.
From my perspective, two points stand out as potentially the most critical:
- **(#4) IAM Setup**
- **(#6) User Data Injection**
### Why are #4 and #6 “Tricky”?
- **IAM Setup** is primarily handled by the `CreateDevpodInstanceProfile` function. It creates a role named `devpod-ec2-role` that can do the following:
- **EC2 Operations**: For example, it can describe or stop instances—particularly the instance associated with itself.
- **SSM Operations**: By attaching the AmazonSSMManagedInstanceCore policy, the instance can be managed by AWS Systems Manager.
- **KMS Operations (Optional)**: If configured, it can perform `kms:Decrypt` on a specific KMS key, helpful for handling session data or secrets.
- **User Data Injection** is basically a startup script inserted into the instance as Base64. That script sets up a `devpod` user with sudo rights, creates SSH folders, and plops your public key in place. In the code, [it looks like](https://github.com/loft-sh/devpod-provider-aws/blob/9d2730c34ecee40cb42596c602381b92ad9c6682/pkg/aws/aws.go#L967-L980):
```bash
useradd devpod -d /home/devpod
mkdir -p /home/devpod
if grep -q sudo /etc/groups; then
usermod -aG sudo devpod
elif grep -q wheel /etc/groups; then
usermod -aG wheel devpod
fi
echo "devpod ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/91-devpod
mkdir -p /home/devpod/.ssh
echo " + string(publicKey) + " >> /home/devpod/.ssh/authorized_keys
chmod 0700 /home/devpod/.ssh
chmod 0600 /home/devpod/.ssh/authorized_keys
chown -R devpod:devpod /home/devpod
```
Since DevPod is open source, you can easily check this out yourself. Its a great learning tool if youre curious about the nuts and bolts! 🔩
## IAM Roles and Policies
Youll need to set up an IAM user and attach an IAM policy that grants just enough permissions for DevPod. For example:
- **EC2 Actions:**
- Describe: `ec2:DescribeSubnets`, `ec2:DescribeVpcs`, `ec2:DescribeImages`, `ec2:DescribeInstances`, `ec2:DescribeSecurityGroups`
- Manage Instances: `ec2:RunInstances`, `ec2:StartInstances`, `ec2:StopInstances`, `ec2:TerminateInstances`, `ec2:CancelSpotInstanceRequests`
- Security Groups & Tags: `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTags`
- **IAM Actions:**
- `iam:GetInstanceProfile`, `iam:CreateRole`, `iam:PutRolePolicy`, `iam:AttachRolePolicy`, `iam:CreateInstanceProfile`, `iam:AddRoleToInstanceProfile`
- **Route 53 (Optional):**
- `route53:ListHostedZones`, `route53:GetHostedZone`, `route53:ChangeResourceRecordSets`
## AWS Configuration 🏗️
I typically use the AWS web console to set this up, but you can absolutely do it all via CLI.
### Step 1: Log in to the AWS Console
1. Head to [AWS Management Console](https://aws.amazon.com/console/).
2. Use an account with the proper rights to create IAM resources.
### Step 2: Create a Custom IAM Policy
#### **A. Go to the IAM Console**
- In the AWS menu, find **IAM**.
#### **B. Create a New Policy**
1. Click **Policies** on the left.
2. Press **Create policy**.
#### **C. Switch to the JSON Tab**
- Paste in something like this, adjusting if needed:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EC2Actions",
"Effect": "Allow",
"Action": [
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeSecurityGroups",
"ec2:RunInstances",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances",
"ec2:CancelSpotInstanceRequests",
"ec2:CreateSecurityGroup",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateTags",
"ec2:DeleteTags"
],
"Resource": "*"
},
{
"Sid": "IAMActions",
"Effect": "Allow",
"Action": [
"iam:GetInstanceProfile",
"iam:CreateRole",
"iam:PutRolePolicy",
"iam:AttachRolePolicy",
"iam:CreateInstanceProfile",
"iam:AddRoleToInstanceProfile"
],
"Resource": "*"
},
{
"Sid": "Route53Actions",
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetHostedZone",
"route53:ChangeResourceRecordSets"
],
"Resource": "*"
}
]
}
```
- Click **Next** (tags optional), then **Next: Review**.
#### **D. Review and Create**
1. Name it `DevpodToolPolicy` (or whatever you like).
2. Optional description.
3. Click **Create policy**.
### Step 3: Create/Update the IAM User
#### **A. Create a New User (If Needed)**
1. Click **Users** in IAM.
2. **Add user**.
3. Name it (e.g., `devpod-tool-user`).
4. Choose **Programmatic access** if you want CLI access. 🤖
5. **Next**.
#### **B. Attach Your New Policy**
1. On the permissions page, pick **Attach policies directly**.
2. Check `DevpodToolPolicy`.
3. Click **Create**.
4. Thats it!
### Step 4: Verify & Done
Head back to **Users****devpod-tool-user****Permissions** to confirm `DevpodToolPolicy` is attached. ✅
### Step 5: Use Those Credentials
- If you created a programmatic user, make sure you note the **Access Key ID** and **Secret Access Key**.
![devpod_user_sumup](devpod_user.png#center)
**Bonus**: Keep track of your **VPC ID** (under the VPC service in AWS). Youll need it when setting up DevPod.
## Configure DevPod 🛠️
### 1. Configure AWS Profile
```bash
aws configure --profile Devpod
```
When prompted:
1. Access Key ID
2. Secret Access Key
3. Default region (e.g., `eu-west-1`)
4. Output format (I usually leave it blank.)
### 2. Add Profile to DevPod
1. In DevPod, create a new provider and pick **AWS**.
2. Select the **AWS region** (e.g., `eu-west-1`).
3. Expand AWS options.
4. **AWS Disk Size**: maybe 40GB to start.
5. **Instance Type**: e.g., `t2.small`.
6. **AWS Profile**: select `Devpod` (or the name you chose).
7. **AWS VPC ID**: add your VPC.
8. You can leave the rest as defaults.
Click **Add Provider**.
![added_new_provider](new_provider.png#center)
## Testing a Deployment 🧪
### Deploy
Well run a quick test using one of the prebuilt Docker images:
1. Go to **Workspaces** in DevPod.
2. Click **Create Workspace**.
3. Pick your new **AWS** provider.
4. Choose your preferred IDE (VS Code, etc.).
5. On the right, pick a quickstart example (e.g., Python). 🐍
6. Click **Create Workspace**.
![new_worspace](new_worskapce.png#center)
Wait a few moments, and your cloud-based environment will pop up in VS Code. 🎊
![vscode](vscode.png#center)
### Stop
When youre not using it, click **Stop** to shut down the EC2 instance. Youll only pay for storage—no compute time. Great for the wallet. 💰
![Stopped Instance](stopped_instance.png#center)
### Delete
Deleting the workspace removes all AWS resources for that environment, so you wont pay a dime. But youll have to redeploy if you want to use it again. ♻️
![Delete Instance](delete_instance.png#center)
## Conclusion 💡
By combining **DevContainers** and **DevPod** on **AWS**, you can build flexible, self-managed dev environments that scale as you grow—without getting boxed in by vendor-specific platforms. Wave goodbye to “It works on my machine!” woes, and say hello to frictionless coding. 🚀✨
Happy building and exploring! 🎉

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

View File

@@ -0,0 +1,316 @@
---
title: "Gestionnaire de Certificats Auto-Hébergé"
date: 2024-08-01T20:00:00+02:00
weight: 2
cascade:
type: docs
---
## 🔗 Sources
- [📖 Documentation Officielle](https://smallstep.com/docs/tutorials/)
- [🛠️ Step-CA en tant que Service systemd](https://angrysysadmins.tech/index.php/2022/09/grassyloki/step-ca-run-as-a-systemd-service/)
- [🔐 Gestion des Certificats avec OpenSSL](https://www.golinuxcloud.com/tutorial-pki-certificates-authority-ocsp/)
## 🤖 À propos de Step-CA
Step-CA est un ensemble d'outils astucieux développé par Smallstep, une entreprise spécialisée dans la gestion sécurisée des identités et l'automatisation des certificats. 🚀
Sa mission ? Simplifier la mise en place et la gestion de vos propres autorités de certification (AC) avec facilité et sécurité !
### Principales fonctionnalités
1. **Gestion des Autorités de Certification** 🔑
Configurez et gérez facilement vos propres AC. Créez des AC racines et intermédiaires, délivrez des certificats et gérez les révocations comme un pro.
2. **Gestion Sécurisée des Clés** 🛡️
Respecte les bonnes pratiques pour le stockage et la gestion sécurisés des clés, garantissant que vos clés cryptographiques restent protégées contre les accès non autorisés.
3. **Automatisation et Scalabilité** ⚙️
Idéal pour les déploiements de petite à grande envergure. Profitez des API et intégrations qui automatisent la délivrance, le renouvellement et la révocation des certificats pour un cycle de vie sans accrocs.
4. **Sécurité Renforcée** 🔒
Grâce à l'utilisation d'algorithmes et de protocoles cryptographiques modernes, Step-CA prend en charge les certificats X.509 conformes aux normes de l'industrie, offrant un chiffrement robuste et des signatures numériques.
5. **Intégration avec l'Infrastructure** 🌐
S'intègre parfaitement avec vos outils et systèmes existants. Prend en charge diverses méthodes d'authentification telles que nom d'utilisateur/mot de passe, MFA et fournisseurs d'identité externes.
6. **Auditabilité et Conformité** 📜
Avec des capacités complètes de journalisation et d'audit, vous pouvez suivre les activités des certificats et satisfaire aux exigences de conformité en toute simplicité.
7. **API Conviviales pour les Développeurs** 👩‍💻👨‍💻
Des API et SDK conçus pour les développeurs facilitent l'intégration de la gestion des certificats dans vos applications et flux de travail personnalisés.
**En résumé :** Step-CA de Smallstep est conçu pour rendre la gestion des autorités de certification à la fois ludique et sans tracas. Grâce à ses fonctionnalités sécurisées, scalables et conviviales, vous pouvez gérer facilement le cycle de vie de vos certificats tout en protégeant votre infrastructure !
## 🚀 Installation
### 🔧 Installation Binaire
#### 1. Step CLI
```bash
wget https://dl.step.sm/gh-release/cli/docs-cli-install/v0.24.3/step-cli_0.24.3_amd64.deb
sudo dpkg -i step-cli_0.24.3_amd64.deb
```
#### 2. Step-CA
```bash
wget https://dl.step.sm/gh-release/certificates/docs-ca-install/v0.24.1/step-ca_0.24.1_amd64.deb
sudo dpkg -i step-ca_0.24.1_amd64.deb
```
#### 3. Création d'un Utilisateur Spécifique
```bash
adduser adminCA
```
#### Configuration
```bash
$ step ca init --password-file=password.txt
✔ Type de déploiement : Autonome
Quel nom souhaitez-vous donner à votre nouvelle PKI ?
(ex. Smallstep) : Lab
(ex. ca.example.com[,10.1.2.3,etc.]) : ca.lab.loc, localhost, 192.168.1.101
À quelle IP et sur quel port votre nouvelle AC sera-t-elle liée ? (:443 se lie à 0.0.0.0:443). 1.101
(ex. :443 ou 127.0.0.1:443) : :443
Quel nom souhaitez-vous donner au premier provisionneur de l'AC ?
✔ (ex. vous@smallstep.com) : contact@lab.loc
Choisissez un mot de passe pour vos clés AC et le premier provisionneur.
✔ [laissez vide et nous en générerons un] :
Génération du certificat racine... fait ! 🎉
Génération du certificat intermédiaire... fait ! 🎊
✔ Certificat racine : /home/adminCA/.step/certs/root_ca.crt
✔ Clé privée racine : /home/adminCA/.step/secrets/root_ca_key
✔ Empreinte du certificat racine : 7d754397c6897aa87d21e33c64daad7be087dc6fe18bf04627848ae1c8e26a4f
✔ Certificat intermédiaire : /home/adminCA/.step/certs/intermediate_ca.crt
✔ Clé privée intermédiaire : /home/adminCA/.step/secrets/intermediate_ca_key
✔ Dossier de la base de données : /home/adminCA/.step/db
✔ Configuration par défaut : /home/adminCA/.step/config/defaults.json
✔ Configuration de l'Autorité de Certification : /home/adminCA/.step/config/ca.json
Votre PKI est prête ! Pour générer des certificats pour des services individuels, consultez `step help ca`.
💌 **RETROACTION**
L'utilitaire step n'est pas instrumenté pour les statistiques d'utilisation. Il ne contacte pas un serveur central. Toutefois, vos retours sont très précieux ! N'hésitez pas à nous écrire à feedback@smallstep.com, rejoindre les Discussions GitHub ou nous rejoindre sur Discord à [https://u.step.sm/discord](https://u.step.sm/discord).
```
Démarrer Step-CA :
```bash
step-ca .step/config/ca.json
```
#### Activer ACME
```bash
$ step ca provisioner add acme --type ACME
✔ Configuration de l'AC : /home/adminCA/.step/config/ca.json
Succès ! La configuration de votre `step-ca` a été mise à jour. Pour prendre en compte la nouvelle configuration, envoyez un SIGHUP (kill -1 <pid>) ou redémarrez le processus step-ca. 🎉
```
#### Exécuter Step-CA en tant que Service systemd
Créez un fichier :
```bash
vim /etc/systemd/system/step-ca.service
```
Copiez-collez ce qui suit :
```config
[Unit]
Description=step-ca
After=syslog.target network.target
[Service]
User=adminCA
Group=adminCA
ExecStart=/bin/sh -c '/bin/step-ca /home/adminCA/.step/config/ca.json --password-file=/home/step/.step/pwd >> /var/log/step-ca/output.log 2>&1'
Type=simple
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Créez le répertoire de logs :
```bash
mkdir -p /var/log/step-ca
chown -R adminCA:adminCA /var/log/step-ca
```
Rechargez le démon systemd :
```bash
systemctl daemon-reload
systemctl start step-ca.service
```
### 🐳 Installation avec Docker
```bash
docker run -it -v step:/home/step \
-p 9000:9000 \
-e "DOCKER_STEPCA_INIT_NAME=Lab" \
-e "DOCKER_STEPCA_INIT_DNS_NAMES=caserver.lab.loc,localhost,192.168.1.101" \
-e "DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT=true" \
-e "DOCKER_STEPCA_INIT_ACME=true" \
smallstep/step-ca
```
## 🔑 Accès à l'AC avec un Autre Client
> **NOTE :**
> Adaptez le port en fonction de votre installation :
>
> - **Binaire :** port **443**
> - **Docker :** port **9000**
Installez le Step CLI :
```bash
wget https://dl.step.sm/gh-release/cli/docs-cli-install/v0.24.3/step-cli_0.24.3_amd64.deb
sudo dpkg -i step-cli_0.24.3_amd64.deb
```
Initialisez votre AC :
```bash
step ca bootstrap --ca-url https://caserver.lab.loc:$PORT/ --fingerprint 685059c30eb305db5272a7a199a2b5823624d55c732121ac65c06b0915d3c887
```
> **ASTUCE :**
> Pour obtenir l'**empreinte**, exécutez simplement :
>
> ```bash
> step certificate fingerprint $(step path)/certs/root_ca.crt
> ```
>
> Pour Docker, consultez les logs du conteneur.
Exemple de sortie :
```bash
admin@User:~$ step ca bootstrap --ca-url https://caserver.lab.loc:$PORT --fingerprint 685059c30eb305db5272a7a199a2b5823624d55c732121ac65c06b0915d3c887
Le certificat racine a été enregistré dans /home/admin/.step/certs/root_ca.crt.
La configuration de l'autorité a été enregistrée dans /home/admin/.step/config/defaults.json.
```
Installez le certificat :
```bash
step certificate install $(step path)/certs/root_ca.crt
```
---
> **ASTUCE :**
> **Installation sur Debian :**
>
> - Copiez les fichiers CRT individuels (format PEM) dans `/usr/local/share/ca-certificates/`
> - Les fichiers doivent appartenir à `root:root` avec les droits `644`
> - Assurez-vous que le paquet `ca-certificates` est installé (sinon, installez-le)
> - Ensuite, exécutez en tant que root :
>
> ```bash
> # /usr/sbin/update-ca-certificates
> ```
>
> Tous les certificats seront consolidés dans : `/etc/ssl/certs/ca-certificates.crt`
---
### 📝 Obtenir un Certificat
```bash
admin@User:~$ step ca certificate nas.lab.loc srv.crt srv.key
✔ Provisionneur : contact@lab.loc (JWK) [kid: chyGkrZqp-BGSHUZ8v3jsPipegt2JLcC7y6RPq4OOkU]
Veuillez entrer le mot de passe pour déchiffrer la clé du provisionneur :
✔ AC : https://caserver.lab.loc:443
✔ Certificat : srv.crt
✔ Clé Privée : srv.key
```
---
> **ASTUCE :**
> Pour effectuer un test de santé :
>
> ```bash
> curl https://caserver.lab.loc:443/health -k
> ```
---
Il pourrait être nécessaire de personnaliser le fichier `ca.json` pour augmenter la durée minimale de validité des certificats. Voici la structure du répertoire :
```bash
.
|-- certs
| |-- intermediate_ca.crt
| `-- root_ca.crt
|-- config
| |-- ca.json
| `-- defaults.json
|-- db
| |-- 000000.vlog
| |-- 000020.sst
| |-- KEYREGISTRY
| |-- LOCK
| `-- MANIFEST
|-- secrets
| |-- intermediate_ca_key
| |-- password
| `-- root_ca_key
`-- templates
```
Exemple de fichier `ca.json` :
```json
{
"root": "/home/step/certs/root_ca.crt",
"federatedRoots": null,
"crt": "/home/step/certs/intermediate_ca.crt",
"key": "/home/step/secrets/intermediate_ca_key",
"address": ":9000",
"insecureAddress": "",
"dnsNames": [
"caserver.lab.loc",
"caserver",
"localhost",
"192.168.1.200"
],
"logger": {
"format": "text"
},
"db": {
"type": "badgerv2",
"dataSource": "/home/step/db",
"badgerFileLoadingMode": ""
},
"authority": {
"enableAdmin": true,
"claims": {
"maxTLSCertDuration": "4380h"
}
},
"tls": {
"cipherSuites": [
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
],
"minVersion": 1.2,
"maxVersion": 1.3,
"renegotiation": false
}
}

View File

@@ -0,0 +1,316 @@
---
title: "Self-Hosted Certificate Manager"
date: 2024-08-01T20:00:00+02:00
weight: 2
cascade:
type: docs
---
## 🔗 Sources
- [📖 Official Documentation](https://smallstep.com/docs/tutorials/)
- [🛠️ Step-CA as a systemd Service](https://angrysysadmins.tech/index.php/2022/09/grassyloki/step-ca-run-as-a-systemd-service/)
- [🔐 OpenSSL Certificate Management](https://www.golinuxcloud.com/tutorial-pki-certificates-authority-ocsp/)
## 🤖 About Step-CA
Step-CA is a nifty toolkit developed by Smallstep, a company thats all about secure identity management and certificate automation. 🚀 Its mission? To simplify setting up and managing your own certificate authorities (CAs) with ease and security!
### Key Features
1. **Certificate Authority Management** 🔑
Easily set up and manage your own CAs. Create root and intermediate CAs, issue certificates, and handle revocations like a pro.
2. **Secure Key Management** 🛡️
Best practices for secure key storage and management, ensuring your cryptographic keys stay safe and sound from unauthorized access.
3. **Automation and Scalability** ⚙️
Perfect for both small-scale and enterprise deployments. Enjoy APIs and integrations that automate certificate issuance, renewal, and revocation for a seamless lifecycle.
4. **Enhanced Security** 🔒
Using modern cryptographic algorithms and protocols, Step-CA supports industry-standard X.509 certificates, offering robust encryption and digital signatures.
5. **Integration with Infrastructure** 🌐
Integrates smoothly with your existing tools and systems. Supports various authentication methods like username/password, MFA, and external identity providers.
6. **Auditability and Compliance** 📜
With comprehensive logging and auditing capabilities, you can track certificate activities and meet compliance requirements with ease.
7. **Developer-Friendly APIs** 👩‍💻👨‍💻
Developer-centric APIs and SDKs make it a breeze to integrate certificate management into your custom applications and workflows.
**In a nutshell:** Step-CA from Smallstep is designed to make certificate authority management fun and hassle-free. With its secure, scalable, and user-friendly features, you can easily manage your certificate lifecycle while keeping your infrastructure safe and sound!
## 🚀 Installation
### 🔧 Binary Installation
#### 1. Step CLI
```bash
wget https://dl.step.sm/gh-release/cli/docs-cli-install/v0.24.3/step-cli_0.24.3_amd64.deb
sudo dpkg -i step-cli_0.24.3_amd64.deb
```
#### 2. Step-CA
```bash
wget https://dl.step.sm/gh-release/certificates/docs-ca-install/v0.24.1/step-ca_0.24.1_amd64.deb
sudo dpkg -i step-ca_0.24.1_amd64.deb
```
#### 3. Create a Specific User
```bash
adduser adminCA
```
#### Configuration
```bash
$ step ca init --password-file=password.txt
✔ Deployment Type: Standalone
What would you like to name your new PKI?
(e.g. Smallstep): Lab
(e.g. ca.example.com[,10.1.2.3,etc.]): ca.lab.loc, localhost, 192.168.1.101
What IP and port will your new CA bind to? (:443 will bind to 0.0.0.0:443).1.101
(e.g. :443 or 127.0.0.1:443): :443
What would you like to name the CA's first provisioner?
✔ (e.g. you@smallstep.com): contact@lab.loc
Choose a password for your CA keys and first provisioner.
✔ [leave empty and we'll generate one]:
Generating root certificate... done! 🎉
Generating intermediate certificate... done! 🎊
✔ Root certificate: /home/adminCA/.step/certs/root_ca.crt
✔ Root private key: /home/adminCA/.step/secrets/root_ca_key
✔ Root fingerprint: 7d754397c6897aa87d21e33c64daad7be087dc6fe18bf04627848ae1c8e26a4f
✔ Intermediate certificate: /home/adminCA/.step/certs/intermediate_ca.crt
✔ Intermediate private key: /home/adminCA/.step/secrets/intermediate_ca_key
✔ Database folder: /home/adminCA/.step/db
✔ Default configuration: /home/adminCA/.step/config/defaults.json
✔ Certificate Authority configuration: /home/adminCA/.step/config/ca.json
Your PKI is all set! To generate certificates for individual services, check out `step help ca`.
💌 **FEEDBACK**
The step utility is not instrumented for usage statistics. It doesnt phone home. But your feedback is super valuable! Feel free to drop us a line at feedback@smallstep.com, join GitHub Discussions, or hop into our Discord at [https://u.step.sm/discord](https://u.step.sm/discord).
```
Start CA Step:
```bash
step-ca .step/config/ca.json
```
#### Enable ACME
```bash
$ step ca provisioner add acme --type ACME
✔ CA Configuration: /home/adminCA/.step/config/ca.json
Success! Your `step-ca` config has been updated. To pick up the new configuration, SIGHUP (kill -1 <pid>) or restart the step-ca process. 🎉
```
#### Run Step-CA as a systemd Service
Create a file:
```bash
vim /etc/systemd/system/step-ca.service
```
Copy and paste the following:
```config
[Unit]
Description=step-ca
After=syslog.target network.target
[Service]
User=adminCA
Group=adminCA
ExecStart=/bin/sh -c '/bin/step-ca /home/adminCA/.step/config/ca.json --password-file=/home/step/.step/pwd >> /var/log/step-ca/output.log 2>&1'
Type=simple
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Create the log directory:
```bash
mkdir -p /var/log/step-ca
chown -R adminCA:adminCA /var/log/step-ca
```
Reload the daemon:
```bash
systemctl daemon-reload
systemctl start step-ca.service
```
### 🐳 Docker Installation
```bash
docker run -it -v step:/home/step \
-p 9000:9000 \
-e "DOCKER_STEPCA_INIT_NAME=Lab" \
-e "DOCKER_STEPCA_INIT_DNS_NAMES=caserver.lab.loc,localhost,192.168.1.101" \
-e "DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT=true" \
-e "DOCKER_STEPCA_INIT_ACME=true" \
smallstep/step-ca
```
## 🔑 Access to CA with Another Client
> **NOTE:**
> Adjust the port based on your installation:
>
> - **Binary:** port **443**
> - **Docker:** port **9000**
Install the Step CLI:
```bash
wget https://dl.step.sm/gh-release/cli/docs-cli-install/v0.24.3/step-cli_0.24.3_amd64.deb
sudo dpkg -i step-cli_0.24.3_amd64.deb
```
Bootstrap your CA:
```bash
step ca bootstrap --ca-url https://caserver.lab.loc:$PORT/ --fingerprint 685059c30eb305db5272a7a199a2b5823624d55c732121ac65c06b0915d3c887
```
> **TIP:**
> To get the **fingerprint**, simply run:
>
> ```bash
> step certificate fingerprint $(step path)/certs/root_ca.crt
> ```
>
> For Docker, check the container logs.
Example output:
```bash
admin@User:~$ step ca bootstrap --ca-url https://caserver.lab.loc:$PORT --fingerprint 685059c30eb305db5272a7a199a2b5823624d55c732121ac65c06b0915d3c887
The root certificate has been saved in /home/admin/.step/certs/root_ca.crt.
The authority configuration has been saved in /home/admin/.step/config/defaults.json.
```
Install the certificate:
```bash
step certificate install $(step path)/certs/root_ca.crt
```
---
> **TIP:**
> **Debian Installation:**
>
> - Copy individual CRT (PEM format) files to `/usr/local/share/ca-certificates/`
> - Files must be owned by `root:root` with mode `644`
> - Ensure the package `ca-certificates` is installed (if not, install it)
> - Then run as root:
>
> ```bash
> # /usr/sbin/update-ca-certificates
> ```
>
> All certificates will be consolidated at: `/etc/ssl/certs/ca-certificates.crt`
---
### 📝 Get a Certificate
```bash
admin@User:~$ step ca certificate nas.lab.loc srv.crt srv.key
✔ Provisioner: contact@lab.loc (JWK) [kid: chyGkrZqp-BGSHUZ8v3jsPipegt2JLcC7y6RPq4OOkU]
Please enter the password to decrypt the provisioner key:
✔ CA: https://caserver.lab.loc:443
✔ Certificate: srv.crt
✔ Private Key: srv.key
```
---
> **TIP:**
> To perform a health check:
>
> ```bash
> curl https://caserver.lab.loc:443/health -k
> ```
---
It might be necessary to customize the `ca.json` file to increase the minimum duration of the certificate validity. Check out the folder structure below:
```bash
.
|-- certs
| |-- intermediate_ca.crt
| `-- root_ca.crt
|-- config
| |-- ca.json
| `-- defaults.json
|-- db
| |-- 000000.vlog
| |-- 000020.sst
| |-- KEYREGISTRY
| |-- LOCK
| `-- MANIFEST
|-- secrets
| |-- intermediate_ca_key
| |-- password
| `-- root_ca_key
`-- templates
```
Example `ca.json` file:
```json
{
"root": "/home/step/certs/root_ca.crt",
"federatedRoots": null,
"crt": "/home/step/certs/intermediate_ca.crt",
"key": "/home/step/secrets/intermediate_ca_key",
"address": ":9000",
"insecureAddress": "",
"dnsNames": [
"caserver.lab.loc",
"caserver",
"localhost",
"192.168.1.200"
],
"logger": {
"format": "text"
},
"db": {
"type": "badgerv2",
"dataSource": "/home/step/db",
"badgerFileLoadingMode": ""
},
"authority": {
"enableAdmin": true,
"claims": {
"maxTLSCertDuration": "4380h"
}
},
"tls": {
"cipherSuites": [
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
],
"minVersion": 1.2,
"maxVersion": 1.3,
"renegotiation": false
}
}
```

View File

@@ -1,6 +0,0 @@
---
title: "Archive"
layout: "archives"
url: "/archives/"
summary: archives
---

View File

@@ -1,6 +0,0 @@
---
title: "Archive"
layout: "archives"
url: "archives"
summary: archives
---

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1,5 @@
---
linkTitle: "Netlab"
cascade:
type: docs
---

16
content/netlab/_index.md Normal file
View File

@@ -0,0 +1,16 @@
---
title: "Netlab"
cascade:
type: docs
---
<!-- markdownlint-disable MD033 MD034-->
{{< hextra/hero-subtitle >}}
Deep Dive using NetLab
{{< /hextra/hero-subtitle >}}
{{< cards >}}
{{< card link="/netlab/netlab/" title="What is a Netlab" subtitle="What and Why we use NetLab" icon="science" >}}
{{< card link="/netlab/first_lab/" title="My First Lab" subtitle="How to deploy an NetLab using DevPod" icon="docker" >}}
{{< /cards >}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -0,0 +1,217 @@
---
title: "Mon Premier Lab"
date: 2025-02-14T12:00:00+02:00
weight: 1
cascade:
type: docs
---
## Introduction 📚
Dans cet article, nous allons explorer comment installer notre tout premier netlab Containerlab en utilisant **DevPod**.
Nous nous concentrerons sur l'utilisation d'un fournisseur cloud, en l'occurrence **AWS**, pour héberger notre projet.
Pourquoi le **Cloud** ? Parce que les labs réseau peuvent consommer énormément de ressources, et nous avons besoin de pouvoir les déployer, les arrêter et les détruire rapidement, tant pour la performance que pour l'efficacité financière. 💡💰
Nous y parviendrons en combinant :
- **DevPod**
- **DevContainer**
- **Containerlab**
De plus, nous utiliserons une topologie simple que vous pouvez retrouver sur mon [dépôt GitHub](https://github.com/darnodo/VXLAN-EVPN). Notre objectif principal est de déployer ce lab sur AWS avec DevPod.
Allons-y, c'est parti ! 🚀😊
## Prérequis 🔧
Avant de commencer, quelques étapes importantes sont à réaliser :
1. **Autorisation de l'environnement AWS** :
Assurez-vous que DevPod est autorisé à accéder à votre environnement AWS. Pour un guide détaillé sur la configuration de DevPod avec AWS, consultez mon article sur ce [sujet](/documentation/devpod). 🔑
2. **Topologie Containerlab** :
Nous avons besoin d'un fichier de topologie compréhensible par Containerlab. Dans notre cas, nous créons une topologie VXLAN simple. 🗺️
## Topologie Containerlab 🔄
Notre lab simulera une topologie VXLAN comprenant :
- **1 switch Spine**
- **2 switches Leaf**
- **2 nœuds Host**
Le diagramme suivant illustre la topologie VXLAN :
![Topologie VXLAN](VXLAN.svg#center)
Voici le fichier de topologie Containerlab (`lab_vxlan.yml`) utilisé pour cette configuration :
```yaml
name: vxlan-evpn-irb
topology:
nodes:
spine1:
kind: ceos
image: ceos:4.32.0.1F
mgmt-ipv4: 172.20.20.101
leaf1:
kind: ceos
image: ceos:4.32.0.1F
mgmt-ipv4: 172.20.20.11
leaf2:
kind: ceos
image: ceos:4.32.0.1F
mgmt-ipv4: 172.20.20.12
host1:
kind: linux
image: alpine:latest
binds:
- hosts/h1_interfaces:/etc/network/interfaces
mgmt-ipv4: 172.20.20.21
host2:
kind: linux
image: alpine:latest
binds:
- hosts/h2_interfaces:/etc/network/interfaces
mgmt-ipv4: 172.20.20.22
links:
- endpoints: ["spine1:eth1", "leaf1:eth1"]
- endpoints: ["spine1:eth2", "leaf2:eth1"]
- endpoints: ["leaf1:eth2", "host1:eth1"]
- endpoints: ["leaf2:eth2", "host2:eth1"]
```
### Décryptage de la Topologie 🧐
1. **Nom et Structure** :
- `name: vxlan-evpn-irb` C'est le nom du lab.
- La topologie se divise en **nodes** (périphériques) et **links** (connexions entre les périphériques).
2. **Nodes** :
- **Couche Spine** :
- `spine1` : Un switch Arista cEOS containerisé utilisant l'image version `4.32.0.1F`.
- **IP de gestion** : `172.20.20.101`
- **Couche Leaf** :
- `leaf1` et `leaf2` : Des switches Arista cEOS utilisant la même version d'image.
- **IPs de gestion** : `172.20.20.11` et `172.20.20.12`
- **Couche Host** :
- `host1` et `host2` : Des conteneurs Linux exécutant Alpine Linux.
- Ils incluent des configurations personnalisées pour les interfaces réseau montées depuis l'hôte.
- **IPs de gestion** : `172.20.20.21` et `172.20.20.22`
3. **Links** :
- **De Spine à Leaf** :
- `spine1:eth1``leaf1:eth1`
- `spine1:eth2``leaf2:eth1`
- **De Leaf à Host** :
- `leaf1:eth2``host1:eth1`
- `leaf2:eth2``host2:eth1`
Cette topologie représente une architecture spine-leaf typique, courante dans les datacenters pour permettre une connectivité en couche 2 et en couche 3 avec des configurations VXLAN EVPN. 🔗💻
## Déployer le Lab 🛠️
Nous allons déployer le lab avec **DevPod** de deux manières :
### 1. En Utilisant le Dépôt 📥
1. **Valider la configuration du fournisseur AWS** :
Assurez-vous que votre fournisseur AWS est correctement configuré. Plus de détails [ici](/documentation/devpod). ✅
2. **Créer un Workspace** :
- Rendez-vous dans l'onglet **Workspace** et cliquez sur **Create Workspace**.
- Indiquez la **source du Workspace** : utilisez le [dépôt GitHub](https://github.com/darnodo/VXLAN-EVPN).
- Sélectionnez **AWS** comme fournisseur.
- Choisissez votre IDE par défaut.
- Enfin, cliquez sur **Create Workspace**.
![Configuration DevPod](devpod_configuration.png#center)
### 2. En Utilisant un Dossier Local 🗂️
Si vous préférez utiliser votre dépôt local :
- La seule différence se trouve dans la **source du Workspace**.
- Il vous suffit de le pointer vers votre dépôt local.
![Configuration DevPod - Local](devpod_configuration_local.png#center)
## Démarrer le Lab 🎬
> [!WARNING] Images cEOS
> Le lab utilise l'**image cEOS v4.32.0.1F**.
> Pour télécharger cette image, rendez-vous sur la [page de téléchargement Arista](https://www.arista.com/en/support/software-download). ⚠️
1. **Importer l'image cEOS** :
Enregistrez l'image cEOS dans votre dossier `network_images` en la glissant-déposant dans VSCode.
Importez l'image en utilisant la commande suivante :
```bash
docker import network_images/cEOS64-lab-4.32.0.1F.tar.xz ceos:4.32.0.1F
```
2. **Déployer le Lab** :
Déployez le lab en utilisant Containerlab :
```bash
sudo containerlab deploy -t lab_vxlan.yml
```
Suivez les instructions du CLI pour configurer vos périphériques. Pour des étapes de configuration détaillées, consultez [ce guide](https://github.com/darnodo/VXLAN-EVPN/tree/main/documentation/eos_configuration). 🔧🖥️
3. **Visualiser l'Architecture** :
Vérifiez la topologie déployée grâce à la vue graphique de Containerlab :
```bash
containerlab graph -t lab_vxlan.yml
```
Les ports (par exemple, le port 50080 mentionné dans le `devcontainer.json`) sont redirigés. Accédez à la vue graphique via [localhost](http://localhost:50080).
![Vue Graphique](Graph_view.png#center)
## Utiliser EdgeShark 🦈
EdgeShark est un outil web qui permet de capturer des paquets depuis votre environnement de lab. Il redirige les captures du lab vers Wireshark exécuté localement. 📡🔍
Pour plus d'informations, consultez le [guide de démarrage d'EdgeShark](https://edgeshark.siemens.io/#/getting-started?id=optional-capture-plugin).
### Configuration d'EdgeShark dans le DevContainer 🐳
Dans la configuration du **DevContainer**, la commande `postCreateCommand` suivante a été ajoutée :
```bash
sudo mkdir -p /opt/edgeshark && sudo curl -sL https://github.com/siemens/edgeshark/raw/main/deployments/wget/docker-compose.yaml -o /opt/edgeshark/docker-compose.yaml
```
Cette commande télécharge un fichier Docker Compose pour faciliter l'utilisation d'EdgeShark. 🚀
### Lancer EdgeShark ⚡
Pour démarrer EdgeShark, exécutez :
```bash
cd /opt/edgeshark
DOCKER_DEFAULT_PLATFORM= docker compose up -d
```
Accédez à EdgeShark via [localhost:5001](http://localhost:5001).
- **Vue d'EdgeShark** :
![Vue d'EdgeShark](edgeshark.png#center)
- **Intégration avec Wireshark** :
En cliquant sur l'icône Wireshark dans EdgeShark, vous pouvez lancer Wireshark localement.
![Interface EdgeShark](edgeshark_interface.png#center)
![EdgeShark et Wireshark](edge_wireshark.png#center)
## Conclusion 🎉
Dans cet article, nous avons parcouru les étapes pour déployer un lab VXLAN EVPN en utilisant Containerlab, DevPod et AWS. Nous avons abordé les points clés suivants :
- **Mise en place des prérequis** pour AWS et Containerlab. 🔑
- **Création d'un fichier de topologie détaillé** pour une architecture spine-leaf. 🗺️
- **Déploiement du lab** en utilisant à la fois un dépôt GitHub et un dossier local. 📥🗂️
- **Démarrage du lab** avec Docker et Containerlab. 🚀🐳
- **Utilisation d'EdgeShark** pour capturer des paquets et intégrer Wireshark pour une analyse approfondie. 🦈🔍
En suivant ces étapes, vous pourrez déployer et gérer facilement un environnement de lab réseau évolutif dans le cloud. Bon networking et profitez bien de vos aventures en lab ! 😄🎊

View File

@@ -0,0 +1,214 @@
---
title: "My First Lab"
date: 2025-02-14T12:00:00+02:00
weight: 1
cascade:
type: docs
---
## Introduction 📚
In this article, well explore how to install our very first Containerlab netlab using **DevPod**. We'll focus on leveraging a cloud provider—specifically **AWS**—to host our project. Why **Cloud**? Because network labs can consume a huge amount of resources, and we need the ability to deploy, stop, and destroy them quickly for both performance and financial efficiency. 💡💰
We'll achieve this using a combination of:
- **DevPod**
- **DevContainer**
- **Containerlab**
Additionally, we will use a small topology, which you can find on my [GitHub repository](https://github.com/darnodo/VXLAN-EVPN). Our main objective is to deploy this lab on AWS using DevPod. Let's dive in and get started! 🚀😊
## Prerequisites 🔧
Before we get started, there are a couple of important steps to complete:
1. **AWS Environment Authorization**:
Ensure that DevPod is authorized to access your AWS environment. For a detailed guide on configuring DevPod with AWS, please refer to my post on this [topic](/documentation/devpod). 🔑
2. **Containerlab Topology**:
We need a topology file that Containerlab can understand. In our case, we're building a simple VXLAN topology. 🗺️
## Containerlab Topology 🔄
Our lab will simulate a VXLAN topology with:
- **1 Spine switch**
- **2 Leaf switches**
- **2 Host nodes**
The following diagram illustrates the VXLAN topology:
![VXLAN Topology](VXLAN.svg#center)
Below is the Containerlab topology file (`lab_vxlan.yml`) used for this setup:
```yaml
name: vxlan-evpn-irb
topology:
nodes:
spine1:
kind: ceos
image: ceos:4.32.0.1F
mgmt-ipv4: 172.20.20.101
leaf1:
kind: ceos
image: ceos:4.32.0.1F
mgmt-ipv4: 172.20.20.11
leaf2:
kind: ceos
image: ceos:4.32.0.1F
mgmt-ipv4: 172.20.20.12
host1:
kind: linux
image: alpine:latest
binds:
- hosts/h1_interfaces:/etc/network/interfaces
mgmt-ipv4: 172.20.20.21
host2:
kind: linux
image: alpine:latest
binds:
- hosts/h2_interfaces:/etc/network/interfaces
mgmt-ipv4: 172.20.20.22
links:
- endpoints: ["spine1:eth1", "leaf1:eth1"]
- endpoints: ["spine1:eth2", "leaf2:eth1"]
- endpoints: ["leaf1:eth2", "host1:eth1"]
- endpoints: ["leaf2:eth2", "host2:eth1"]
```
### Breaking Down the Topology 🧐
1. **Name and Structure**:
- `name: vxlan-evpn-irb` This is the lab's name.
- The topology is divided into **nodes** (devices) and **links** (connections between devices).
2. **Nodes**:
- **Spine Layer**:
- `spine1`: A containerized Arista cEOS switch using image version `4.32.0.1F`.
- **Management IP**: `172.20.20.101`
- **Leaf Layer**:
- `leaf1` and `leaf2`: Arista cEOS switches with the same image version.
- **Management IPs**: `172.20.20.11` and `172.20.20.12`
- **Host Layer**:
- `host1` and `host2`: Linux containers running Alpine Linux.
- They include custom network interface configurations mounted from the host.
- **Management IPs**: `172.20.20.21` and `172.20.20.22`
3. **Links**:
- **Spine to Leaf**:
- `spine1:eth1``leaf1:eth1`
- `spine1:eth2``leaf2:eth1`
- **Leaf to Host**:
- `leaf1:eth2``host1:eth1`
- `leaf2:eth2``host2:eth1`
This topology represents a typical spine-leaf architecture, common in data center networks to enable both Layer 2 and Layer 3 connectivity with VXLAN EVPN configurations. 🔗💻
## Deploy the Lab 🛠️
We will deploy the lab using **DevPod** in two ways:
### 1. Using the Repository 📥
1. **Validate AWS Provider Configuration**:
Ensure that your AWS provider is correctly configured. More details can be found [here](/documentation/devpod). ✅
2. **Create a Workspace**:
- Navigate to the **Workspace** tab and click on **Create Workspace**.
- Enter the **Workspace source**: use the [GitHub repository](https://github.com/darnodo/VXLAN-EVPN).
- Select **AWS** as the provider.
- Choose your default IDE.
- Finally, click on **Create Workspace**.
![DevPod Configuration](devpod_configuration.png#center)
### 2. Using a Local Folder 🗂️
If you prefer to use your local repository:
- The only difference is in the **Workspace source**.
- Simply point it to your local repository.
![DevPod Configuration - Local](devpod_configuration_local.png#center)
## Starting the Lab 🎬
> [!WARNING] cEOS Images
> The lab uses **cEOS image v4.32.0.1F**.
> To download this image, visit the [Arista download webpage](https://www.arista.com/en/support/software-download). ⚠️
1. **Import the cEOS Image**:
Save the cEOS image in your `network_images` folder by dragging and dropping it into VSCode.
Import the image using the following command:
```bash
docker import network_images/cEOS64-lab-4.32.0.1F.tar.xz ceos:4.32.0.1F
```
2. **Deploy the Lab**:
Deploy the lab using Containerlab:
```bash
sudo containerlab deploy -t lab_vxlan.yml
```
Follow the CLI prompts to configure your devices. For detailed configuration steps, refer to [this guide](https://github.com/darnodo/VXLAN-EVPN/tree/main/documentation/eos_configuration). 🔧🖥️
3. **Visualize the Architecture**:
Validate the deployed topology using Containerlabs graph view:
```bash
containerlab graph -t lab_vxlan.yml
```
Ports (e.g., port 50080 as mentioned in the `devcontainer.json`) are forwarded. Access the graph view via [localhost](http://localhost:50080).
![Graph View](Graph_view.png#center)
## Using EdgeShark 🦈
EdgeShark is a web UI tool that helps capture packets from your lab environment. It tunnels captures from the lab to Wireshark running locally. 📡🔍
For more details, check out [EdgeSharks Getting Started Guide](https://edgeshark.siemens.io/#/getting-started?id=optional-capture-plugin).
### EdgeShark Setup in the DevContainer 🐳
In the **DevContainer** configuration, the following `postCreateCommand` has been added:
```bash
sudo mkdir -p /opt/edgeshark && sudo curl -sL https://github.com/siemens/edgeshark/raw/main/deployments/wget/docker-compose.yaml -o /opt/edgeshark/docker-compose.yaml
```
This command downloads a Docker Compose file to facilitate the use of EdgeShark. 🚀
### Running EdgeShark ⚡
To start EdgeShark, execute:
```bash
cd /opt/edgeshark
DOCKER_DEFAULT_PLATFORM= docker compose up -d
```
Access EdgeShark via [localhost:5001](http://localhost:5001).
- **EdgeShark View**:
![Edgeshark View](edgeshark.png#center)
- **Wireshark Integration**:
Using the Wireshark icon in EdgeShark, you can launch Wireshark locally.
![Edgeshark Interface](edgeshark_interface.png#center)
![Edgeshark and Wireshark](edge_wireshark.png#center)
## Conclusion 🎉
In this article, we walked through the steps to deploy a VXLAN EVPN lab using Containerlab, DevPod, and AWS. We covered the following key points:
- **Setting up prerequisites** for AWS and Containerlab. 🔑
- **Creating a detailed topology** file for a spine-leaf network. 🗺️
- **Deploying the lab** using both repository and local methods. 📥🗂️
- **Starting the lab** with Docker and Containerlab. 🚀🐳
- **Using EdgeShark** to capture packets and integrate with Wireshark for detailed analysis. 🦈🔍
By following these steps, you can easily deploy and manage a scalable network lab environment in the cloud. Happy networking and enjoy your lab adventures! 😄🎊

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -1,13 +1,7 @@
---
title: "Présentation des NetLabs"
date: 2024-08-25T15:19:00+02:00
draft: false
categories: "NetLab"
UseHugoToc: true
TocOpen: false
showToc: true
weight: 1
cascade:
type: docs
---
## Introduction

View File

@@ -1,14 +1,7 @@
---
title: "Introduction to NetLabs"
date: 2024-08-25T15:19:00+02:00
draft: false
categories: "NetLab"
UseHugoToc: true
TocOpen: false
showToc: true
weight: 1
title: "What is a Netlab"
cascade:
type: docs
---
## Introduction

118
data/icons.yml Normal file

File diff suppressed because one or more lines are too long

100
hugo.yaml
View File

@@ -1,65 +1,57 @@
baseURL: https://notes.arnodo.fr/
title: 🧑‍💻 Notes
pagination.pagerSize: 5
theme: PaperMod
params:
ShowReadingTime: true
ShowPostNavLinks: true
ShowBreadCrumbs: true
ShowCodeCopyButtons: true
socialIcons:
- name: github
url: "https://github.com/darnodo"
- name: linkedin
url: "https://www.linkedin.com/in/darnodo/"
baseURL: https://notebook.arnodo.fr/
title: 🧑‍💻 Notebook
theme: hextra
defaultContentLanguage: en
languages:
en:
languageName: English
contentDir: 'content/en'
params:
homeInfoParams:
enabled: true
Title: "Welcome to my Note Book! 🚀"
Content: >
Here, we dive into the world of **NetOps, networking, and system automation**—exploring tools, best practices, and hands-on tips to streamline operations.
menu:
main:
- name: Categories
url: /categories/
weight: 10
- name: Tags
url: /tags/
weight: 20
- name: Archives
url: archives/
weight: 30
weight: 1
fr:
languageName: Français
contentDir: 'content/fr'
params:
homeInfoParams:
enabled: true
Title: "Bienvenue sur mon blog ! 🚀"
Content: >
Ici, nous plongeons dans lunivers du **NetOps, du networking et de lautomatisation des systèmes**, en explorant les outils, les meilleures pratiques et des conseils pratiques pour optimiser les opérations.
weight: 2
menu:
main:
- name: Catégories
url: /categories/
weight: 10
- name: Tags
url: /tags/
weight: 20
- name: Archives
url: archives
weight: 30
- name: Documentation
pageRef: /documentation
weight: 1
- name: Netlab
pageRef: /netlab
weight: 2
- name: About
pageRef: /about
weight: 3
- name: Search
weight: 4
params:
type: search
- name: GitHub
weight: 5
url: "https://github.com/darnodo"
params:
icon: github
params:
# Navbar
navbar:
displayTitle: true
displayLogo: true
# Logo
logo:
path: images/logo.svg
link: /
width: 40
height: 20
# Search
search:
enable: true
type: flexsearch
flexsearch:
# index page by: content | summary | heading | title
index: heading
markup:
goldmark:
renderer:
unsafe: true

1
i18n/en.yaml Normal file
View File

@@ -0,0 +1 @@
poweredBy: "Personal NoteBook by Hugo and Hextra"

1
i18n/fr.yaml Normal file
View File

@@ -0,0 +1 @@
poweredBy: "Bloc Note Personnel par Hugo et Hextra"

View File

@@ -1,139 +0,0 @@
{{- if not (.Param "hideFooter") }}
<footer class="footer">
{{- if not site.Params.footer.hideCopyright }}
{{- if site.Copyright }}
<span>{{ site.Copyright | markdownify }}</span>
{{- else }}
<span>&copy; {{ now.Year }} <a href="{{ "" | absLangURL }}">{{ site.Title }}</a></span>
{{- end }}
{{- print " · "}}
{{- end }}
{{- with site.Params.footer.text }}
{{ . | markdownify }}
{{- print " · "}}
{{- end }}
</footer>
{{- end }}
{{- if (not site.Params.disableScrollToTop) }}
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a>
{{- end }}
{{- partial "extend_footer.html" . }}
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
});
</script>
{{- if (not site.Params.disableScrollToTop) }}
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
{{- end }}
{{- if (not site.Params.disableThemeToggle) }}
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
}
})
</script>
{{- end }}
{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }}
<script>
document.querySelectorAll('pre > code').forEach((codeblock) => {
const container = codeblock.parentNode.parentNode;
const copybutton = document.createElement('button');
copybutton.classList.add('copy-code');
copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
function copyingDone() {
copybutton.innerHTML = '{{- i18n "code_copied" | default "copied!" }}';
setTimeout(() => {
copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
}, 2000);
}
copybutton.addEventListener('click', (cb) => {
if ('clipboard' in navigator) {
navigator.clipboard.writeText(codeblock.textContent);
copyingDone();
return;
}
const range = document.createRange();
range.selectNodeContents(codeblock);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
try {
document.execCommand('copy');
copyingDone();
} catch (e) { };
selection.removeRange(range);
});
if (container.classList.contains("highlight")) {
container.appendChild(copybutton);
} else if (container.parentNode.firstChild == container) {
// td containing LineNos
} else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
// table containing LineNos and code
codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
} else {
// code blocks not having highlight as parent class
codeblock.parentNode.appendChild(copybutton);
}
});
</script>
{{- end }}

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

27
static/images/logo.svg Normal file
View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="si-glyph si-glyph-network">
<title>91</title>
<defs>
</defs>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g fill="#434343">
<path d="M11.783,10.094 C10.084,11.092 8.017,11.778 6.105,12.044 C5.993,12.432 5.751,12.762 5.421,12.978 C5.933,14.071 6.67,15.065 7.56,15.965 C10.072,16.085 12.601,15.027 14.262,12.891 C14.291,12.853 14.317,12.811 14.345,12.772 C14.101,11.858 13.697,10.988 13.2,10.128 C13.11,10.154 13.024,10.174 12.939,10.19 C12.796,10.23 12.648,10.258 12.493,10.258 C12.238,10.258 12,10.196 11.783,10.094 L11.783,10.094 Z" class="si-glyph-fill">
</path>
<path d="M9.051,5.492 C8.409,5.025 7.735,4.607 7.047,4.236 C6.795,4.84 6.199,5.263 5.502,5.263 C5.377,5.263 5.257,5.247 5.14,5.221 C4.733,6.756 4.516,8.383 4.629,9.915 C5.393,9.973 6.011,10.532 6.149,11.269 C7.844,10.99 9.619,10.39 11.116,9.531 C10.93,9.26 10.819,8.934 10.819,8.582 C10.819,8.169 10.975,7.796 11.222,7.504 C10.568,6.768 9.833,6.061 9.051,5.492 L9.051,5.492 Z" class="si-glyph-fill">
</path>
<path d="M4,9.989 C3.863,8.355 4.104,6.597 4.541,4.957 C4.111,4.653 3.828,4.155 3.828,3.588 C3.828,3.391 3.867,3.202 3.932,3.026 C3.276,2.904 2.618,2.828 1.958,2.779 C1.869,2.883 1.773,2.983 1.689,3.093 C-0.04,5.317 -0.405,8.165 0.459,10.64 C1.23,10.969 2.025,11.187 2.856,11.306 C2.959,10.681 3.408,10.178 4,9.989 L4,9.989 Z" class="si-glyph-fill">
</path>
<path d="M13.928,9.689 C13.899,9.726 13.864,9.756 13.832,9.789 C14.265,10.525 14.631,11.271 14.885,12.057 C16.002,10.167 16.256,7.958 15.717,5.935 C15.627,6.068 15.541,6.202 15.446,6.331 C15.01,6.932 14.571,7.548 14.092,8.103 C14.137,8.255 14.168,8.414 14.168,8.582 L14.168,8.586 C14.252,8.96 14.181,9.365 13.928,9.689 L13.928,9.689 Z" class="si-glyph-fill">
</path>
<path d="M7.164,3.447 C7.963,3.861 8.748,4.345 9.494,4.887 C10.334,5.498 11.121,6.26 11.818,7.051 C12.025,6.959 12.252,6.906 12.494,6.906 C12.994,6.906 13.439,7.131 13.746,7.478 C14.15,6.986 14.529,6.456 14.907,5.938 C15.101,5.67 15.279,5.395 15.451,5.118 C14.945,3.807 14.097,2.612 12.909,1.687 C11.364,0.485 9.515,-0.057 7.701,0.012 C7.586,0.158 7.472,0.302 7.362,0.451 C6.961,1.003 6.623,1.531 6.322,2.088 C6.361,2.117 6.386,2.154 6.422,2.188 C6.839,2.464 7.119,2.922 7.164,3.447 L7.164,3.447 Z" class="si-glyph-fill">
</path>
<path d="M2.879,11.965 C2.168,11.867 1.477,11.719 0.809,11.478 C1.328,12.553 2.087,13.531 3.094,14.314 C4.16,15.143 5.371,15.657 6.615,15.875 C5.893,15.058 5.303,14.169 4.862,13.215 C4.747,13.239 4.628,13.255 4.505,13.255 C3.713,13.254 3.054,12.703 2.879,11.965 L2.879,11.965 Z" class="si-glyph-fill">

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
static/images/netlab.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 655 KiB

1
themes/hextra Submodule

Submodule themes/hextra added at ab56c66ae5