Obaja klienti sedia na tom istom notebooku, prechádzajú tým istým tunelom a pripojí sa len jeden z nich. To porovnanie vyzerá ako dôkaz, že VPN je selektívna, kým oveľa častejšie vysvetlenie je, že obaja klienti mieria na rôzne ciele. GUI si drží vlastný host, port, rolu a nastavenia TLS a potichu si stavia SSH presmerovanie, keď ho potrebuje, kým psql skladá spojenie z predvolených hodnôt libpq, ktoré váš shell možno už nastavil. Zreprodukovať fungujúce spojenie znamená prečítať nastavenia GUI, nie preinštalovať tunel.

Mýtus: jeden fungujúci klient dokazuje cestu

Ak sa GUI pripojí, tunel prenáša prevádzku, a to je to jediné, čo GUI dokazuje. Nehovorí nič o tom, ktorú adresu psql prekladá, pod akou rolou sa autentizuje, ani či socket, ktorý otvorí, vôbec opustí počítač. Cesta je spoločná; parametre nie.

Lokálne presmerovanie rozdiel rozširuje. GUI sa môže pripojiť na 127.0.0.1 na porte, ktorý presmeroval cez SSH, a tento poslucháč existuje len počas relácie GUI. psql namierený na localhost bez presmerovania dostane odmietnuté spojenie, ktoré s VPN nemá nič spoločné.

Prečítajte cieľový bod, ktorý GUI skutočne používa

Otvorte vlastnosti pripojenia a skopírujte štyri hodnoty: host, port, databázu a rolu. Potom hľadajte kartu tunela, pretože SSH presmerovanie mení súkromnú adresu na lokálny port a mení, čo treba psql povedať.

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

Každý riadok zlyhá v inej vrstve a správa, ktorú dostanete, tú vrstvu pomenuje. Vloženie priateľského názvu uloženého profilu do psql neprenesie žiadnu z vyššie uvedených hodnôt a názov služby sa prekladá cez súbor, ktorý terminál možno nikdy neprečíta.

Čo libpq dedí z vášho shellu

psql je tenký klient nad libpq a libpq číta prostredie skôr, než číta čokoľvek iné. Premenné ako PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE a PGSSLMODE môžu každá presmerovať časť pripojenia. Dedia sa, namiesto aby sa písali, takže nič v príkaze, ktorý ste spustili, ich neukazuje. Exportovaná PGSSLMODE tiež môže zmeniť, čo klient akceptuje, bez jediného slova na príkazovom riadku.

Dve z týchto premenných si zaslúžia podozrenie ako prvé. PGHOSTADDR dodáva číselný cieľ, ktorý obchádza preklad názvov, kým názov hostiteľa stále určuje identitu certifikátu, a PGSERVICE vyťahuje host, databázu a voľby TLS zo súboru služby. Vypísať celé prostredie pri ladení je zlý zvyk, pretože môže obsahovať heslá a nesúvisiace tokeny; vyberte si radšej premenné, ktoré vás zaujímajú.

Vynechanie host aj hostaddr vyberie socket domény Unix namiesto sieťovej adresy. Volanie psql bez -h preto môže lokálne uspieť alebo zlyhať s chybou socketu, bez toho aby sa kedy dotklo trasy, ktorú GUI používa.

Pošlite rovnaké parametre ručne

S hodnotami GUI v ruke ich odovzdajte explicitne a preskočte štartovací súbor, ktorý by mohol pridať prepisy. Pripojovací reťazec nižšie je ilustratívny: nahraďte cieľový bod, port, databázu a rolu hodnotami, ktoré schválil váš správca, a ponechajte konfiguráciu dôvery, ktorá už funguje.

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

Tri detaily v tomto príkaze sú zámerné. -X potláča štartovací súbor psql, hoci nepotláča prostredie libpq ani definíciu služby. connect_timeout=5 bráni tomu, aby trasa do prázdna zablokovala terminál na minúty. sslmode=verify-full drží kontroly certifikátu a názvu hostiteľa zapnuté, čo je presne tá časť, ktorú ľudia vypnú, keď sa objaví chyba TLS.

Ak schválený cieľový bod stojí za poolerom, port 6432 a port 5432 môžu dosiahnuť rovnaké dáta cez rôzne identity servera a overenie môže zlyhať na názve poolera namiesto databázy. Opravte názov v pripojovacom reťazci namiesto oslabenia režimu.

Nech ďalší krok vyberie chybová správa

Text zlyhania hovorí, ako ďaleko sa pokus dostal, a to je lepšie než akýkoľvek odhad o tuneli. Názov, ktorý sa nepreloží, zlyhá skôr, než existuje socket, časový limit znamená, že trasa alebo firewall zahodil pakety, odmietnutie znamená, že niečo odpovedalo a odmietlo, a chyba overenia znamená, že sieť už fungovala.

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

Porovnajte výstup \conninfo so živou reláciou GUI: rovnaký host, rovnaký port, rovnaká rola, rovnaký stav TLS. Keď sa tie štyri zhodnú, VPN už nemá čo vysvetľovať. Kým sa nezhodnú, každá ďalšia zmena tunela je odhad o spojení, ktoré terminál nikdy neuskutočnil.

Súvisiace články