Oba odjemalca sta na istem prenosniku, gresta skozi isti tunel in poveže se le eden od njiju. Primerjava se zdi kot dokaz, da je VPN izbirčen, medtem ko je veliko pogostejša razlaga ta, da dva odjemalca kličeta različne cilje. GUI ohranja svoj gostitelj, vrata, vlogo in nastavitve TLS ter tiho zgradi posredovanje SSH, ko ga potrebuje, medtem ko psql sestavi povezavo iz privzetih vrednosti libpq, ki jih je vaša lupina morda že nastavila. Ponovna vzpostavitev delujoče povezave je stvar branja nastavitev GUI, ne ponovne namestitve tunela.

Mit: en delujoč odjemalec dokazuje pot

Če se GUI poveže, tunel prenaša promet, in to je edino, kar GUI dokazuje. Ne pove ničesar o tem, kateri naslov razreši psql, s katero vlogo se preverja ali ali vtičnica, ki jo odpre, kdaj zapusti stroj. Pot je skupna; parametri niso.

Lokalno posredovanje poveča razliko. GUI se lahko poveže na 127.0.0.1 na vratih, ki jih je posredoval prek SSH, in ta poslušalec obstaja le, dokler traja seja GUI. psql, usmerjen na localhost brez posredovanja, prejme zavrnjeno povezavo, ki nima nič skupnega z VPN.

Preberite končno točko, ki jo GUI dejansko uporablja

Odprite lastnosti povezave in kopirajte štiri vrednosti: gostitelj, vrata, zbirka podatkov in vloga. Nato poiščite zavihek tunela, ker posredovanje SSH spremeni zasebni naslov v lokalna vrata in spremeni, kaj je treba povedati psql.

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

Vsaka vrstica spodleti na drugem sloju, in sporočilo, ki ga prejmete, poimenuje ta sloj. Prilepitev prijaznega imena shranjenega profila v psql ne prenese nobene od zgornjih vrednosti, ime storitve pa se razreši prek datoteke, ki je terminal morda nikoli ne bo prebral.

Kaj libpq podeduje od vaše lupine

psql je tanek odjemalec nad libpq, in libpq prebere okolje, preden prebere karkoli drugega. Spremenljivke, kot so PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE in PGSSLMODE, lahko vsaka preusmeri del povezave. Podedujejo se, namesto da bi jih vpisali, zato nič v ukazu, ki ste ga zagnali, ne kaže nanje. Izvožena PGSSLMODE lahko tudi spremeni, kaj odjemalec sprejme, brez ene besede v ukazni vrstici.

Dve od teh spremenljivk si zaslužita sum najprej. PGHOSTADDR zagotovi številčni cilj, ki obide razreševanje imen, medtem ko ime gostitelja še vedno določa identiteto potrdila, in PGSERVICE izvleče gostitelja, zbirko podatkov in izbire TLS iz datoteke storitve. Izlivanje celotnega okolja za odpravljanje napak je slaba navada, ker lahko vsebuje gesla in nepovezane žetone; raje izberite spremenljivke, ki vas zanimajo.

Če izpustite host in hostaddr, se izbere vtičnica domene Unix namesto omrežnega naslova. Klic psql brez -h lahko zato uspe lokalno ali spodleti z napako vtičnice, ne da bi se kdaj dotaknil poti, ki jo uporablja GUI.

Pošljite iste parametre ročno

Z vrednostmi GUI v roki jih posredujte izrecno in preskočite zagonsko datoteko, ki bi lahko dodala prepise. Povezovalni niz spodaj je ilustrativen: zamenjajte končno točko, vrata, zbirko podatkov in vlogo z vrednostmi, ki jih je odobril vaš skrbnik, in obdržite konfiguracijo zaupanja, ki že deluje.

psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"

Tri podrobnosti v tem ukazu so namerne. -X zatre zagonsko datoteko psql, čeprav ne zatre okolja libpq ali definicije storitve. connect_timeout=5 prepreči, da bi pot v prazno minutami obesila terminal. sslmode=verify-full ohrani preverjanja potrdila in imena gostitelja vključena, kar je natanko tisti del, ki ga ljudje izklopijo, ko se pojavi napaka TLS.

Če je odobrena končna točka za poolerjem, lahko vrata 6432 in vrata 5432 dosežejo iste podatke prek različnih identitet strežnika, preverjanje pa lahko spodleti na imenu poolerja namesto zbirke podatkov. Popravite ime v povezovalnem nizu, namesto da bi oslabili način.

Naj naslednji korak izbere sporočilo o napaki

Besedilo neuspeha pove, kako daleč je prišel poskus, in to premaga vsako ugibanje o tunelu. Ime, ki se ne razreši, spodleti, preden obstaja vtičnica, časovna omejitev pomeni, da je pot ali požarni zid spustil pakete, zavrnitev pomeni, da je nekaj odgovorilo in zavrnilo, napaka pri preverjanju pa pomeni, da je omrežje že delovalo.

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

Primerjajte izhod \conninfo z živo sejo GUI: isti gostitelj, ista vrata, ista vloga, isto stanje TLS. Ko se ti štirje ujemajo, VPN nima več česa razložiti. Dokler se ne ujemajo, je vsaka dodatna sprememba tunela ugibanje o povezavi, ki je terminal nikoli ni vzpostavil.

Sorodni članki