503 Service Unavailable - Proxy tunnel creation failed with 403 (503 Сервис недоступен – не удалось создать туннель прокси-сервера с ошибкой 403)

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Symptom

Клиентское приложение получает код статуса HTTP 503 Service Unavailable с кодом ошибки protocol.http.ProxyTunnelCreationFailed в качестве ответа на вызовы API.

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 503 Service Unavailable

Кроме того, может появиться следующее сообщение об ошибке:

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

Прямой прокси-сервер и туннелирование

Apigee Edge позволяет прокси API взаимодействовать с внутренним сервером через прокси-сервер, как описано в разделе Настройка прямого прокси. Прокси-сервер устанавливает безопасное (HTTPS) или небезопасное (HTTP) подключение к серверу, в зависимости от типа прокси (указанного в свойстве HTTPClient.proxy.type), и передает данные в обоих направлениях. Это называется туннелированием.

По умолчанию Apigee Edge использует туннелирование для всего трафика. Чтобы отключить туннелирование, для свойства HTTPClient.use.tunneling нужно задать значение false.

Код ошибки: protocol.http.ProxyTunnelCreationFailed

Apigee Edge возвращает код ошибки protocol.http.ProxyTunnelCreationFailed, если прокси-сервер не может создать туннель между Apigee Edge и внутренним сервером из-за проблем с брандмауэром, ограничениями списка контроля доступа, проблемами с DNS, недоступностью внутреннего сервера, истечением времени ожидания и т. д.

Код статуса в faultstring ответа Apigee Edge обычно указывает на возможную причину высокого уровня, которая привела к этой ошибке.

Шаблон строки ошибки

Proxy refused to create tunnel with response status STATUS_CODE

Возможные причины некоторых кодов статуса, указанных в строке ошибки

В таблице ниже перечислены возможные причины в зависимости от кода статуса, указанного в faultstring:

Faultstring Описание
Прокси-сервер отказался создать туннель. Статус ответа: 403.

403 - Forbidden

Это может произойти из-за ограничений брандмауэра или списка контроля доступа, настроенных на внутреннем сервере, которые препятствуют созданию туннеля.

Прокси-сервер отказался создать туннель. Статус ответа: 503.

503 - Service Unavailable

Это может произойти из-за проблем с DNS, ограничений брандмауэра или недоступности внутреннего сервера, из-за чего не удается создать туннель.

Прокси-сервер отказался создать туннель с кодом ответа 504

504 - Gateway Timeout

Это может произойти, если во время создания туннеля истекло время ожидания.

В зависимости от кода статуса, указанного в faultstring, вам нужно использовать подходящие методы устранения неполадок. В этом руководстве рассказывается, как устранить проблему, если в faultstring для кода ошибки protocol.http.ProxyTunnelCreationFailed вы видите код статуса 403 .

Возможные причины

Эта ошибка (код статуса 403) возникает, если на внутреннем сервере настроены ограничения брандмауэра или ACL (списка контроля доступа), которые не позволяют прокси-серверу создать туннель между Apigee Edge и внутренним сервером.

Причина Описание Инструкции по устранению неполадок, применимые к
Прокси-сервер отказался создать туннель с кодом ответа 403 Прокси-сервер отказывается создать туннель, поскольку в заголовке Host указано имя хоста прокси-сервера, а не имя хоста внутреннего сервера. Только для пользователей Edge Private Cloud

Распространенные этапы диагностики

Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:

Инструмент "Трассировка"

Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:

  1. Включите сеанс трассировки и:
    • Дождитесь появления ошибки или:
    • Если вам удалось воспроизвести проблему, выполните вызов API, чтобы воспроизвести ее снова, Proxy refused to create tunnel with response status 403.503 Service Unavailable
  2. Убедитесь, что включен параметр Показывать все FlowInfo:

  3. Выберите один из неудачных запросов и изучите трассировку.
  4. Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
  5. Обычно ошибка появляется после этапа Target Request Flow Started, как показано ниже.

    Обратите внимание на следующее:

    Ошибка: Proxy refused to create tunnel with response status 403

  6. Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.
  7. Прокрутите страницу вниз до раздела Phase Details (Сведения об этапе) Response Headers (Заголовки ответов) и определите значения X-Apigee-fault-code (Код ошибки Apigee) и X-Apigee-fault-source (Источник ошибки Apigee), как показано ниже:

    ( посмотреть изображение в полном размере)

    ( посмотреть изображение в полном размере)

  8. Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как protocol.http.ProxyTunnelCreationFailed и target соответственно. Это означает, что ошибка возникла из-за того, что не был получен ожидаемый заголовок хоста, и не удалось создать туннель прокси.

    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

nginx

Чтобы диагностировать ошибку с помощью журналов доступа NGINX:

  1. Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP 503 Service Unavailable.
  2. Проверьте журналы доступа NGINX:

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

    Где: ORG, ORG и PORT# заменяются фактическими значениями.

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 503 с кодом ошибки protocol.http.ProxyTunnelCreationFailed за определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 503.
  4. Если вы обнаружите ошибки 503 с кодом X-Apigee-fault-code, соответствующим значению protocol.http.ProxyTunnelCreationFailed, определите значение X-Apigee-fault-source.

    Пример ошибки 503 из журнала доступа NGINX:

    В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:

    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

Причина: прокси-сервер отказался создать туннель с ответом 403.

диагностика;

  1. Определите код ошибки и источник ошибки для 503 Service Unavailable, используя инструмент трассировки или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики.
  2. Проверьте сообщение об ошибке и определите код статуса, указанный в faultstring, чтобы понять, почему не удалось создать туннель.
  3. В этом случае код статуса – 403, что означает Запрещено.
  4. Это означает, что у вас недостаточно прав или привилегий для создания туннеля. Обычно это происходит, если брандмауэр или список контроля доступа (ACL) блокируют создание туннеля.
  5. Проверьте, не настроены ли на вашем внутреннем сервере ограничения брандмауэра и/или списков контроля доступа, которые могут помешать созданию туннеля.
  6. В зависимости от типа брандмауэра и/или ограничений ACL вам нужно устранить проблему.
  7. Чтобы объяснить, как устранить проблему, связанную с ограничениями межсетевого экрана, рассмотрим следующий пример:

    Сценарий: ограничение межсетевого экрана на внутреннем сервере требует, чтобы заголовок Host всегда содержал имя хоста внутреннего сервера

    Чтобы определить заголовок хоста, переданный Apigee Edge, можно использовать один из следующих способов:

    Трассировка

    Чтобы определить заголовок хоста с помощью Trace:

    1. Убедитесь, что faultstring содержит Proxy refused to create tunnel with response status 403, используя трассировку, как описано в разделе Общие шаги диагностики.
    2. Перейдите к этапу Целевой запрос запущен и проверьте заголовки запроса.
    3. Проверьте значение имени хоста, указанного в заголовке хоста в разделе Заголовки запроса.
    4. Если заголовок Host содержит имя хоста прокси-сервера, это и является причиной ошибки.
    5. Это происходит потому, что брандмауэр на внутреннем сервере настроен так, чтобы принимать запросы, только если заголовок хоста содержит имя внутреннего сервера.
    6. Поэтому, когда прокси-сервер пытается создать туннель с внутренним сервером, он завершается с ошибкой

      Proxy refused to create tunnel with response status 403.

      Пример трассировки, в которой заголовок хоста содержит имя хоста прокси-сервера

      ( посмотреть изображение в полном размере)

      В приведенном выше примере трассировки показано, что заголовок хоста содержит имя хоста прокси-сервера www.proxyserver.com. . Поскольку на внутреннем сервере настроено ограничение межсетевого экрана, согласно которому в заголовке хоста должно быть только имя хоста внутреннего сервера, вы получаете ошибку Proxy refused to create tunnel with response status 403.

    tcpdump

    Как определить заголовок хоста с помощью tcpdump

    1. Захватите tcpdump на прокси-сервере для запросов, поступающих от компонента Message Processor Apigee Edge, с помощью следующей команды:

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

      Подробнее об использовании команды tcpdump можно узнать в руководстве по tcpdump.

    2. Проанализируйте данные tcpdump с помощью инструмента Wireshark или аналогичного инструмента.
    3. Вот пример анализа tcpdump с помощью Wireshark:

      ( посмотреть изображение в полном размере)

    4. Пакеты 13, 14 и 15 показывают, что процессор сообщений устанавливает подключение к прокси-серверу с помощью трехэтапного рукопожатия TCP.
    5. В пакете 16 Message Processor подключился к хосту прокси-сервера httpbin.org (как показано в примере выше).
    6. Выберите пакет 16 и подробно изучите его содержимое, в частности заголовок хоста, который процессор сообщений передает прокси-серверу.

    7. В приведенном выше примере Host Header httpin.org – это имя хоста прокси-сервера. Поэтому, когда прокси-сервер пытается создать туннель с внутренним сервером, передавая указанный выше заголовок хоста httpin.org, происходит сбой с ошибкой Proxy refused to create tunnel with response status 403.

Разрешение

Сценарий: брандмауэр на прокси-сервере требует, чтобы заголовок Host всегда содержал имя хоста внутреннего сервера

Если вы выяснили, что ошибка возникает из-за того, что брандмауэр на бэкенд-сервере настроен таким образом, что заголовок хоста всегда должен содержать имя хоста бэкенд-сервера, а Message Processor отправляет имя хоста прокси-сервера, выполните следующие действия, чтобы устранить проблему:

  1. Задайте для свойства use.proxy.host.header.with.target.uri значение true в TargetEndpoint, как показано в следующем примере:

    Пример конфигурации 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. Убедитесь, что другие свойства, связанные с прямым прокси-сервером, настроены в Message Processor следующим образом:

    1. Проверьте файл /opt/apigee/customer/application/message-processor.properties на каждом из процессоров сообщений.
    2. Убедитесь, что следующие свойства заданы в соответствии с вашими потребностями:

      Примеры значений свойств

      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

Необходимо собрать диагностическую информацию

Если проблема не исчезнет после выполнения описанных выше инструкций, соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.

Если вы используете частное облако, предоставьте следующую информацию:

  • Полное сообщение об ошибке, которое появляется при неудачных запросах.
  • Название среды
  • Пакет прокси-сервера API
  • Файл трассировки для запросов к API
  • Журналы доступа NGINX

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

    Где: ORG, ENV и PORT# заменяются фактическими значениями.

  • Системные журналы процессора сообщений

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

Ссылки