Oba klijenta su na istom prijenosnom računaru, prolaze kroz isti tunel, a samo se jedan od njih povezuje. To poređenje izgleda kao dokaz da je VPN selektivan, dok je mnogo češće objašnjenje da dva klijenta biraju različita odredišta. GUI čuva svoj host, port, ulogu i TLS postavke i tiho gradi SSH prosljeđivanje kada mu zatreba, dok psql sastavlja vezu iz libpq zadanih vrijednosti koje je vaša ljuska možda već postavila. Reproduciranje radne veze stvar je čitanja GUI postavki, a ne ponovne instalacije tunela.

Mit: jedan radni klijent dokazuje put

Ako se GUI povezuje, tunel prenosi saobraćaj, i to je jedino što GUI dokazuje. On ne govori ništa o tome koju adresu psql razrješava, pod kojom se ulogom autentificira ili napušta li soket koji otvara mašinu. Put je zajednički; parametri nisu.

Lokalno prosljeđivanje proširuje razliku. GUI se može povezati na 127.0.0.1 na portu koji je proslijedio preko SSH, a taj slušalac postoji samo dok traje GUI sesija. psql usmjeren na localhost bez prosljeđivanja dobija odbijenu vezu koja nema nikakve veze s VPN-om.

Pročitajte odredište koje GUI zaista koristi

Otvorite svojstva veze i kopirajte četiri vrijednosti: host, port, bazu podataka i ulogu. Zatim potražite karticu tunela, jer SSH prosljeđivanje pretvara privatnu adresu u lokalni port i mijenja ono što treba reći psql-u.

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

Svaki red pada na drugom sloju, a poruka koju dobijete imenuje taj sloj. Lijepljenje prijateljskog imena sačuvanog profila u psql ne nosi nijednu od gornjih vrijednosti, a naziv usluge se razrješava kroz datoteku koju terminal možda nikada neće pročitati.

Šta libpq nasljeđuje od vaše ljuske

psql je tanki klijent nad libpq-om, a libpq čita okruženje prije nego što pročita bilo šta drugo. Varijable kao što su PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE i PGSSLMODE mogu svaka preusmjeriti dio veze. One se nasljeđuju, a ne upisuju, pa ništa u komandi koju ste pokrenuli ih ne pokazuje. Izvezena PGSSLMODE također može promijeniti šta klijent prihvata bez ijedne riječi na komandnoj liniji.

Dvije od tih varijabli prve zaslužuju sumnju. PGHOSTADDR daje numeričko odredište koje nadjačava razrješavanje imena dok ime hosta i dalje upravlja identitetom certifikata, a PGSERVICE izvlači host, bazu podataka i TLS izbore iz datoteke usluge. Izvlačenje cijelog okruženja radi otklanjanja greške loša je navika, jer može sadržavati lozinke i nepovezane tokene; umjesto toga odaberite varijable koje vas zanimaju.

Izostavljanje i host i hostaddr bira Unix domen soket umjesto mrežne adrese. Poziv psql-a bez -h stoga može uspjeti lokalno ili pasti sa greškom soketa, a da nikada ne dotakne rutu koju GUI koristi.

Pošaljite iste parametre ručno

Sa GUI vrijednostima u ruci, prenesite ih eksplicitno i preskočite datoteku za pokretanje koja bi mogla dodati nadjačavanja. Niz veze ispod je ilustrativan: zamijenite odredište, port, bazu podataka i ulogu vrijednostima koje je odobrio vaš administrator i zadržite konfiguraciju povjerenja koja već radi.

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

Tri detalja u toj komandi su namjerna. -X potiskuje psql datoteku za pokretanje, iako ne potiskuje libpq okruženje ni definiciju usluge. connect_timeout=5 sprječava da ruta u prazno objesi terminal na minute. sslmode=verify-full drži provjere certifikata i imena hosta uključenim, što je upravo dio koji ljudi isključe kada se pojavi TLS greška.

Ako odobreno odredište stoji iza poolera, port 6432 i port 5432 mogu doći do istih podataka kroz različite identitete servera, a verifikacija može pasti na imenu poolera umjesto baze podataka. Ispravite ime u nizu veze umjesto da oslabite način rada.

Neka poruka o grešci odabere sljedeći korak

Tekst neuspjeha kaže dokle je pokušaj stigao i to pobjeđuje svaku pretpostavku o tunelu. Ime koje se ne razrješava pada prije nego što soket postoji, istek vremena znači da je ruta ili firewall odbacio pakete, odbijanje znači da je nešto odgovorilo i odbilo, a greška autentifikacije znači da je mreža već radila.

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

Uporedite izlaz \conninfo sa živom GUI sesijom: isti host, isti port, ista uloga, isto TLS stanje. Kada se ta četiri slože, VPN više nema šta objašnjavati. Dok se ne slože, svaka dodatna promjena tunela je pretpostavka o vezi koju terminal nikada nije ostvario.

Povezani članci