Servizio 503 non disponibile - Creazione del tunnel proxy non riuscita con 403

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Sintomo

L'applicazione client riceve un codice di stato HTTP 503 Service Unavailable con il codice di errore protocol.http.ProxyTunnelCreationFailed come risposta alle chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 503 Service Unavailable

Inoltre, potresti visualizzare il seguente messaggio di errore:

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

Proxy di inoltro e tunneling

Apigee Edge consente ai proxy API di comunicare con il server di backend tramite un server proxy, come spiegato in Configurare il proxy di inoltro. Il server proxy apre una connessione sicura (HTTPS) o non sicura (HTTP) al server di backend a seconda del tipo di proxy (indicato dalla proprietà HTTPClient.proxy.type) utilizzato e trasferisce i dati in entrambe le direzioni. Questa operazione è nota come tunneling.

Per impostazione predefinita, Apigee Edge utilizza il tunneling per tutto il traffico. Per disattivare il tunneling, la proprietà HTTPClient.use.tunneling deve essere impostata su false.

Codice di errore: protocol.http.ProxyTunnelCreationFailed

Apigee Edge restituisce il codice di errore protocol.http.ProxyTunnelCreationFailed se il server proxy non è in grado di creare un tunnel tra Apigee Edge e il server di backend a causa di problemi come firewall, restrizioni dell'elenco di controllo dell'accesso (ACL), problemi DNS, indisponibilità del server di backend, timeout e così via.

Il codice di stato nel faultstring della risposta di Apigee Edge in genere indica una possibile causa di alto livello che ha portato a questo errore.

Modello di faultstring:

Proxy refused to create tunnel with response status STATUS_CODE

Possibili cause di alcuni dei codici di stato osservati in faultstring:

La tabella seguente descrive le possibili cause a seconda del codice di stato indicato nel faultstring:

Faultstring Descrizione
Proxy refused to create tunnel with response status 403

403 - Forbidden

Questo può accadere a causa di restrizioni firewall o ACL configurate sul server di backend che impediscono la creazione del tunnel.

Proxy refused to create tunnel with response status 503

503 - Service Unavailable

Questo può accadere a causa di problemi DNS, restrizioni firewall, indisponibilità del server di backend che impedisce la creazione del tunnel

Proxy refused to create tunnel with response status 504

504 - Gateway Timeout

Questo può accadere se si verificano timeout durante la creazione del tunnel

A seconda del codice di stato osservato nella faultstring, devi utilizzare tecniche appropriate per risolvere il problema. Questo playbook spiega come risolvere il problema se osservi il codice di stato 403 nella faultstring per il codice di errore protocol.http.ProxyTunnelCreationFailed.

Possibili cause

Questo errore (codice di stato 403) si verifica se sul server di backend sono configurate restrizioni firewall o ACL (Access Control List) che impediscono al server proxy di creare il tunnel tra Apigee Edge e il server di backend.

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Proxy refused to create tunnel with response status 403 Il server proxy si rifiuta di creare il tunnel perché riceve il nome host del server proxy anziché il nome host del server di backend nell'intestazione Host. Solo per gli utenti di Edge Private Cloud

Passaggi comuni per la diagnosi

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

Strumento di traccia

Per diagnosticare l'errore utilizzando lo strumento di traccia:

  1. Attiva la sessione di traccia e
    • Attendi che si verifichi l'errore oppure
    • Se riesci a riprodurre il problema, effettua la chiamata API per riprodurre il problema 503 Service Unavailable con Proxy refused to create tunnel with response status 403.
  2. Assicurati che l'opzione Mostra tutte le informazioni sul flusso sia attivata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Esamina le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
  5. In genere, l'errore viene visualizzato dopo la fase Target Request Flow Started come mostrato di seguito:

    Prendi nota delle seguenti informazioni:

    error: Proxy refused to create tunnel with response status 403

  6. Vai alla fase AX (Analytics Data Recorded) nella traccia e fai clic su di essa.
  7. Scorri verso il basso fino alla sezione Phase Details Response Headers e determina i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:

    ( visualizza immagine più grande)

    ( visualizza immagine più grande)

  8. Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source come protocol.http.ProxyTunnelCreationFailed e target rispettivamente, a indicare che questo errore è causato dal fatto che la creazione del tunnel proxy non è riuscita perché non è stata ricevuta l'intestazione host prevista.

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

NGINX

Per diagnosticare l'errore utilizzando i log degli accessi NGINX:

  1. Se sei un utente di Private Cloud, puoi utilizzare i log degli accessi NGINX per determinare le informazioni chiave sugli errori HTTP 503 Service Unavailable.
  2. Controlla i log degli accessi NGINX:

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

    Dove: ORG, ORG e PORT# vengono sostituiti con i valori effettivi.

  3. Cerca se sono presenti errori 503 con il codice di errore protocol.http.ProxyTunnelCreationFailed durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste che non vanno ancora a buon fine con 503.
  4. Se trovi errori 503 con X-Apigee-fault-code corrispondente al valore di protocol.http.ProxyTunnelCreationFailed, allora determina il valore di X-Apigee-fault-source.

    Esempio di errore 503 dal log degli accessi NGINX:

    La voce di esempio riportata sopra dal log degli accessi NGINX ha i seguenti valori per X- Apigee-fault-code e X-Apigee-fault-source:

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

Causa: Proxy refused to create tunnel with response status 403

Diagnosi

  1. Determina il codice di errore e l'origine dell'errore per 503 Service Unavailable utilizzando lo strumento di traccia o i log degli accessi NGINX, come spiegato in Passaggi comuni per la diagnosi.
  2. Esamina il messaggio di errore e determina il codice di stato indicato nella faultstring per l'errore nella creazione del tunnel.
  3. In questo scenario, il codice di stato è 403, il che significa Forbidden.
  4. Ciò significa che non sono presenti diritti o privilegi sufficienti per creare il tunnel. In genere, questo può accadere se sono presenti restrizioni firewall o ACL (elenco di controllo dell'accesso) che impediscono la creazione del tunnel.
  5. Esamina le restrizioni firewall e/o ACL configurate sul server di backend che possono impedire la creazione del tunnel.
  6. A seconda del tipo di restrizioni firewall e/o ACL, devi risolvere il problema in modo appropriato.
  7. Prendiamo come esempio una restrizione firewall per spiegare come risolvere il problema:

    Scenario: la restrizione firewall sul server di backend prevede che l'intestazione Host contenga sempre il nome host del server di backend

    Puoi utilizzare uno dei seguenti modi per determinare l'intestazione Host passata da Apigee Edge:

    Traccia

    Per determinare l'intestazione Host utilizzando la traccia:

    1. Verifica che faultstring contenga Proxy refused to create tunnel with response status 403 utilizzando la traccia, come spiegato in Passaggi comuni per la diagnosi.
    2. Vai alla fase Target Request Flow Started ed esamina le intestazioni della richiesta
    3. Verifica il valore del nome host specificato nell'intestazione Host nella sezione Intestazioni della richiesta.
    4. Se l'intestazione Host contiene il nome host del proxy, questa è la causa dell'errore.
    5. Questo perché il firewall è configurato sul server di backend per accettare le richieste solo se l'intestazione Host contiene il nome del server di backend.
    6. Pertanto, quando il server proxy tenta di creare il tunnel con il server di backend, non riesce a causa dell'errore

      Proxy refused to create tunnel with response status 403.

      Esempio di traccia che mostra l'intestazione Host con il nome host del proxy

      ( visualizza immagine più grande)

      Nell'esempio di traccia mostrato sopra, l'intestazione Host contiene il nome dell'host proxy www.proxyserver.com. Poiché sul server di backend è configurata una restrizione firewall che prevede che solo il nome host del server di backend sia contenuto nell' intestazione Host, viene visualizzato l' errore Proxy refused to create tunnel with response status 403.

    tcpdump

    Per determinare l'intestazione Host utilizzando tcpdump

    1. Acquisisci un tcpdump sul server proxy per le richieste provenienti da componente del processore di messaggi di Apigee Edge con il seguente comando:

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

      Per ulteriori informazioni sull'utilizzo del comando tcpdump, consulta tcpdump.

    2. Analizza i dati tcpdump utilizzando lo strumento Wireshark o uno strumento simile.
    3. Di seguito è riportato un esempio di analisi di tcpdump utilizzando Wireshark:

      ( visualizza immagine più grande)

    4. I numeri di pacchetto 13, 14 e 15 mostrano che il processore di messaggi sta stabilendo la connessione al server proxy tramite una procedura di handshake TCP a tre vie.
    5. Nel pacchetto 16, il processore di messaggi si è connesso all'host proxy httpbin.org (mostrato nell'esempio sopra).
    6. Seleziona il pacchetto 16 ed esamina in dettaglio il contenuto del pacchetto, in particolare l'intestazione Host passata al server proxy dal processore di messaggi.

    7. L'esempio sopra mostra l'intestazione Host httpin.org, che è il nome host del server proxy. Pertanto, quando il server proxy tenta di creare il tunnel con il server di backend passando l'intestazione Host httpin.org, non riesce a causa dell'errore Proxy refused to create tunnel with response status 403.

Risoluzione

Scenario: la restrizione firewall sul server proxy prevede che l'intestazione Host contenga sempre il nome host del server di backend

Se hai verificato che questo errore è causato dal fatto che il firewall sul server di backend è configurato in modo da prevedere che l'intestazione Host contenga sempre il nome host del server di backend, mentre il processore di messaggi invia il nome host del server proxy, segui questi passaggi per risolvere il problema:

  1. Imposta la proprietà use.proxy.host.header.with.target.uri su true in TargetEndpoint, come mostrato nell'esempio seguente:

    Esempio di configurazione di 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. Assicurati che le altre proprietà relative a proxy di inoltro siano configurate nel processore di messaggi come segue:

    1. Esamina il file /opt/apigee/customer/application/message-processor.properties su ciascuno dei processori di messaggi.
    2. Assicurati che le seguenti proprietà siano impostate in base al tuo caso d'uso o ai tuoi requisiti:

      Valori di esempio per le proprietà:

      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

Informazioni di diagnostica da raccogliere

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni di diagnostica e contatta l'assistenza Apigee Edge:

Se sei un utente di Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle del proxy API
  • File di traccia per le richieste API
  • Log degli accessi NGINX

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

    Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.

  • Log di sistema del processore di messaggi

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

Riferimenti