Ao usar o Global Accelerator (GA) para acelerar seus serviços de aplicação, ative a preservação de IP do cliente para obter o endereço IP do cliente de origem. Para listeners da camada 7 (HTTP/HTTPS), o endereço é obtido do campo X-Forwarded-For no cabeçalho da solicitação HTTP. Para listeners da camada 4 (TCP/UDP), a obtenção ocorre automaticamente ou exige que o serviço de backend suporte Proxy Protocol, dependendo do tipo de serviço de backend.
A preservação de IP do cliente tem suporte apenas para listeners de roteamento inteligente. Esse recurso não tem suporte por padrão em listeners de roteamento personalizado. Para ativá-lo em um listener de roteamento personalizado, entre em contato com seu gerente de conta.
Listeners HTTP e HTTPS
Método
Para listeners HTTP e HTTPS, o Global Accelerator (GA) usa o recurso Preserve Client IP para recuperar o IP do cliente de origem. Esse recurso vem ativado por padrão.
O GA armazena o endereço IP do cliente de origem no campo X-Forwarded-For do cabeçalho da solicitação HTTP. Configure o servidor de backend para obter esse endereço IP. O primeiro endereço IP listado no campo corresponde ao IP do cliente de origem.
X-Forwarded-For: <originating client IP, proxy server 1 IP, proxy server 2 IP, ...>
Procedimento
Este procedimento usa como exemplo um servidor Nginx 1.20.1 em execução no Alibaba Cloud Linux 3. As etapas podem variar conforme o ambiente.
-
Execute
nginx -V | grep http_realip_modulepara verificar se o http_realip_module está instalado. O Nginx usa esse módulo para analisar registros X-Forwarded-For.Se a saída incluir
--with-http_realip_module, o módulo já está instalado. Prossiga para a próxima etapa.NotaO http_realip_module está disponível desde o Nginx 1.0.4 (2011). Caso use uma versão anterior, faça backup da configuração e atualize o Nginx.
Se o http_realip_module não estiver instalado, recompile o Nginx com o módulo ou reinstale-o usando um gerenciador de pacotes como yum.
-
Edite o arquivo de configuração do Nginx. Execute
nginx -tpara localizar o caminho do arquivo. O padrão é/etc/nginx/nginx.conf.http { # Make sure that the log_format includes $http_x_forwarded_for. This variable records the value of X-Forwarded-For. log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ... } Execute o comando
sudo nginx -s reloadpara recarregar a configuração do Nginx.-
Obtenha o endereço IP do cliente de origem.
Verifique o log de acesso do Nginx para confirmar se o endereço IP do cliente de origem foi recuperado com sucesso.
Execute o comando
tail -n <number_of_lines> <log_path>. Na entrada de log retornada, verifique o campo correspondente à variável$http_x_forwarded_for. O primeiro endereço IP é o IP do cliente de origem.Neste exemplo, o caminho padrão do arquivo de log do Nginx é
/var/log/nginx/access.log.[root@izxxx ~]# tail -n 1 /var/log/nginx/access.log 172.20xxx - - [17/Oct/2024:17:46:49 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0" "47.243.xxx"NotaPara evitar que logs de verificação de integridade sobrescrevam entradas contendo endereços IP do cliente de origem, visualize várias entradas de log por vez ou aumente temporariamente o intervalo de verificação de integridade.
Listeners TCP
Métodos
Para obter o endereço IP do cliente de origem, ative o recurso Preserve Client IP e selecione um método de obtenção.
Os métodos compatíveis variam conforme o tipo de serviço de backend.
Automático: O GA encaminha o endereço IP do cliente de origem diretamente para o serviço de backend. O endereço IP do cliente recuperado pelo servidor de backend corresponde ao IP do cliente de origem.
-
Proxy Protocol: O servidor de backend deve ter suporte a Proxy Protocol para obter o endereço IP do cliente de origem.
ImportanteO Proxy Protocol requer suporte tanto do servidor proxy quanto do servidor de backend para funcionar corretamente. Se o servidor de backend não conseguir analisar o Proxy Protocol, ativar esse recurso provavelmente causará erros de análise e afetará a disponibilidade do serviço.
Os listeners do GA usam Proxy Protocol para transmitir informações originais de conexão (como IP de origem, IP de destino, porta de origem e porta de destino), prependendo-as ao fluxo de dados TCP. Esse processo não descarta nem sobrescreve nenhum dado existente.
O GA tem suporte apenas a Proxy Protocol v1, compatível somente com o protocolo TCP. Para mais informações, consulte The PROXY protocol.
Serviços de backend da Alibaba Cloud
|
Tipo de serviço de backend |
Suporte à preservação de IP |
Métodos compatíveis |
|
|
Instância ECS |
Compatível A instância ECS deve estar em uma virtual private cloud (VPC) e seu grupo de segurança deve permitir tráfego de todos os endereços IP do cliente de origem. |
|
|
|
Application Load Balancer (ALB) |
Não compatível |
Não aplicável |
|
|
Network Load Balancer (NLB) |
Compatível |
|
|
|
Classic Load Balancer (CLB) |
Compatível O grupo de segurança do servidor de backend da instância CLB deve permitir tráfego de todos os endereços IP do cliente de origem. Os servidores de backend não conseguem obter endereços IP do cliente de origem nos seguintes cenários:
|
|
|
|
Object Storage Service (OSS) |
Não compatível |
Não aplicável |
|
|
Elastic Network Interface (ENI) |
Compatível O grupo de segurança da ENI deve permitir tráfego de todos os endereços IP do cliente de origem. |
|
|
|
Custom private IP |
Compatível |
Proxy Protocol |
|
|
Alibaba Cloud Public IP Aviso
Se um endpoint for um IP público da Alibaba Cloud, desanexar o IP público de sua instância original e anexá-lo a outra pode causar falha na preservação do IP do cliente e interromper o tráfego. Para restaurar esse recurso no endpoint, exclua e recrie o endpoint ou entre em contato com seu gerente de conta. |
Anexado a uma instância ECS do tipo VPC |
Compatível |
|
|
Anexado a uma instância NLB |
Compatível |
|
|
|
Anexado a uma instância ALB |
Não compatível |
Não aplicável |
|
|
Anexado a uma instância CLB privada |
Compatível |
|
|
|
Anexado a uma ENI |
Compatível |
|
|
|
Anexado a um NAT gateway público |
Compatível |
Proxy Protocol |
|
Serviços de backend externos
|
Tipo de serviço de backend |
Suporte à preservação de IP |
Métodos compatíveis |
|
Custom public IP |
Compatível |
Proxy Protocol |
|
Custom Domain Name |
Compatível |
Se um cliente acessar o GA por meio de um endereço IP acelerado IPv6, ou se o GA se comunicar com o serviço de backend via IPv6, será necessário usar Proxy Protocol para obter o endereço IP do cliente de origem.
Procedimento
Este procedimento usa como exemplo um servidor Nginx 1.20.1 em execução no Alibaba Cloud Linux 3. As etapas podem variar conforme o ambiente.
Obtenção automática
-
Ative a preservação de IP do cliente.
Faça login no console do Global Accelerator (GA).
Na página Instances, localize a instância GA desejada e clique em Configure Listener na coluna Actions.
Na aba Listener, localize o listener TCP desejado e clique em Edit Listener na coluna Actions.
Na página Configure Listener & Protocol, clique em Next.
-
Na página Configure Endpoint Group, selecione Maintain na lista suspensa Preserve Client IP e clique em Next.
Se o serviço de backend estiver implantado na Alibaba Cloud, Retrieve Client IP Address estará definido como Automatically Retrieve Client IP por padrão.
Defina Preserve Client IP como Preserve. Se um cliente IPv6 acessar o serviço de backend, selecione Proxy Protocol como Method to Retrieve Originating Client IP.
Na página Configuration Review, confirme a configuração e clique em Submit.
-
Verifique o arquivo de configuração do Nginx.
Execute o comando
nginx -tpara encontrar o caminho do arquivo de configuração. Normalmente, o caminho padrão é/etc/nginx/nginx.conf.NotaPara processar tráfego HTTP ou HTTPS, o servidor Nginx deve ter suporte ao módulo
http{}. Para processar tráfego TCP, ele também deve ter suporte ao módulostream{}.O módulo
stream{}foi adicionado no Nginx 1.9.0 e não vem instalado por padrão. É necessário compilá-lo e instalá-lo para utilizar o módulostream{}.# Process HTTP traffic http { # Default configuration log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # Example: listener on port 80 server { listen 80; #... } } # Process TCP traffic (add if needed) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # Example: listener on port 4000 server { listen 4000; #... } } -
Obtenha o endereço IP do cliente de origem.
-
Método 1: Verifique o log do Nginx para confirmar o endereço IP do cliente de origem.
Execute o comando
tail -n <number_of_lines> <log_path>. Na entrada de log retornada, o primeiro endereço IP, correspondente à variável$remote_addr, é o IP do cliente de origem.-
Para tráfego HTTP:
Neste exemplo, o caminho do arquivo de log é
/var/log/nginx/access.log.[root@xxx ~]# tail -n 1 /var/log/nginx/access.log 47.243.xxx.xxx - [21/Oct/2024:14:01:06 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 xxx" -
Para tráfego TCP:
Neste exemplo, o caminho do arquivo de log é
/var/log/nginx/stream_access.log.[root@iZrxxx xxx]# tail -n 5 /var/log/nginx/stream_access.log 121.40.xxx.xxx [24/Jan/2025:10:29:34 +0800] "TCP" 200 0 16 "3.217" 121.40.xxx.xxx [24/Jan/2025:10:29:44 +0800] "TCP" 200 0 15 "2.935" 121.40.xxx.xxx [24/Jan/2025:10:29:57 +0800] "TCP" 200 0 7 "4.908" 121.40.xxx.xxx [24/Jan/2025:10:30:16 +0800] "TCP" 200 0 26 "10.474" 121.40.xxx.xxx [24/Jan/2025:10:30:25 +0800] "TCP" 200 0 10 "3.368"
-
-
Método 2: Capture pacotes de dados para verificar o endereço IP do cliente de origem.
Execute o comando
tcpdump tcp port [listener_port] -n -X -s 0para verificar nos pacotes de dados o endereço IP do cliente de origem.[root@iZrxxx ~]# tcpdump tcp port 4000 -n -X -s 0 dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 10:31:59.216390 IP 121.40.xxx.xxx.52352 > 172.20.106.148.terabase: Flags [S], seq 3468880686, win 65535, options [nop,nop,nop,nop,nop,nop,nop,nop,mss 1460,sackOK,TS val 1793314199 ecr 0,nop,wscale 9], length 0 0x0000: 4500 0044 801a 4000 4006 36a9 7928 f41f E..D..@.@.6.y(.. 0x0010: ac14 6a94 cc80 0fa0 cec2 eb2e 0000 0000 ..j............. 0x0020: c002 ffff d173 0000 0101 0101 0101 0101 .....s.......... 0x0030: 0204 05b4 0402 080a 6ae3 cd97 0000 0000 ........j....... 0x0040: 0103 0309 .... 10:31:59.216419 IP 172.20.106.148.terabase > 121.40.xxx.xxx.52352: Flags [S.], seq 28697778872, ack 3468880687, win 65160, options [mss 1460,sackOK,TS val 1603313796 ecr 1793314199,nop,wscale 7], length 0 0x0000: 4500 003c 0000 4000 4006 b6cb ac14 6a94 E..<..@.@.....j. 0x0010: 7928 f41f 0fa0 cc80 ab0d 59b8 cec2 eb2f y(........Y..../ 0x0020: a012 fe88 841f 0000 0204 05b4 0402 080a ................ 0x0030: 5f90 a084 6ae3 cd97 0103 0307 _...j.......
-
Proxy Protocol
-
Ative a preservação de IP do cliente.
Faça login no console do Global Accelerator (GA).
Na página Instances, localize a instância GA desejada e clique em Configure Listener na coluna Actions.
Na aba Listener, localize o listener TCP desejado e clique em Edit Listener na coluna Actions.
Na página Configure Listener & Protocol, clique em Next.
-
Na página Configure Endpoint Group, selecione Maintain na lista suspensa Preserve Client IP e clique em Next.
Se o serviço de backend estiver implantado fora da Alibaba Cloud, Retrieve Client IP Address estará definido como Proxy Protocol por padrão.
Na página Configure Endpoint Group, defina Preserve Client IP como Preserve.
Na página Configuration Review, confirme a configuração e clique em Submit.
-
Modifique o arquivo de configuração do Nginx conforme mostrado no exemplo abaixo e salve as alterações.
Execute o comando
nginx -tpara encontrar o caminho do arquivo de configuração. Geralmente, o caminho padrão é/etc/nginx/nginx.conf, mas o caminho real depende do ambiente.NotaPara processar tráfego HTTP ou HTTPS, o servidor Nginx deve ter suporte ao módulo
http{}. Para processar tráfego TCP, ele também deve ter suporte ao módulostream{}.O módulo
stream{}foi adicionado no Nginx 1.9.0 e não vem instalado por padrão. É necessário compilá-lo e instalá-lo para utilizar o módulostream{}.# Process HTTP traffic http { # Add the $proxy_protocol_addr variable to the log format to record the originating client IP. log_format main '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # Enable proxy_protocol parsing on the listener port (port 80 in this example). server { listen 80 proxy_protocol; #... } } # Process TCP traffic (add if needed) stream { # Add the $proxy_protocol_addr variable to the log format to record the originating client IP. log_format main_stream '$proxy_protocol_addr - $remote_addr - $protocol [$time_local] ' '$status $bytes_sent $bytes_received $session_time'; access_log /var/log/nginx/stream_access.log main_stream; # Enable proxy_protocol parsing on the listener port (port 12345 in this example). server { listen 12345 proxy_protocol; #... } } Execute o comando
sudo nginx -s reloadpara recarregar o arquivo de configuração do Nginx.-
Obtenha o endereço IP do cliente de origem.
Verifique o log do Nginx para confirmar o endereço IP do cliente de origem.
Execute o comando
tail -n <number_of_lines> <log_path>. Na entrada de log retornada, o endereço IP correspondente à variável$proxy_protocol_addré o IP do cliente de origem.-
Para tráfego HTTP:
Neste exemplo, o caminho do arquivo de log é
/var/log/nginx/access.log.[root@xxx ~]# tail -n 1 /var/log/nginx/access.log 47.243.xxx - 47.251.xxx - - [21/Oct/2024:16:57:41 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0" -
Para tráfego TCP:
Neste exemplo, o caminho do arquivo de log é
/var/log/nginx/stream_access.log.[root@i-xxx ~]# tail -n 1 /var/log/nginx/stream_access.log 47.243 47.251 - TCP [23/Oct/2024:17:19:44 +0800] 200 0 1 0.000
-
Listeners UDP
Método
Para obter o endereço IP do cliente de origem, ative o recurso Preserve Client IP. Para listeners UDP, esse recurso tem suporte apenas ao método Automatically Retrieve Client IP, no qual o GA encaminha o endereço IP do cliente de origem diretamente para o serviço de backend.
Ao ativar Preserve Client IP para um listener UDP, aplicam-se as seguintes limitações:
-
Somente instâncias GA pay-as-you-go têm suporte.
Se a instância GA pay-as-you-go não tiver suporte à ativação de client IP preservation para listeners UDP, a versão da instância pode não oferecer esse recurso. Para utilizá-lo, entre em contato com seu gerente de conta e solicite uma atualização da instância.
Esse recurso tem suporte apenas quando o Backend Service Type é ECS , ENI ou NLB . Para serviços de backend do tipo NLB, o recurso Preserve Client IP não vem ativado por padrão. Para usá-lo, entre em contato com seu gerente de conta.
Servidores de backend só conseguem obter endereços IP de origem de clientes da mesma versão de IP (IPv4 para IPv4 e IPv6 para IPv6).
Procedimento
Este procedimento usa como exemplo um servidor Nginx 1.20.1 em execução no Alibaba Cloud Linux 3. As etapas podem variar conforme o ambiente.
-
Ative a preservação de IP do cliente.
Faça login no console do Global Accelerator (GA).
Na página Instances, localize a instância GA desejada e clique em Configure Listener na coluna Actions.
Na aba Listener, localize o listener UDP desejado e clique em Edit Listener na coluna Actions.
Na página Configure Listener & Protocol, clique em Next.
-
Na página Configure Endpoint Group, selecione Maintain na lista suspensa Preserve Client IP e clique em Next.
Retrieve Client IP Address está definido como Automatic por padrão.
Na página Configuration Review, confirme a configuração e clique em Submit.
-
Verifique o arquivo de configuração do Nginx.
Execute o comando
nginx -tpara encontrar o caminho do arquivo de configuração. Normalmente, o caminho padrão é/etc/nginx/nginx.conf.NotaPara processar tráfego UDP, o servidor Nginx deve ter suporte ao módulo
stream{}.O módulo
stream{}foi adicionado no Nginx 1.9.0 e não vem instalado por padrão. É necessário compilá-lo e instalá-lo para utilizar o módulostream{}.#... # Process UDP traffic (make sure to include this module) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # Example: UDP listener on port 4000 server { listen 4000 udp; #... } } -
Obtenha o endereço IP do cliente de origem.
-
Método 1: Verifique o log do Nginx para confirmar o endereço IP do cliente de origem.
Execute o comando
tail -n <number_of_lines> <log_path>. Na entrada de log retornada, o primeiro endereço IP, correspondente à variável$remote_addr, é o IP do cliente de origem.Neste exemplo, o caminho do arquivo de log é
/var/log/nginx/stream_access.log.[root@iZ2zxxx ~]# tail -n 5 /var/log/nginx/stream_access.log 47.251.xxx.xxx - [24/Jan/2025:13:37:43 +0800] "UDP" 200 0 12 "600.099" 47.251.xxx.xxx - [24/Jan/2025:13:39:11 +0800] "UDP" 200 0 12 "600.088" 47.251.xxx.xxx - [24/Jan/2025:13:39:28 +0800] "UDP" 200 0 14 "600.012" 47.251.xxx.xxx - [24/Jan/2025:13:39:37 +0800] "UDP" 200 0 14 "600.009" 47.251.xxx.xxx - [24/Jan/2025:13:41:04 +0800] "UDP" 200 0 14 "600.086" -
Método 2: Capture pacotes de dados para verificar o endereço IP do cliente de origem.
Execute o comando
tcpdump udp port [listener_port] -n -X -s 0para verificar nos pacotes de dados o endereço IP do cliente de origem.[root@iz2xxx ~]# tcpdump udp port 4000 -n -X -s 0 dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 14:04:06.047337 IP 47.251.xxx.xxx 55491 > 10.5.120.213.terabase: UDP, length 14 0x0000: 4500 002a 6e1e 4000 4011 a221 2ffb 77ae E..*n.@.@..!/w. 0x0010: 0a05 78d5 d8c3 0fa0 0016 12fb 4865 6c6c ..x.........Hell 0x0020: 6f2c 2055 4450 3032 210a o, UDP02!.
-
FAQ
Solução de problemas na preservação de IP do cliente
Para um listener HTTP ou HTTPS, a preservação do endereço IP do cliente não funciona se o servidor de backend não conseguir registrar ou processar o cabeçalho
X-Forwarded-For.-
Para um listener TCP:
Se o serviço de backend estiver implantado na Alibaba Cloud, a preservação do endereço IP do cliente não funcionará caso a instância de backend, ou a instância associada ao Elastic IP Address (EIP), não esteja em uma VPC.
-
Caso o serviço de backend esteja implantado fora da Alibaba Cloud, o servidor de backend deve ter suporte a Proxy Protocol para obter o endereço IP do cliente. Caso contrário, esse recurso não funcionará.
Quando a preservação do endereço IP do cliente está ativada, o Global Accelerator usa Proxy Protocol para encaminhar o IP do cliente. Se o servidor de backend não tiver suporte a Proxy Protocol, ele não conseguirá analisar corretamente o tráfego acelerado.
Se um cliente IPv6 acessar um serviço de backend IPv4, o servidor de backend deve ter suporte a Proxy Protocol para obter o endereço IP do cliente. Caso contrário, esse recurso não funcionará.
Para um listener UDP, a preservação do endereço IP do cliente não funciona se um cliente IPv6 acessar um serviço de backend IPv4.
Desativar a preservação de IP do cliente
Para listeners HTTP e HTTPS, a preservação do endereço IP do cliente vem ativada por padrão e não pode ser desativada.
Para listeners TCP e UDP, desative esse recurso no console seguindo estas etapas:
Na página Instances, localize a instância Global Accelerator desejada e clique em Configure Listener na coluna Actions.
Na aba Listeners, localize o listener desejado e clique em Edit na coluna Actions.
Na etapa Configure Listener & Protocol, clique em Next.
Na etapa Configure Endpoint Group, defina Preserve Client IP como Do Not Preserve e clique em Next.
Na etapa Configuration Review, revise as configurações e clique em Submit.
Obtenção de IP do cliente na tradução IPv6 para IPv4
Para um listener HTTP ou HTTPS, o endereço IP do cliente tanto para clientes IPv4 quanto IPv6 está disponível apenas no campo
X-Forwarded-Fordo cabeçalho da solicitação HTTP.Para um listener TCP, apenas Proxy Protocol tem suporte para obter os endereços IP de clientes IPv6. Com esse método, o servidor de backend deve ter suporte a Proxy Protocol para recuperar o endereço IP do cliente. Caso contrário, o acesso pode falhar.
Para listeners UDP, não há suporte para obtenção de endereços IP de clientes IPv6.
Documentos relacionados
Console
Como alternativa, utilize o recurso de log de acesso do GA. Crie um log de acesso para o grupo de endpoints e os logs coletados serão entregues a um Logstore do Simple Log Service (SLS) na mesma região. O IP do cliente de origem fica disponível no campo client_ip na aba Raw Logs do Logstore.
Para mais informações sobre a configuração e considerações para serviços de backend em um grupo de endpoints, consulte Grupos de endpoints e endpoints e Adicionar e gerenciar grupos de endpoints para listeners de roteamento inteligente.
API
Ao chamar essas operações de API, utilize o parâmetro EnableClientIPPreservation para o método automático e o parâmetro EnableProxyProtocol para o método Proxy Protocol.