Puncte:0

Nginx: Redirecționați traficul HTTPS către un server proxy care necesită autentificare

drapel in

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

djdomi avatar
drapel za
nu funcționează nu este o descriere a erorii. Vă rugăm să furnizați configurația completă a reamintirii „nu funcționează”, că portul implicit nu trebuie să fie declarat
ahmadrg avatar
drapel in
@djdomi A adăugat mai multe detalii și clarificări la postare. Mulțumiri.
dave_thompson_085 avatar
drapel jp
Pentru ca nginx să gestioneze HTTPS [aveți nevoie de `listen *:443 ssl` plus directive(e) pentru a seta certificatul/lanțul și cheia](https://nginx.org/en/docs/http/ngx_http_ssl_module.html). Cu configurația pe care o aveți, nginx așteaptă HTTP-clear pe 443, așa că atunci când clientul folosește de fapt HTTPS, prima înregistrare SSL/TLS (strângere de mână ClientHello) apare în jurnal ca o solicitare HTTP de gunoi `\x16\x03\x01etcetc `
dave_thompson_085 avatar
drapel jp
PS: fluxul nu poate nici analiza/recunoaște și nici modifica anteturile HTTP, deoarece nu necesită sau așteaptă HTTP, doar octeți, iar octeții nu au antete sau chiar linii.
ahmadrg avatar
drapel in
@dave_thompson_085 Vă mulțumim pentru clarificare. Eu explorez alte module cu NGINX, cum ar fi https://github.com/chobits/ngx_http_proxy_connect_module#example-for-curl Menționează autentificarea de bază în documentație și în discuție. Voi actualiza postarea după ce voi avea o vedere clară sau am găsit o soluție.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.