503 Service indisponible - Échec de la création du tunnel proxy avec 403

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

Problème constaté

L'application cliente reçoit un code d'état HTTP 503 Service Unavailable avec le code d'erreur protocol.http.ProxyTunnelCreationFailed comme réponse aux appels d'API.

Message d'erreur

L'application cliente reçoit le code de réponse suivant:

HTTP/1.1 503 Service Unavailable

De plus, le message d'erreur suivant peut s'afficher:

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

Proxy de transfert et tunnelisation

Apigee Edge permet à vos proxys d'API de communiquer avec votre serveur backend via un serveur proxy, comme expliqué dans la section Configurer un proxy de transfert. Le serveur proxy ouvre une connexion sécurisée (HTTPS) ou non sécurisée (HTTP) au serveur backend en fonction du type de proxy utilisé par la propriété HTTPClient.proxy.type et transfère les données dans les deux sens. C'est ce que l'on appelle la tunnelisation.

Par défaut, Apigee Edge utilise la tunnellisation pour tout le trafic. Pour désactiver la tunnellisation, la propriété HTTPClient.use.tunneling doit être définie sur false.

Code d'erreur: Protocol.http.ProxyTunnelCreationFailed

Apigee Edge renvoie le code d'erreur protocol.http.ProxyTunnelCreationFailed si le serveur proxy ne parvient pas à créer de tunnel entre Apigee Edge et le serveur backend en raison de problèmes tels qu'un pare-feu, des restrictions de LCA (liste de contrôle d'accès), des problèmes DNS, une indisponibilité du serveur backend, des délais avant expiration, etc.

Le code d'état dans le faultstring de la réponse d'Apigee Edge indique généralement une cause de niveau élevé possible qui a conduit à cette erreur.

Modèle de chaîne de panne:

Proxy refused to create tunnel with response status STATUS_CODE

Causes possibles de certains codes d'état observés dans faultstring:

Le tableau suivant décrit les causes possibles en fonction du code d'état indiqué dans faultstring:

Chaîne d'erreur Description
Le proxy a refusé de créer un tunnel avec l'état de réponse 403

403 - Forbidden

Cela peut être dû à des restrictions de pare-feu ou de LCA configurées sur le serveur backend qui empêchent la création du tunnel.

Le proxy a refusé de créer un tunnel avec l'état de réponse 503

503 - Service Unavailable

Cela peut être dû à des problèmes DNS, à des restrictions de pare-feu ou à l'indisponibilité du serveur backend qui empêche la création du tunnel.

Le proxy a refusé de créer un tunnel avec l'état de réponse 504

504 - Gateway Timeout

Cela peut se produire s'il y a des délais avant expiration lors de la création du tunnel.

Selon le code d'état observé dans faultstring, vous devez utiliser les techniques appropriées pour résoudre le problème. Ce playbook explique comment résoudre le problème si vous observez le code d'état 403 dans faultstring pour le code d'erreur protocol.http.ProxyTunnelCreationFailed.

Causes possibles

Cette erreur (code d'état 403) se produit si des restrictions de pare-feu ou de LCA (liste de contrôle d'accès) sont configurées sur le serveur backend pour empêcher le serveur proxy d'établir le tunnel entre Apigee Edge et le serveur backend.

Cause Description Instructions de dépannage applicables
Le proxy a refusé de créer un tunnel avec l'état de réponse 403 Le serveur proxy refuse de créer le tunnel, car il reçoit le nom d'hôte du serveur proxy au lieu du nom d'hôte du serveur backend dans l'en-tête Host. Utilisateurs de cloud privé Edge uniquement

Étapes de diagnostic courantes

Utilisez l'un des outils ou techniques suivants pour diagnostiquer cette erreur:

Outil de traçage

Pour diagnostiquer l'erreur à l'aide de l'outil Trace:

  1. Activez la session de trace, puis effectuez l'une des opérations suivantes :
    • Attendez que l'erreur se produise.
    • Si vous pouvez reproduire le problème, effectuez un appel d'API pour reproduire le problème 503 Service Unavailable avec Proxy refused to create tunnel with response status 403.
  2. Assurez-vous que l'option Show all FlowInfos (Afficher tous les FlowInfos) est activée:

  3. Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
  4. Parcourez les différentes phases de la trace et localisez l'origine de l'échec.
  5. L'erreur s'affiche généralement après la phase Début du flux de requête cible, comme indiqué ci-dessous:

    Prenez note des informations suivantes:

    erreur:Proxy refused to create tunnel with response status 403

  6. Accédez à la phase AX (Données analytiques enregistrées) dans la trace et cliquez dessus.
  7. Faites défiler la page jusqu'à la section En-têtes de réponse Détails de la phase et déterminez les valeurs de X-Apigee-fault-code et de X-Apigee-fault-source, comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

    ( Afficher l'image plus grande)

  8. Les valeurs X-Apigee-fault-code et X-Apigee-fault-source s'affichent respectivement sous protocol.http.ProxyTunnelCreationFailed et target . Elles indiquent que cette erreur est causée par l'échec de la création du tunnel proxy, car l'en-tête d'hôte attendu n'est pas reçu.

    En-têtes de réponse Valeur
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

NGINX

Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX, procédez comme suit:

  1. Si vous êtes un utilisateur du cloud privé, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations essentielles sur les erreurs HTTP 503 Service Unavailable.
  2. Vérifiez les journaux d'accès NGINX:

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

    :ORG, ORG et PORT# sont remplacés par des valeurs réelles.

  3. Recherchez s'il existe des erreurs 503 avec le code d'erreur protocol.http.ProxyTunnelCreationFailed pendant une durée spécifique (si le problème s'est produit par le passé) ou si des requêtes échouent toujours avec 503.
  4. Si vous trouvez des erreurs 503 avec le X-Apigee-fault-code correspondant à la valeur de X-Apigee-fault-code , déterminez la valeur de la source X-Apigee-fault-code .

    Exemple d'erreur 503 du journal d'accès NGINX:

    L'exemple d'entrée ci-dessus du journal d'accès NGINX contient les valeurs suivantes pour X-Apigee-fault-code et X-Apigee-fault-source :

    En-têtes de réponse Valeur
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

Cause: le proxy a refusé de créer un tunnel avec l'état de réponse 403

Diagnostic

  1. Déterminez le code d'erreur et la source d'erreur pour 503 Service Unavailable à l'aide de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans la section Étapes de diagnostic courantes.
  2. Examinez le message d'erreur et déterminez le code d'état indiqué dans le faultstring en cas d'échec de la création du tunnel.
  3. Dans ce scénario, le code d'état est 403, ce qui signifie Interdit.
  4. Cela signifie que les droits ou privilèges ne sont pas suffisants pour créer le tunnel. Cela peut généralement se produire si des restrictions de pare-feu ou de LCA (liste de contrôle d'accès) empêchent la création du tunnel.
  5. Examinez toutes les restrictions de pare-feu et/ou de LCA configurées sur votre serveur backend susceptibles d'empêcher la création du tunnel.
  6. Selon le type de pare-feu et/ou les restrictions LCA, vous devrez résoudre le problème de manière appropriée.
  7. Prenons un exemple de restriction de pare-feu pour expliquer comment résoudre ce problème:

    Scénario: La restriction de pare-feu sur le serveur backend s'attend à ce que l'en-tête d'hôte contienne toujours le nom d'hôte du serveur backend

    Vous pouvez utiliser l'une des méthodes suivantes pour déterminer l'en-tête d'hôte transmis par Apigee Edge:

    Trace

    Pour déterminer l'en-tête d'hôte à l'aide de Trace:

    1. Vérifiez que faultstring contient Proxy refused to create tunnel with response status 403 à l'aide d'une trace, comme expliqué dans la section Étapes de diagnostic courantes.
    2. Accédez à la phase Début du flux de requête cible et consultez la section En-têtes de requête.
    3. Vérifiez la valeur du nom d'hôte spécifié dans l'en-tête de l'hôte de la section En-têtes de requête.
    4. Si l'en-tête Host (Hôte) contient le nom d'hôte du proxy, c'est la cause de cette erreur.
    5. En effet, le pare-feu est configuré sur le serveur backend pour n'accepter les requêtes que si l'en-tête de l'hôte contient le nom du serveur backend.
    6. Ainsi, lorsque le serveur proxy tente de créer le tunnel avec le serveur backend, il échoue et renvoie l'erreur

      Proxy refused to create tunnel with response status 403.

      Exemple de trace montrant un en-tête d'hôte ayant un nom d'hôte proxy

      ( Afficher l'image plus grande)

      L'exemple de trace ci-dessus montre que l'en-tête de l'hôte contient le nom de l'hôte proxy. www.proxyserver.com. Comme une restriction de pare-feu est configurée sur le serveur backend et ne s'attend à ce que seul le nom d'hôte du serveur backend soit contenu dans l'en-tête de l'hôte, l'erreur Proxy refused to create tunnel with response status 403 s'affiche.

    tcpdump

    Déterminer l'en-tête d'hôte à l'aide de tcpdump

    1. Capturez un tcpdump sur le serveur proxy pour les requêtes provenant du composant de processeur de messages d'Apigee Edge à l'aide de la commande suivante:

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

      Pour plus d'informations sur l'utilisation de la commande tcpdump, consultez la page tcpdump.

    2. Analysez les données tcpdump à l'aide de l'outil Wireshark ou d'un outil similaire.
    3. Voici un exemple d'analyse de tcpdump avec Wireshark:

      ( Afficher l'image plus grande)

    4. Les numéros de paquet 13, 14 et 15 indiquent que le processeur de messages établit la connexion au serveur proxy via un processus de handshake TCP à trois voies.
    5. Dans le paquet 16, le processeur de messages s'est connecté à l'hôte proxy httpbin.org (illustré dans l'exemple ci-dessus).
    6. Sélectionnez le paquet 16 et examinez-le en détail, et plus particulièrement l'en-tête de l'hôte transmis au serveur proxy par le processeur de messages.

    7. L'exemple ci-dessus montre Host Header (En-tête de l'hôte) httpin.org, qui correspond au nom d'hôte du serveur proxy. Par conséquent, lorsque le serveur proxy tente de créer le tunnel avec le serveur backend en transmettant l'en-tête d'hôte httpin.org ci-dessus, il échoue avec l'erreur Proxy refused to create tunnel with response status 403.

Résolution

Scénario: La restriction de pare-feu sur le serveur proxy s'attend à ce que l'en-tête d'hôte contienne toujours le nom d'hôte du serveur backend

Si vous avez vérifié que cette erreur est due au fait que le pare-feu du serveur backend est configuré de sorte qu'il s'attend à ce que l'en-tête de l'hôte contienne toujours le nom d'hôte du serveur backend, alors que le processeur de messages envoie le nom d'hôte du serveur proxy, procédez comme suit pour résoudre le problème:

  1. Définissez la propriété use.proxy.host.header.with.target.uri sur "true" dans TargetEndpoint, comme indiqué dans l'exemple suivant:

    Exemple de configuration du point de terminaison cible:

    <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. Assurez-vous que les autres propriétés liées au proxy de transfert sont configurées sur le processeur de messages comme suit:

    1. Examinez le fichier /opt/apigee/customer/application/message-processor.properties sur chacun des processeurs de messages.
    2. Assurez-vous que les propriétés suivantes sont définies conformément à votre cas d'utilisation ou à vos exigences:

      Exemples de valeurs pour les propriétés:

      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
      

Vous devez collecter des informations de diagnostic

Si le problème persiste même après avoir suivi les instructions ci-dessus, rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge:

Si vous êtes un utilisateur du Private Cloud, fournissez les informations suivantes:

  • Message d'erreur complet observé pour les requêtes ayant échoué
  • Nom de l'environnement
  • Groupe de proxys d'API
  • Fichier de suivi des requêtes API
  • Journaux d'accès NGINX

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

    :ORG, ENV et PORT# sont remplacés par des valeurs réelles.

  • Journaux système du processeur de messages

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

Références