Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:HTTP üst bilgisinden gerçek istemci IP adresini alma

Son Güncelleme:Oct 07, 2026

Alibaba Cloud Service Mesh (ASM) giriş ağ geçidinizin güvenliğini sağlamak için gerçek istemci IP adresini elde etmeniz gerekir. Bu sayede, erişimi denetlemek amacıyla bir IP engelleme listesi veya IP izin listesi kullanan bir yetkilendirme ilkesi oluşturabilirsiniz. Bu konuda, giriş ağ geçidinizin bir HTTP istek üst bilgisinden gerçek istemci IP adresini alacak şekilde nasıl yapılandırılacağı açıklanmaktadır.

Önkoşullar

Arka plan

Uygulamalar genellikle isteklerdeki istemci özelliklerini (X-Forwarded-For üst bilgisi gibi) iletmek için bir ters proxy'ye güvenir. Ancak Istio çeşitli ağ topolojilerinde dağıtılabildiğinden giriş ağ geçidine Classic Load Balancer (CLB) genel IP adresi kullanılarak doğrudan, bir Web Application Firewall (WAF) üzerinden veya başka belirtilmemiş dağıtım topolojileriyle erişilebilir. Bu farklı dağıtım mimarilerini desteklemek için Service Mesh ASM, istemci özelliklerini hedef iş yüküne doğru şekilde iletmek üzere sabit bir varsayılan değer sağlayamaz. Sonuç olarak, gerçek istemci IP adresini X-Forwarded-For üst bilgisinden doğrudan alamazsınız.

Bu sorunu çözmek için ASM ağ geçidindeki numTrustedProxies parametresini, ağ geçidi proxy'sinin önünde konuşlandırılan güvenilir proxy sayısına ayarlayın. Bu yapılandırma, giriş ağ geçidinin X-Envoy-External-Address üst bilgisine doldurduğu değeri kontrol eder; böylece yukarı akış hizmetleri bu değeri kullanarak istemcinin orijinal IP adresine erişebilir.

Yordam

  1. Örnek bir uygulama dağıtın.

    1. kubectl kullanarak kümeye bağlanın. Daha fazla bilgi için bkz. Kümenin kubeconfig dosyasını alma ve kubectl ile kümeye bağlanma.

    2. httpbin uygulamasını dağıtın.

      1. Aşağıdaki içeriğe sahip bir httpbin.yaml dosyası oluşturun.

        httpbin.yaml

        # httpbin service
        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: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/httpbin:0.1.0
                imagePullPolicy: IfNotPresent
                name: httpbin
                ports:
                - containerPort: 80
                                                
      2. httpbin uygulamasını dağıtmak için aşağıdaki komutu çalıştırın.

        kubectl apply -f httpbin.yaml
  2. Bir ASM ağ geçidi oluşturun.

    1. ASM konsoluna giriş yapın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneğini belirleyin.

    2. Mesh Management sayfasında ASM örneğinin adını tıklayın. Sol gezinme bölmesinde ASM Gateways > Ingress Gateway seçeneğini belirleyin.

    3. Ingress Gateway sayfasında Create seçeneğini tıklayın ve temel ağ geçidi ayarlarını yapılandırın.

      CLB instance type değerini Internet Access olarak ayarlayın. Diğer parametreleri ihtiyacınıza göre yapılandırın. Parametreler hakkında daha fazla bilgi için bkz. Giriş ağ geçidi hizmeti oluşturma.

    4. Advanced Options seçeneğini tıklayın, External Traffic Policy değerini Local olarak ayarlayın ve ardından Create seçeneğini tıklayın.

  3. Bir Gateway ve bir VirtualService oluşturun.

    1. Denetim düzlemindeki Istio kaynaklarını yönetmek için kubectl kullanın. Daha fazla bilgi için bkz. Istio kaynaklarına erişmek için denetim düzleminde kubectl kullanma.

    2. Bir Gateway kaynağı oluşturun.

      1. Aşağıdaki içeriği kullanarak httpbin-gateway.yaml dosyasını oluşturun.

        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. Gateway kaynağını oluşturmak için aşağıdaki komutu çalıştırın.

        kubectl apply -f httpbin-gateway.yaml
    3. Bir VirtualService kaynağı oluşturun.

      1. Aşağıdaki içeriği kullanarak httpbin-virtualservice.yaml dosyasını oluşturun.

        apiVersion: networking.istio.io/v1alpha3
        kind: VirtualService
        metadata:
          name: httpbin
        spec:
          hosts:
          - "*"
          gateways:
          - httpbin-gateway
          http:
          - route:
            - destination:
                host: httpbin
                port:
                  number: 8000
      2. VirtualService kaynağını oluşturmak için aşağıdaki komutu çalıştırın.

        kubectl apply -f httpbin-virtualservice.yaml
  4. httpbin uygulaması için 80 bağlantı noktasındaki giriş ağ geçidinin IP adresini alın. Daha fazla bilgi için bkz. Giriş ağ geçidi hizmeti oluşturma.

  5. Web Application Firewall içinde, Adım 4 içinde aldığınız giriş ağ geçidi adresini ekleyin. Daha fazla bilgi için bkz. WAF öğreticisi.

  6. ASM ağ geçidine numTrustedProxies parametresini ekleyin.

    1. ASM konsoluna giriş yapın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneğini belirleyin.

    2. Mesh Management sayfasında ASM örneğinin adını tıklayın. Sol gezinme bölmesinde ASM Gateways > Ingress Gateway seçeneğini belirleyin.

    3. Ingress Gateway sayfasında hedef ağ geçidini bulun ve View YAML seçeneğini tıklayın.

    4. Edit iletişim kutusunda, spec parametresinin altına aşağıdaki içeriği ekleyin ve ardından OK seçeneğini tıklayın.

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

      numTrustedProxies değerini, mevcut topolojinize göre ağ geçidi proxy'sinin önünde konuşlandırılan güvenilir proxy sayısına ayarlayın. numTrustedProxies değerini sıfırdan büyük bir N değerine ayarlarsanız güvenilir istemci adresi, X-Forwarded-For üst bilgisindeki sağdan itibaren (N+1). adres olur.

  7. httpbin uygulamasına erişmek ve gerçek istemci IP adresini almak için aşağıdaki komutu çalıştırın.

    curl http://{IP address of the ingress gateway}/get?show_env=true

    Beklenen çıktı:

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

    X-Envoy-External-Address değeri gerçek istemci IP adresidir.