VPN ne blokira psql: vaš klijent bira drugo odredište
psql i GUI klijent mogu birati različita odredišta s iste mašine. Uporedite host, soket, ulogu i TLS prije nego optužite VPN.
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.
| 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 |
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 --versionUporedite 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.