Мне нужно настроить прозрачный сервер 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 включена