すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:名前空間から外部ウェブサイトへのアウトバウンドトラフィックの拒否

最終更新日:Aug 25, 2026

Kubernetes の NetworkPolicy は、L3/L4 ネットワーク分離を提供しますが、アプリケーションレベルのアクセスの制御を強制することはできません。Service Mesh (ASM) はゼロトラストモデルを使用します。これにより、コード変更なしで、名前空間内のサービスから外部ウェブサイトへのアウトバウンドトラフィックを動的に許可または拒否する権限付与ポリシーを作成できます。

このウォークスルーでは、demo-frontend 名前空間内のすべてのサービスから www.aliyun.com への HTTP アウトバウンドトラフィックをブロックします。このパターンは、任意の名前空間と外部ホストに適用できます。

前提条件

開始する前に、以下を確認してください。

ステップ 1: テストサービスのデプロイ

テスト用のアウトバウンドトラフィックを生成するために、demo-frontend 名前空間に sleep サービスをデプロイします。

  1. kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルの取得と kubectl を使用したクラスターへの接続」をご参照ください。

  2. 次の YAML を sleep.yaml として保存します。

    sleep.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "3650d"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
  3. マニフェストを適用します。

    kubectl apply -f sleep.yaml -n demo-frontend
  4. サイドカープロキシが注入されていることを確認します。

    1. ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター]をクリックします。

    2. [クラスター] ページで、対象のクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ワークロード] > [ポッド] を選択します。

    3. [名前空間] ドロップダウンリストから [demo-frontend] を選択し、sleep サービスの Pod 名をクリックします。

    4. [コンテナ] タブで、[istio-proxy] という名前のコンテナが存在することを確認します。これは、サイドカープロキシが実行中であることを示しています。

ステップ 2: エグレスゲートウェイの作成

エグレスゲートウェイは、メッシュからのアウトバウンドトラフィックを一元化し、権限付与ポリシーが単一のポイントでアクセスの制御を強制できるようにします。egressgateway という名前のエグレスゲートウェイを作成します。詳細な手順については、「エグレスゲートウェイの作成」をご参照ください。

ステップ 3: アウトバウンドトラフィックの制限と外部ホストの登録

デフォルトでは、ASM インスタンス内のサービスは、任意の外部エンドポイントにアクセスできます。サービスエントリとして登録されていないホストへのアクセスをブロックするには、メッシュレベルのアウトバウンドトラフィックポリシーを REGISTRY_ONLY に切り替えます。

アウトバウンドトラフィックポリシーの設定

  1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[データプレーンコンポーネント管理] > [サイドカープロキシ設定] を選択します。

  3. [グローバル] タブで、[送信トラフィックポリシー] を [REGISTRY_ONLY] に設定し、[設定の更新] をクリックします。

www.aliyun.com をサービスエントリとして登録

  1. ASM インスタンスの詳細ページの左側のナビゲーションウィンドウで、[クラスターとワークロード管理] > [外部サービス (ServiceEntry)] を選択します。

  2. 「[YAML から作成]」をクリックします。[名前空間] のドロップダウンリストから [istio-system] を選択し、以下の YAML を貼り付けます:

    apiVersion: networking.istio.io/v1beta1
    kind: ServiceEntry
    metadata:
      name: aliyuncom-ext
      namespace: istio-system
    spec:
      hosts:
        - www.aliyun.com
      location: MESH_EXTERNAL
      ports:
        - name: http
          number: 80
          protocol: HTTP
        - name: tls
          number: 443
          protocol: TLS
      resolution: DNS
  3. [作成] をクリックします。

ステップ 4: ゲートウェイ経由のアウトバウンドトラフィックのルーティング

demo-frontend 名前空間からエグレスゲートウェイ経由で www.aliyun.com へのトラフィックをルーティングするために、3 つの Istio リソースを作成します。Gateway と DestinationRule は、サイドカープロキシとエグレスゲートウェイ間の相互 TLS (mTLS) を強制します。

Istio ゲートウェイ

istio-system 名前空間に次のゲートウェイを作成します。詳細については、「Istio ゲートウェイの管理」をご参照ください。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: istio-egressgateway
  namespace: istio-system
spec:
  selector:
    istio: egressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTPS
      tls:
        mode: ISTIO_MUTUAL     # すべてのアウトバウンドトラフィックに mTLS が必要
      hosts:
        - '*'

mode を ISTIO_MUTUAL に設定すると、サービスは外部ホストに到達する前にメッシュ管理の mTLS 認証に合格する必要があります。

宛先ルール

demo-frontend 名前空間に次の宛先ルールを作成します。詳細については、「宛先ルールの管理」をご参照ください。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: target-egress-gateway
  namespace: demo-frontend
spec:
  host: istio-egressgateway.istio-system.svc.cluster.local
  subsets:
    - name: target-egress-gateway-mTLS
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        tls:
          mode: ISTIO_MUTUAL   # エグレスゲートウェイへの mTLS

仮想サービス

demo-frontend 名前空間に次の仮想サービスを作成します。詳細については、「仮想サービスの管理」をご参照ください。

仮想サービス YAML

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: example-com-through-egress-gateway
  namespace: demo-frontend
spec:
  exportTo:
    - istio-system
    - demo-frontend
  gateways:
    - mesh
    - istio-system/istio-egressgateway
  hosts:
    - www.aliyun.com
  http:
    - match:
        - gateways:
            - mesh              # サイドカープロキシからのトラフィックに一致
          port: 80
      route:
        - destination:
            host: istio-egressgateway.istio-system.svc.cluster.local
            port:
              number: 80
            subset: target-egress-gateway-mTLS
          weight: 100
    - match:
        - gateways:
            - istio-system/istio-egressgateway   # エグレスゲートウェイでのトラフィックに一致
          port: 80
      route:
        - destination:
            host: www.aliyun.com
            port:
              number: 80
          weight: 100

http セクションでは、2 つのルーティングルールを定義します。

ルールゲートウェイの一致動作
サイドカーからゲートウェイmeshdemo-frontend 内の Pod からエグレスゲートウェイへのトラフィックを転送します
ゲートウェイから外部istio-system/istio-egressgatewayエグレスゲートウェイから www.aliyun.com

ステップ 5: DENY 権限付与ポリシーの作成

demo-frontend 名前空間から発信されるすべてのトラフィックを拒否するようにエグレスゲートウェイに指示する権限付与ポリシーを作成します。

  1. 「ASM コンソール」にログインします。左側のナビゲーションウィンドウで、Service Mesh > メッシュ管理 を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[メッシュセキュリティセンター] > [承認ポリシー] を選択します。[作成] をクリックします。

  3. 次のパラメーターを設定します。

    パラメーター値
    名前ポリシーのわかりやすい名前
    ポリシータイプDENY
    ASM Gateway ([ゲートウェイスコープ] タブで)egressgateway
    リクエストマッチングルール「リクエストソースの追加」で、「名前空間」を有効にし、値を demo-frontend
  4. [作成] をクリックします。

ステップ 6: ポリシーの検証

demo-frontend 名前空間内のサービスが www.aliyun.com に到達できなくなったことを確認します。

  1. 「ACK コンソール」にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [ポッド] を選択します。

  3. 「demo-frontend」を[名前空間]ドロップダウンリストから選択します。sleep Pod を見つけ、[操作] 列の [ターミナル] > [sleep] をクリックします。

  4. 次のコマンドを実行します。

    curl -I http://www.aliyun.com

    期待される出力:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Thu, 12 Oct 2023 07:14:09 GMT
    server: envoy
    x-envoy-upstream-service-time: 4

    403 Forbidden 応答は、権限付与ポリシーが demo-frontend 名前空間から www.aliyun.com へのアウトバウンドトラフィックをブロックしていることを確認します。server: envoy ヘッダーは、Envoy ベースのエグレスゲートウェイがリクエストを傍受したことを示しており、外部ホストではありません。

関連ドキュメント