Как авторизовать соединение от Google Chrome (Selenium-Driverless) к reverse proxy развернутому в Varnish
Применяю python скрипт использующий Selenium-Driverless для получения данных некоторых сайтов. В его работе использую прокси. Раньше без проблем удавалось получать доступ к сайтам через прокси (все прокси имеют формат user:password@ip:port).
Но сейчас потребовалось развернуть обратный прокси на Varnish, который получая запрос и сверяю в нем значения заголовка Proxy-Authorization проксировал запрос в иные прокси. Система отлично работает через обычные http запросы из скрипта python. Проблема возникла с тем, что Google Chrome не отправляет в запросе CONNECT заголовок Proxy-Authorization.
Данные по запросу от Google Chrome на подключение к прокси:
Begin req 45 rxreq
VCL_use boot
ReqMethod CONNECT
ReqURL domain.com:443
ReqProtocol HTTP/1.1
ReqHeader Host: domain.com:443
ReqHeader Proxy-Connection: keep-alive
ReqHeader User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
ReqHeader X-Forwarded-For: 111.22.3.4
VCL_call RECV
VCL_return synth
VCL_call HASH
VCL_return lookup
RespProtocol HTTP/1.1
RespStatus 407
RespReason Proxy Authentication Required
RespHeader Server: Varnish
RespHeader X-Varnish: 46
VCL_call SYNTH
RespHeader Content-Type: text/html; charset=utf-8
RespHeader Retry-After: 5
VCL_return deliver
RespHeader Content-Length: 306
Storage malloc Transient
Filters
RespHeader Connection: keep-alive
End
Я пробовал установку кук перед подключением прокси в Selenium-Driverless и попробовал через них определить нужный прокси сервер для запроса. Но обработать куки в Varnish не удалось. Так же попробовал найти зацепку из модуля proxy в Varnish, выводя значения proxy.alpn() и proxy.authority(), но никаких данных не было. Зацепок по самому запросу, тоже не смог увидеть.
Использование какого-то рандомного прокси для запросов от Chrome я не могу, мне нужно использовать всегда определенный. Вопрос, можно ли как то получить авторизационные данные прокси при запросе от Google Chrome?
Ответы (1 шт):
Со своей версией Varnish я нашел решение в развороте демона Varnish с прослушиванием множества портов, в файле сервиса я указываю их через -a :port
ExecStart=/usr/sbin/varnishd \
-a :port1 \
-a :port2 \
-a :port3 \
...
-f /etc/varnish/default.vcl
Затем в конфиг файле я прописываю проверки по значению порта из local.endpoint и от его значения делаю выбор нужного прокси под запрос. Решение не идеально, но под мои требования оно подходит. Как доп. вариант использовать еще один обратный прокси перед Varnish, условный Nginx или HAPRoxy, и в нем я думаю получится упростить маршрутизацию трафика по нужному прокси.