Puncte:0

Sintaxa declarațiilor NGINX reverse proxy „dacă nu”?

drapel us

Am un proxy invers nginx pe care vreau să redirecționez practic orice solicitare URL care nu este domeniul meu de nivel superior specific la 404.

Până acum cred că vreau așa ceva în partea de jos a mea /etc/nginx/sites-enabled/site.conf:

Server {
        asculta 80;
        dacă ($gazdă != *domeniu.com) {
                returnează 404 http://$host$request_uri;
        }
}

dar nu cunosc sintaxa exactă aici. Am deja alte blocuri de redirecționare deasupra acestuia, vreau doar ca orice solicitări de adrese URL pentru nume de gazdă numai IP sau alte domenii să primească imediat un 404 și să nu fie transmise serverelor backend.

În plus, am și TLS passthrough pe care aș dori să fac același lucru, dar nu știu complet cum să implementez o instrucțiune if pe blocul de flux. Blocul meu de flux arată așa în /etc/nginx/nginx.conf:

curent {
        harta $ssl_preread_server_name $nume {
                server.domeniu.com;
                www.domeniu.com www;
        }
        server în amonte {
                server backendip:443;
        }
        în amonte www {
                server backendip2:443;
        }
        Server {
                asculta 443;
                proxy_pass $nume;
                ssl_preread on;
        }
}

Pentru asta, aș implementa ceva de genul acesta chiar sub primul bloc de server?

        Server {
                asculta 443;
                dacă ($ssl_preread_server_name != *domain.com) {
                        returnează 404 https://$host$request_uri;
                }
        }

Cred că, pentru securitate, ar trebui să includ și default_server în linia de ascultare pentru ambele blocuri cu instrucțiuni if, sau contează?

Presupun doar o mulțime de sintaxă aici, așa că orice ajutor ar fi foarte apreciat.

Ivan Shatsky avatar
drapel gr
Puteți fie să verificați potrivirea exactă/nepotrivirea pe șiruri de caractere, fie să efectuați potrivirea diferențiată cu majuscule și minuscule cu un model regex. Se pare că căutați `dacă ($var !~ (.*\.)?domeniu\.com$) { ... }`. Recent am dat un răspuns detaliat despre blocarea tuturor accesului prin adresa IP, mai degrabă decât numele gazdei [aici](https://stackoverflow.com/questions/69824838/block-access-with-https-ipaddress-on-nginx/69825652# 69825652).
ehammer avatar
drapel us
Am verificat cealaltă postare a ta, care ajută la blocurile mele http. Încă nu sunteți sigur cum să o faceți cu Nginx TLS passthrough (întoarceți 444 dacă SNI nu este un anumit domeniu)
Ivan Shatsky avatar
drapel gr
Ei bine, nu sunt la fel de informat despre modulul de flux precum despre http one. Nu puteți folosi nimic din modulul de rescriere (inclusiv „dacă”). Nu puteți utiliza `return 444` deoarece modulul de flux are propria sa directivă [`return`](http://nginx.org/en/docs/stream/ngx_stream_return_module.html) diferită de cea http.
Puncte:1
drapel gr

Nu știam cum să închid cu grație o conexiune cu un modul de flux, așa că nu sunt sigur dacă ar fi o soluție corectă, dar merită să încerc (puteți folosi orice port liber pentru serverul fals/upstream):

curent {
    harta $ssl_preread_server_name $nume {
        server.domeniu.com;
        www.domeniu.com www;
        manechin implicit;
    }
    server în amonte {
        server backendip:443;
    }
    în amonte www {
        server backendip2:443;
    }
    manechin în amonte {
        backend 127.0.0.1:4343;
    }
    Server {
        asculta 443;
        proxy_pass $nume;
        ssl_preread on;
    }
    Server {
        asculta 4343;
        întoarcere "";
    }
}

Actualizați

După ce testez soluția de mai sus, pot confirma că este funcțională. Cu toate acestea, produce o intrare de jurnal de erori precum

WSARecv() a eșuat (10053: O conexiune stabilită a fost întreruptă de software-ul din mașina dvs. gazdă) în timp ce proxy și citiți din amonte, client: 127.0.0.1, server: 127.0.0.1:443, amonte: "127.0.0.1:4343" , octeți de la/către client:517/0, octeți de la/către amonte:0/517

Deci, după ce m-am gândit, am încercat asta:

http {
    Server {
        asculta 4343 ssl;
        ssl_certificate /path/to/selfsigned.crt;
        ssl_certificate_key /path/to/selfsigned.key;
        întoarcere 444;
    }
}
curent {
    harta $ssl_preread_server_name $nume {
        server.domeniu.com;
        www.domeniu.com www;
        manechin implicit;
    }
    server în amonte {
        server backendip:443;
    }
    în amonte www {
        server backendip2:443;
    }
    manechin în amonte {
        backend 127.0.0.1:4343;
    }
    Server {
        asculta 443;
        proxy_pass $nume;
        ssl_preread on;
    }
}

Certificatul și cheia autosemnate pot fi create folosind următoarea comandă:

openssl req -nodes -new -x509 -subj "/CN=localhost" -keyout /path/to/selfsigned.key -out /path/to/selfsigned.crt

Acesta închide corect conexiunea.

Mai mult, chiar și asta a funcționat:

http {
    Server {
        asculta 80 default_server;
        întoarcere 444;
    }
}
curent {
    harta $ssl_preread_server_name $nume {
        server.domeniu.com;
        www.domeniu.com www;
        manechin implicit;
    }
    server în amonte {
        server backendip:443;
    }
    în amonte www {
        server backendip2:443;
    }
    manechin în amonte {
        backend 127.0.0.1:80;
    }
    Server {
        asculta 443;
        proxy_pass $nume;
        ssl_preread on;
    }
}

Desigur, răsuci se plânge de încercarea de strângere de mână pentru numărul incorect al versiunii SSL și există intrări amuzante în jurnalul de acces, cum ar fi

127.0.0.1 - - [05/Nov/2021:01:04:34 +0200] „\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03L\xF9[\xB2\x7F \x99\xB1(\xAC\xB4\x91}\xE2N\xC6H\xE3\xB3_\xD1\xEA\xA3C\x1D\xE5\xE5\xB6\x02\xDB\x04h\xB6 *\xCB\x0E\xC0\ xF5\xB7\xAF[y|\x1B\x14_\xC2g\xEA\xA2\x1E\xB4\xC4Bj3t\xE8d\xE72vm\xF2\x1B\x00>\x13\x02\x13\x03\x13\x, \xC00\x00\x9F\xCC\xA9\xCC\xA8\xCC\xAA\xC0+\xC0/\x00\x9E\xC0$\xC0(\x00k\xC0#\xC0'\x00g\xC0" 400 163 "- " "-"

dar jurnalul de erori este clar.

ehammer avatar
drapel us
Asta pare să funcționeze.Nu mi-am dorit niciodată să închid o conexiune cu grație. Am vrut mai mult de tipul http444 de funcționalitate. Eșuând în tăcere.
Ivan Shatsky avatar
drapel gr
@ehammer Verificați actualizarea.
ehammer avatar
drapel us
Imi place. Aveam deja un bloc implicit HTTP care indică 127.0.0.1:80 către HTTP444, așa că se integrează foarte bine cu asta. Opțiunea ```default``` de sub blocul hărții înseamnă de fapt default_server sau este doar un nume de substituent?
Ivan Shatsky avatar
drapel gr
Este un cuvânt cheie special pentru blocul de hartă, ceea ce înseamnă că această valoare va fi returnată dacă nu se potrivește alte variante. Dacă nu este specificat în mod explicit, valoarea implicită este un șir gol.

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.