Advanced Container Networking Services を使用して WireGuard 暗号化をデプロイする

この記事では、高度なコンテナー ネットワーク サービスを使用して WireGuard 暗号化を Azure Kubernetes Service (AKS) クラスターにデプロイする方法について説明します。

[前提条件]

  • アクティブなサブスクリプションを持つAzure アカウント。 アカウントをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Get started with Azure Cloud Shell」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLIinstallします。 Windowsまたは macOS で実行している場合は、Docker コンテナーでAzure CLIを実行することを検討してください。 詳細については、「 Docker コンテナーでAzure CLIを実行する方法を参照してください。

    • ローカル インストールを使用している場合は、az login コマンドを使用してAzure CLIにサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI を使用して Azure に認証するを参照してください。

    • メッセージが表示されたら、最初に使用するときにAzure CLI拡張機能をインストールします。 拡張機能の詳細については、「Azure CLIを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事の手順に必要なAzure CLIの最小バージョンは 2.71.0 です。 バージョンを見つけるには、 az --versionを実行します。 インストールまたはアップグレードする必要がある場合は、「Install Azure CLIを参照してください。

  • WireGuard 暗号化は、Cilium を搭載した Azure CNI でのみサポートされます。 他のネットワーク プラグインを使用している場合、WireGuard 暗号化はサポートされていません。 「 Cilium を使用した CNI Azure構成を参照してください。

  • WireGuard は、各 AKS ノードで公開される UDP ポート 51871 経由で暗号化されたトンネルを確立します。 特に環境でファイアウォールが使用されている場合は、すべてのノード IP 間で UDP ポート 51871 が許可されていることを確認します。

高度なコンテナー ネットワーク サービスと WireGuard を有効にする

これ以降の作業では、アドバンスト コンテナー ネットワークサービスが有効になっている AKS クラスターが必要となります。

az aks create コマンドにアドバンスト コンテナー ネットワークサービスのフラグ --enable-acns を指定すると、アドバンスト コンテナー ネットワークサービスのすべての機能を備えた新しい AKS クラスターが作成されます。 これらの機能には以下が含まれます。

  • コンテナー ネットワークの監視: トラフィックに関する分析情報を提供します。 詳細については、コンテナー ネットワークの監視に関するページを参照してください。

  • Container Network Security: 完全修飾ドメイン名 (FQDN) フィルター処理などのセキュリティ機能を提供します。 詳細については、コンテナー ネットワークのセキュリティに関するページを参照してください。

Cilium データ プレーンを備えたクラスターでは、Kubernetes バージョン 1.29 から、コンテナー ネットワークの監視とコンテナー ネットワークのセキュリティがサポートされます。 高度なコンテナー ネットワーク サービスを有効にした後でも、WireGuard は既定で無効になっています。 WireGuard を有効にするには、フラグ --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

既存のクラスターで Advanced Container Networking Services と WireGuard を有効にする

advanced Container Networking Services フラグを使用した az aks update コマンド --enable-acnsコンテナー ネットワーク監視機能コンテナー ネットワーク セキュリティ 機能を含むすべての Advanced Container Networking Services 機能を使用して、既存の AKS クラスターを更新します。

Important

既存のクラスターで WireGuard を有効にすると、すべてのノードにわたって Cilium エージェントのロールアウト再起動がトリガーされます。 大規模なクラスターの場合、このプロセスには時間がかかる場合があり、ワークロードに一時的に影響を与える可能性があります。 中断を最小限に抑えるために、メンテナンス期間中またはトラフィックの少ない期間中に更新プログラムを計画することをお勧めします

アドバンスト コンテナー ネットワークサービスのコンテナー ネットワークのセキュリティ機能をサポートしているのは、Cilium データ プレーンを備えたクラスターだけです。

高度なコンテナー ネットワーク サービスを有効にした後でも、WireGuard は既定で無効になっています。 WireGuard を有効にするには、フラグ --acns-transit-encryption-type wireguardを使用して暗号化の種類を設定します。

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

クラスターの資格情報を取得する

az aks get-credentials コマンドを使用してクラスターの資格情報を取得します。

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

セットアップを検証する

cilium-dbg cli を使用して WireGuard が正常に有効になっていることを検証する

アクティブ化後、WireGuard が完全に有効になり、すべてのノードで構成されるまでに数分かかる場合があります。

  1. Cilium ポッドのいずれかで bash シェルを実行する
kubectl -n kube-system exec -ti ds/cilium -- bash
  1. WireGuard が有効になっていることを確認する
cilium-dbg encrypt status

予想される出力:

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

ピアの数は、ノードの数から 1 を引いた数に等しい必要があります。

トラブルシューティング

Cilium CNI を使用して AKS クラスターで WireGuard 暗号化が有効になっている場合は、cilium-dbg CLI ツールを使用してトンネルの状態を検査し、ピア接続を確認し、暗号化関連の問題をデバッグできます。

WireGuard 接続先を検査する

次を使用して、各ノードのピアの状態と構成を調べることができます。

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

予想される出力:

{
  "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"
  }
}

この出力は、ノード上の WireGuard 暗号化の現在の状態を示しています。

  • listen-port: このノードがピアからの暗号化されたトラフィックをリッスンしている UDP ポート (51871)。
  • peer-count: このノード用に構成されたリモート WireGuard ピアの数。
  • 仲間:
    • allowed-ips: 暗号化されたトンネル経由でこのピアにルーティングされるポッド IP アドレスの一覧。
    • endpoint: リモート ピアの WireGuard インターフェイスの IP とポート。
    • last-handshake-time: このピアとのキー交換の最新の成功のタイムスタンプ。
    • 公開キー: リモート ピアの公開キー。
    • transfer-rx/transfer-tx: トンネル経由で受信/送信されたバイトの合計数。
  • 公開キー: ローカルの WireGuard インターフェイスの公開キー。
  • node-encryption: ノード自体またはホスト ネットワーク ポッドから送信されるトラフィックを暗号化します。 現時点では、ポッド トラフィックのみが暗号化されています。 ノード暗号化はまだサポートされておらず、既定では無効のままです。

既存のクラスターでの WireGuard の無効化

WireGuard は、他の高度なコンテナー ネットワーク サービス機能に影響を与えることなく、個別に無効にすることができます。 無効にするには、フラグ --acns-transit-encryption-type=noneを設定します。

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

既知の問題

  • WireGuard デバイスの構成時にパケットが破棄され、接続の問題が発生する可能性があります。 この問題は、エンドポイントが追加または削除されたとき、またはノードの更新が発生したときに発生します。 場合によっては、この問題により、 sendmsgsendto の呼び出しが失敗する可能性があります。 詳細については、GitHub問題 33159 を参照してください。