全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Memperoleh alamat IP asal klien dari header permintaan HTTP

更新时间:Jul 02, 2025

Untuk menegakkan kontrol akses berbasis IP pada gateway ingress, Anda perlu memperoleh alamat IP asal klien. Sebagai contoh, Anda dapat membuat kebijakan otorisasi untuk menolak atau mengizinkan permintaan ke gateway ingress dengan mengonfigurasi daftar hitam atau daftar putih alamat IP. Topik ini menjelaskan cara memperoleh alamat IP asal klien dari header permintaan HTTP.

Prasyarat

Informasi latar belakang

Dalam banyak kasus, permintaan yang berisi atribut klien diteruskan ke aplikasi menggunakan reverse proxy. Contohnya, sebuah permintaan berisi Header X-Forwarded-For. Istio mendukung berbagai topologi jaringan. Untuk mengakses alamat IP gateway ingress, Anda dapat menggunakan alamat IP publik dari instance Classic Load Balancer (CLB), menambahkan alamat IP gateway ingress ke Web Application Firewall (WAF), atau menggunakan topologi jaringan lainnya. Dalam hal ini, nilai default tidak dapat digunakan untuk mengidentifikasi alamat IP asal dalam Header X-Forwarded-For jika permintaan yang berisi atribut klien diteruskan ke beban kerja tertentu. Oleh karena itu, Anda tidak dapat memperoleh alamat IP asal klien berdasarkan nilai header permintaan X-Forwarded-For.

Untuk menyelesaikan masalah ini, atur parameter numTrustedProxies ke jumlah proxy tepercaya sebelum gateway ingress. Gateway ingress akan memperoleh alamat IP asal klien berdasarkan nilai parameter numTrustedProxies dan mengatur nilai header X-Envoy-External-Address. Layanan upstream kemudian dapat mengakses alamat IP asal klien melalui nilai header X-Envoy-External-Address.

Prosedur

  1. Sebarkan aplikasi sampel.

    1. Gunakan kubectl untuk terhubung ke cluster Container Service for Kubernetes (ACK). Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Cluster dan Gunakan kubectl untuk Terhubung ke Cluster.

    2. Sebarkan aplikasi HTTPBin.

      1. Buat file httpbin.yaml dengan konten berikut:

        Tampilkan File httpbin.yaml

        # Layanan httpbin
        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: httpbin
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: httpbin
          labels:
            app: httpbin
            service: httpbin
        spec:
          ports:
          - name: http
            port: 8000
            targetPort: 80
          selector:
            app: httpbin
        ---
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: httpbin
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: httpbin
              version: v1
          template:
            metadata:
              labels:
                app: httpbin
                version: v1
            spec:
              serviceAccountName: httpbin
              containers:
              - image: docker.io/kennethreitz/httpbin
                imagePullPolicy: IfNotPresent
                name: httpbin
                ports:
                - containerPort: 80
                                                
      2. Jalankan perintah berikut untuk menerapkan aplikasi HTTPBin:

        kubectl apply -f httpbin.yaml
  2. Buat gateway ingress.

    1. Masuk ke Konsol ASM. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi sisi kiri, pilih ASM Gateways > Ingress Gateway.

    3. Di halaman Ingress Gateway, klik Create. Di halaman Buat, konfigurasikan parameter yang diperlukan untuk gateway ingress.

      Atur CLB Instance Type ke Internet Access. Untuk informasi lebih lanjut tentang parameter, lihat Buat Gateway Ingress.

    4. Klik Advanced Options, atur External Traffic Policy ke Local, lalu klik Create.

  3. Buat gateway Istio dan layanan virtual.

    1. Gunakan kubectl untuk terhubung ke instance ASM sehingga Anda dapat memanggil operasi API untuk mengelola instance tersebut. Untuk informasi lebih lanjut, lihat Gunakan kubectl di Bidang Kontrol untuk Mengakses Sumber Daya Istio.

    2. Buat gateway Istio.

      1. Buat file httpbin-gateway.yaml dengan konten berikut:

        apiVersion: networking.istio.io/v1alpha3
        kind: Gateway
        metadata:
          name: httpbin-gateway
        spec:
          selector:
            istio: ingressgateway
          servers:
          - port:
              number: 80
              name: http
              protocol: HTTP
            hosts:
            - "*"
      2. Jalankan perintah berikut untuk membuat gateway Istio:

        kubectl apply -f httpbin-gateway.yaml
    3. Buat layanan virtual.

      1. Buat file httpbin-virtualservice.yaml dengan konten berikut:

        apiVersion: networking.istio.io/v1alpha3
        kind: VirtualService
        metadata:
          name: httpbin
        spec:
          hosts:
          - "*"
          gateways:
          - httpbin-gateway
          http:
          - route:
            - destination:
                host: httpbin
                port:
                  number: 8000
      2. Jalankan perintah berikut untuk membuat layanan virtual:

        kubectl apply -f httpbin-virtualservice.yaml
  4. Dapatkan alamat IP gateway ingress dengan nomor port 80. Untuk informasi lebih lanjut, lihat Buat Gateway Ingress.

  5. Tambahkan alamat IP gateway ingress yang Anda peroleh di sublangkah 4 ke WAF. Untuk informasi lebih lanjut, lihat Tutorial.

  6. Tambahkan parameter numTrustedProxies ke gateway ingress.

    1. Masuk ke Konsol ASM. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi sisi kiri, pilih ASM Gateways > Ingress Gateway.

    3. Di halaman Ingress Gateway, temukan gateway ingress dan klik YAML.

    4. Di kotak dialog Edit, tambahkan konten berikut ke parameter spec, lalu klik OK.

      podAnnotations:
          proxy.istio.io/config: '{"gatewayTopology" : { "numTrustedProxies": 2 } }'

      Atur parameter numTrustedProxies ke jumlah proxy tepercaya yang diterapkan sebelum gateway ingress sesuai dengan topologi jaringan. Jika Anda mengatur parameter numTrustedProxies ke nilai N yang lebih besar dari nol, alamat IP asal klien tepercaya adalah alamat ke-(N +1) dalam nilai parameter X-Forwarded-For.

  7. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin dan mendapatkan alamat IP asal klien:

    curl http://{Alamat IP gateway ingress}/get?show_env=true

    Keluaran yang Diharapkan:

    {
      "args": {
        "show_env": "true"
      },
      "headers": {
        "Accept": "*/*",
        ....
        "X-Envoy-Attempt-Count": "1",
        "X-Envoy-External-Address": "106.11.**.**",
        ....
      },
      ....
    }

    Nilai parameter X-Envoy-External-Address adalah alamat IP asal klien.