Tüm Ürünler
Search
Belge Merkezi

Elastic Compute Service:Reduce public network exposure with PrivateLink

Son Güncelleme:Sep 30, 2026

VPC'ler arası veya hesaplar arası özel erişim sağlamak amacıyla PrivateLink kullanın ve kaynak VPC'leri ile uç noktaları tanımlayarak ayrıntılı erişim kontrolü uygulamak üzere SLB üzerinde Proxy Protocol v2'yi etkinleştirin.

Güvenlik riskleri

Cloud ortamlarında, kendi kendine oluşturulan veritabanı platformları, yapay zeka çıkarım uygulamaları ve Object Storage Service (OSS) gibi Alibaba Cloud hizmetlerine kolay erişim sağlamak amacıyla genellikle EIP'ler veya genel uç noktalar yapılandırılır. Bu durum, hizmetleri doğrudan İnternet'e açar ve aşağıdaki güvenlik risklerini beraberinde getirir:

  1. Genel ağ saldırısı riski: İnternet'e açık olan herhangi bir hizmet, DDoS saldırıları, güvenlik açığı taramaları ve istismarları ile kaba kuvvet saldırıları için potansiyel bir hedeftir.

  2. Kimlik taklit etme riski: Geleneksel İnternet hizmetleri kullanıcı adı ve parola kimlik doğrulamasına dayanır. Kimlik bilgileri sızdırıldığında saldırganlar, meşru kullanıcıları herhangi bir yerden taklit ederek verilere erişebilir, bunları çalabilir veya değiştirebilir. Genel erişim, isteklerin kaynak ağını kısıtlamaz.

  3. Veri sızdırma kanalı: Kurum içi çalışanlar, OSS gibi Alibaba Cloud hizmetlerinin genel uç noktalarını kullanarak kurumsal verileri kişisel cloud hesapları üzerinden sızdırabilir. Bu trafik İnternet üzerinden aktığından kurumun ağ ilkelerinin uygulanması zorlaşır.

En iyi uygulamalar

Aynı alan içindeki VPC'ler arası erişim için PrivateLink kullanın

image

Açıklama: VPC2'deki bir ECS örneğine bir ağ hizmeti (örneğin bir web hizmeti) dağıtılmıştır. VPC1 ile VPC2 arasındaki bir PrivateLink bağlantısı, hizmetin VPC1'den özel bir IP adresi (uç nokta) üzerinden erişilmesine olanak tanır.

: Uç nokta (hizmet tüketici) ve uç nokta hizmeti (hizmet sağlayıcı) aynı alanda bulunmalıdır. Uç nokta alanları, uç nokta hizmeti alanlarının bir alt kümesi olmalıdır. Örneğin, bir uç nokta hizmeti Alan A ve Alan B'de dağıtılmışsa uç nokta yalnızca Alan A veya Alan B'de oluşturulabilir.

Temel adımlar:

  1. Sunucu tarafı (hizmet sağlayıcı) yapılandırması

    1. Yük dengeleyici oluşturun: VPC2'de, özel yönlendirmeli CLB veya NLB gibi PrivateLink'i destekleyen bir SLB örneği oluşturun. Bir arka uç sunucu grubu ve dinleyici yapılandırın.

    2. Uç nokta hizmeti oluşturun: PrivateLink konsolunda bir uç nokta hizmeti oluşturun ve bunu önceki adımda oluşturduğunuz SLB örneğiyle ilişkilendirin.

    3. Hizmet izin listesini yapılandırın (yalnızca hesaplar arası erişim için): VPC1 farklı bir Alibaba Cloud hesabına aitse hesabın UID'sini uç nokta hizmetinin hizmet izin listesine ekleyin.

    4. Bağlantı isteğini kabul edin: İstemci bir bağlantı başlattıktan sonra uç nokta hizmetinin Connections sekmesine gidin ve bekleyen isteği kabul edin. Alternatif olarak, hizmeti bağlantıları otomatik olarak kabul edecek şekilde yapılandırın.

  2. İstemci tarafı (hizmet tüketici) yapılandırması

    1. Uç nokta oluşturun: VPC1'de bir uç nokta oluşturun ve sunucu tarafında oluşturulan uç nokta hizmetini seçin.

    2. Ağı yapılandırın: Uç nokta için VPC1'de bir vSwitch ve bir güvenlik grubu seçerek VPC1'deki hangi kaynakların bu uç noktaya erişebileceğini kontrol edin.

    3. Uç nokta ayrıntılarını alın: Oluşturma işleminden sonra özel bir etki alanı adı ve IP adresi oluşturulur.

    4. Erişimi başlatın: Hizmet sağlayıcı bağlantıyı kabul ettikten sonra VPC1'deki uygulamalar, oluşturulan etki alanı adı veya IP adresi aracılığıyla VPC2'deki hizmete erişebilir.

Erişilebilir VPC'leri ve özel IP adreslerini kontrol etmek için Proxy Protocol kullanın

PrivateLink üzerinden hizmet sağladığınızda sunucu, her isteğin kaynak uç noktasını veya VPC'sini tanımlayabilir ve buna göre güvenlik kuralları uygulayabilir. Örneğin, bir hesabın yalnızca meşru bir VPC'den gelen erişimi kabul etmesini kısıtlayabilirsiniz. Kimlik bilgileri sızdırılsa bile yetkisiz ağlar hizmete erişemez.

Aynı alan içindeki VPC'ler arası erişim için PrivateLink kullanın bölümünde açıklanan adımlara ek olarak, sunucu tarafı uygulamanın kaynak VPC'yi tanımlamasını ve erişim kontrolü uygulamasını sağlayabilirsiniz.

  1. Proxy Protocol v2'yi etkinleştirin: NLB dinleyicisinde Proxy Protocol v2'yi etkinleştirin ve VPC ID ile endpoint ID aboneliklerini yapılandırın.

    # Use the Cloud Assistant CLI to enable Proxy Protocol v2 for a specified listener and subscribe to the VPC ID and endpoint ID.
    aliyun nlb UpdateListenerAttribute \
         --ListenerId lsn-xxxxxxxxxxxxxxxx \
         --ProxyProtocolEnabled true \
         --ProxyProtocolV2Config '{"Ppv2VpcIdEnabled":true,"Ppv2PrivateLinkEpIdEnabled":true}' \
         --RegionId cn-hangzhou

    --ListenerId: Web hizmeti için oluşturulan dinleyici kimliği.

    --ProxyProtocolEnabled: Proxy Protocol'u etkinleştirmek için true olarak ayarlayın. Bu protokol, TCP el sıkışmasından sonraki ilk pakette istemci bağlantı bilgilerini iletir. Arka uç hizmetinin bu protokolü desteklemesi gerekir. Ayrıntılar için 2. Adımı inceleyin. Aksi takdirde hizmet kesintiye uğrar.

    --ProxyProtocolV2Config: Alibaba Cloud tarafından tanımlanan Type-Length-Value (TLV) alanlarını ekler. Bu örnek, kaynak VPC ID ve PrivateLink uç nokta ID aboneliklerini yapılandırır.

    17 7.005726    10.0.0.186    10.0.0.184    TCP    74 3059 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=128
    18 7.005753    10.0.0.184    10.0.0.186    TCP    62 80 → 3059 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460 WS=128
    19 7.006781    10.0.0.186    10.0.0.184    TCP    54 3059 → 80 [ACK] Seq=1 Ack=1 Win=64256 Len=0
    20 7.006804    10.0.0.186    10.0.0.184    HTTP    154 Continuation
    21 7.006814    10.0.0.184    10.0.0.186    TCP    54 80 → 3059 [ACK] Seq=1 Ack=101 Win=64256 Len=0
    22 7.006805    10.0.0.186    10.0.0.184    HTTP    210 GET /login HTTP/1.1
    23 7.006821    10.0.0.184    10.0.0.186    TCP    54 80 → 3059 [ACK] Seq=1 Ack=257 Win=64128 Len=0

    Aşağıdaki tabloda TLV'nin nasıl ayrıştırılacağı açıklanmaktadır.

    Açıklama/İçerik

    Orijinal içerik

    Protokol başlığı

    Proxy Protocol sabit imzası

    0d0a0d0a000d0a515549540a

    Sürüm 2, PROXY komutu

    21

    TCP/IPv4

    11

    Aşağıdaki veriler 84 bayt uzunluğundadır

    0054

    Adres bilgisi

    Kaynak IP: 10.0.0.14

    0a00000e

    Hedef IP: 10.0.0.15

    0a00000f

    Kaynak bağlantı noktası: 59074

    e6c2

    Hedef bağlantı noktası: 80

    0050

    TLV1

    Type 03

    03

    4 bayt

    0004

    0764b56b

    0764b56b

    TLV2

    Type e1 (özel tür)

    e1

    24 bayt

    0018

    PrivateLink uç nokta ID:

    ep-bp1i288487e586152d4b

    0265702d6270316932383834383765353836313532643462

    TLV3

    Type e1 (özel tür)

    e1

    26 bayt

    001a

    VPC ID:

    vpc-bp179qeke0wzo1mr8bxhl

    017670632d627031373971656b6530777a6f316d72386278686c

    TLV4

    04 (PP2_TYPE_NETNS), ağ ad alanını iletmek için kullanılır

    04

    6 bayt

    0006

    000000000000

    000000000000

  2. Web hizmetiniz Nginx kullanıyorsa Proxy Protocol'u destekleyecek şekilde yapılandırın:

    (NGINX Plus R16 veya sonrası ya da açık kaynaklı Nginx 1.13.11 veya sonrası gerektirir.)

    server {
        listen 80 proxy_protocol;   # Enable Proxy Protocol v1/v2.
        # Other configurations...
    }

    Nginx, 80 numaralı bağlantı noktasında Proxy Protocol TLV'yi otomatik olarak ayrıştırır ancak standart sürüm yalnızca TLV'den IP adresini almaya olanak tanır.

    Alibaba Cloud tarafından özelleştirilen VPC ID'leri ve PrivateLink uç nokta ID'lerini işlemek için bir Lua uzantısı kullanın.

    nginx.conf dosyasındaki aşağıdaki Lua eklentisi TCP bağlantılarını işler, soketten paketleri okur ve TLV arabelleğini ayrıştırır.

    Ayrıştırılan veriler istek bağlamında depolanır. Bir /login isteği yapıldığında kod PrivateLink uç nokta ID'sini doğrular:

    -- Define shared memory before the http block.
    lua_shared_dict tlv_cache 10m;
    
    stream {
      server {
        listen 80;  # Do not enable proxy_protocol. Let the Lua code below handle it.
        preread_by_lua_block {
           -- 1. Try to read the fixed 16-byte protocol header.
           local sock = ngx.req.socket(true)
           local header, err = sock:receive(16)
    
           if not header then
              ngx.log(ngx.ERR, "failed to receive proxy protocol header: ", err)
              return
           end
    
           -- 2. Check the protocol signature (12 bytes).
           if string.sub(header, 1, 12) ~= "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" then
               -- If it is not the Proxy Protocol, put the read data back into the buffer to avoid corrupting the original request.
                sock:setreused(header)
                      return
          end
    
          -- 3. Parse the rest of the protocol header.
          local ver_cmd = string.byte(header, 13) -- Version and command
          local family = string.byte(header, 14) -- Address family and protocol
          local len = string.byte(header, 15) * 256 + string.byte(header, 16) -- Total length of the variable part
          if len == 0 then
             -- No address or TLV information. Return directly.
             return
          end
    
          -- 4. Read the variable-length part (contains address and TLV).
          local variable_part, err = sock:receive(len)
          if not variable_part or #variable_part < len then
             ngx.log(ngx.ERR, "failed to read variable part (address + tlvs): ", err)
             return
          end
    
          -- 5. Determine the length of the address information based on the address family.
          local addr_len = 0
          local protocol = family & 0x0F
          local address_family = family >> 4
    
          if address_family == 1 then -- AF_INET (IPv4)
              addr_len = 12
          elseif address_family == 2 then -- AF_INET6 (IPv6)
              addr_len = 36
          elseif address_family == 3 then -- AF_UNIX
              addr_len = 216
          end
    
          -- 6. Separate the address information and TLV data.
          local address_block = string.sub(variable_part, 1, addr_len) -- You can parse the address information if needed.
          local tlv_string = string.sub(variable_part, addr_len + 1)
    
          -- 7. Parse the TLV data.
          local tlvs = {}
          local pos = 1
          while pos <= #tlv_string do
              -- Make sure there are at least 3 bytes (Type, Length).
              if pos + 2 > #tlv_string then
                  ngx.log(ngx.ERR, "malformed TLV data: not enough bytes for type and length")
                  break
              end
    
              local tlv_type = string.byte(tlv_string, pos)
              local tlv_length = string.byte(tlv_string, pos + 1) * 256 + string.byte(tlv_string, pos + 2)
          
              -- Make sure the length of the value does not exceed the boundary.
              if pos + 2 + tlv_length > #tlv_string then
                  ngx.log(ngx.ERR, "malformed TLV data: length exceeds available data")
                  break
              end
          
              local tlv_value = string.sub(tlv_string, pos + 3, pos + 2 + tlv_length)
                          
              table.insert(tlvs, {
                  type = tlv_type,
                  length = tlv_length,
                  -- Encode the binary value in Base64 for easy storage and viewing.
                  value = ngx.encode_base64(tlv_value) 
               })
               pos = pos + 3 + tlv_length
         end
    
         -- 8. Cache the parsed TLV in shared memory.
         if #tlvs > 0 then
            local cjson = require "cjson"
            local tlv_cache = ngx.shared.tlv_cache
            -- Use the client IP address as the key to store the TLV data.
            local client_ip = ngx.var.remote_addr
            local tlv_json = cjson.encode(tlvs)
            tlv_cache:set(client_ip, tlv_json, 60)  -- Cache for 60 seconds.
            -- Optional: Also store in ngx.ctx for the stream layer to use.
            ngx.ctx.proxy_protocol_tlvs = tlvs
         end
        }
        proxy_pass localhost:8080;   # Pass subsequent HTTP requests to the HTTP server for processing.
      }
    }
    
    http {
        server {
            listen 8080;
    
            # Dedicated location to handle /login requests.
            location /login {
                access_by_lua_block {
                    local cjson = require "cjson"
                    local tlv_cache = ngx.shared.tlv_cache
                    -- Get TLV data from shared memory.
                    local client_ip = ngx.var.remote_addr
                    local tlv_json = tlv_cache:get(client_ip)
                    if not tlv_json then
                       ngx.log(ngx.ERR, "No TLV data found for client: ", client_ip)
                       return ngx.exit(ngx.HTTP_FORBIDDEN)
                    end
                    local tlvs = cjson.decode(tlv_json)
                    -- Extract the value of the second TLV (PrivateLink endpoint ID).
                    local privateLinkEndId = nil
                    if tlvs[2] then
                       privateLinkEndId = tlvs[2].value  -- Base64-encoded value.
                    end
                    -- Define the expected endpoint ID (Base64-encoded).
                    local expected_value = "ZXAtYnAxaTI4ODQ4N2U1ODYxNTJkNGI="  -- Example value. Modify it as needed.
                    -- Verify the endpoint ID.
                    if privateLinkEndId ~= expected_value then
                       ngx.log(ngx.ERR, "Access to /login denied: TLV value mismatch. Expected '", expected_value, "', got '", tostring(privateLinkEndId), "'")
                       return ngx.exit(ngx.HTTP_FORBIDDEN)
                    end
                    -- If the verification is successful, the request continues to be processed.
                }
                proxy_pass http://your_python_backend;
            }
    
            # Handle all other requests.
            location / {
                proxy_pass http://your_python_backend;
            }
        }
    
        # Your Python backend service upstream definition.
        upstream your_python_backend {
            server 127.0.0.1:5000; # Assume your backend program runs on port 5000.
        }
    }

Alibaba Cloud hizmetlerine erişmek için PrivateLink kullanın

Bazı Alibaba Cloud hizmetleri PrivateLink erişimini destekler. Bu sayede yetkili hesaplar için özel ağ erişimi yapılandırabilir ve genel ağ güvenlik risklerinden kaçınabilirsiniz.

Kişisel hesaplar veri sızdırma riski oluşturur. Kurumsal hesapları yalnızca meşru özel ağlardan erişime izin verecek şekilde yapılandırarak kimlik bilgileri ele geçirildiğinde bunun kötüye kullanılmasını önleyin.

Tehdit senaryosu

  1. Bir Alibaba Cloud hizmeti için uç nokta oluşturun: PrivateLink konsolunda, OSS gibi erişmeniz gereken Alibaba Cloud hizmeti için bir ağ geçidi uç noktası oluşturun ve bunu kuruluşunuzun VPC'si ve yönlendirme tablosuyla ilişkilendirin.

  2. Uç nokta erişim ilkesi yapılandırın: Erişimi, kuruluşunuzun Alibaba Cloud hesabına ait olan RAM kimlikleriyle (kullanıcılar veya roller gibi) kısıtlayın. Bu, çalışanların kişisel hesapları gibi diğer hesapların bu özel kanal üzerinden OSS'ye erişmesini engeller.

  3. RAM ilkesi yapılandırın (isteğe bağlı): Daha ayrıntılı kontrol sağlamak için RAM kullanıcıları veya rolleri için ilkeler yapılandırarak OSS'ye erişimin belirtilen bir VPC'den gelmesini zorunlu kılın.

Uyumluluk yetenekleri

Bir VPC'den bir Alibaba Cloud genel IP adresine erişimi kontrol etme

VPC akış günlükleri analiz ederek VPC'nizden PrivateLink ile optimize edilebilecek Alibaba Cloud genel IP adreslerine giden trafiği belirleyin.

Adımlar:

  1. VPC akış günlüklerini etkinleştirin: Temel işinizin bulunduğu VPC için akış günlüklerini etkinleştirin ve günlükleri Simple Log Service (SLS) hizmetine iletin.

  2. Giden trafiği analiz edin: SLS konsolunda VPC akış günlüklerini sorgulayın ve direction = out filtresini uygulayarak giden trafiği filtreleyin.

  3. Filtreleme ve konumlandırma:

    • Yanıt paketlerini filtreleyin: Hedef bağlantı noktaları 1024'ten küçük olan trafiği ve bilinen diğer hizmet yanıt trafiğini filtreleyerek gürültüyü azaltın.

    • Alibaba Cloud genel IP adreslerini belirleyin: ipip.net gibi araçları kullanarak hedef IP adreslerinin (dstaddr) sahipliğini sorgulayın. Alibaba Cloud'a ait genel IP adreslerine odaklanın.

    • Kaynak ECS örneğini konumlandırın: Akış günlüğündeki vm-id alanını kullanarak erişimi başlatan ECS örneğini belirleyin.

Örnek günlük analizi

Hangi örneklerin İnternet üzerinden cloud kaynaklarına eriştiğini belirlemek için bu günlükleri analiz edin.

Bu örnek günlükteki anahtar alanlar:

  • srcaddr: 10.0.1.171 (VPC içindeki özel IP adresi)

  • dstaddr: 47.110.154.20, dstport: 80 (hedef genel IP adresi ve bağlantı noktası)

  • direction: out, action: ACCEPT (giden, izin verildi)

  • protocol: 6 (TCP)

  • vm-id: i-bp1ifnznc1m4tp4krmb1 (erişimi başlatan ECS örneği)

Sonucu doğrulayın:

  • Hedef genel IP adresi OSS veya ECS gibi bir Alibaba Cloud hizmetinin genel uç noktasıysa PrivateLink uç noktasına geçiş yapın.

  • Bir hedef genel IP adresi hesabınız içindeki başka bir VPC'deki bir hizmeti (EIP veya SLB gibi) işaret ediyorsa bu VPC'ler arası iletişim PrivateLink ile optimize edilebilir.