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.

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ý řá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 --version

Porovnejte 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.

Související články