Рейтинг:0

Nginx: перенаправить HTTPS-трафик на прокси-сервер, требующий аутентификации

флаг in

Мне нужно настроить прозрачный сервер HTTP/HTTPS (прокси X) с NGINX для проксирования трафика с авторизацией, необходимой для конечной точки прокси (прокси Y).Конечная точка прокси (B) требует базовой авторизации для приема трафика.

Аналогия будет такой:

Клиент С запрашивает URL (например, ifconfig.co) -> Пользовательский DNS разрешает запрос к прокси Икс -> Прокси (ИКС) принимает запрос и манипулирует заголовком, чтобы добавить базовую аутентификацию -> Прокси Икс перенаправляет запрос на конечную точку прокси Д

Он должен достичь точного результата, как показано ниже cURL: Здесь я использую https://ifconfig.co чтобы проверить IP конечной точки.

HTTP

curl -x http://proxy_endpoint:proxy_port -U 'имя пользователя':'пароль' -k https://ifconfig.co

HTTPS

curl -x http://proxy_endpoint:proxy_port -U 'имя пользователя':'пароль' -k https://ifconfig.co

Тестирование:

Чтобы проверить настройку, я добавляю запись в свой /и т.д./хосты Решить ifconfig.co на мой прокси-сервер X

Затем я делаю cURL

#http
завиток http://ifconfig.co

#https
завиток https://ifconfig.co

Успешный результат должен дать мне IP-адрес прокси-сервера конечной точки. Д


HTTP-трафик:

Я много искал в Интернете решение с использованием модулей NGINX и нашел очень полезный ответ здесь: https://serverfault.com/a/345244/954119

Однако этот ответ помог мне отправить только HTTP-трафик, а не HTTPS. Вот что я настроил для HTTP на порту 80 в nginx.conf:

http {
    включить /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$статус $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    журнал_доступа /var/log/nginx/access.log основной;

    отправить файл включен;
    #tcp_npush включен;

    keepalive_timeout 300;

    proxy_set_header Хост $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  сервер {
    слушать *:80;
    журнал_доступа /var/log/nginx/nginx.access.log;
    журнал_ошибок /var/log/nginx/nginx.error.log;

    место расположения / {
        proxy_pass http://proxy_endpoint_Y:PORT;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_set_header Хост $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Proxy-Authorization "Базовая строка в кодировке base64";
    }
  }


}

Поэтому я установил http директива с сервер который слушает порт 80 и настроен место расположения с proxy_set_header Прокси-авторизация с именем пользователя/паролем в кодировке bas64.

На самом деле это работает очень хорошо и передает прокси-трафик HTTP (порт 80) на конечную точку прокси, однако трафик HTTPS не будет работать.


HTTPS-трафик

Итак, когда я изменил Слушать к 443 вместо:

http {
    включить /etc/nginx/mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$статус $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    журнал_доступа /var/log/nginx/access.log основной;
    отправить файл включен;

    keepalive_timeout 300;

  сервер {
    слушать *:443;
    журнал_доступа /var/log/nginx/nginx.access.log;
    журнал_ошибок /var/log/nginx/nginx.error.log;

    место расположения / {
        proxy_pass http://proxy_endpoint_Y:PORT;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_set_header Хост $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Proxy-Authorization "Базовая строка в кодировке base64";
    }
  }


}

ошибка cURL на моем клиенте С:

curl: (35) ошибка: 1400410B: подпрограммы SSL: CONNECT_CR_SRVR_HELLO: неверный номер версии

В моих журналах доступа я получаю очень странный журнал:

xx.xxx.xx.x - - [26/Mar/2022:21:43:54 +0000] "\x16\x03\x01\x00\xE1\x01\x00\x00\xDD\x03\x03W\x87> \x1E+1\xDFb\x13\x1E,\xC0\xE9\xEF\x07\xAB[\xEA!\xBE\x17\xC23\x8D\xBD\xA4\xEA\xB5\xD5s\x8AO\x00\x00\ x5C\xC00\xC0,\xC0(\xC0$\xC0\x14\xC0" 400 157 "-" "-"

Мне просто нужно манипулировать HTTPS-трафиком, чтобы добавить заголовок авторизации? Это возможно? Или есть другой подход?

Примечание:

я пытался использовать транслировать модуль, который я использовал раньше для отправки HTTPS-трафика на конечные точки, но без авторизации, но я не вижу никакой опции в NGINX транслировать документация модуля для управления заголовками запросов. http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html

Системная среда:

Версия nginx: nginx/1.21.6, созданная gcc 9.3.0 (Ubuntu 9.3.0-10ubuntu2), построенный с OpenSSL 1.1.1f 31 марта 2020 г. Поддержка TLS SNI включена

djdomi avatar
флаг za
не работает - это не описание ошибки. пожалуйста, предоставьте полную конфигурацию «не работает», напомните, что порт по умолчанию не нужно объявлять
ahmadrg avatar
флаг in
@djdomi Добавил в пост больше подробностей и пояснений. Спасибо.
dave_thompson_085 avatar
флаг jp
Чтобы nginx обрабатывал HTTPS [вам нужно `listen *:443 ssl` плюс директива(ы) для установки сертификата/цепочки и ключа](https://nginx.org/en/docs/http/ngx_http_ssl_module.html). С имеющейся у вас конфигурацией nginx ожидает очистки HTTP на 443, поэтому, когда клиент фактически использует HTTPS, первая запись SSL/TLS (рукопожатие ClientHello) появляется в вашем журнале как мусорный HTTP-запрос `\x16\x03\x01etcetc `
dave_thompson_085 avatar
флаг jp
PS: поток не может ни анализировать/распознавать, ни изменять заголовки HTTP, потому что он не требует и не ожидает HTTP, только байты, а байты не имеют заголовков или даже строк.
ahmadrg avatar
флаг in
@ dave_thompson_085 Спасибо за разъяснение. Я изучаю другие модули с NGINX, такие как https://github.com/chobits/ngx_http_proxy_connect_module#example-for-curl. Базовая аутентификация упоминается в документации и в обсуждении. Я обновлю пост, как только у меня будет четкое представление или я найду решение.

Ответить или комментировать

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