Esta página descreve como os cabeçalhos personalizados funcionam nos mapas de URLs usados por equilibradores de carga de aplicações internos regionais e equilibradores de carga de aplicações internos entre regiões.
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 que o equilibrador de carga deteta, estes cabeçalhos podem incluir as seguintes informações:
- Latência para o cliente
Parâmetros da ligação TLS
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 faz um pedido ao 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 balanceador de carga define os cabeçalhos de resposta antes de devolver uma resposta ao cliente.
Para ativar cabeçalhos personalizados para equilibradores de carga de aplicações internos regionais e equilibradores de carga de aplicações internos entre regiões, especifique uma lista de nomes de cabeçalhos e valores de cabeçalhos no ficheiro de configuração do mapa de URLs.
Os nomes dos cabeçalhos têm de ter as seguintes propriedades:
- 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
. - O nome do cabeçalho não pode começar por
X-Google
,X-Goog-
,X-GFE
, ouX-Amz-
. - 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 ser
Host
nemauthority
.Host
eauthority
são palavras-chave especiais reservadas pela Google Cloud. Não pode modificar estes cabeçalhos para equilibradores de carga baseados no Envoy. Em alternativa, recomendamos que crie outros cabeçalhos personalizados (por exemplo,MyHost
) para não interferir com os nomes de cabeçalhos reservados. - Um nome de cabeçalho não pode aparecer mais do que uma vez na lista de cabeçalhos.
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.
Os valores dos cabeçalhos têm de ter as seguintes propriedades:
- 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 não pode estar em branco. Os cabeçalhos em branco são rejeitados.
- O valor do cabeçalho pode incluir uma ou mais variáveis, entre chavetas, que se expandem para valores fornecidos pelo equilibrador de carga. Para ver uma lista completa das variáveis permitidas no valor do cabeçalho, consulte o artigo Variáveis que podem aparecer no valor do cabeçalho.
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 (}
).
Adicione cabeçalhos de pedidos ou respostas
Para adicionar cabeçalhos de pedidos ou respostas, use a CLI gcloud para editar o mapa de URLs da seguinte forma:
Regional
gcloud compute url-maps edit URL_MAP_NAME \ --region=REGION
Segue-se um exemplo de um ficheiro YAML que mostra como usar variáveis em cabeçalhos personalizados:
defaultService: regions/REGION/backendServices/BACKEND_SERVICE_1 name: regional-lb-map region: region/REGION hostRules: - hosts: - '*' pathMatcher: matcher1 pathMatchers: - defaultService: regions/REGION/backendServices/BACKEND_SERVICE_1 name: matcher1 routeRules: - matchRules: - prefixMatch: /PREFIX priority: PRIORITY # 0 is highest routeAction: weightedBackendServices: - backendService: regions/REGION/backendServices/BACKEND_SERVICE_1 weight: 100 headerAction: requestHeadersToAdd: - headerName: X-header-1-client-region headerValue: "{client_region}" - headerName: X-header-2-client-ip-port headerValue: "{client_ip_address}, {client_port}" replace: True requestHeadersToRemove: - header-3-name responseHeadersToAdd: - headerName: X-header-4-server-ip-port headerValue: "{server_ip_address}, {server_port}" replace: True responseHeadersToRemove: - header-5-name - header-6-name
Entre regiões
gcloud compute url-maps edit URL_MAP_NAME \ --global
Segue-se um exemplo de um ficheiro YAML que mostra como usar variáveis em cabeçalhos personalizados:
defaultService: global/backendServices/BACKEND_SERVICE_1 name: global-lb-map hostRules: - hosts: - '*' pathMatcher: matcher1 pathMatchers: - defaultService: global/backendServices/BACKEND_SERVICE_1 name: matcher1 routeRules: - matchRules: - prefixMatch: /PREFIX priority: PRIORITY # 0 is highest routeAction: weightedBackendServices: - backendService: global/backendServices/BACKEND_SERVICE_1 weight: 100 headerAction: requestHeadersToAdd: - headerName: X-header-1-client-region headerValue: "{client_region}" - headerName: X-header-2-client-ip-port headerValue: "{client_ip_address}, {client_port}" replace: True requesteHeadersToRemove: - header-3-name responseHeadersToAdd: - headerName: X-header-4-server-ip-port headerValue: "{server_ip_address}, {server_port}" replace: True responseHeadersToRemove: - header-5-name - header-6-name
Tenha em atenção os seguintes comportamentos:
- Se um cabeçalho de resposta com variáveis personalizadas for resolvido como uma string vazia, é removido.
- Se um cabeçalho de pedido com variáveis personalizadas for resolvido como uma string vazia, é mantido com um marcador de posição de string vazia.
- Se um cabeçalho do pedido personalizado incluir uma variável personalizada e um pedido de cliente recebido também incluir o mesmo cabeçalho, o valor do cabeçalho do pedido do cliente é substituído pelo novo valor fornecido pelo cabeçalho personalizado do equilibrador de carga.
Variáveis que podem aparecer no valor do cabeçalho
As seguintes variáveis podem aparecer em valores de cabeçalho personalizados.
Variável | Descrição |
---|---|
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_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 .
|
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).
|
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. |
O balanceador de carga expande as variáveis para strings vazias quando não consegue determinar os respetivos valores. Por exemplo:
- 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
Os valores geográficos 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 as 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.
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, a string
client_cert_serial_number_exceeded_size_limit é adicionada a
client_cert_error 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 SPIFFE ID tiver mais de 2048 bytes, a string
|
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 |
Campo Emissor completo codificado em Base64 do certificado. Se |
client_cert_subject_dn |
Campo Subject completo codificado em Base64 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 do certificado está em conformidade com a RFC 9440: o certificado DER binário é codificado com Base64 (sem quebras de linha, espaços ou outros carateres fora do alfabeto 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 |
Limitações
Aplicam-se as seguintes limitações:
- Não pode configurar cabeçalhos personalizados em serviços de back-end usados por Application Load Balancers internos regionais e Application Load Balancers internos entre regiões.