503 Serviço indisponível - Falha na criação do túnel do proxy com 403

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

Sintoma

O aplicativo cliente recebe um código de status HTTP de 503 Service Unavailable com o código de erro protocol.http.ProxyTunnelCreationFailed como uma resposta para chamadas de API.

Mensagem de erro

O aplicativo cliente recebe este código de resposta:

HTTP/1.1 503 Service Unavailable

Além disso, talvez você veja a seguinte mensagem de erro:

{
   "fault":{
      "faultstring":"Proxy refused to create tunnel with response status 403",
      "detail":{
         "errorcode":"protocol.http.ProxyTunnelCreationFailed"
      }
   }
}

Encaminhar proxy e encapsulamento

O Apigee Edge permite que os proxies de API se comuniquem com o servidor de back-end por meio de um servidor proxy, conforme explicado em Configurar proxy de encaminhamento. O servidor proxy abre uma conexão segura (HTTPS) ou não segura (HTTP) com o servidor de back-end, dependendo do tipo de proxy (indicado pela propriedade HTTPClient.proxy.type) usado e transfere os dados em ambas as direções. Isso é conhecido como encapsulamento.

Por padrão, o Apigee Edge usa o tunelamento para todo o tráfego. Para desativar o encapsulamento, a propriedade HTTPClient.use.tunneling precisa ser definida como false.

Código do erro: protocol.http.ProxyTunnelCreationFailed

O Apigee Edge retornará o código de erro protocol.http.ProxyTunnelCreationFailed se o servidor proxy não puder criar um túnel entre o Apigee Edge e o servidor de back-end devido a problemas como firewall, restrições de lista de controle de acesso (ACL), problemas de DNS, indisponibilidade do servidor de back-end, tempos limite etc.

O código de status no faultstring da resposta do Apigee Edge normalmente indica uma possível causa de alto nível que levou a esse erro.

Modelo de string com falhas:

Proxy refused to create tunnel with response status STATUS_CODE

Possíveis causas para alguns dos códigos de status observados em faultstring:

A tabela a seguir descreve as possíveis causas, dependendo do código de status indicado em faultstring:

String de falha Descrição
O proxy foi recusado para criar um túnel com status de resposta 403

403 - Forbidden

Isso pode acontecer devido a restrições de firewall ou ACL configuradas no servidor de back-end que impedem a criação de um túnel.

O proxy foi recusado para criar um túnel com status de resposta 503

503 - Service Unavailable

Isso pode acontecer devido a problemas de DNS, restrições de firewall, indisponibilidade do servidor de back-end que impedem a criação de uma extensão de

O proxy foi recusado a criar um túnel com status de resposta 504

504 - Gateway Timeout

Isso pode acontecer quando há tempos limite durante a criação do túnel

Dependendo do código de status observado em faultstring, é necessário usar técnicas adequadas para resolver o problema. Este manual explica como solucionar o problema se você observar o código de status 403 no faultstring do código de erro protocol.http.ProxyTunnelCreationFailed.

Causas possíveis

Este erro (código de status 403) ocorre se houver alguma restrição de firewall ou ACL (lista de controle de acesso) configurada no servidor de back-end que impeça a criação do túnel entre o Apigee Edge e o servidor de back-end pelo servidor proxy.

Causa Descrição Instruções de solução de problemas aplicáveis para
O proxy foi recusado a criar um túnel com status de resposta 403 O servidor proxy se recusa a criar o túnel porque recebe o nome de host do servidor proxy em vez do nome do host do servidor de back-end no cabeçalho Host. Apenas usuários da nuvem privada do Edge

Etapas comuns do diagnóstico

Use uma das seguintes ferramentas/técnicas para diagnosticar esse erro:

Ferramenta de rastreamento

Para diagnosticar o erro usando a ferramenta Trace:

  1. Ative a sessão de rastreamento e:
    • Aguarde o erro ocorrer ou
    • Se você conseguir reproduzir o problema, faça a chamada de API para reproduzir o problema 503 Service Unavailable com Proxy refused to create tunnel with response status 403.
  2. Verifique se a opção Mostrar todos os FlowInfos está ativada:

  3. Selecione uma das solicitações com falha e examine o rastro.
  4. Navegue pelas diferentes fases do rastro e localize onde a falha ocorreu.
  5. Você verá o erro normalmente após a fase Iniciar o fluxo de solicitação de destino, conforme mostrado abaixo:

    Observe as seguintes informações:

    erro: Proxy refused to create tunnel with response status 403

  6. Navegue até a fase AX (Dados do Analytics registrados) no rastreamento e clique nela.
  7. Role para baixo até a seção Cabeçalhos de resposta Detalhes da fase e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source, como mostrado abaixo:

    ( ver imagem ampliada)

    ( ver imagem ampliada)

  8. Você verá os valores de X-Apigee-fault-code e X-Apigee-fault-source como protocol.http.ProxyTunnelCreationFailed e target , respectivamente, indicando que esse erro foi causado por uma falha na criação do túnel de proxy porque o cabeçalho do host esperado não foi recebido.

    Cabeçalhos de resposta Valor
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

NGINX

Para diagnosticar o erro usando os registros de acesso do NGINX:

  1. Se você for um usuário da nuvem privada, poderá usar os registros de acesso do NGINX para determinar as principais informações sobre os erros HTTP 503 Service Unavailable.
  2. Verifique os registros de acesso do NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    Onde:ORG, ORG e PORT# são substituídos por valores reais.

  3. Pesquise se há algum erro 503 com o código protocol.http.ProxyTunnelCreationFailed durante um período específico (se o problema aconteceu anteriormente) ou se ainda há alguma solicitação com falha com 503.
  4. Se você encontrar erros 503 com o X-Apigee-fault-code que corresponda ao valor de protocol.http.ProxyTunnelCreationFailed, determine o valor de X-Apigee-fault-source.

    Exemplo de erro 503 do registro de acesso do NGINX:

    A entrada de amostra acima do registro de acesso do NGINX tem os seguintes valores para X- Apigee-fault-code e X-Apigee-fault-source:

    Cabeçalhos de resposta Valor
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

Causa: o proxy foi recusado para criar um túnel com status de resposta 403

Diagnóstico

  1. Determine o código de falha e a origem da falha do 503 Service Unavailable usando a Ferramenta de rastreamento ou os registros de acesso do NGINX, conforme explicado nas Etapas comuns de diagnóstico.
  2. Analise a Mensagem de erro e determine o código de status indicado no faultstring em busca de falha na criação do túnel.
  3. Nesse cenário, o código de status é 403, o que significa Proibido.
  4. Isso significa que não há direitos ou privilégios suficientes para criar o túnel. Isso normalmente acontece quando há restrições de firewall ou lista de controle de acesso (ACL, na sigla em inglês) que impeçam a criação do túnel.
  5. Revise as restrições de firewall e/ou ACLs configuradas no servidor de back-end que possam impedir a criação do túnel.
  6. Dependendo do tipo de restrições de firewall e/ou ACL, é necessário corrigir o problema adequadamente.
  7. Vejamos um exemplo de restrição de firewall para explicar como solucionar esse problema:

    Cenário: a restrição de firewall no servidor de back-end espera que o cabeçalho do host sempre contenha o nome do host do servidor de back-end

    É possível usar uma das seguintes maneiras para determinar o cabeçalho do host transmitido pelo Apigee Edge:

    Trace

    Para determinar o cabeçalho do host usando o Trace:

    1. Verifique se faultstring contém Proxy refused to create tunnel with response status 403 usando rastros, conforme explicado em Etapas comuns de diagnóstico.
    2. Navegue para a fase Fluxo de solicitação de destino iniciado e revise os Cabeçalhos de solicitação.
    3. Verifique o valor do nome do host especificado em Host header na seção Request Headers.
    4. Se o cabeçalho Host contiver o nome do host de proxy, essa será a causa do erro.
    5. Isso ocorre porque o firewall está configurado no servidor de back-end para aceitar as solicitações somente se o Cabeçalho do host contiver o nome do servidor de back-end.
    6. Portanto, quando o servidor proxy tenta criar o túnel com o servidor de back-end, ele falha com o erro

      Proxy refused to create tunnel with response status 403.

      Exemplo de rastro mostrando o cabeçalho do host com o nome do host do proxy

      ( ver imagem ampliada)

      No exemplo de rastreamento mostrado acima, ele mostra que o Host Header contém o nome do host proxy www.proxyserver.com. Como há uma restrição de firewall configurada no servidor de back-end que espera que apenas o nome do host do servidor de back-end esteja contido no Host Header, o erro Proxy refused to create tunnel with response status 403.

    tcpdump

    Para determinar o cabeçalho do host usando o tcpdump

    1. Capture um tcpdump no servidor proxy para as solicitações provenientes do componente de processador de mensagens do Apigee Edge com o seguinte comando:

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      Para mais informações sobre como usar o comando tcpdump, consulte tcpdump.

    2. Analise os dados de tcpdump usando a ferramenta Wireshark ou uma ferramenta semelhante.
    3. Veja um exemplo de análise do tcpdump usando o Wireshark:

      ( ver imagem ampliada)

    4. Os números de pacote 13, 14 e 15 mostram que o processador de mensagens está estabelecendo a conexão com o servidor proxy por meio de um processo de handshake de TCP de três vias.
    5. No pacote 16, o processador de mensagens se conectou ao host de proxy httpbin.org (mostrado no exemplo acima).
    6. Selecione o pacote 16 e examine o conteúdo dele em detalhes, mais especificamente o Cabeçalho do host que está sendo transmitido para o servidor proxy pelo processador de mensagens.

    7. O exemplo acima mostra o Cabeçalho do host httpin.org, que é o nome do host do servidor proxy. Portanto, quando o servidor proxy tenta criar o túnel com o servidor de back-end transmitindo o Cabeçalho do host httpin.org acima, ele falha com o erro Proxy refused to create tunnel with response status 403.

Resolução

Cenário: a restrição de firewall no servidor proxy espera que o cabeçalho do host sempre contenha o nome do host do servidor de back-end

Se você tiver determinado que esse erro é causado porque o firewall no servidor de back-end está configurado de forma que espera que o Cabeçalho do host sempre contenha o nome do host do servidor de backend enquanto o processador de mensagens envia o nome do host do backend, execute as etapas a seguir para resolver o problema:

  1. Defina a propriedade use.proxy.host.header.with.target.uri como verdadeira no TargetEndpoint, conforme mostrado no exemplo a seguir:

    Exemplo de configuração do TargetEndpoint:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <URL>https://mocktarget.apigee.net/json</URL>
        <Properties>
          <Property name="use.proxy.host.header.with.target.uri">true</Property>
        </Properties>
      </HTTPTargetConnection>
    </TargetEndpoint>
    
  2. Verifique se as outras propriedades relacionadas ao proxy de encaminhamento estão configuradas no processador de mensagens da seguinte maneira:

    1. Consulte o arquivo /opt/apigee/customer/application/message-processor.properties em cada um dos processadores de mensagens.
    2. Verifique se as propriedades a seguir estão definidas de acordo com seu caso de uso ou requisitos:

      Exemplos de valores para propriedades:

      conf_http_HTTPClient.use.proxy=true
      conf/http.properties+HTTPClient.proxy.type=HTTP
      conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME
      conf/http.properties+HTTPClient.proxy.port=PORT_#
      conf/http.properties+HTTPClient.proxy.user=USERNAME
      conf/http.properties+HTTPClient.proxy.password=PASSWORD
      

É necessário coletar informações de diagnóstico

Se o problema persistir mesmo depois de seguir as instruções acima, colete as informações de diagnóstico a seguir e entre em contato com o suporte do Apigee Edge:

Se você for um usuário da nuvem privada, forneça as seguintes informações:

  • Concluir a mensagem de erro observada para as solicitações com falha
  • Nome do ambiente
  • Pacote de proxy de API
  • Arquivo de rastreamento das solicitações de API
  • Registros de acesso do NGINX

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Onde:ORG, ENV e PORT# são substituídos por valores reais.

  • Registros do sistema do processador de mensagens

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    

Referências