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.

SettingWhat the GUI holdsWhat psql uses when the value is absent
DestinationA saved hostname, sometimes behind a forwardA local Unix socket, not the remote endpoint
PortThe direct port or a forwarded local port5432, or the port from a service file
Role and databaseStored per connection profileYour operating-system user name
TLS identityIts own CA bundle and verification modeWhatever PGSSLMODE or the service file says
Startup filesNot read at allRead 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 --version

Võ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.

Seotud artiklid