Aller au contenu principal

Networking

Cluster DNS DHCP de la flotte

Le cluster DNS/DHCP centralise la resolution de noms et l'attribution d'adresses IP de la flotte. Il s'appuie sur central-dnsdhcp pour le CRUD reseau et sur CoreDNS pour la resolution locale.

Saturn agit comme orchestrateur: il recupere les donnees des nodes (inventaire, IP, hostname, MAC), puis appelle DNS/DHCP en gRPC pour convertir ces informations en enregistrements DNS et reservations DHCP.

  • Source metier: Saturn (etat et inventaire de flotte).

  • Source de verite reseau: central-dnsdhcp.

  • Resolution locale: CoreDNS recharge regulierement les donnees synchronisees.

Canaux de communication​

leukOS combine des canaux complementaires entre UI, central et nodes: GraphQL, REST, gRPC et MQTT.

MQTT bus local node​

Le broker Mosquitto ecoute sur 127.0.0.1:1883 et transporte la telemetrie locale node.

TopicSensContenu
openautomation/<node_id>/statusnode -> centralLWT online / offline (retenu).
openautomation/<node_id>/statenode -> centralEtat JSON periodique (~2 s).
openautomation/<node_id>/cmd/relay/<id>central/local -> nodeCommande relais (compatibilite / usage local).
openautomation/<node_id>/cmd/valve/<id>central/local -> nodeCommande vanne (compatibilite / usage local).

Dans le flux principal actuel, Saturn pilote les nodes via gRPC puis HTTP fallback. MQTT reste disponible pour la telemetrie et certains usages de compatibilite.

Resume des ports​

ServicePortProtocole
API locale node8080HTTP/REST
Daemon node19080 / 9080gRPC
Mosquitto1883MQTT
Venus8135HTTP/GraphQL
Saturn8130HTTP/REST
Mercure8140HTTP/REST
central-dnsdhcp9150gRPC
PostgreSQL5432TCP
Elasticsearch9200HTTP

Flux DNS/DHCP detaille​

Sequence fonctionnelle:

  1. Saturn collecte/maintient les metadonnees node (id, hostname, ip, mac).
  2. Lors d'un upsert node ou d'un changement reseau, Saturn mappe ces donnees.
  3. Saturn appelle central-dnsdhcp en gRPC pour ecrire DNS et DHCP.
  4. La couche DNS est rechargee avec les nouveaux enregistrements.

Conversion des donnees node vers DNS/DHCP​

Exemple de mapping metier applique dans Saturn:

type Node struct {
ID string
Hostname string
IP string
MAC string
}

func mapNodeToNetworkRecords(n Node) (dnsHost string, dnsIP string, dhcpMAC string, dhcpIP string) {
// Convention flotte: hostname.leukos.lan pour DNS local
dnsHost = n.Hostname + ".leukos.lan"
dnsIP = n.IP
dhcpMAC = n.MAC
dhcpIP = n.IP
return
}

Exemple d'appel gRPC Saturn -> DNSDHCP:

func syncNodeNetwork(ctx context.Context, c dnspb.DNSDHCPServiceClient, n Node) error {
dnsHost, dnsIP, dhcpMAC, dhcpIP := mapNodeToNetworkRecords(n)

if _, err := c.UpsertDnsRecord(ctx, &dnspb.UpsertDnsRecordRequest{
Hostname: dnsHost,
Ip: dnsIP,
Enabled: true,
}); err != nil {
return err
}

_, err := c.UpsertDhcpRecord(ctx, &dnspb.UpsertDhcpRecordRequest{
ClientId: n.ID,
Mac: dhcpMAC,
Ip: dhcpIP,
Hostname: n.Hostname,
Enabled: true,
})
return err
}

Exemple REST cote Saturn pour declencher une synchronisation DNS:

curl -X POST http://central:8130/api/dns/sync

API reseau exposees par Saturn​

MéthodeCheminDescription
GET/api/dns/recordsListe les records DNS.
POST/api/dns/records/upsertCree/met a jour un record DNS.
DELETE/api/dns/records/{hostname}Supprime un record DNS.
POST/api/dns/syncRegenere le jeu DNS local.
GET/api/dhcp/recordsListe les baux DHCP.
POST/api/dhcp/records/upsertCree/met a jour un bail DHCP.
DELETE/api/dhcp/records/{client_id}Supprime un bail DHCP.

WireGuard (fusion)​

WireGuard fait partie de la strategie networking de leukOS: tunnel VPN au boot, liaison securisee site vers central, et acces d'exploitation distant.

Ce qui est configure​

  • BR2_PACKAGE_WIREGUARD_TOOLS=y dans les defconfigs Buildroot.
  • BR2_PACKAGE_IPROUTE2=y et BR2_PACKAGE_BASH=y (requis pour wg-quick).
  • Script init SysV S89wireguard execute avant les services applicatifs.
  • Modele de conf: /etc/wireguard/wg0.conf.example.

Activation rapide​

cp /etc/wireguard/wg0.conf.example /etc/wireguard/wg0.conf
chmod 600 /etc/wireguard/wg0.conf
/etc/init.d/S89wireguard start
ip addr show wg0
wg show

Exemple minimal wg0.conf​

[Interface]
Address = 10.66.0.2/24
PrivateKey = <node_private_key_base64>
ListenPort = 51820

[Peer]
PublicKey = <hub_public_key_base64>
PresharedKey = <preshared_key_base64>
AllowedIPs = 10.66.0.0/24
Endpoint = vpn.example.com:51820
PersistentKeepalive = 25

Depannage rapide​

  • interface absente: verifier wg0.conf et permissions 600.
  • pas de handshake: verifier endpoint, port, NAT/firewall et cles.
  • wg-quick: not found: reconstruire une image avec les options Buildroot a jour.

Voir aussi​