全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Membatasi alamat IP tertentu dari mengakses aplikasi dalam instance ASM

更新时间:Jun 28, 2025

Topik ini menjelaskan cara membatasi akses dari alamat IP tertentu ke aplikasi dalam instance Service Mesh (ASM).

Prasyarat

Catatan penggunaan

Dalam contoh ini, bidang externalTrafficPolicy gateway disetel ke Local. Jika bidang externalTrafficPolicy disetel ke Cluster, alamat IP sumber tidak akan dipertahankan.

Skenario 1: Tidak ada proxy lapisan 7 yang diterapkan antara klien yang memulai permintaan untuk mengakses aplikasi dalam instance ASM dan gateway ASM

Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

curl 47.111.XXX.XX:80/ -I

Kembangkan untuk Melihat Log Gateway

{
    "authority_for": "47.111.XXX.XX",
    "bytes_received": "0",
    "bytes_sent": "0",
    "downstream_local_address": "10.0.70.17:80",
    "downstream_remote_address": "106.XX.XX.1:58656",
    "duration": "2",
    "istio_policy_status": "-",
    "method": "HEAD",
    "path": "/",
    "protocol": "HTTP/1.1",
    "request_id": "b1aa0770-4f64-4798-894a-4a04a0ba****",
    "requested_server_name": "-",
    "response_code": "200",
    "response_flags": "-",
    "route_name": "httpbin",
    "start_time": "2023-08-31T06:42:47.380Z",
    "trace_id": "-",
    "upstream_cluster": "outbound|8000||httpbin.default.svc.cluster.local",
    "upstream_host": "10.0.70.85:80",
    "upstream_local_address": "10.0.70.17:56110",
    "upstream_response_time": "2",
    "upstream_service_time": "2",
    "upstream_transport_failure_reason": "-",
    "user_agent": "curl/7.88.1",
    "x_forwarded_for": "106.11.XX.X"
}

Alamat IP sebenarnya dari klien adalah 106.11.XX.X. Nilai dari bidang downstream_remote_address dan x_forwarded_for dalam log gateway benar. Dalam hal ini, konfigurasi ipBlocks dan remoteIpBlocks pada gateway dapat berfungsi.

Kembangkan untuk Melihat Log Akses Proxy Sidecar

{
    "authority_for": "47.111.XXX.XX",
    "bytes_received": "0",
    "bytes_sent": "0",
    "downstream_local_address": "10.0.70.91:80",
    "downstream_remote_address": "106.11.XX.X:0",
    "duration": "1",
    "istio_policy_status": "-",
    "method": "HEAD",
    "path": "/",
    "protocol": "HTTP/1.1",
    "request_id": "20c94846-3e12-458a-b7d5-88ac867f****",
    "requested_server_name": "outbound_.8000_._.httpbin.default.svc.cluster.local",
    "response_code": "200",
    "response_flags": "-",
    "route_name": "default",
    "start_time": "2023-08-31T10:06:33.809Z",
    "trace_id": "-",
    "upstream_cluster": "inbound|80||",
    "upstream_host": "10.0.70.91:80",
    "upstream_local_address": "127.0.X.X:43247",
    "upstream_response_time": "1",
    "upstream_service_time": "1",
    "upstream_transport_failure_reason": "-",
    "user_agent": "curl/7.88.1",
    "x_forwarded_for": "106.11.XX.X"
}

Nilai dari bidang x_forwarded_for dalam log akses proxy sidecar adalah alamat IP sebenarnya dari klien. Nilai dari bidang downstream_remote_address juga merupakan alamat IP sebenarnya dari klien, tetapi informasi port hilang dan ditampilkan sebagai 0.

Contoh 1: Konfigurasikan daftar hitam atau putih pada gateway

Uji ipBlocks

  1. Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml.

    Anda dapat menggunakan kebijakan keamanan ASM atau daftar hitam/putih gateway untuk menyederhanakan konfigurasi.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: gateway-test
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                ipBlocks:
                  - 106.11.XX.X
      selector:
        matchLabels:
          istio: ingressgateway
  2. Jalankan perintah berikut untuk menerapkan kebijakan otorisasi:

    kubectl apply -f gateway-test.yaml
  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.175.XX:XX/ -I

    Output yang Diharapkan:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Thu, 31 Aug 2023 06:56:00 GMT
    server: istio-envoy

Uji remoteIpBlocks

  1. Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml.

    Anda dapat menggunakan kebijakan keamanan ASM atau daftar hitam/putih gateway untuk menyederhanakan konfigurasi.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: gateway-test
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                remoteIpBlocks:
                  - 106.11.XX.X
      selector:
        matchLabels:
          istio: ingressgateway
    
  2. Jalankan perintah berikut untuk menerapkan kebijakan otorisasi:

    kubectl apply -f gateway-test.yaml
  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.175.XX:XX/ -I

    Output yang Diharapkan:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Thu, 31 Aug 2023 09:59:02 GMT
    server: istio-envoy

Contoh 2: Konfigurasikan daftar hitam atau putih pada proxy sidecar

Uji ipBlocks

  1. Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: gateway-test
      namespace: default
    spec:
      action: DENY
      rules:
        - from:
            - source:
                ipBlocks:
                  - 106.11.XX.X
      selector:
        matchLabels:
          app: httpbin
  2. Jalankan perintah berikut untuk menerapkan kebijakan otorisasi:

    kubectl apply -f gateway-test.yaml
  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.175.XX:XX/ -I

    Output yang Diharapkan:

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Thu, 31 Aug 2023 10:14:01 GMT
    content-type: text/html; charset=utf-8
    content-length: 9593
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 2

    Nilai dari bidang downstream_remote_address dalam log akses proxy sidecar adalah alamat IP klien, yang tidak diblokir.

    Nilai dari downstream_remote_address tidak selalu menjadi alamat IP yang ditentukan dalam bidang ipBlocks. Bidang ipBlocks menentukan alamat IP klien yang tidak diizinkan untuk secara langsung membentuk koneksi TCP dengan proxy saat ini. Dalam hal ini, alamat IP sumber sebenarnya dari koneksi TCP adalah alamat IP pod dari gateway. downstream_remote_address adalah bidang fleksibel dan nilainya tidak selalu menjadi alamat IP fisik dari koneksi downstream.

    Bidang downstream_remote_address menunjukkan alamat remote dari koneksi downstream. Jika alamat tersebut adalah alamat IP, maka ia mencakup alamat IP dan port. Alamat tersebut mungkin bukan alamat fisik sebenarnya dari ujung remote. Alamat tersebut mungkin disimpulkan dari filter Proxy Protocol atau header permintaan x_forwarded_for.

    Anda dapat mengganti alamat dalam bidang ipBlocks dengan alamat IP pod dari gateway. Setelah konfigurasi, Anda tidak dapat mengakses aplikasi HTTPBin.

Uji remoteIpBlocks

  1. Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: gateway-test
      namespace: default
    spec:
      action: DENY
      rules:
        - from:
            - source:
                remoteIpBlocks:
                  - 106.11.XX.X
      selector:
        matchLabels:
          app: httpbin
  2. Jalankan perintah berikut untuk menerapkan kebijakan otorisasi:

    kubectl apply -f gateway-test.yaml
  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.XXX.XX:80/ -I

    Output yang Diharapkan:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Thu, 31 Aug 2023 11:06:42 GMT
    server: istio-envoy
    x-envoy-upstream-service-time: 0

    Konfigurasi remoteIpBlocks berfungsi. Dalam hal ini, nilai dari bidang x_forwarded_for sama dengan nilai dari bidang downstream_remote_address.

Skema 2: Sebuah proxy lapisan 7 diterapkan antara klien yang memulai permintaan untuk mengakses aplikasi dalam instance ASM dan gateway ASM

Dalam skenario ini, header permintaan x_forwarded_for dalam permintaan yang diterima oleh gateway ASM harus memiliki nilai default, yang ditambahkan oleh proxy lapisan 7.

Kembangkan untuk Melihat Log Gateway

{
    "authority_for": "47.111.XXX.XX",
    "bytes_received": "0",
    "bytes_sent": "0",
    "downstream_local_address": "10.0.70.17:80",
    "downstream_remote_address": "106.11.XX.X:62232",
    "duration": "4",
    "istio_policy_status": "-",
    "method": "HEAD",
    "path": "/",
    "protocol": "HTTP/1.1",
    "request_id": "4f8ee609-1479-4f75-ba9d-4fa6d646****",
    "requested_server_name": "-",
    "response_code": "200",
    "response_flags": "-",
    "route_name": "httpbin",
    "start_time": "2023-08-31T11:25:11.376Z",
    "trace_id": "-",
    "upstream_cluster": "outbound|8000||httpbin.default.svc.cluster.local",
    "upstream_host": "10.0.70.91:80",
    "upstream_local_address": "10.0.70.17:42646",
    "upstream_response_time": "4",
    "upstream_service_time": "4",
    "upstream_transport_failure_reason": "-",
    "user_agent": "curl/7.88.1",
    "x_forwarded_for": "56.5.X.X, 72.9.X.X, 98.1.X.X,106.11.XX.X"
}

Sebelum permintaan mencapai gateway ASM, nilai dari header permintaan x_forwarded_for harus 56.5.X.X, 72.9.X.X, 98.1.X.X. Alamat IP terakhir 106.11.XX.X ditambahkan oleh gateway ASM. downstream_remote_address menunjukkan alamat IP dari peer end yang langsung terhubung ke gateway. Dalam hal ini, itu adalah alamat IP fisik dan berisi port yang valid.

Kembangkan untuk Melihat Log Proxy Sidecar

{
    "authority_for": "47.111.XXX.XX",
    "bytes_received": "0",
    "bytes_sent": "0",
    "downstream_local_address": "10.0.70.91:80",
    "downstream_remote_address": "106.11.XX.X:0",
    "duration": "1",
    "istio_policy_status": "-",
    "method": "HEAD",
    "path": "/",
    "protocol": "HTTP/1.1",
    "request_id": "4f8ee609-1479-4f75-ba9d-4fa6d646****",
    "requested_server_name": "outbound_.8000_._.httpbin.default.svc.cluster.local",
    "response_code": "200",
    "response_flags": "-",
    "route_name": "default",
    "start_time": "2023-08-31T11:25:11.378Z",
    "trace_id": "-",
    "upstream_cluster": "inbound|80||",
    "upstream_host": "10.0.70.91:80",
    "upstream_local_address": "127.0.X.X:34607",
    "upstream_response_time": "1",
    "upstream_service_time": "1",
    "upstream_transport_failure_reason": "-",
    "user_agent": "curl/7.88.1",
    "x_forwarded_for": "56.5.X.X, 72.9.X.X, 98.1.X.X,106.11.XX.X"
}

Log proxy sidecar menunjukkan bahwa nilai dari header permintaan x_forwarded_for sama dengan gateway. Nilai dari downstream_remote_address bukan alamat fisik sebenarnya. Ini adalah alamat IP terakhir dalam nilai dari header permintaan x_forwarded_for. (Bidang x_forwarded_for hanya berisi alamat IP. Oleh karena itu, port di sini adalah 0.)

Berikut ini tidak menguji bidang ipBlocks (bidang ini menunjukkan alamat IP fisik sebenarnya dari peer end). Hanya bidang remoteIpBlocks yang diuji. Dalam hal ini, Anda perlu memperlakukan bidang x_forwarded_for sebagai array. Ini menolak alamat IP untuk mengakses gateway ASM. Alamat IP terakhir dalam x_forwarded_for dalam log sebelumnya tidak diizinkan untuk mengakses gateway ASM.

Contoh 1: Atur remoteIpBlocks ke alamat IP terakhir dalam bidang x_forwarded_for

  1. Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                remoteIpBlocks:
                  - 106.11.XX.X
      selector:
        matchLabels:
          istio: ingressgateway
  2. Jalankan perintah berikut untuk menerapkan kebijakan otorisasi:

    kubectl apply -f gateway-test.yaml
  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.175.XX:XX/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I

    Output yang Diharapkan:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Thu, 31 Aug 2023 11:50:36 GMT
    server: istio-envoy

    Output menunjukkan bahwa alamat IP terakhir dalam bidang x_forwarded_for tidak diizinkan untuk mengakses gateway ASM.

Contoh 2: Atur bidang numTrustedProxies dari gateway masuk ke 2

  1. Tambahkan konfigurasi berikut ke bidang spec dalam file YAML gateway masuk. Untuk informasi lebih lanjut tentang cara mengedit file YAML gateway masuk, lihat Kelola Gateway Masuk di Konsol ASM.

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

    Konfigurasi ini menyebabkan gateway restart.

  2. Setelah gateway direstart, jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I

    Output yang Diharapkan:

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Thu, 31 Aug 2023 12:10:15 GMT
    content-type: text/html; charset=utf-8
    content-length: 9593
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 2

    Output menunjukkan bahwa akses berhasil dan nilai dari bidang numTrustedProxies memengaruhi hasil penilaian dari bidang remoteIpBlocks.

    Ketika numTrustedProxies disetel ke 2, gateway ASM menganggap dua proxy terdekat dengan dirinya sendiri sebagai tepercaya dan proxy ketiga terdekat sebagai tidak tepercaya. Oleh karena itu, bidang remoteIpBlocks menolak alamat IP dari proxy ketiga terdekat untuk mengakses gateway. Jika numTrustedProxies tidak disetel, nilai defaultnya adalah 0.

Contoh 3: Gunakan kebijakan otorisasi untuk menolak akses dari alamat IP ketiga terakhir dalam bidang x_forwarded_for log gateway

  1. Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                remoteIpBlocks:
                  - 72.9.X.X
      selector:
        matchLabels:
          istio: ingressgateway
  2. Jalankan perintah berikut untuk menerapkan kebijakan otorisasi:

    kubectl apply -f gateway-test.yaml
  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I

    Output yang Diharapkan:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Thu, 31 Aug 2023 12:38:09 GMT
    server: istio-envoy

    Output menunjukkan bahwa akses dari alamat IP ketiga terakhir yang ditentukan dalam bidang x_forwarded_for ditolak.

Contoh 4: Ubah ruang lingkup efektif dari kebijakan otorisasi sebelumnya ke aplikasi HTTPBin

  1. Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: gateway-test
      namespace: default
    spec:
      action: DENY
      rules:
        - from:
            - source:
                remoteIpBlocks:
                  - 72.9.X.X
      selector:
        matchLabels:
          app: httpbin
  2. Jalankan perintah berikut untuk menerapkan kebijakan otorisasi:

    kubectl apply -f gateway-test.yaml
  3. Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I

    Output yang Diharapkan:

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Thu, 31 Aug 2023 12:39:36 GMT
    content-type: text/html; charset=utf-8
    content-length: 9593
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 6

    Output menunjukkan bahwa akses berhasil dan kebijakan otorisasi tidak valid. Bidang numTrustedProxies sebelumnya dikonfigurasikan untuk gateway. Nilai default dari numTrustedProxies untuk proxy sidecar masih 0. Proxy sidecar memverifikasi alamat IP terakhir dari header permintaan x_forwarded_for yang diterima. Oleh karena itu, permintaan tidak ditolak.

    Jika Anda mengubah nilai dari remoteIpBlocks dalam kebijakan otorisasi menjadi alamat IP terakhir dari x_forwarded_for dalam log proxy sidecar, akses ditolak.