Guida al Provisioning dei Dispositivi
Questa guida illustra il provisioning di un DoubleZero Device (DZD) dall'inizio alla fine. Ogni fase corrisponde alla Checklist di Onboarding.
Come si Integra il Tutto
Questa guida illustra come registrare la propria infrastruttura on-chain affinché la rete DoubleZero possa instradare il traffico attraverso di essa. Quanto più completamente il dispositivo è registrato, tanto più è utile per la rete. Una rappresentazione on-chain completa del dispositivo consente un miglior troubleshooting, una migliore pianificazione della capacità e permette al controller di prendere decisioni informate. Nel tempo, l'obiettivo è che il controller assuma una maggiore responsabilità nella configurazione.
Concetti chiave
Interfacce
Le interfacce di un DZD si presentano in diverse forme: porte Ethernet, port channel (LAG composti da più porte Ethernet) e loopback. Ogni interfaccia che svolge un ruolo nella rete deve essere registrata on-chain con i flag appropriati affinché il protocollo sappia quale funzione svolge.
Le porte Ethernet e i port channel possono svolgere i seguenti ruoli:
| Flag | Significato |
|---|---|
--interface-dia dia |
Contrassegna l'interfaccia come uplink di accesso diretto a internet |
--interface-cyoa <subtype> |
Dichiara come gli utenti stabiliscono tunnel GRE attraverso questa interfaccia (es. tramite internet pubblico, tramite un link di peering privato) |
--user-tunnel-endpoint true |
Questa interfaccia porta un IP pubblico su cui gli utenti terminano i tunnel GRE |
Le interfacce utilizzate per link WAN o DZX non portano un flag specifico: vengono registrate con la loro larghezza di banda e poi referenziate quando il link viene creato.
Le interfacce loopback servono a diversi scopi:
| Loopback | Significato |
|---|---|
| Loopback100 / 101 | Portano IP pubblici su cui gli utenti terminano i tunnel GRE. Registrate con --user-tunnel-endpoint true. |
Loopback255 (vpnv4) |
Registrata affinché il controller possa assegnare un IP utilizzato per il BGP router ID, il peering VPN-IPv4 (unicast), l'identità IS-IS e il segment routing |
Loopback256 (ipv4) |
Registrata affinché il controller possa assegnare un IP utilizzato per il peering BGP IPv4 (multicast) e le sessioni MSDP |
Link
I link vengono registrati separatamente dalle interfacce, e le interfacce devono esistere on-chain prima che un link possa referenziarle. Quando si crea un link WAN o DZX, si specifica un'interfaccia già registrata come endpoint fisico del link. Non tutte le interfacce sono collegate a un link: le interfacce DIA, CYOA e loopback non sono connesse a un link.
| Termine | Significato |
|---|---|
| WAN Link | Un link tra due dei vostri DZD |
| DZX Link | Un link tra il vostro DZD e il DZD di un altro contributore |
Panoramica dell'architettura
flowchart TB
subgraph Onchain
SC[DoubleZero Ledger]
end
subgraph Your Infrastructure
MGMT[Management Server<br/>DoubleZero CLI]
subgraph DZD[Your DZD]
CYOA["DIA · CYOA interface<br/>(user-facing uplink)"]
WAN_INTF["WAN link interface"]
DZX_INTF["DZX link interface"]
LO100["Loopback100/101<br/>(user tunnel endpoint)"]
end
DZD2[Your other DZD]
end
subgraph Other Contributor
OtherDZD[Their DZD]
end
USERS["Users"]
MGMT -.->|Registers devices,<br/>links, interfaces| SC
WAN_INTF ---|WAN Link| DZD2
DZX_INTF ---|DZX Link| OtherDZD
USERS -.|GRE tunnel|.-> CYOA
CYOA ---|routes to| LO100
Fase 1: Prerequisiti
Prima di poter eseguire il provisioning di un dispositivo, è necessario avere l'hardware fisico configurato e alcuni indirizzi IP allocati.
Cosa Serve
| Requisito | Perché è Necessario |
|---|---|
| Hardware DZD | Switch Arista 7280CR3A (vedi specifiche hardware) |
| Spazio Rack | 4U con flusso d'aria adeguato |
| Alimentazione | Alimentazioni ridondanti, ~4KW raccomandati |
| Accesso di Gestione | Accesso SSH/console per configurare lo switch |
| Connettività Internet | Per la pubblicazione delle metriche e per recuperare la configurazione dal controller |
| Blocco IPv4 Pubblico | Minimo /29 per il pool di prefissi DZ (vedi sotto) |
Installare la CLI DoubleZero
La CLI DoubleZero (doublezero) viene utilizzata durante tutto il provisioning per registrare dispositivi, creare link e gestire il proprio contributo. Deve essere installata su un server di gestione o VM — non sullo switch DZD stesso. Lo switch esegue solo il Config Agent e il Telemetry Agent (installati nella Fase 4).
Ubuntu / Debian:
curl -1sLf https://dl.cloudsmith.io/public/malbeclabs/doublezero/setup.deb.sh | sudo -E bash
sudo apt-get install doublezero
Rocky Linux / RHEL:
curl -1sLf https://dl.cloudsmith.io/public/malbeclabs/doublezero/setup.rpm.sh | sudo -E bash
sudo yum install doublezero
Verificare che il daemon sia in esecuzione:
sudo systemctl status doublezerod
Comprendere il Prefisso DZ
Il prefisso DZ è un blocco di indirizzi IP pubblici che il protocollo DoubleZero gestisce per l'allocazione IP.
flowchart LR
subgraph "Your /29 Block (8 IPs)"
IP1["First IP<br/>Reserved for<br/>your device"]
IP2["IP 2"]
IP3["IP 3"]
IP4["..."]
IP8["IP 8"]
end
IP1 -->|Assigned to| LO[Loopback100<br/>on your DZD]
IP2 -->|Allocated to| U1[User 1]
IP3 -->|Allocated to| U2[User 2]
Come vengono utilizzati i prefissi DZ:
- Primo IP: Riservato al vostro dispositivo (assegnato all'interfaccia Loopback100)
- IP rimanenti: Allocati a specifici tipi di utenti che si connettono al vostro DZD:
- Utenti
IBRLWithAllocatedIP - Utenti
EdgeFiltering(caso d'uso futuro)
- Utenti
- Utenti IBRL: NON consumano da questo pool (utilizzano il proprio IP pubblico)
Regole del Prefisso DZ
NON È POSSIBILE utilizzare questi indirizzi per:
- Le proprie apparecchiature di rete
- Link point-to-point sulle interfacce DIA
- Interfacce di gestione
- Qualsiasi infrastruttura al di fuori del protocollo DZ
Requisiti:
- Devono essere indirizzi IPv4 globalmente instradabili (pubblici)
- Gli intervalli IP privati (10.x, 172.16-31.x, 192.168.x) vengono rifiutati dallo smart contract
- Dimensione minima: /29 (8 indirizzi), prefissi più grandi sono preferibili (es. /28, /27)
- L'intero blocco deve essere disponibile — non pre-allocare alcun indirizzo
Se servono indirizzi per le proprie apparecchiature (IP delle interfacce DIA, gestione, ecc.), utilizzare un pool di indirizzi separato.
Fase 2: Configurazione dell'Account
In questa fase, si creano le chiavi crittografiche che identificano voi e i vostri dispositivi sulla rete.
Dove Eseguire la CLI
NON installare la CLI sullo switch
La CLI DoubleZero (doublezero) deve essere installata su un server di gestione o VM, non sullo switch Arista.
flowchart LR
subgraph "Management Server/VM"
CLI[DoubleZero CLI]
KEYS[Your Keypairs]
end
subgraph "Your DZD Switch"
CA[Config Agent]
TA[Telemetry Agent]
end
CLI -->|Creates devices, links| BC[Blockchain]
CA -->|Pulls config| CTRL[Controller]
TA -->|Submits metrics| BC
| Installare sul Server di Gestione | Installare sullo Switch |
|---|---|
CLI doublezero |
Config Agent |
| La vostra keypair di servizio | Telemetry Agent |
| La vostra keypair del metrics publisher | Keypair del metrics publisher (copia) |
Cosa Sono le Chiavi?
Le chiavi sono come credenziali di accesso sicure:
- Service Key: La vostra identità come contributore - utilizzata per eseguire i comandi CLI
- Metrics Publisher Key: L'identità del vostro dispositivo per l'invio dei dati di telemetria
Entrambe sono coppie di chiavi crittografiche (una chiave pubblica che condividete, una chiave privata che tenete segreta).
flowchart LR
subgraph "Your Keys"
SK[Service Key<br/>~/.config/solana/id.json]
MK[Metrics Publisher Key<br/>~/.config/doublezero/metrics-publisher.json]
end
SK -->|Used for| CLI[CLI Commands<br/>doublezero device create<br/>doublezero link create]
MK -->|Used for| TEL[Telemetry Agent<br/>Submits metrics onchain]
Passo 2.1: Generare la Service Key
Questa è la vostra identità principale per interagire con DoubleZero.
doublezero keygen
Questo crea una coppia di chiavi nella posizione predefinita. L'output mostra la vostra chiave pubblica - questa è ciò che condividerete con DZF.
Passo 2.2: Generare la Metrics Publisher Key
Questa chiave viene utilizzata dal Telemetry Agent per firmare gli invii delle metriche.
doublezero keygen -o ~/.config/doublezero/metrics-publisher.json
Passo 2.3: Inviare le Chiavi a DZF
Contattare la DoubleZero Foundation o Malbec Labs e fornire:
- La vostra chiave pubblica della service key
- Il vostro username GitHub (per l'accesso al repository)
Essi provvederanno a:
- Creare il vostro account contributore on-chain
- Concedere l'accesso al repository privato dei contributori
Passo 2.4: Verificare il Proprio Account
Una volta confermato, verificare che il proprio account contributore esista:
doublezero contributor list
Dovreste vedere il vostro codice contributore nella lista.
Passo 2.5: Accedere al Repository dei Contributori
Il repository malbeclabs/contributors contiene:
- Configurazioni base dei dispositivi
- Profili TCAM
- Configurazioni ACL
- Istruzioni di configurazione aggiuntive
Seguire le istruzioni presenti per la configurazione specifica del dispositivo.
Fase 3: Provisioning del Dispositivo
Ora registrerete il vostro dispositivo fisico sulla blockchain e configurerete le sue interfacce.
Comprendere i Tipi di Dispositivo
Edge — accetta solo connessioni utente
flowchart LR
subgraph EDZD[Edge DZD]
E_CYOA["DIA · CYOA interface"]
E_TUN["Loopback100/101
(user tunnel endpoint)"]
E_DZX["DZX link interface"]
E_CYOA --- E_TUN
end
EU["Users"] -.|GRE tunnel|.-> E_CYOA
E_DZX <-->|DZX Link| ED["DZD (different contributor)"]
Transit — trasporta traffico tra dispositivi, nessuna connessione utente
flowchart LR
subgraph TDZD[Transit DZD]
T_WAN["WAN link interface"]
T_DZX["DZX link interface"]
end
T_WAN <-->|WAN Link| T2["DZD (same contributor)"]
T_DZX <-->|DZX Link| TD["DZD (different contributor)"]
Hybrid — connessioni utente e backbone, il più comune
flowchart LR
subgraph HDZD[Hybrid DZD]
H_CYOA["DIA · CYOA interface"]
H_TUN["Loopback100/101
(user tunnel endpoint)"]
H_WAN["WAN link interface"]
H_DZX["DZX link interface"]
H_CYOA --- H_TUN
end
HU["Users"] -.|GRE tunnel|.-> H_CYOA
H_WAN <-->|WAN Link| H2["DZD (same contributor)"]
H_DZX <-->|DZX Link| HD["DZD (different contributor)"]
| Tipo | Funzione | Quando Usarlo |
|---|---|---|
| Edge | Accetta solo connessioni utente | Singola location, solo rivolto agli utenti |
| Transit | Trasporta traffico tra dispositivi | Connettività backbone, nessun utente |
| Hybrid | Sia connessioni utente CHE backbone | Il più comune - fa tutto |
Passo 3.1: Trovare la Propria Location e Exchange
Prima di creare il dispositivo, cercare i codici per la location del data center e l'exchange più vicino:
# Elencare le location disponibili (data center)
doublezero location list
# Elencare gli exchange disponibili (punti di interconnessione)
doublezero exchange list
Passo 3.2: Creare il Dispositivo On-chain
Registrare il dispositivo sulla blockchain:
doublezero device create \
--code <YOUR_DEVICE_CODE> \
--contributor <YOUR_CONTRIBUTOR_CODE> \
--device-type hybrid \
--location <LOCATION_CODE> \
--exchange <EXCHANGE_CODE> \
--public-ip <DEVICE_PUBLIC_IP> \
--dz-prefixes <YOUR_DZ_PREFIX>
Esempio:
doublezero device create \
--code nyc-dz001 \
--contributor acme \
--device-type hybrid \
--location EQX-NY5 \
--exchange nyc \
--public-ip "203.0.113.10" \
--dz-prefixes "198.51.100.0/28"
Output atteso:
Signature: 4vKz8H...truncated...7xPq2
Verificare che il dispositivo sia stato creato:
doublezero device list | grep nyc-dz001
Spiegazione dei parametri:
| Parametro | Significato |
|---|---|
--code |
Un nome univoco per il dispositivo (es. nyc-dz001) |
--contributor |
Il vostro codice contributore (fornito da DZF) |
--device-type |
hybrid, transit, o edge |
--location |
Codice del data center da location list |
--exchange |
Codice dell'exchange più vicino da exchange list |
--public-ip |
L'IP pubblico dove gli utenti si connettono al dispositivo tramite internet |
--dz-prefixes |
Il blocco IP allocato per gli utenti |
Passo 3.3: Creare le Interfacce Loopback Richieste
Ogni dispositivo necessita di due interfacce loopback per il routing interno:
# Loopback VPNv4
doublezero device interface create <DEVICE_CODE> Loopback255 --loopback-type vpnv4
# Loopback IPv4
doublezero device interface create <DEVICE_CODE> Loopback256 --loopback-type ipv4
Output atteso (per ogni comando):
Signature: 3mNx9K...truncated...8wRt5
Passo 3.4: Creare le Interfacce Fisiche
Registrare le interfacce fisiche che verranno utilizzate per i link WAN o DZX. Queste interfacce devono esistere on-chain prima di poter creare un link che le referenzi. In questo passo si registra solo l'interfaccia e la sua larghezza di banda; il link viene creato in un passo successivo.
doublezero device interface create <DEVICE_CODE> <INTERFACE_NAME> \
--bandwidth <PORT_SPEED>
Esempio:
doublezero device interface create nyc-dz001 Ethernet1/1 \
--bandwidth 10Gbps
Output atteso:
Signature: 7pQw2R...truncated...4xKm9
Ripetere per ogni interfaccia che verrà utilizzata come endpoint di un link WAN o DZX. Le interfacce CYOA e DIA vengono registrate separatamente nel passo successivo.
Passo 3.5: Creare l'Interfaccia CYOA (per dispositivi Edge/Hybrid)
I DZD hybrid e edge necessitano di due indirizzi IP pubblici su cui gli utenti terminano i loro tunnel GRE. Gli utenti possono connettersi tramite unicast, multicast o entrambi, e quale IP serve quale scopo ruota per ogni utente.
Entrambi gli IP devono essere registrati con --user-tunnel-endpoint true, sia su un'interfaccia fisica che su un loopback. Questo include l'IP fornito al momento della creazione del dispositivo; quell'IP deve comunque essere esplicitamente registrato qui.
Se si è vincolati negli IP, è possibile utilizzare il primo /32 del proprio prefisso DZ come uno dei due IP.
CYOA e DIA
| Tipo | Flag | Scopo |
|---|---|---|
| DIA | --interface-dia dia |
Contrassegna la porta come accesso diretto a internet |
| CYOA | --interface-cyoa <subtype> |
Dichiara come gli utenti connettono i tunnel GRE al dispositivo |
Il flag CYOA viene sempre impostato su un'interfaccia fisica (porta Ethernet o port channel). Mai su un loopback.
| Sottotipo CYOA | Quando usarlo |
|---|---|
gre-over-dia |
Gli utenti si connettono tramite internet pubblico. Il più comune. |
gre-over-private-peering |
Gli utenti si connettono tramite cross-connect diretto o circuito privato |
gre-over-public-peering |
Gli utenti fanno peering con voi presso un Internet Exchange (IX) |
gre-over-fabric |
Gli utenti sono co-locati e si connettono tramite fabric locale |
gre-over-cable |
Connessione via cavo diretto a un singolo utente dedicato |
Scenario A: Singola interfaccia fisica
Un singolo uplink fisico verso l'ISP. Ethernet1/1 è l'interfaccia CYOA e DIA e porta uno dei due IP pubblici. Loopback100 porta il secondo IP pubblico.
flowchart LR
USERS(["End Users"])
subgraph DZD["DZD"]
E1["Eth1/1
203.0.113.1/30
CYOA · DIA · user tunnel endpoint"]
LO["Loopback100
198.51.100.1/32\n user tunnel endpoint"]
E1 --- LO
end
ISP["ISP Router
203.0.113.2/30"]
ISP -- "10GbE" --- E1
USERS -. "GRE tunnels" .-> E1
USERS -. "GRE tunnels" .-> LO
| Interfaccia | --interface-cyoa |
--interface-dia |
--ip-net |
--bandwidth |
--cir |
--routing-mode |
--user-tunnel-endpoint |
|---|---|---|---|---|---|---|---|
| Ethernet1/1 | gre-over-dia |
dia |
IP/subnet assegnato dal contributore | velocità della porta | tasso garantito | bgp o static |
true |
| Loopback100 | — | — | il vostro /32 pubblico | 0bps |
— | — | true |
Esempio di comandi da eseguire basati sullo Scenario A:
doublezero device interface create mydzd-nyc01 Ethernet1/1 \
--interface-cyoa gre-over-dia \
--interface-dia dia \
--ip-net 203.0.113.1/30 \
--bandwidth 10Gbps \
--cir 1Gbps \
--routing-mode bgp \
--user-tunnel-endpoint true
doublezero device interface create mydzd-nyc01 Loopback100 \
--ip-net 198.51.100.1/32 \
--bandwidth 0bps \
--user-tunnel-endpoint true
Scenario B: Port channel (LAG)
Il DZD si connette al dispositivo upstream tramite un port channel con un IP. Il port channel porta un IP pubblico ed è l'endpoint CYOA. Loopback100 porta il secondo IP pubblico.
flowchart LR
USERS(["End Users"])
subgraph SW["Upstream Router / Switch"]
SWPC(["bond0
203.0.113.2/30"])
end
subgraph DZD["DZD"]
subgraph PC["Port-Channel1 · 203.0.113.1/30 · CYOA · DIA · user tunnel endpoint"]
E1["Eth1/1"]
E2["Eth2/1"]
end
LO["Loopback100
198.51.100.1/32\n user tunnel endpoint"]
PC --- LO
end
SWPC -- "2x 10GbE" --- PC
USERS -. "GRE tunnels" .-> PC
USERS -. "GRE tunnels" .-> LO
| Interfaccia | --interface-cyoa |
--interface-dia |
--ip-net |
--bandwidth |
--cir |
--routing-mode |
--user-tunnel-endpoint |
|---|---|---|---|---|---|---|---|
| Port-Channel1 | gre-over-dia |
dia |
IP/subnet assegnato dal contributore | velocità LAG combinata | tasso garantito | bgp o static |
true |
| Loopback100 | — | — | il vostro /32 pubblico | 0bps |
— | — | true |
Esempio di comandi da eseguire basati sullo Scenario B:
doublezero device interface create mydzd-fra01 Port-Channel1 \
--interface-cyoa gre-over-dia \
--interface-dia dia \
--ip-net 203.0.113.1/30 \
--bandwidth 20Gbps \
--cir 2Gbps \
--routing-mode bgp \
--user-tunnel-endpoint true
doublezero device interface create mydzd-fra01 Loopback100 \
--ip-net 198.51.100.1/32 \
--bandwidth 0bps \
--user-tunnel-endpoint true
Scenario C: Doppio uplink fisico verso router separati
Ogni interfaccia fisica si connette a un router upstream diverso. I due IP pubblici risiedono su Loopback100 e Loopback101, entrambi registrati come endpoint dei tunnel utente.
flowchart LR
USERS(["End Users"])
RA["Router A
203.0.113.2/30"]
RB["Router B
203.0.113.6/30"]
subgraph DZD["DZD"]
E1["Eth1/1
203.0.113.1/30
CYOA · DIA"]
E2["Eth2/1
203.0.113.5/30
CYOA · DIA"]
LO0["Loopback100
198.51.100.1/32\n user tunnel endpoint"]
LO1["Loopback101
198.51.100.2/32\n user tunnel endpoint"]
E1 --> LO0
E2 --> LO1
end
RA -- "10GbE" --- E1
RB -- "10GbE" --- E2
USERS -. "GRE tunnels" .-> LO0
USERS -. "GRE tunnels" .-> LO1
| Interfaccia | --interface-cyoa |
--interface-dia |
--ip-net |
--bandwidth |
--cir |
--routing-mode |
--user-tunnel-endpoint |
|---|---|---|---|---|---|---|---|
| Ethernet1/1 | gre-over-dia |
dia |
IP/subnet assegnato dal contributore | velocità della porta | tasso garantito | bgp o static |
— |
| Ethernet2/1 | gre-over-dia |
dia |
IP/subnet assegnato dal contributore | velocità della porta | tasso garantito | bgp o static |
— |
| Loopback100 | — | — | il vostro /32 pubblico | 0bps |
— | — | true |
| Loopback101 | — | — | il vostro /32 pubblico | 0bps |
— | — | true |
Esempio di comandi da eseguire basati sullo Scenario C:
doublezero device interface create mydzd-ams01 Ethernet1/1 \
--interface-cyoa gre-over-dia \
--interface-dia dia \
--ip-net 203.0.113.1/30 \
--bandwidth 10Gbps \
--cir 1Gbps \
--routing-mode bgp
doublezero device interface create mydzd-ams01 Ethernet2/1 \
--interface-cyoa gre-over-dia \
--interface-dia dia \
--ip-net 203.0.113.5/30 \
--bandwidth 10Gbps \
--cir 1Gbps \
--routing-mode bgp
doublezero device interface create mydzd-ams01 Loopback100 \
--ip-net 198.51.100.1/32 \
--bandwidth 0bps \
--user-tunnel-endpoint true
doublezero device interface create mydzd-ams01 Loopback101 \
--ip-net 198.51.100.2/32 \
--bandwidth 0bps \
--user-tunnel-endpoint true
Passo 3.6: Verificare il Dispositivo
doublezero device list
Output di esempio:
account | code | contributor | location | exchange | device_type | public_ip | dz_prefixes | users | max_users | status | health | mgmt_vrf | owner
7xKm9pQw2R4vHt3... | nyc-dz001 | acme | EQX-NY5 | nyc | hybrid | 203.0.113.10 | 198.51.100.0/28 | 0 | 14 | activated | pending | | 5FMtd5Woq5XAAg54...
Il dispositivo dovrebbe apparire con stato activated.
Fase 4: Attivazione dei Link e Installazione degli Agent
I link connettono il vostro dispositivo al resto della rete DoubleZero.
Comprendere i Link
flowchart LR
subgraph "Your Network"
D1[Your DZD 1<br/>NYC]
D2[Your DZD 2<br/>LAX]
end
subgraph "Other Contributor"
O1[Their DZD<br/>NYC]
end
D1 ---|WAN Link<br/>Same contributor| D2
D1 ---|DZX Link<br/>Different contributors| O1
| Tipo di Link | Connette | Accettazione |
|---|---|---|
| WAN Link | Due dei VOSTRI dispositivi | Automatica (li possedete entrambi) |
| DZX Link | Il vostro dispositivo a quello di UN ALTRO contributore | Richiede la loro accettazione |
Passo 4.1: Creare Link WAN (se si hanno più dispositivi)
I link WAN connettono i vostri dispositivi:
doublezero link create wan \
--code <LINK_CODE> \
--contributor <YOUR_CONTRIBUTOR> \
--side-a <DEVICE_1_CODE> \
--side-a-interface <INTERFACE_ON_DEVICE_1> \
--side-z <DEVICE_2_CODE> \
--side-z-interface <INTERFACE_ON_DEVICE_2> \
--bandwidth 10000 \
--mtu 9000 \
--delay-ms 20 \
--jitter-ms 1
Esempio:
doublezero link create wan \
--code nyc-lax-wan01 \
--contributor acme \
--side-a nyc-dz001 \
--side-a-interface Ethernet3/1 \
--side-z lax-dz001 \
--side-z-interface Ethernet3/1 \
--bandwidth 10000 \
--mtu 9000 \
--delay-ms 65 \
--jitter-ms 1
Output atteso:
Signature: 5tNm7K...truncated...9pRw2
Passo 4.2: Creare Link DZX
I link DZX connettono il vostro dispositivo direttamente al DZD di un altro contributore:
doublezero link create dzx \
--code <DEVICE_CODE_A:DEVICE_CODE_Z> \
--contributor <YOUR_CONTRIBUTOR> \
--side-a <YOUR_DEVICE_CODE> \
--side-a-interface <YOUR_INTERFACE> \
--side-z <OTHER_DEVICE_CODE> \
--bandwidth <BANDWIDTH in Kbps, Mbps, or Gbps> \
--mtu <MTU> \
--delay-ms <DELAY> \
--jitter-ms <JITTER>
Output atteso:
Signature: 8mKp3W...truncated...2nRx7
Dopo aver creato un link DZX, l'altro contributore deve accettarlo:
# L'ALTRO contributore esegue questo comando
doublezero link accept \
--code <LINK_CODE> \
--side-z-interface <THEIR_INTERFACE>
Output atteso (per il contributore che accetta):
Signature: 6vQt9L...truncated...3wPm4
Passo 4.3: Verificare i Link
doublezero link list
Output di esempio:
account | code | contributor | side_a_name | side_a_iface_name | side_z_name | side_z_iface_name | link_type | bandwidth | mtu | delay_ms | jitter_ms | delay_override_ms | tunnel_id | tunnel_net | status | health | owner
8vkYpXaBW8RuknJq... | nyc-dz001:lax-dz001 | acme | nyc-dz001 | Ethernet3/1 | lax-dz001 | Ethernet3/1 | WAN | 10Gbps | 9000 | 65.00ms | 1.00ms | 0.00ms | 42 | 172.16.0.84/31 | activated | pending | 5FMtd5Woq5XAAg54...
I link dovrebbero mostrare stato activated una volta che entrambi i lati sono configurati.
Installazione degli Agent
Due software agent vengono eseguiti sul vostro DZD:
flowchart TB
subgraph "Your DZD"
CA[Config Agent]
TA[Telemetry Agent]
HW[Switch Hardware/Software]
end
CA -->|Polls for config| CTRL[Controller Service]
CA -->|Applies config| HW
HW -->|Metrics| TA
TA -->|Submits onchain| BC[DoubleZero Ledger]
| Agent | Funzione |
|---|---|
| Config Agent | Recupera la configurazione dal controller e la applica allo switch |
| Telemetry Agent | Misura latenza/perdita di pacchetti verso altri dispositivi, riporta le metriche on-chain |
Passo 4.4: Installare il Config Agent
Abilitare l'API sullo switch
Aggiungere alla configurazione EOS:
management api eos-sdk-rpc
transport grpc eapilocal
localhost loopback vrf default
service all
no disabled
Nota sul VRF
Sostituire default con il nome del proprio VRF di gestione se diverso (es. management).
Scaricare e installare l'agent
# Entrare in bash sullo switch
switch# bash
$ sudo bash
# cd /mnt/flash
# wget AGENT_DOWNLOAD_URL
# exit
$ exit
# Installare come estensione EOS
switch# copy flash:AGENT_FILENAME extension:
switch# extension AGENT_FILENAME
switch# copy installed-extensions boot-extensions
Verificare l'estensione
switch# show extensions
Lo Status dovrebbe essere "A, I, B":
Name Version/Release Status Extension
------------------------------------------- ------------------- ---------- ---------
AGENT_FILENAME MAINNET_CLIENT_VERSION/1 A, I, B 1
A: available | NA: not available | I: installed | F: forced | B: install at boot
Configurare e avviare l'agent
Aggiungere alla configurazione EOS:
daemon doublezero-agent
exec /usr/local/bin/doublezero-agent -pubkey <YOUR_DEVICE_PUBKEY> -controller <controller_IP>:<controller_port>
no shut
IP e porta del controller
L'IP e la porta del controller sono disponibili nel repository dei contributori a cui avete ottenuto l'accesso nel Passo 2.5.
Nota sul VRF
Se il VRF di gestione non è default (cioè il namespace non è ns-default), prefissare il comando exec con exec /sbin/ip netns exec ns-<VRF>. Ad esempio, se il VRF è management:
daemon doublezero-agent
exec /sbin/ip netns exec ns-management /usr/local/bin/doublezero-agent -pubkey <YOUR_DEVICE_PUBKEY>
no shut
Ottenere la pubkey del dispositivo da doublezero device list (colonna account).
Verificare che sia in esecuzione
switch# show agent doublezero-agent logs
Dovreste vedere "Starting doublezero-agent" e connessioni al controller avvenute con successo.
Passo 4.5: Installare il Telemetry Agent
Copiare la chiave del metrics publisher sul dispositivo
scp ~/.config/doublezero/metrics-publisher.json <SWITCH_IP>:/mnt/flash/metrics-publisher-keypair.json
Registrare il metrics publisher on-chain
doublezero device update \
--pubkey <DEVICE_ACCOUNT> \
--metrics-publisher <METRICS_PUBLISHER_PUBKEY>
Ottenere la pubkey dal file metrics-publisher.json.
Scaricare e installare l'agent
switch# bash
$ sudo bash
# cd /mnt/flash
# wget TELEMETRY_DOWNLOAD_URL
# exit
$ exit
# Installare come estensione EOS
switch# copy flash:TELEMETRY_FILENAME extension:
switch# extension TELEMETRY_FILENAME
switch# copy installed-extensions boot-extensions
Verificare l'estensione
switch# show extensions
Lo Status dovrebbe essere "A, I, B":
Name Version/Release Status Extension
------------------------------------------- ------------------- ---------- ---------
TELEMETRY_FILENAME MAINNET_CLIENT_VERSION/1 A, I, B 1
A: available | NA: not available | I: installed | F: forced | B: install at boot
Configurare e avviare l'agent
Aggiungere alla configurazione EOS:
daemon doublezero-telemetry
exec /usr/local/bin/doublezero-telemetry --local-device-pubkey <DEVICE_ACCOUNT> --env mainnet --keypair /mnt/flash/metrics-publisher-keypair.json
no shut
Nota sul VRF
Se il VRF di gestione non è default (cioè il namespace non è ns-default), aggiungere --management-namespace ns-<VRF> al comando exec. Ad esempio, se il VRF è management:
daemon doublezero-telemetry
exec /usr/local/bin/doublezero-telemetry --management-namespace ns-management --local-device-pubkey <DEVICE_ACCOUNT> --env mainnet --keypair /mnt/flash/metrics-publisher-keypair.json
no shut
Verificare che sia in esecuzione
switch# show agent doublezero-telemetry logs
Dovreste vedere "Starting telemetry collector" e "Starting submission loop".
Fase 5: Burn-in dei Link
Tutti i nuovi link devono completare il burn-in prima di trasportare traffico
I nuovi link devono essere drenati per almeno 24 ore prima di essere attivati per il traffico di produzione. Questo requisito di burn-in è definito in RFC12: Network Provisioning, che specifica ~200.000 slot del DZ Ledger (~20 ore) di metriche pulite prima che un link sia pronto per il servizio.
Con gli agent installati e in esecuzione, monitorare i link su metrics.doublezero.xyz per almeno 24 ore consecutive:
- Dashboard "DoubleZero Device-Link Latencies" — verificare zero perdita di pacchetti sul link nel tempo
- Dashboard "DoubleZero Network Metrics" — verificare zero errori sui link
Rimuovere il drain dal link solo dopo che il periodo di burn-in mostra un link pulito con zero perdite e zero errori.
Fase 6: Verifica e Attivazione
Completare questa checklist per confermare che tutto funzioni correttamente.
Il dispositivo inizia bloccato (max_users = 0)
Quando un dispositivo viene creato, max_users è impostato a 0 per impostazione predefinita. Ciò significa che nessun utente può ancora connettersi. Questo è intenzionale — dovete verificare che tutto funzioni prima di accettare traffico utente.
Prima di impostare max_users sopra 0, dovete:
- Confermare che tutti i link abbiano completato il burn-in di 24 ore con zero perdite/errori su metrics.doublezero.xyz
- Coordinarvi con DZ/Malbec Labs per eseguire un test di connettività:
- Un utente di test riesce a connettersi al dispositivo?
- L'utente riceve le rotte attraverso la rete DZ?
- L'utente riesce a instradare il traffico sulla rete DZ end-to-end?
- Solo dopo che DZ/ML conferma il superamento dei test, impostare max_users a 96:
doublezero device update --pubkey <DEVICE_ACCOUNT> --max-users 96
Controlli del Dispositivo
# Il dispositivo dovrebbe apparire con stato "activated"
doublezero device list | grep <YOUR_DEVICE_CODE>
Output atteso:
7xKm9pQw2R4vHt3... | nyc-dz001 | acme | EQX-NY5 | nyc | hybrid | 203.0.113.10 | 198.51.100.0/28 | 0 | 14 | activated | pending | | 5FMtd5Woq5XAAg54...
# Le interfacce dovrebbero essere elencate
doublezero device interface list | grep <YOUR_DEVICE_CODE>
Output atteso:
nyc-dz001 | Loopback255 | loopback | vpnv4 | none | none | 0 | 0 | 1500 | static | 0 | 172.16.1.91/32 | 56 | false | activated
nyc-dz001 | Loopback256 | loopback | ipv4 | none | none | 0 | 0 | 1500 | static | 0 | 172.16.1.100/32 | 0 | false | activated
nyc-dz001 | Ethernet1/1 | physical | none | none | none | 0 | 0 | 1500 | static | 0 | | 0 | false | activated
Controlli dei Link
# I link dovrebbero mostrare stato "activated"
doublezero link list | grep <YOUR_DEVICE_CODE>
Output atteso:
8vkYpXaBW8RuknJq... | nyc-lax-wan01 | acme | nyc-dz001 | Ethernet3/1 | lax-dz001 | Ethernet3/1 | WAN | 10Gbps | 9000 | 65.00ms | 1.00ms | 0.00ms | 42 | 172.16.0.84/31 | activated | pending | 5FMtd5Woq5XAAg54...
Controlli degli Agent
Sullo switch:
# Il Config Agent dovrebbe mostrare recuperi di configurazione riusciti
switch# show agent doublezero-agent logs | tail -20
# Il Telemetry Agent dovrebbe mostrare invii riusciti
switch# show agent doublezero-telemetry logs | tail -20
Diagramma di Verifica Finale
flowchart TB
subgraph "Verification Checklist"
D[Device Status: activated?]
I[Interfaces: registered?]
L[Links: activated?]
CA[Config Agent: pulling config?]
TA[Telemetry Agent: submitting metrics?]
end
D --> PASS
I --> PASS
L --> PASS
CA --> PASS
TA --> PASS
PASS[All Checks Pass] --> NOTIFY[Notify DZF/Malbec Labs<br/>You are technically ready!]
Risoluzione dei Problemi
La creazione del dispositivo fallisce
- Verificare che la service key sia autorizzata (
doublezero contributor list) - Controllare che i codici di location e exchange siano validi
- Assicurarsi che il prefisso DZ sia un intervallo IP pubblico valido
Il link rimane nello stato "requested"
- I link DZX richiedono l'accettazione da parte dell'altro contributore
- Contattarlo per eseguire
doublezero link accept
Il Config Agent non si connette
- Verificare che la rete di gestione abbia accesso a internet
- Controllare che la configurazione del VRF corrisponda alla propria configurazione
- Assicurarsi che la pubkey del dispositivo sia corretta
Il Telemetry Agent non invia dati
- Verificare che la chiave del metrics publisher sia registrata on-chain
- Controllare che il file della keypair esista sullo switch
- Assicurarsi che la pubkey dell'account del dispositivo sia corretta
Prossimi Passi
- Consultare la Guida alle Operazioni per gli aggiornamenti degli agent e la gestione dei link
- Controllare il Glossario per le definizioni dei termini
- Contattare DZF/Malbec Labs in caso di problemi