VPN neblokuje psql: váš klient mieri inam
psql a klient GUI môžu z jedného počítača mieriť na rôzne cieľové body. Pred obvinením VPN porovnajte host, socket, rolu a TLS.
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ť.
| 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 |
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 --versionPorovnajte 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.