VPN ei blokeeri psql-i: sinu klient valib teise sihtkoha
psql ja GUI klient võivad samast masinast valida erinevaid sihtkohti. Enne VPN-i süüdistamist võrdle hosti, socketit, rolli ja TLS-i.
Mõlemad kliendid istuvad samas sülearvutis, läbivad sama tunnelit ja ainult üks neist ühendub. See võrdlus tundub tõestusena, et VPN on valiv, kuigi palju tavalisem seletus on, et kaks klienti valivad erinevad sihtkohad. GUI hoiab oma hosti, porti, rolli ja TLS-i seadeid ning ehitab vaikselt SSH edastuse, kui seda vajab, samal ajal kui psql paneb ühenduse kokku libpq vaikeväärtustest, mille sinu shell võib juba seadnud olla. Töötava ühenduse taasesitamine tähendab GUI seadete lugemist, mitte tunneli uuesti paigaldamist.
Müüt: üks töötav klient tõestab tee
Kui GUI ühendub, kannab tunnel liiklust, ja see on ainus, mida GUI tõestab. See ei ütle midagi selle kohta, millise aadressi psql lahendab, millise rolliga see autendib või kas avatav socket masinast üldse lahkub. Tee on ühine; parameetrid ei ole.
Kohalik edastus suurendab vahet. GUI võib ühenduda aadressiga 127.0.0.1 pordil, mille see SSH kaudu edastas, ja see kuulaja eksisteerib ainult GUI sessiooni kestel. Edastuseta localhostile suunatud psql saab tagasilükatud ühenduse, millel pole VPN-iga midagi pistmist.
Loe sihtkoht, mida GUI tegelikult kasutab
Ava ühenduse atribuudid ja kopeeri neli väärtust: host, port, andmebaas ja roll. Seejärel otsi tunnelit vahekaarti, sest SSH edastus muudab privaatse aadressi kohalikuks pordiks ja muudab seda, mida tuleb psql-ile öelda.
| Setting | What the GUI holds | What psql uses when the value is absent |
|---|---|---|
| Destination | A saved hostname, sometimes behind a forward | A local Unix socket, not the remote endpoint |
| Port | The direct port or a forwarded local port | 5432, or the port from a service file |
| Role and database | Stored per connection profile | Your operating-system user name |
| TLS identity | Its own CA bundle and verification mode | Whatever PGSSLMODE or the service file says |
| Startup files | Not read at all | Read unless -X is passed |
Iga rida ebaõnnestub erinevas kihis ja saadud teade nimetab selle kihi. Salvestatud profiili sõbraliku nime kleepimine psql-i ei kanna ühtegi ülaltoodud väärtust ning teenuse nimi lahendatakse faili kaudu, mida terminal ei pruugi kunagi lugeda.
Mida libpq sinu shellist pärib
psql on õhuke klient libpq peal ja libpq loeb keskkonda enne, kui loeb midagi muud. Muutujad nagu PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE ja PGSSLMODE võivad igaüks ühenduse osa ümber suunata. Neid päritakse, mitte ei kirjutata, seega ei näita käivitatud käsk neist ühtegi. Eksporditud PGSSLMODE võib samuti muuta seda, mida klient aktsepteerib, ilma ühegi sõnata käsureal.
Kaks neist muutujatest väärib esimesena kahtlust. PGHOSTADDR annab numbrilise sihtkoha, mis alistab nime lahendamise, samal ajal kui hostinimi määrab endiselt sertifikaadi identiteedi, ja PGSERVICE tõmbab hosti, andmebaasi ja TLS-i valikud teenusefailist. Kogu keskkonna väljapaiskamine selle silumiseks on halb harjumus, sest see võib sisaldada paroole ja seostamata tunnuseid; vali selle asemel muutujad, mis sind huvitavad.
Nii hosti kui hostaddr-i ärajätmine valib Unixi domeeni socketi, mitte võrguaadressi. Seetõttu võib psql-i kutse ilma -h õnnestuda kohapeal või ebaõnnestuda socketi veaga, ilma et see puudutaks marsruuti, mida GUI kasutab.
Saada samad parameetrid käsitsi
Kui GUI väärtused on käes, edasta need selgesõnaliselt ja jäta vahele algfail, mis võiks lisada alistusi. Allolev ühendusstring on illustratiivne: asenda sihtkoht, port, andmebaas ja roll väärtustega, mille sinu administraator on heaks kiitnud, ning jäta alles usalduse konfiguratsioon, mis juba töötab.
psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"Kolm detaili selles käsus on tahtlikud. -X summutab psql-i algfaili, kuigi ei summusta libpq keskkonda ega teenuse määratlust. connect_timeout=5 hoiab tühja marsruudi terminali minutiteks rippuma jäämast. sslmode=verify-full hoiab sertifikaadi ja hostinime kontrollid sisse lülitatud, mis on täpselt see osa, mille inimesed TLS-i vea ilmudes välja lülitavad.
Kui heakskiidetud sihtkoht asub pooleri taga, võivad port 6432 ja port 5432 jõuda samade andmeteni erinevate serveri identiteetide kaudu ning kontroll võib ebaõnnestuda pigem pooleri kui andmebaasi nime tõttu. Paranda nimi ühendusstringis, selle asemel et režiimi nõrgendada.
Lase veateatel valida järgmine samm
Ebaõnnestumise tekst ütleb, kui kaugele katse jõudis, ja see lööb iga oletuse tunneli kohta. Nimi, mida ei lahendata, ebaõnnestub enne, kui socket olemas on, aegumine tähendab, et marsruut või tulemüür viskas paketid minema, keeldumine tähendab, et miski vastas ja keeldus, ning autentimisviga tähendab, et võrk juba töötas.
psql -X -w "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5" -c '\conninfo'
env | grep -E '^PG'
psql --versionVõrdle \conninfo väljundit GUI elava sessiooniga: sama host, sama port, sama roll, sama TLS-i olek. Kui need neli klapivad, pole VPN-il enam midagi selgitada. Kuni need ei klapi, on iga täiendav tunnelimuudatus oletus ühenduse kohta, mida terminal kunagi ei teinud.