Вопрос или проблема
У меня есть mitmproxy, работающий на порту 2011. Я могу использовать его самостоятельно, с помощью curl -x http://127.0.0.1:2011 google.com
. Однако теперь я хочу разместить его за nginx под доменным именем proxy.history.test
. Однако выполнение curl -x http://proxy.history.test:80 google.com -L -v
завершается ошибкой
* Получен HTTP код 400 от прокси после CONNECT
* Фаза CONNECT завершена!
* Закрытие соединения 1
curl: (56) Получен HTTP код 400 от прокси после CONNECT
Мой nginx.conf
:
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid /dev/null;
daemon off;
events {
worker_connections 1024;
}
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
map $http_host $service_port {
hostnames;
default '';
proxy.history.* 2011;
}
proxy_temp_path ./tmp;
access_log /dev/null;
ssl_certificate ./cert.pem;
ssl_certificate_key ./key.pem;
#proxy_set_header Host localhost;
client_body_temp_path ./tmp;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
client_max_body_size 50m;
server {
listen 127.0.0.1:443 ssl;
server_name *.test;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:$service_port;
}
}
server {
listen 127.0.0.1:80;
server_name *.test;
return 302 https://$http_host$request_uri;
}
}
(Мне нужно указывать :80
в команде curl, потому что в противном случае он попытается подключиться к порту 1080
, по какой-то причине).
nginx
является обратным прокси и не является прямым прокси и не поддерживает HTTP
CONNECT
метод. Вам нужно найти сторонний nginx
модуль для поддержки CONNECT
.
Ответ или решение
Вопрос «Получен код HTTP 400 от прокси после подключения» возникают при попытке интеграции mitmproxy за nginx. Давайте разберем проблему более подробно.
Фон события
У вас уже настроен mitmproxy, который работает на порту 2011, и вы можете получить к нему доступ через curl -x http://127.0.0.1:2011 google.com
. Однако, после установки nginx перед mitmproxy, вы сталкиваетесь с ошибкой при использовании команды curl -x http://proxy.history.test:80 google.com -L -v
, которая выводит сообщение "Получен код HTTP 400 от прокси после подключения". Эта ситуация требует особого внимания к настройкам вашего nginx и понимания работы HTTP-протоколов.
Текущая конфигурация nginx
Ваш файл nginx.conf
выглядит следующим образом:
worker_processes 1;
pid /dev/null;
daemon off;
events {
worker_connections 1024;
}
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
map $http_host $service_port {
hostnames;
default '';
proxy.history.* 2011;
}
proxy_temp_path ./tmp;
access_log /dev/null;
ssl_certificate ./cert.pem;
ssl_certificate_key ./key.pem;
client_body_temp_path ./tmp;
client_max_body_size 50m;
server {
listen 127.0.0.1:443 ssl;
server_name *.test;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:$service_port;
}
}
server {
listen 127.0.0.1:80;
server_name *.test;
return 302 https://$http_host$request_uri;
}
}
Проблема с HTTP CONNECT
Основная причина, по которой вы получаете код ответа 400, заключается в том, что nginx является обратным прокси и не поддерживает метод HTTP CONNECT, который требуется для работы с HTTPS-трафиком. При попытке использования curl с HTTPS, nginx не знает, как обрабатывать этот метод, что и приводит к ошибке 400.
Решение проблемы
Чтобы исправить эту ситуацию, вам необходимо использовать nginx с модулем, который поддерживает HTTP CONNECT, или рассмотреть альтернативные решения.
-
Использование NGINX Plus: Если у вас есть доступ к NGINX Plus, эта версия поддерживает метод CONNECT по умолчанию.
-
Установка стороннего модуля: Также существуют сторонние модули, такие как
ngx_http_proxy_connect_module
, которые обеспечивают необходимую функциональность. -
Альтернативный подход: Вместо использования nginx в качестве обратного прокси для mitmproxy, вы можете напрямую прослушивать входящие соединения на порту 2011 mitmproxy и использовать его без промежуточного элемента, таких как nginx.
Заключение
Ошибка, с которой вы столкнулись, указывает на ограничения настройки nginx в контексте работы с HTTPS-трафиком, который требует метода CONNECT. Советуем рассмотреть возможность установки модуля для поддержки CONNECT или использование альтернативного подхода, чтобы избежать дальнейших проблем. Надеемся, что эти рекомендации помогут вам в решении вашей задачи.