Os cabeçalhos de pedidos e respostas personalizados permitem-lhe especificar cabeçalhos adicionais que o balanceador de carga pode adicionar a pedidos e respostas HTTP(S). Consoante as informações detetadas pelo balanceador de carga, estes cabeçalhos podem incluir as seguintes informações:
- Latência para o cliente
- Localização geográfica do endereço IP do cliente
- Parâmetros da ligação TLS
Os cabeçalhos de pedidos personalizados são suportados para serviços de back-end, enquanto os cabeçalhos de respostas personalizados são suportados para serviços de back-end e contentores de back-end.
O balanceador de carga adiciona determinados cabeçalhos por predefinição a todos os pedidos e respostas HTTP(S) que encaminha entre back-ends e clientes. Para mais informações, consulte o artigo Segmente proxies.
Antes de começar
Se necessário, atualize para a versão mais recente da CLI Google Cloud:
gcloud components update
Como funcionam os cabeçalhos personalizados
Os cabeçalhos personalizados funcionam da seguinte forma:
Quando o balanceador de carga encaminha um pedido para o back-end, o balanceador de carga adiciona cabeçalhos de pedidos.
O equilibrador de carga adiciona cabeçalhos de pedidos personalizados apenas aos pedidos do cliente e não às sondagens de verificação do estado. Se o seu back-end exigir um cabeçalho específico para autorização que esteja em falta no pacote de verificação de funcionamento, a verificação de funcionamento pode falhar.
O equilibrador de carga define os cabeçalhos de resposta antes de devolver as respostas ao cliente.
Para ativar os cabeçalhos personalizados, especifica uma lista de cabeçalhos numa propriedade do serviço de back-end ou do contentor de back-end.
Especifique cada cabeçalho como uma string header-name:header-value
. O cabeçalho tem de conter dois pontos a separar o nome do cabeçalho e o valor do cabeçalho.
Os nomes dos cabeçalhos têm de cumprir os seguintes requisitos:
- O nome do cabeçalho tem de ser uma definição de nome de campo de cabeçalho HTTP válida (de acordo com o RFC 7230).
- O nome do cabeçalho não pode ser
X-User-IP
nemCDN-Loop
. - Os seguintes cabeçalhos hop-by-hop não podem ser usados:
Keep-Alive
,Transfer-Encoding
,TE
,Connection
,Trailer
eUpgrade
. De acordo com a RFC 2616, estes cabeçalhos não são armazenados em cache nem propagados pelos proxies de destino. - O nome do cabeçalho não pode começar com
X-Google
,X-Goog-
,X-GFE
ouX-Amz-
. - Um nome de cabeçalho não pode aparecer mais do que uma vez na lista de cabeçalhos adicionados.
Os valores dos cabeçalhos têm de cumprir os seguintes requisitos:
- O valor do cabeçalho tem de ser uma definição de campo de cabeçalho HTTP válida de acordo com a RFC 7230, com formulários obsoletos não permitidos).
- O valor do cabeçalho pode estar em branco.
- O valor do cabeçalho pode incluir uma ou mais variáveis, entre chavetas, que se expandem para valores fornecidos pelo equilibrador de carga. Uma lista de variáveis permitidas no valor do cabeçalho encontra-se na secção seguinte.
A ferramenta de linha de comandos gcloud
tem uma marca para especificar os cabeçalhos de pedidos, que é --custom-request-header
. Certifique-se de que inclui o nome do cabeçalho e o valor do cabeçalho entre aspas simples retas ('
) com esta flag.
O formato geral da flag é:
--custom-request-header='HEADER_NAME:[HEADER_VALUE]'
Segue-se um exemplo de um valor de cabeçalho com duas variáveis, client_region
e client_city
, entre chavetas.
--custom-request-header='X-Client-Geo-Location:{client_region},{client_city}'
Para clientes localizados em Mountain View, Califórnia, o balanceador de carga adiciona um cabeçalho da seguinte forma:
X-Client-Geo-Location:US,Mountain View
Variáveis suportadas com valores de cabeçalho
As seguintes variáveis podem aparecer em valores de cabeçalho personalizados.
Variável | Descrição |
---|---|
cdn_cache_id |
Código de localização e ID da instância da cache usada para publicar o pedido.
Este é o mesmo valor preenchido no campo jsonPayload.cacheId dos registos de pedidos da RFC na nuvem em Logging.
|
cdn_cache_status |
Estado atual da cache. Os valores podem ser hit ,
miss , revalidated , stale ,
uncacheable ou disabled para qualquer objeto
servido por um back-end ativado para o Cloud CDN.
|
origin_request_header |
Reflete o valor do cabeçalho Origin no pedido
para exemplos de utilização da partilha de recursos de origem cruzada (CORS).
|
client_rtt_msec |
Tempo de transmissão de ida e volta estimado entre o balanceador de carga e o cliente HTTP(S), em milissegundos. Este é o parâmetro de tempo de ida e volta suavizado (SRTT) medido pela pilha TCP do balanceador de carga, por RFC 2988. O RTT suavizado é um algoritmo que lida com variações e anomalias que podem ocorrer nas medições de RTT. |
client_region |
O país (ou a região) associado ao endereço IP do cliente. Este é um código de região CLDR Unicode, como US ou FR . (Para a maioria dos países, estes códigos correspondem diretamente
aos códigos ISO-3166-2.)
|
client_region_subdivision |
Subdivisão, por exemplo, uma província ou um estado, do país associado ao endereço IP do cliente. É um ID de subdivisão CLDR Unicode, como
USCA ou CAON . (Estes códigos Unicode são
derivados das subdivisões definidas pela norma ISO-3166-2.)
|
client_city |
Nome da cidade de origem do pedido, por exemplo,
Mountain View para Mountain View, Califórnia. Não existe uma lista canónica de valores válidos para esta variável. Os nomes das cidades podem
conter letras US-ASCII, números, espaços e os seguintes carateres:
!#$%&'*+-.^_`|~ .
|
client_city_lat_long |
Latitude e longitude da cidade de onde o pedido foi originado, por exemplo, 37.386051,-122.083851 para um pedido de Mountain View.
|
client_ip_address |
O endereço IP do cliente. Normalmente, é o mesmo que o endereço IP do cliente, que é o penúltimo endereço no cabeçalho X-Forwarded-For , a menos que o cliente esteja a usar um proxy ou o cabeçalho X-Forwarded-For tenha sido adulterado. |
client_port |
A porta de origem do cliente. |
client_encrypted |
true se a ligação entre o cliente e o balanceador de carga estiver encriptada (através de HTTPS, HTTP/2 ou HTTP/3); caso contrário, false .
|
client_protocol |
O protocolo HTTP usado para comunicação entre o cliente e o balanceador de carga. Uma das seguintes opções: HTTP/1.0 , HTTP/1.1 ,
HTTP/2 ou HTTP/3 .
|
device_request_type |
O dispositivo do cliente, derivado dos valores do cabeçalho
Seguem-se os valores possíveis:
|
server_ip_address |
O endereço IP do balanceador de carga ao qual o cliente se liga. Isto
pode ser útil quando vários equilibradores de carga partilham back-ends comuns. Isto
é o mesmo que o último endereço IP no cabeçalho
X-Forwarded-For .
|
server_port |
O número da porta de destino ao qual o cliente se liga. |
tls_sni_hostname |
Indicação do nome do servidor (conforme definido na RFC 6066), se fornecida pelo cliente durante o handshake do TLS ou QUIC. O nome de anfitrião é convertido em minúsculas e todos os pontos finais são removidos. |
tls_version |
Versão do TLS negociada entre o cliente e o balanceador de carga durante o handshake SSL. Os valores possíveis incluem: TLSv1 ,
TLSv1.1 , TLSv1.2 e TLSv1.3 . Se
o cliente se ligar através do QUIC em vez do TLS, o valor é
QUIC .
|
tls_cipher_suite |
Conjunto de cifras negociado durante o handshake TLS. O valor é composto por quatro dígitos hexadecimais definidos pelo IANA TLS Cipher Suite Registry, por exemplo, 009C para TLS_RSA_WITH_AES_128_GCM_SHA256. Este
valor está vazio para QUIC e para ligações de clientes não encriptadas.
|
tls_ja3_fingerprint |
JA3 Impressão digital TLS/SSL se o cliente se ligar através de HTTPS, HTTP/2 ou HTTP/3. |
tls_ja4_fingerprint |
JA4 Impressão digital TLS/SSL se o cliente se ligar através de HTTPS, HTTP/2 ou HTTP/3. |
user_agent_family |
O tipo de navegador do cliente, derivado dos valores do cabeçalho
Seguem-se os valores possíveis:
|
O equilibrador de carga expande as variáveis para strings vazias quando não consegue determinar os respetivos valores. Por exemplo:
- Variáveis de localização geográfica quando a localização do endereço IP é desconhecida
- Parâmetros TLS quando o TLS não está em utilização
- O
{origin_request_header}
quando o pedido não inclui um cabeçalhoOrigin
- O cabeçalho
{cdn_cache_status}
quando incluído num cabeçalho de pedido
Os valores geográficos (regiões, subdivisões e cidades) são estimativas baseadas no endereço IP do cliente. Periodicamente, a Google atualiza os dados que fornecem estes valores para melhorar a precisão e refletir alterações geográficas e políticas. Mesmo que o cabeçalho X-Forwarded-For
original contenha informações de localização válidas, a Google estima as localizações dos clientes através das informações do endereço IP de origem contidas nos pacotes recebidos pelo equilibrador de carga.
Os cabeçalhos adicionados pelo equilibrador de carga substituem os cabeçalhos existentes com o mesmo nome. Os nomes dos cabeçalhos não são sensíveis a maiúsculas e minúsculas. Quando os nomes dos cabeçalhos são transmitidos a um back-end HTTP/2, o protocolo HTTP/2 codifica os nomes dos cabeçalhos em letras minúsculas.
Nos valores dos cabeçalhos, os espaços em branco à esquerda e à direita são insignificantes e não são transmitidos ao back-end. Para permitir chavetas nos valores dos cabeçalhos, o equilibrador de carga interpreta duas chavetas de abertura ({{
) como uma única chaveta de abertura ({
) e duas chavetas de fecho (}}
) como uma única chaveta de fecho (}
).
Cabeçalhos personalizados do TLS mútuo
As seguintes variáveis de cabeçalho adicionais estão disponíveis se o TLS mútuo (mTLS) estiver configurado no TargetHttpsProxy do balanceador de carga.
Variável | Descrição |
---|---|
client_cert_present |
true se o cliente tiver fornecido um certificado durante o handshake TLS; caso contrário, false .
|
client_cert_chain_verified |
true se a cadeia de certificados de cliente for validada em relação a um TrustStore configurado; caso contrário, false .
|
client_cert_error |
Strings predefinidas que representam as condições de erro. Para mais informações sobre as strings de erro, consulte os modos de validação do cliente mTLS. |
client_cert_sha256_fingerprint |
Impressão digital SHA-256 codificada em Base64 do certificado do cliente. |
client_cert_serial_number |
O número de série do certificado de cliente.
Se o número de série tiver mais de 50 bytes, o elemento client_cert_error
é definido como client_cert_serial_number_exceeded_size_limit e o
número de série é definido como uma string vazia. |
client_cert_spiffe_id |
O ID SPIFFE do campo de nome alternativo de assunto (SAN). Se o valor não for válido ou exceder 2048 bytes, o ID SPIFFE é definido como uma string vazia. Se o ID SPIFFE tiver mais de 2048 bytes, o valor de |
client_cert_uri_sans |
Lista separada por vírgulas codificada em Base64 das extensões SAN do tipo URI.
As extensões SAN são extraídas do certificado de cliente.
O SPIFFE ID não está incluído no campo Se o |
client_cert_dnsname_sans |
Lista codificada em Base64 separada por vírgulas das extensões SAN do tipo DNSName. As extensões SAN são extraídas do certificado de cliente. Se o |
client_cert_valid_not_before |
Data/hora (RFC 3339
formato de string de data) antes da qual o certificado de cliente não é válido.
Por exemplo, 2022-07-01T18:05:09+00:00 .
|
client_cert_valid_not_after |
Data/hora (RFC 3339
formato de string de data) após a qual o certificado de cliente não é válido.
Por exemplo, 2022-07-01T18:05:09+00:00 .
|
client_cert_issuer_dn |
Codificação DER codificada em Base64 do campo Issuer completo do certificado. Se |
client_cert_subject_dn |
Codificação DER codificada em Base64 do campo Subject completo do certificado. Se o |
client_cert_leaf |
O certificado de folha do cliente para uma ligação mTLS estabelecida em que o certificado passou na validação. A codificação de certificados está em conformidade com a norma RFC 9440. Isto significa que o certificado DER binário é codificado com Base64 e delimitado com dois pontos de cada lado. Se |
client_cert_chain |
A lista de certificados delimitada por vírgulas, na ordem TLS padrão, da cadeia de certificados de cliente para uma ligação mTLS estabelecida em que o certificado de cliente passou na validação, não incluindo o certificado principal. A codificação de certificados está em conformidade com a norma RFC 9440. Se o tamanho combinado de |
Configure cabeçalhos de pedidos personalizados
Consola
Para adicionar cabeçalhos de pedidos personalizados a um serviço de back-end existente:
- Aceda à página de resumo do equilíbrio de carga.
Aceda à página Balanceamento de carga - Clique em Back-ends.
- Clique no nome de um serviço de back-end.
- Clique em Editar .
- Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
- Em Cabeçalhos de pedidos personalizados, clique em Adicionar cabeçalho.
- Introduza o Nome do cabeçalho e o Valor do cabeçalho para o cabeçalho do pedido personalizado.
- Introduza quaisquer cabeçalhos de pedidos personalizados adicionais.
- Clique em Guardar.
Para remover um cabeçalho de pedido personalizado de um serviço de back-end:
- Aceda à página de resumo do equilíbrio de carga.
Aceda à página Balanceamento de carga - Clique em Back-ends.
- Clique no nome de um serviço de back-end.
- Clique em Editar .
- Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
- Clique no X junto ao nome do cabeçalho de pedido personalizado que quer remover.
- Clique em Guardar.
gcloud
Para especificar cabeçalhos de pedidos personalizados, use o comando gcloud compute backend-services
create
ou gcloud compute backend-services
update
com a flag --custom-request-header
.
Para criar um serviço de back-end com cabeçalhos de pedidos personalizados:
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --global-health-checks \ --global \ --protocol HTTPS \ --health-checks https-basic-check \ --custom-request-header='HEADER_NAME:[HEADER_VALUE]'
Para adicionar mais cabeçalhos de pedidos, especifique um nome e um valor de cabeçalho únicos repetindo a flag --custom-request-header
.
Para adicionar cabeçalhos personalizados a um serviço de back-end existente:
gcloud compute backend-services update BACKEND_SERVICE_NAME \ --global \ --custom-request-header='HEADER_1_NAME:[HEADER_1_VALUE]' \ --custom-request-header='HEADER_2_NAME:[HEADER_2_VALUE]'
O passo anterior substitui todos os cabeçalhos já existentes no serviço de back-end pelos cabeçalhos de pedidos que especificar no comando.
Para remover todos os cabeçalhos de um serviço de back-end:
gcloud compute backend-services update BACKEND_SERVICE_NAME \ --global \ --no-custom-request-headers
API
Faça um pedido PATCH
para o método
backendServices.patch
:
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME "customRequestHeaders": [ "client_city:Mountain View" ]
Terraform
Para um script do Terraform que cria um balanceador de carga com cabeçalhos personalizados, consulte os exemplos do Terraform para balanceadores de carga de aplicações externos globais.
Configure cabeçalhos das respostas personalizados
Consola
Para adicionar cabeçalhos de resposta personalizados a um serviço de back-end existente:
- Aceda à página de resumo do equilíbrio de carga.
Aceda à página Balanceamento de carga - Clique em Back-ends.
- Clique no nome de um serviço de back-end.
- Clique em Editar .
- Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
- Em Cabeçalhos de resposta personalizados, clique em Adicionar cabeçalho.
- Introduza o Nome do cabeçalho e o Valor do cabeçalho para o cabeçalho da resposta personalizada.
- Introduza cabeçalhos de resposta personalizados adicionais.
- Clique em Guardar.
Para remover um cabeçalho de resposta personalizado de um serviço de back-end:
- Aceda à página de resumo do equilíbrio de carga.
Aceda à página Balanceamento de carga - Clique em Back-ends.
- Clique no nome de um serviço de back-end.
- Clique em Editar .
- Clique em Configurações avançadas (afinidade de sessão, tempo limite de esgotamento de ligações, políticas de segurança).
- Clique no X junto ao nome do cabeçalho de resposta personalizado que quer remover.
- Clique em Guardar.
gcloud
Para serviços de back-end, use o comando gcloud compute backend-services
create
ou gcloud compute backend-services
update
com a flag --custom-response-header
.
Para buckets de back-end, use o comando gcloud compute backend-buckets
create
ou gcloud compute backend-buckets
update
com a flag --custom-response-header
.
gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME --custom-response-header='HEADER_NAME:[HEADER_VALUE]'
gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME --custom-response-header='HEADER_NAME:[HEADER_VALUE]'
Exemplo com o cabeçalho X-Frame-Options
:
gcloud compute backend-buckets update gaming-lab \ --custom-response-header='X-Frame-Options: DENY'
Exemplo com o cabeçalho Strict-Transport-Security
:
O exemplo seguinte mostra como adicionar um cabeçalho de resposta personalizado para suportar a HTTP Strict Transport Security (HSTS):
gcloud compute backend-services update customer-bs-name \ --global \ --custom-response-header='Strict-Transport-Security: max-age=63072000'
API
Para contentores de back-end, use a chamada da API
Method: backendBuckets.insert
ou
Method: backendBuckets.update
.
Para serviços de back-end, use a chamada da API
Method: backendServices.insert
ou
Method: backendServices.update
.
Use uma das seguintes chamadas da API:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET_NAME POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME
Adicione o seguinte fragmento ao corpo do pedido JSON:
"customResponseHeaders":HEADER_NAME:[HEADER_VALUE]
Terraform
Para um script do Terraform que cria um balanceador de carga com cabeçalhos personalizados, consulte os exemplos do Terraform para balanceadores de carga de aplicações externos globais.
Defina cabeçalhos de resposta para o Cloud Storage
Se precisar de definir cabeçalhos HTTP em respostas do
armazenamento na nuvem, como cabeçalhos de política de recursos de origem cruzada,
X-Frame-Options
ou X-XSS-Protection
, oGoogle Cloud oferece
a opção de usar cabeçalhos personalizados para a RFC do Google Cloud com o
armazenamento na nuvem. Pode fazê-lo configurando cabeçalhos personalizados ao nível do contentor de back-end do equilibrador de carga, conforme descrito nesta página.
Os cabeçalhos de resposta personalizados configurados ao nível do depósito de back-end só são adicionados às respostas se o pedido do cliente for enviado para o endereço IP do equilibrador de carga. Os cabeçalhos personalizados não são adicionados às respostas se o pedido do cliente tiver sido feito diretamente à API Cloud Storage.
Use cabeçalhos personalizados com o Google Cloud Armor
Quando configura uma política de segurança do Cloud Armor, pode configurar o Cloud Armor para inserir um cabeçalho e um valor personalizados. Se a sua política de segurança do Cloud Armor estiver configurada para inserir o mesmo nome do cabeçalho personalizado que os cabeçalhos personalizados do Application Load Balancer externo global ou do Application Load Balancer clássico, o valor do cabeçalho especificado na sua política de segurança do Cloud Armor é substituído pelo valor preenchido pelo equilibrador de carga. Se não quiser que a política do Cloud Armor seja substituída, certifique-se de que não usa o mesmo nome.
Limitações
As seguintes limitações aplicam-se aos cabeçalhos personalizados usados com balanceadores de carga globais:
- O tamanho total de todos os cabeçalhos de pedidos personalizados (nome e valor combinados, antes da expansão de variáveis) para cada serviço de back-end não pode exceder 8 KB ou 16 cabeçalhos de pedidos.
- O tamanho total de todos os cabeçalhos de resposta personalizados (nome e valor combinados, antes da expansão de variáveis) para cada serviço de back-end não pode exceder 8 KB ou 16 cabeçalhos de resposta.
O que se segue?
- Para ver um exemplo de utilização, consulte o artigo Configurar um balanceador de carga com um back-end externo.