“Получен код HTTP 400 от прокси после CONNECT”, пытаясь поставить mitmproxy за nginx

Вопрос или проблема

У меня есть 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, или рассмотреть альтернативные решения.

  1. Использование NGINX Plus: Если у вас есть доступ к NGINX Plus, эта версия поддерживает метод CONNECT по умолчанию.

  2. Установка стороннего модуля: Также существуют сторонние модули, такие как ngx_http_proxy_connect_module, которые обеспечивают необходимую функциональность.

  3. Альтернативный подход: Вместо использования nginx в качестве обратного прокси для mitmproxy, вы можете напрямую прослушивать входящие соединения на порту 2011 mitmproxy и использовать его без промежуточного элемента, таких как nginx.

Заключение
Ошибка, с которой вы столкнулись, указывает на ограничения настройки nginx в контексте работы с HTTPS-трафиком, который требует метода CONNECT. Советуем рассмотреть возможность установки модуля для поддержки CONNECT или использование альтернативного подхода, чтобы избежать дальнейших проблем. Надеемся, что эти рекомендации помогут вам в решении вашей задачи.

Оцените материал
Добавить комментарий

Капча загружается...