Post

Nebula V2

Nebula V2

Nebula est un outil de réseau superposé évolutif axé sur les performances, la simplicité et la sécurité. Il vous permet de connecter de manière transparente des ordinateurs partout dans le monde. Nebula est portable et fonctionne sous Linux, OSX, Windows, iOS et Android.

  • https://github.com/slackhq/nebula
  • https://deepwiki.com/slackhq/nebula/1-overview
  • Documentation: https://nebula.defined.net/docs/

Nebula V2

Bureau et serveur (binaires)

Consultez la page releases pour les téléchargements ou consultez la section Distribution Packages.

  • Linux - 64 (nebula-linux-amd64.tar.gz) and 32 bit, arm, and others
  • Windows
  • MacOS
  • Freebsd

cwwk

Se connecter sur le serveur cwwk Création d’un dossier nebula-v2

1
2
mkdir -p /sharenfs/nebula-v2
cd /sharenfs/nebula-v2

Téléchargement et extraction des binaires nebula : https://github.com/slackhq/nebula/releases/latest

1
2
3
wget https://github.com/slackhq/nebula/releases/download/v1.10.3/nebula-linux-amd64.tar.gz
tar xzvf nebula-linux-amd64.tar.gz
rm nebula-linux-amd64.tar.gz

Création autorité de certification (AC)

1
2
# durée 3 ans exprimés en hms (3x365x24) -> -duration 26280h00m00s
./nebula-cert ca -name "Yann Nebula CA V2" -encrypt -duration 26280h00m00s

Vérification

1
./nebula-cert print -json -path ca.crt | jq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[
  {
    "curve": "CURVE25519",
    "details": {
      "groups": null,
      "isCa": true,
      "issuer": "",
      "name": "Yann Nebula CA V2",
      "networks": null,
      "notAfter": "2029-02-08T18:56:50+01:00",
      "notBefore": "2026-02-09T18:56:50+01:00",
      "unsafeNetworks": null
    },
    "fingerprint": "68dce...........................................5433557005",
    "publicKey": "5b8............................................................32d",
    "signature": "c3be4410183c788217e4.................................................2a8a0e",
    "version": 2
  }
]

Adresse IPV6

RFC4193 IPv6 Generator Lorsque vous configurez IPv6, vous devrez peut-être configurer votre propre adresse IP locale et non routable Adresses sur votre réseau - similaires aux anciens blocs RFC1918. Adresses RFC-4193 (pas de jeu de mots prévu) ce numéro. Votre bloc d’adresse IP attribué doit être généré aléatoirement à partir du fc00::/7 bloc. Comme l’IETF n’a pas officialisé fc00::/8, les adresses doivent être attribuées de fd00::/8. Cela signifie que votre réseau IPv6 résultant ressemblera à: fdxx:xxx:xxx: et vous aurez fdxx:xxx:xxx:xxx:0:/64 à travers fdxx:xxxx:xxxx:ffff:/64 comme blocs routables dans votre /48 privé. Les 40 octets du /48 (xx:xxxx:xxxx) sont censés être générés de manière aléatoire par l’une des nombreuses méthodes suggérées.

Cette page utilise la première méthode suggérée par l’IETF en utilisant l’horodatage actuel plus l’adresse mac, sha1 haché, et les 40 bits inférieurs pour générer votre ULA aléatoire. Par conséquent, si deux organisations ont touché cette page dans la même deuxième, avec la même adresse mac pour générer un ULA, ils pourraient avoir des ULA identiques.

Créer des clés et des certificats ​

Vous pouvez nommer les hôtes comme vous le souhaitez, y compris FQDN. Vous devrez également choisir l’adresse IP nebula pour chaque hôte lors de la génération de son certificat. Dans cet exemple, nous créons un réseau nebula qui utilise le sous-réseau 10.139.110.x/24 et attribuera des adresses IP à chaque hôte depuis ce sous-réseau. Cet exemple démontre également les groupes de nébuleuses, qui peuvent ensuite être utilisés pour définir les règles de circulation dans un réseau de nébuleuses. Votre réseau IPv6 privé est fda3:4291:71b9::/48 vous donnant accès aux /64s suivants fda3:4291:71b9:0::/64 à travers la fda3:4291:71b9:ffff::/64

Ajouter IPv6 tout en gardant IPv4 (double stack)

1
./nebula-cert sign -ca-crt ca.crt -ca-key ca.key -duration 26232h00m00s -name "vps-5351f610-lighthouse" -networks "10.139.110.1/24,fda3:4291:71b9:2f0a::1/64"

info: Sans passer un -duration XXhXXmXXsdrapeau, les certificats seront valables jusqu’à une seconde avant leur signature CA Expire.

Générateur de certificats clients

1
2
3
4
5
6
7
8
9
10
11
12
# durée 3 ans - 2 jours exprimés en hms (3x365x24)-48 -> -duration 26232h00m00s
# Dans le dossier contenant ca.crt, ca.key et nebula-cert
# Pour désigner ca si nécessaire: sign -ca-crt ca.crt -ca-key ca.key
./nebula-cert sign -duration 26232h00m00s -name "vps-5351f610-lighthouse" -networks "10.139.110.1/24,fda3:4291:71b9:2f0a::1/64"
./nebula-cert sign -duration 26232h00m00s -name "cwwk-nebula" -networks "10.139.110.2/24,fda3:4291:71b9:2f0a::2/64" -groups "servers"
./nebula-cert sign -duration 26232h00m00s -name "vps-1780de45-nebula" -networks "10.139.110.3/24,fda3:4291:71b9:2f0a::3/64" -groups "servers"
./nebula-cert sign -duration 26232h00m00s -name "yannir-nebula" -networks "10.139.110.4/24,fda3:4291:71b9:2f0a::4/64" -groups "servers"
./nebula-cert sign -duration 26232h00m00s -name "iceyan-nebula" -networks "10.139.110.5/24,fda3:4291:71b9:2f0a::5/64" -groups "servers"
./nebula-cert sign -duration 26232h00m00s -name "ouestyan-nebula" -networks "10.139.110.6/24,fda3:4291:71b9:2f0a::6/64" -groups "servers"
./nebula-cert sign -duration 26232h00m00s -name "e6230-nebula" -networks "10.139.110.7/24,fda3:4291:71b9:2f0a::7/64" -groups "laptops"
./nebula-cert sign -duration 26232h00m00s -name "pc1-nebula" -networks "10.139.110.8/24,fda3:4291:71b9:2f0a::8/64" -groups "homes"
./nebula-cert sign -duration 26232h00m00s -name "a528s-nebula" -networks "10.139.110.9/24,fda3:4291:71b9:2f0a::9/64" -groups "mobiles"

Droits en exécution

1
chmod +x gener-certificat-client.sh 

Exécution (saisie phrase de passe à chaque certificat)

1
./gener-certificat-client.sh 

Vérification des certificats

1
./nebula-cert print -path cwwk-nebula.crt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
	"curve": "CURVE25519",
	"details": {
		"groups": [
			"servers"
		],
		"isCa": false,
		"issuer": "68dc.....................................7005",
		"name": "cwwk-nebula",
		"networks": [
			"10.139.110.2/24",
			"fda3:4291:71b9:2f0a::2/64"
		],
		"notAfter": "2029-02-07T14:24:47+01:00",
		"notBefore": "2026-02-10T14:24:47+01:00",
		"unsafeNetworks": null
	},
	"fingerprint": "743............................................................e17",
	"publicKey": "127.............................................................851",
	"signature": "50305.............................................................................f09",
	"version": 2
}

Configuration de nebula​

Remarque: Pour les exemples suivants, nous utilisons l’adresse 198.51.100.1 comme ip routable pour un phare fictif. Vous Allez Vous devez remplacer l’adresse IP routable de votre propre phare lors de la création de vos fichiers de configuration Nebula.

Fichiers de configuration ​

Télécharger un Exemple de configuration. Faire deux copies distinctes de l’exemple de fichier de configuration, un pour votre phare nommé config-lighthouse.yaml, et un que pour chaque hôte non-lighthouse, appelé config.yaml.

1
2
3
curl -o config.yml https://raw.githubusercontent.com/slackhq/nebula/master/examples/config.yml
cp config.yml config-lighthouse.yaml
cp config.yml config.yaml

Configuration du phare (config-lighthouse.yaml)​

Sur l’hôte du phare, vous devrez vous assurer am_lighthouse: trueest fixé. Par défaut le port est 4242 , remplacé par 54254

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Dual-stack configuration (both IPv4 and IPv6 overlay addresses)
static_host_map:
  '10.139.110.1': ['xoyaz.xyz:54254']
  'fda3:4291:71b9:2f0a::1': ['xoyaz.xyz:54254']
lighthouse:
  am_lighthouse: true

listen:
  # To listen on only ipv4, use "0.0.0.0"
  host: "::"
  port: 54254

# Désactiver hosts su le phare lighthouse
  # hosts is a list of lighthouse hosts this node should report to and query from
  # IMPORTANT: THIS SHOULD BE EMPTY ON LIGHTHOUSE NODES
  # IMPORTANT2: THIS SHOULD BE LIGHTHOUSES' NEBULA IPs, NOT LIGHTHOUSES' REAL ROUTABLE IPs
  # hosts:
  #  - "192.168.100.1"

Configuration de l’hôte (config.yaml)​

Sur les hôtes individuels, assurez-vous que le phare est défini correctement dans le static_host_mapsection, et est ajouté à la phare hostssection.

1
2
3
4
5
6
7
8
static_host_map:
  '10.139.110.1': ['xoyaz.xyz:54254']
lighthouse:
  am_lighthouse: false
  interval: 60
  hosts:
    - '10.139.110.1' # IPv4 lighthouse
    - 'fda3:4291:71b9:2f0a::1' # IPv6 lighthouse

Paramètres de pare-feu ​

Le fichier de configuration d’exemple permet tout le trafic sortant, mais ne permet que des connexions spécifiques à chaque hôte nebula. Vous devez modifier ces paramètres pour autoriser le trafic vers/depuis les hôtes de votre réseau.

1
2
3
4
5
6
7
8
9
10
11
12
13
firewall:
  outbound:
    # Allow all outbound traffic from this node
    - port: any
      proto: any
      host: any

  inbound:
    # Allow icmp between any nebula hosts
    # proto: any
    - port: any
      proto: icmp
      host: any

Script génération client Nebula

Création d’un bash gener-nebula-v2.sh pour générer les fichiers de configurations Nebula des groupes homes, laptops, servers, lighthouse et mobile

Etendre Réduire...
#!/bin/bash
#
CURRENT=$pwd
DOWNLOAD=""
CSV_FILE="nebula-v2.csv"

function usage {
       printf "#################################################################################################\n"
       printf "Utilisation: $0 [-d <durée format 1450h10m05s> -n <Nom client Nebula>] [-i <Adresse IP>] [-g <Groupe>]\n"
       printf "Nom client Nebula sans espace ni caractères spéciaux\n"
       printf "Adresse IPV4 10.139.110.0/24  IPV6 fda3:4291:71b9::/48\n"
       printf "Groupes: lighthouse, homes, laptops, servers et mobile\n"
       printf "Exemples:\n"
       printf "$0 -d 26100 -n vps-5351f610-lighthouse -i 10.139.110.1/24,fda3:4291:71b9:2f0a::1/64 -g lighthouse\n"
       printf "$0 -d 26100 -n cwwk-nebula -i 10.139.110.2/24,fda3:4291:71b9:2f0a::2/64 -g servers \n"
       printf "Lecture fichier '$CSV_FILE': \n"
       printf "  $0 -f \n"
       printf "  column -s';' -t < $CSV_FILE  \n"
       printf "#################################################################################################\n"
       exit 0
}

n=""
i=""
g=""

while getopts "d:n:i:g:hf" option; do
    case "${option}" in
        d)
            d=${OPTARG}
            ;;
        n)
            n=${OPTARG}
            ;;
        i)
            i=${OPTARG}
            ;;
        g)
            g=${OPTARG}
            ;;
        h)
            usage
            ;;
        f)
        if [ -f "$CSV_FILE" ]; then
	  column -s';' -t < $CSV_FILE	
          exit
        fi
          ;;
    esac
done
shift $((OPTIND-1))

if [ -z "$n" ] || [ -z "$i" ] || [ -z "$g" ]; then
 echo "Pas d'arguments"
 usage
fi

# Variables
nebula_duree=${d}
nebula_host=${n}
nebula_ip=${i}
nebula_group=${g}

case "$nebula_group" in
  homes | laptops | servers | mobile )
   nebula_cfg="config-server-nfs.yaml"
   ;;
  lighthouse)
   nebula_cfg="config-lighthouse.yaml"
   ;;
esac

echo "nebula_cfg: $nebula_cfg"
echo "nebula_duree: $nebula_duree"
echo "nebula_host: $nebula_host"
echo "nebula_ip: $nebula_ip"
echo "nebula_group: $nebula_group"

# Générer les certificats 
#-------------------------------------
# si le certificat est présent , on  efface le .crt et le .key
if [ -f "$nebula_host.crt" ]; then
 echo "effacement certificat "
 rm $nebula_host.crt
 rm $nebula_host.key
fi

echo "Générer les certificats $nebula_host"
# ./nebula-cert sign -duration 26232h00m00s -name "ouestyan-nebula" -networks "10.139.110.6/24,fda3:4291:71b9:2f0a::6/64" -groups "servers"
echo "Saisie de la phrase mot de passe pendant exécution commande suivante"
echo "nebula-cert sign -duration $nebula_duree -name $nebula_host -networks $nebula_ip -groups $nebula_group"
nebula-cert sign -duration $nebula_duree -name $nebula_host -networks $nebula_ip -groups $nebula_group

# Générer la procédure d'installation
cat > $nebula_host.sh << EOF
#!/bin/sh

# exécutable nebula amd64
#
sudo mv -f nebula /usr/local/bin/
sudo chmod +x /usr/local/bin/nebula
#
# Répertoire, configuration et certificats nebula
#
echo "sudo mkdir -p /etc/nebula"
sudo mkdir -p /etc/nebula
echo "sudo mv -f *.yaml /etc/nebula/config.yaml"
sudo mv -f *.yaml /etc/nebula/config.yaml
echo "sudo mv -f ca.crt /etc/nebula/ca.crt"
sudo mv -f ca.crt /etc/nebula/ca.crt
echo "sudo mv -f *.key /etc/nebula/host.key"
sudo mv -f *.key /etc/nebula/host.key
echo "sudo mv -f *.crt /etc/nebula/host.crt"
sudo mv -f *.crt /etc/nebula/host.crt
#
# Créer le service nebula
#
echo "Créer le service systemd nebula"
sudo mv -f nebula.service /etc/systemd/system/nebula.service
# Recharger la configuration systemd
sudo systemctl daemon-reload
# Démarrer et activer le service nebula
echo "Démarrer et activer le service nebula"
sudo systemctl enable nebula --now
EOF

# lighthouse
case "$nebula_group" in
  lighthouse)
cat >> $nebula_host.sh << EOF
#
# si parefeu ufw
#
if [ -f "/usr/sbin/ufw" ]; then
 echo "UFW allow 54254/udp"
 sudo ufw allow 54254/udp
 sudo ufw reload
fi
EOF
   ;;
esac

# Rendre ex&cutable le script
chmod +x $nebula_host.sh

# Créer une archive tar.gz
echo "tar czvf $nebula_host.tar.gz nebula ca.crt $nebula_host.key $nebula_host.crt nebula.service $nebula_cfg $nebula_host.sh"
tar czvf $nebula_host.tar.gz nebula ca.crt $nebula_host.key $nebula_host.crt nebula.service $nebula_cfg $nebula_host.sh
# Déplacer le fichier compressé
echo "sudo mv -f $nebula_host.tar.gz /srv/media/statique/files/$nebula_host.tar.gz"
sudo mv -f $nebula_host.tar.gz /srv/media/statique/files/$nebula_host.tar.gz


echo "# Client Nebula, télécharger le gz"
echo "wget https://chirpy.rnmkcy.eu/files/$nebula_host.tar.gz"
echo "# Extraire dans le répertoire courant"
echo "tar -xvf $nebula_host.tar.gz"
echo "Lancer l'installation:" 
echo "./$nebula_host.sh"
Cet article est sous licence CC BY 4.0 par l'auteur.