Trebuie să configurez un server HTTP/HTTPS transparent (proxy X) cu NGINX pentru a trimite traficul cu autorizația necesară către punctul final proxy (proxy Y).Punctul final proxy (B) necesită autorizare de bază pentru a accepta trafic.
Analogia ar fi asa:
Client C
solicită URL (de exemplu, ifconfig.co) -> DNS personalizat rezolvă cererea de proxy X
-> Proxy (X)
acceptă cererea și manipulează antetul pentru a adăuga autentificare de bază -> Proxy X
transmite cererea către punctul final proxy Y
Ar trebui să obțină rezultatul exact ca următorul cURL:
Aici folosesc https://ifconfig.co pentru a verifica IP-ul punctului final.
HTTP
curl -x http://proxy_endpoint:proxy_port -U „nume utilizator”: „parolă” -k https://ifconfig.co
HTTPS
curl -x http://proxy_endpoint:proxy_port -U „nume utilizator”: „parolă” -k https://ifconfig.co
Testare:
Pentru a testa configurarea, adaug o înregistrare în contul meu /etc/hosts
sa rezolv ifconfig.co
pe serverul meu Proxy X
Apoi, fac un cURL
#http
curl http://ifconfig.co
#https
curl https://ifconfig.co
Un rezultat de succes ar trebui să-mi dea IP-ul proxy-ului punctului final Y
Trafic HTTP:
Am căutat pe net o soluție folosind module NGINX și am găsit un răspuns foarte util aici: https://serverfault.com/a/345244/954119
Cu toate acestea, acest răspuns m-a ajutat doar să trimit trafic HTTP, nu HTTPS. Iată ce am configurat pentru HTTP pe portul 80 în nginx.conf:
http {
includ /etc/nginx/mime.types;
aplicație de tip_default/octet-stream;
log_format principal „$remote_addr - $remote_user [$time_local] „$request” '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log principal;
sendfile activat;
#tcp_nopush on;
keepalive_timeout 300;
proxy_set_header Gazdă $gazdă;
proxy_set_header X-Real-IP $adresă_la distanță;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Server {
asculta *:80;
access_log /var/log/nginx/nginx.access.log;
error_log /var/log/nginx/nginx.error.log;
Locație / {
proxy_pass http://proxy_endpoint_Y:PORT;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_set_header Gazdă $gazdă;
proxy_set_header X-Real-IP $adresă_la distanță;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Autorizare proxy „Șir-codat de bază 64”;
}
}
}
Așa că am setat http
directivă cu Server
care ascultă pe portul 80 și configurat Locație
cu proxy_set_header Autorizare proxy
cu nume de utilizator/pass codificat bas64.
Acest lucru funcționează foarte bine de fapt și face trafic HTTP (portul 80) proxy către punctul final de proxy, cu toate acestea, traficul HTTPS nu va funcționa.
Trafic HTTPS
Deci, când m-am schimbat asculta
la 443
in schimb:
http {
includ /etc/nginx/mime.types;
aplicație de tip_default/octet-stream;
log_format principal „$remote_addr - $remote_user [$time_local] „$request” '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log principal;
sendfile activat;
keepalive_timeout 300;
Server {
asculta *:443;
access_log /var/log/nginx/nginx.access.log;
error_log /var/log/nginx/nginx.error.log;
Locație / {
proxy_pass http://proxy_endpoint_Y:PORT;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_set_header Gazdă $gazdă;
proxy_set_header X-Real-IP $adresă_la distanță;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Autorizare proxy „Șir-codat de bază 64”;
}
}
}
eroare cURL pe clientul meu C
:
curl: (35) eroare:1400410B:Rutine SSL:CONNECT_CR_SRVR_HELLO:număr de versiune greșit
În jurnalele mele de acces, primesc un jurnal foarte ciudat:
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 "-" "-"
Trebuie doar să manipulez traficul HTTPS pentru a adăuga antetul de autorizare? Este posibil? Sau există o altă modalitate de abordare?
Notă:
Am încercat să folosesc curent
modul pe care l-am folosit înainte pentru a trimite trafic HTTPS către punctele finale, dar fără autorizare, dar nu văd nicio opțiune în NGINX curent
documentația modulului pentru a manipula antetele cererilor. http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html
Mediul de sistem:
Versiunea nginx: nginx/1.21.6 construit de gcc 9.3.0 (Ubuntu
9.3.0-10ubuntu2) construit cu OpenSSL 1.1.1f 31 mar 2020 Suport SNI TLS activat