Ambii clienți stau pe același laptop, trec prin același tunel și doar unul dintre ei se conectează. Comparația pare o dovadă că VPN-ul este selectiv, în timp ce explicația mult mai frecventă este că cei doi clienți merg spre destinații diferite. O interfață grafică își păstrează propriul host, port, rol și setări TLS și construiește în liniște o redirecționare SSH atunci când are nevoie, în timp ce psql asamblează o conexiune din valorile implicite libpq pe care shell-ul tău poate le-a setat deja. Reproducerea conexiunii funcționale ține de citirea setărilor interfeței grafice, nu de reinstalarea tunelului.

Mitul: un client funcțional dovedește calea

Dacă interfața grafică se conectează, tunelul transportă trafic, și acesta este singurul lucru pe care îl dovedește. Nu spune nimic despre ce adresă rezolvă psql, cu ce rol se autentifică sau dacă socketul pe care îl deschide părăsește vreodată mașina. Calea este partajată; parametrii nu.

O redirecționare locală mărește diferența. Interfața se poate conecta la 127.0.0.1 pe un port pe care l-a redirecționat prin SSH, iar acel ascultător există doar cât durează sesiunea interfeței. psql îndreptat spre localhost fără redirecționare primește o conexiune refuzată care nu are nimic de-a face cu VPN-ul.

Citește punctul final pe care interfața îl folosește de fapt

Deschide proprietățile conexiunii și copiază patru valori: host, port, baza de date și rol. Apoi caută o filă de tunel, pentru că o redirecționare SSH transformă o adresă privată într-un port local și schimbă ceea ce trebuie spus lui 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

Fiecare rând eșuează într-un strat diferit, iar mesajul primit numește acel strat. Lipirea numelui prietenos al profilului salvat în psql nu aduce niciuna dintre valorile de mai sus, iar un nume de serviciu este rezolvat printr-un fișier pe care terminalul poate nu-l va citi niciodată.

Ce moștenește libpq din shell-ul tău

psql este un client subțire peste libpq, iar libpq citește mediul înainte de a citi orice altceva. Variabile precum PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE și PGSSLMODE pot redirecționa fiecare o parte a conexiunii. Sunt moștenite, nu tastate, așa că nimic din comanda pe care ai rulat-o nu le arată. Un PGSSLMODE exportat poate schimba și ceea ce acceptă clientul fără un cuvânt pe linia de comandă.

Două dintre aceste variabile merită suspiciune mai întâi. PGHOSTADDR furnizează o destinație numerică ce anulează rezolvarea numelor, în timp ce numele hostului încă guvernează identitatea certificatului, iar PGSERVICE extrage hostul, baza de date și alegerile TLS dintr-un fișier de serviciu. Descărcarea întregului mediu pentru depanare este un obicei prost, fiindcă poate conține parole și tokenuri fără legătură; alege în schimb variabilele care te interesează.

Omiterea atât a host, cât și a hostaddr selectează un socket de domeniu Unix în locul unei adrese de rețea. O chemare psql fără -h poate deci reuși local sau poate eșua cu o eroare de socket, fără a atinge vreodată ruta folosită de interfață.

Trimite aceiași parametri manual

Cu valorile interfeței în mână, transmite-le explicit și sari peste fișierul de pornire care ar putea adăuga suprascrieri. Șirul de conexiune de mai jos este ilustrativ: înlocuiește punctul final, portul, baza de date și rolul cu valorile aprobate de administratorul tău și păstrează configurația de încredere care funcționează deja.

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

Trei detalii din acea comandă sunt deliberate. -X suprimă fișierul de pornire al psql, deși nu suprimă mediul libpq sau o definiție de serviciu. connect_timeout=5 împiedică o rută în gol să blocheze terminalul minute în șir. sslmode=verify-full menține activate verificările certificatului și ale numelui de host, exact partea pe care oamenii o dezactivează când apare o eroare TLS.

Dacă punctul final aprobat stă în spatele unui pooler, portul 6432 și portul 5432 pot ajunge la aceleași date prin identități de server diferite, iar verificarea poate eșua pe numele poolerului în loc de cel al bazei de date. Corectează numele în șirul de conexiune în loc să slăbești modul.

Lasă mesajul de eroare să aleagă pasul următor

Textul eșecului spune cât de departe a ajuns încercarea, iar asta bate orice presupunere despre tunel. Un nume care nu se rezolvă eșuează înainte să existe un socket, un timeout înseamnă că ruta sau un firewall a aruncat pachetele, un refuz înseamnă că ceva a răspuns și a refuzat, iar o eroare de autentificare înseamnă că rețeaua funcționa deja.

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

Compară rezultatul \conninfo cu sesiunea live a interfeței: același host, același port, același rol, aceeași stare TLS. Când cele patru coincid, VPN-ul nu mai are nimic de explicat. Până coincid, fiecare modificare suplimentară a tunelului este o presupunere despre o conexiune pe care terminalul nu a făcut-o niciodată.

Articole similare