Вопрос или проблема
Мы протестировали команды AWS CLI на локальном компьютере с Windows и виртуальных машинах, и они работают нормально, но на сервере Windows Server 2016 всегда возникает ошибка OSError: Tunnel connection failed: 400 Bad Request
.
Например, команда aws ssm describe-sessions --state "Active" --region "region" --profile "profile_name" --debug
, выполняемая на сервере, выдаёт исключение, начиная с следующего сообщения об ошибке.
2025-03-05 17:19:09,695 - MainThread - urllib3.connectionpool - DEBUG
Starting new HTTPS connection (2): sts.region.amazonaws.com:443
2025-03-05 17:19:09,710 - MainThread - botocore.endpoint - DEBUG - Exception received when sending HTTP request.
Traceback (most recent call last):
File "urllib3\connectionpool.py", line 713, in urlopen
File "urllib3\connectionpool.py", line 1015, in _prepare_proxy
File "urllib3\connection.py", line 374, in connect
File "http\client.py", line 981, in _tunnel
OSError: Tunnel connection failed: 400 Bad Request
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "awscli\botocore\httpsession.py", line 458, in send
File "urllib3\connectionpool.py", line 802, in urlopen
File "urllib3\util\retry.py", line 527, in increment
File "urllib3\packages\six.py", line 769, in reraise
File "urllib3\connectionpool.py", line 713, in urlopen
File "urllib3\connectionpool.py", line 1015, in _prepare_proxy
File "urllib3\connection.py", line 374, in connect
File "http\client.py", line 981, in _tunnel
urllib3.exceptions.ProxyError: ('Cannot connect to proxy.', OSError('Tunnel connection failed: 400 Bad Request'))
During handling of the above exception, another exception occurred:
...
Кроме того, мы заметили, что вышеописанная ошибка возникает при попытке подключения к удалённому адресу на порту 443, поэтому мы протестировали curl https://google.com
на сервере, и он также не сработал с следующим снимком экрана. Кажется, сервер не разрешает исходящее соединение.
PS C:\> curl https://google.com
curl : Bad Request - Invalid URL
HTTP Error 400. The request URL is invalid.
At line:1 char:1
+ curl https://google.com
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
PS C:\>
Мы подозреваем, что на сервере есть более строгие правила на его межсетевом экране, но мы не очень хорошо знакомы с этой частью. Поэтому мы надеемся получить какие-то советы в расследовании.
Ответ или решение
Ваша проблема, вероятно, связана с сетевыми ограничениями на сервере, из-за которых команда AWS CLI успешно работает на локальном компьютере, но выдает ошибки на сервере Windows 2016. Ошибка, с которой вы сталкиваетесь, «OSError: Tunnel connection failed: 400 Bad Request», указывает на проблему с наладкой туннельного соединения через прокси-сервер. Основная причина данной проблемы может быть объяснена несколькими факторами. Давайте разберем возможные причины и решения этой проблемы, используя соответствующую теорию, примеры и применение.
Теория
-
Прокси-серверы и их настройки: Часто на корпоративных серверах устанавливаются прокси-серверы для контроля и фильтрации интернет-трафика. Все исходящие подключения к интернету могут быть направлены через такой прокси. Если прокси неправильно настроен или требует аутентификации, это может вызвать ошибки при попытке подключения ко внешним ресурсам, что, вероятно, и происходит в вашем случае.
-
Брандмауэр и сетевые политики: Ограничения в брандмауэре Windows или политики безопасности сети могут блокировать исходящие запросы на определенные порты или адреса. Это может стать причиной невозможности установить HTTPS-соединение на порт 443, как на это указывает ошибка, с которой вы сталкиваетесь при попытке использовать команду
curl
. -
Настройки сетевых интерфейсов и маршрутизации: Конфигурация сетевого интерфейса и связанных маршрутов может влиять на то, как сервер соединяется с внешними ресурсами. Если дефолтный шлюз или DNS неправильно настроены, это может вызывать ошибки при резолве адресов или маршрутизации трафика.
Примеры
-
Прокси-сервер требует аутентификации: Если вы пытаетесь использовать AWS CLI на сервере, находящемся за прокси-сервером, который требует аутентификации, аутентификационные данные могут быть не переданы в запрос, что вызывает ошибку 400 — Bad Request.
-
Блокировка доступа на уровне брандмауэра: На многих корпоративных серверах установлены строгие политики брандмауэра, которые блокируют все неопределеннные исходящие соединения, кроме как к конкретным службам и адресам, что может потребовать ручной настройки для разрешения необходимых соединений.
Применение
Для решения проблемы, вам необходимо провести несколько шагов:
-
Проверка и настройка прокси: Если вашему серверу требуется использовать прокси для выхода в интернет, убедитесь, что параметры прокси правильно настроены в системе и в AWS CLI. Вы можете задать необходимые параметры, используя переменные окружения
HTTP_PROXY
,HTTPS_PROXY
,NO_PROXY
или настроить их напрямую в конфигурации AWS CLI.export HTTPS_PROXY=http://proxy_hostname:proxy_port
-
Анализ настроек брандмауэра: Проверьте и настройте правила брандмауэра, чтобы убедиться, что сервер может осуществлять исходящие соединения на порт 443. Для диагностики проблем с сетевыми соединениями рекомендуем использовать команды
telnet
илиTest-NetConnection
в PowerShell для проверки возможности установленного соединения на определенные порты.Test-NetConnection -ComputerName google.com -Port 443
-
Консультация с сетевым администратором: В случае, если адекватные изменения не могут быть внесены вами, вам необходимо проконсультироваться с IT администратором или сетевым инженером, который сможет предоставить доступные возможности для оптимальной настройки серевой политики и маршрутизации для решения проблемы.
-
Логирование и отладка: Используйте параметр
--debug
в AWS CLI, чтобы получить расширенную информацию для отладки о том, где именно происходит сбой и какие ошибки возникают.
Таким образом, идентификация вашей проблемы требует комплексного анализа сетевой среды, настройки брандмауэра и прокси-сервера. Уверенное следование указанным шагам поможет вам получить более точное понимание проблемы и позволит ей устранить.