Implementare la crittografia WireGuard con i servizi avanzati di rete per container

Questo articolo illustra come distribuire la crittografia WireGuard con Advanced Container Networking Services nei cluster Azure Kubernetes Service (AKS).

Prerequisiti

  • Un account Azure con una sottoscrizione attiva. Se non ne hai uno, crea un account gratuito prima di iniziare.
  • La versione minima di Azure CLI necessaria per i passaggi descritti in questo articolo è 2.71.0. Per trovare la versione, eseguire az --version. Se è necessario installare o aggiornare, vedere Installare Azure CLI.

  • La crittografia WireGuard è supportata solo con Azure CNI con tecnologia Cilium. Se si usa qualsiasi altro plug-in di rete, la crittografia WireGuard non è supportata. Vedere Configurare Azure CNI con tecnologia Cilium.

  • WireGuard stabilisce tunnel crittografati sulla porta UDP 51871, che è esposta su ciascun nodo AKS. Verificare che la porta UDP 51871 sia consentita tra tutti gli IP dei nodi, soprattutto se l'ambiente prevede l'uso di firewall.

Abilitare Advanced Container Networking Services e WireGuard

Per continuare, è necessario disporre di un cluster del servizio Azure Kubernetes con i servizi avanzati di rete per contenitori abilitati.

Il comando az aks create con il flag servizi avanzati di rete per contenitori, --enable-acns, crea un nuovo cluster del servizio Azure Kubernetes con tutte le funzionalità dei servizi avanzati di rete per contenitori. Queste funzionalità includono:

Annotazioni

I cluster inclusi nel piano dati Cilium supportano l'osservabilità di rete del contenitore e la sicurezza di rete dei contenitori a partire dalla versione 1.29 di Kubernetes. WireGuard è disabilitato per impostazione predefinita anche dopo l'abilitazione di Advanced Container Networking Services. Per abilitare WireGuard impostare il tipo di crittografia usando il flag --acns-transit-encryption-type wireguard.


# Set environment variables for the AKS cluster name and resource group. Make sure to replace the placeholders with your own values.
export CLUSTER_NAME="<aks-cluster-name>"
export RESOURCE_GROUP="<resourcegroup-name>"
 
# Create an AKS cluster
az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --location eastus \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --network-dataplane cilium \
    --enable-acns \
    --acns-transit-encryption-type wireguard \
    --generate-ssh-keys

Abilitare Advanced Container Networking Services e WireGuard in un cluster esistente

Il comando az aks update con il flag --enable-acns di Servizi avanzati di rete dei contenitori aggiorna un cluster AKS esistente con tutte le funzionalità dei Servizi avanzati di rete dei contenitori, che includono l'osservabilità della rete dei contenitori e la funzionalità sicurezza di rete dei contenitori.

Importante

L'abilitazione di WireGuard in un cluster esistente attiverà un riavvio dell'implementazione dell'agente Cilium in tutti i nodi. Per i cluster di grandi dimensioni, questo processo può richiedere del tempo e può influire temporaneamente sui carichi di lavoro. È consigliabile pianificare l'aggiornamento durante una finestra di manutenzione o un periodo di traffico ridotto per ridurre al minimo le interruzioni

Annotazioni

Solo i cluster con il piano dati Cilium supportano le funzionalità della sicurezza di rete dei contenitori dei servizi avanzati di rete per contenitori.

WireGuard è disabilitato per impostazione predefinita anche dopo l'abilitazione di Advanced Container Networking Services. Per abilitare WireGuard impostare il tipo di crittografia usando il flag --acns-transit-encryption-type wireguard.

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns \
    --acns-transit-encryption-type wireguard

Ottenere le credenziali del cluster

Ottenere le credenziali del cluster usando il az aks get-credentials comando .

az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Convalidare la configurazione

Verificare che WireGuard sia attivato correttamente usando il CLI cilium-dbg

Annotazioni

L'abilitazione completa e la configurazione di WireGuard in tutti i nodi dopo l'attivazione potrebbero richiedere alcuni minuti.

  1. Eseguire una shell bash in uno dei pod Cilium
kubectl -n kube-system exec -ti ds/cilium -- bash
  1. Verificare che WireGuard sia abilitato
cilium-dbg encrypt status

Output previsto:

Encryption: Wireguard
Interface: cilium_wg0
        Public key: jikeOvVATORm/1GD0kZLxKhw1lofdsfdgiXWVyVIR3T0=
        Number of peers: 2

Il numero di peer deve essere uguale al numero di nodi meno uno.

Risoluzione dei problemi

Quando la crittografia WireGuard è abilitata in un cluster del servizio Azure Kubernetes tramite Cilium CNI, è possibile usare lo strumento dell'interfaccia della riga di comando cilium-dbg per esaminare lo stato del tunnel, verificare la connettività peer ed eseguire il debug dei problemi correlati alla crittografia.

Esaminare i nodi WireGuard

È possibile esaminare lo stato e la configurazione del peer in ogni nodo usando:

kubectl exec -n kube-system ds/cilium -- cilium-dbg debuginfo --output json | jq .encryption

Output previsto:

{
  "wireguard": {
    "interfaces": [
      {
        "listen-port": 51871,
        "name": "cilium_wg0",
        "peer-count": 1,
        "peers": [
          {
            "allowed-ips": [
              "10.244.1.31/32",
              "10.244.1.206/32",
              "10.224.0.6/32"
            ],
            "endpoint": "10.224.0.6:51871",
            "last-handshake-time": "2025-04-24T11:13:49.102Z",
            "public-key": "3qwZEQLdK5IcFcdXxtr1m8RkDqznPVWEEirJ88+zDyk=",
            "transfer-rx": 2457024,
            "transfer-tx": 15746568
          }
        ],
        "public-key": "jikeOvVATORm/1GD0kZLxKhw1lofdsfdgiXWVyVIR3T0="
      }
    ],
    "node-encryption": "Disabled"
  }
}

Questo output mostra lo stato corrente della crittografia WireGuard nel nodo.

  • listen-port: porta UDP (51871) in cui questo nodo è in ascolto del traffico crittografato dai peer.
  • peer-count: numero di peer WireGuard remoti configurati per questo nodo.
  • peers:
    • allowed-ips: elenco di indirizzi IP dei pod instradati attraverso il tunnel crittografato verso questo peer.
    • endpoint: indirizzo IP e porta dell'interfaccia WireGuard del peer remoto.
    • last-handshake-time: timestamp dello scambio di chiavi riuscito più recente con questo peer.
    • public-key: chiave pubblica del peer remoto.
    • transfer-rx/transfer-tx: numero totale di byte ricevuti/trasmessi nel tunnel.
  • public-key: chiave pubblica dell'interfaccia WireGuard locale.
  • node-encryption: crittografa il traffico proveniente dal nodo stesso o dai pod di rete host. Attualmente, viene crittografato solo il traffico dei pod. La crittografia dei nodi non è ancora supportata e rimane disabilitata per impostazione predefinita.

Disabilitazione di WireGuard in un cluster esistente

WireGuard può essere disabilitato in modo indipendente senza influire su altre funzionalità di Servizi di rete dei contenitori avanzati. Per disabilitarla, impostare il flag --acns-transit-encryption-type=none.

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns \
    --acns-transit-encryption-type none

Problemi noti

  • I pacchetti potrebbero essere eliminati durante la configurazione del dispositivo WireGuard, portando a problemi di connettività. Questo problema si verifica quando gli endpoint vengono aggiunti o rimossi o quando si verificano gli aggiornamenti del nodo. In alcuni casi, questo problema potrebbe causare chiamate non riuscite a sendmsg e sendto. Per altre informazioni, vedere GitHub problema 33159.