Begge klientane sit på same berbare datamaskin, går gjennom same tunnel, og berre éin av dei koplar til. Samanlikninga kjennest som prov på at VPN-en er selektiv, medan den langt vanlegare forklaringa er at dei to klientane går til ulike destinasjonar. Eit GUI held sin eigen vert, port, rolle og TLS-innstillingar og byggjer stille ei SSH-vidaresending når det treng det, medan psql set saman ei tilkopling frå libpq-standardverdiar som skalet ditt kanskje alt har sett. Å gjenskape den fungerande tilkoplinga er eit spørsmål om å lese innstillingane til GUI-et, ikkje om å installere tunnelen på nytt.

Myten: éin fungerande klient provar vegen

Viss GUI-et koplar til, fører tunnelen trafikk, og det er det einaste GUI-et provar. Det seier ingenting om kva adresse psql slår opp, kva rolle det autentiserer som, eller om sokkelen det opnar nokon gong forlèt maskina. Vegen er delt; parametrane er det ikkje.

Ei lokal vidaresending aukar skilnaden. GUI-et kan kople til 127.0.0.1 på ein port det har vidaresendt over SSH, og den lyttaren finst berre så lenge GUI-økta varer. psql retta mot localhost utan vidaresendinga får ei avvist tilkopling som ikkje har noko med VPN-en å gjere.

Les endepunktet GUI-et faktisk brukar

Opne eigenskapane til tilkoplinga og kopier fire verdiar: vert, port, database og rolle. Sjå deretter etter ei tunnel-fane, fordi ei SSH-vidaresending gjer ei privat adresse om til ein lokal port og endrar kva psql må få beskjed om.

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

Kvar rad feilar i eit ulikt lag, og meldinga du får namngir det laget. Å lime inn det venlege namnet til den lagra profilen i psql ber ingen av verdiane ovanfor, og eit tenestnamn blir slått opp gjennom ei fil terminalen kanskje aldri les.

Kva libpq arvar frå skalet ditt

psql er ein tynn klient over libpq, og libpq les miljøet før det les noko anna. Variablar som PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE og PGSSLMODE kan kvar omdirigere ein del av tilkoplinga. Dei blir arva i staden for skrivne, så ingenting i kommandoen du køyrde viser dei. Ein eksportert PGSSLMODE kan òg endre kva klienten godtek utan eit ord på kommandolinja.

To av desse variablane fortener mistanke først. PGHOSTADDR leverer ein numerisk destinasjon som overstyrer namneoppslag medan vertsnamnet framleis styrer identiteten til sertifikatet, og PGSERVICE trekkjer vert, database og TLS-val ut av ei tenestefil. Å dumpe heile miljøet for å feilsøkje dette er ein dårleg vane, sidan det kan innehalde passord og urelaterte token; vel i staden variablane du bryr deg om.

Å utelate både host og hostaddr vel ein Unix-domenesokkel i staden for ei nettverksadresse. Eit psql-kall utan -h kan difor lukkast lokalt, eller feile med ein sokkel-feil, utan å nokon gong røre ruta GUI-et brukar.

Send dei same parametrane for hand

Med verdiane til GUI-et i handa, send dei eksplisitt og hopp over oppstartsfila som kan leggje til overstyringar. Tilkoplingsstrengen nedanfor er illustrativ: byt ut endepunktet, porten, databasen og rolla med verdiane administratoren din har godkjent, og hald fram med tillitskonfigurasjonen som alt fungerer.

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

Tre detaljar i den kommandoen er medvite. -X undertrykkjer oppstartsfila til psql, sjølv om det ikkje undertrykkjer libpq-miljøet eller ein tenestedefinisjon. connect_timeout=5 hindrar at ei svart-hol-rute får terminalen til å henge i minutt. sslmode=verify-full held sertifikat- og vertsnamnkontrollar på, som er nettopp den delen folk slår av når ein TLS-feil dukkar opp.

Viss det godkjende endepunktet ligg bak ein pooler, kan port 6432 og port 5432 nå dei same dataa gjennom ulike serveridentitetar, og verifiseringa kan feile på namnet til pooleren i staden for databasen. Rett namnet i tilkoplingsstrengen i staden for å svekkje modusen.

Lat feilmeldinga velje neste steg

Feilteksten seier kor langt forsøket kom, og det slår kvar gissing om tunnelen. Eit namn som ikkje blir slått opp, feilar før ein sokkel finst, ein tidsavbrot betyr at ruta eller ein brannmur sleppte pakkane, ei avvising betyr at noko svara og avslo, og ein autentiseringsfeil betyr at nettverket alt virka.

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

Samanlikn utdataa frå \conninfo med den aktive økta til GUI-et: same vert, same port, same rolle, same TLS-tilstand. Når dei fire stemmer, har VPN-en ingenting meir å forklare. Inntil dei stemmer, er kvar ekstra tunnelendring ei gissing om ei tilkopling terminalen aldri har laga.

Relaterte artiklar