VPN neblokuje psql: váš klient míří jinam
psql a klient GUI mohou z jednoho počítače mířit na různé cílové body. Než obviníte VPN, porovnejte host, socket, roli a TLS.
Oba klienti sedí na stejném notebooku, procházejí stejným tunelem a připojí se jen jeden z nich. To srovnání vypadá jako důkaz, že VPN je vybíravá, zatímco mnohem častější vysvětlení je, že oba klienti míří na různé cíle. GUI si drží vlastní host, port, roli a nastavení TLS a tiše si staví SSH přesměrování, když ho potřebuje, kdežto psql sestavuje spojení z výchozích hodnot libpq, které váš shell možná už nastavil. Zreprodukovat fungující spojení znamená přečíst nastavení GUI, ne přeinstalovat tunel.
Mýtus: jeden fungující klient dokazuje cestu
Pokud se GUI připojí, tunel přenáší provoz, a to je to jediné, co GUI dokazuje. Neříká nic o tom, kterou adresu psql překládá, pod jakou rolí se autentizuje, ani zda socket, který otevře, vůbec opustí počítač. Cesta je sdílená; parametry ne.
Lokální přesměrování rozdíl rozšiřuje. GUI se může připojit na 127.0.0.1 na portu, který přesměroval přes SSH, a tento posluchač existuje jen po dobu relace GUI. psql namířený na localhost bez přesměrování dostane odmítnuté spojení, které s VPN nemá nic společného.
Přečtěte cílový bod, který GUI skutečně používá
Otevřete vlastnosti připojení a zkopírujte čtyři hodnoty: host, port, databázi a roli. Pak hledejte kartu tunelu, protože SSH přesměrování mění soukromou adresu na lokální port a mění, co je třeba psql říct.
| 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ý řádek selhává v jiné vrstvě a zpráva, kterou dostanete, tu vrstvu pojmenuje. Vložení přátelského názvu uloženého profilu do psql nenese žádnou z výše uvedených hodnot a název služby se překládá přes soubor, který terminál možná nikdy nepřečte.
Co libpq dědí z vašeho shellu
psql je tenký klient nad libpq a libpq čte prostředí dřív, než přečte cokoli jiného. Proměnné jako PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE a PGSSLMODE mohou každá přesměrovat část spojení. Dědí se, místo aby se psaly, takže nic v příkazu, který jste spustili, je neukazuje. Exportovaná PGSSLMODE také může změnit, co klient přijme, aniž by na příkazovém řádku padlo slovo.
Dvě z těchto proměnných si zaslouží podezření jako první. PGHOSTADDR dodává číselný cíl, který přebíjí překlad názvů, zatímco název hostitele stále určuje identitu certifikátu, a PGSERVICE vytahuje host, databázi a volby TLS ze souboru služby. Vysypat celé prostředí kvůli ladění je špatný zvyk, protože může obsahovat hesla a nesouvisející tokeny; vyberte místo toho proměnné, které vás zajímají.
Vynechání host i hostaddr vybere socket domény Unix místo síťové adresy. Volání psql bez -h proto může lokálně uspět, nebo selhat s chybou socketu, aniž by se kdy dotklo trasy, kterou GUI používá.
Pošlete stejné parametry ručně
S hodnotami GUI v ruce je předejte explicitně a přeskočte startovní soubor, který by mohl přidat přepisy. Připojovací řetězec níže je ilustrativní: nahraďte cílový bod, port, databázi a roli hodnotami, které schválil váš správce, a ponechte konfiguraci důvěry, která už funguje.
psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"Tři detaily v tomto příkazu jsou záměrné. -X potlačuje startovní soubor psql, i když nepotlačuje prostředí libpq ani definici služby. connect_timeout=5 brání tomu, aby trasa do prázdna zablokovala terminál na minuty. sslmode=verify-full drží kontroly certifikátu a názvu hostitele zapnuté, což je přesně ta část, kterou lidé vypnou, když se objeví chyba TLS.
Pokud schválený cílový bod stojí za poolerem, port 6432 a port 5432 mohou dosáhnout stejných dat přes různé identity serveru a ověření může selhat na názvu pooleru místo databáze. Opravte název v připojovacím řetězci, místo abyste oslabili režim.
Ať další krok vybere chybová zpráva
Text selhání říká, jak daleko se pokus dostal, a to je lepší než jakýkoli odhad o tunelu. Název, který se nepřeloží, selže dřív, než existuje socket, časový limit znamená, že trasa nebo firewall zahodil pakety, odmítnutí znamená, že něco odpovědělo a odmítlo, a chyba ověření znamená, že síť 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 --versionPorovnejte výstup \conninfo s živou relací GUI: stejný host, stejný port, stejná role, stejný stav TLS. Když se ty čtyři shodnou, VPN už nemá co vysvětlovat. Dokud se neshodnou, každá další změna tunelu je odhad o spojení, které terminál nikdy neuskutečnil.