Абодва кліенты сядзяць на тым жа ноўтбуку, праходзяць праз той жа тунель, і злучаецца толькі адзін з іх. Гэтае параўнанне выглядае як доказ, што VPN выбарачны, тады як значна часцейшая прычына ў тым, што два кліенты звяртаюцца да розных пунктаў прызначэння. GUI захоўвае свае ўласныя хаст, порт, ролю і налады TLS і ціха будуе SSH-перанос, калі ён патрэбны, а psql збірае злучэнне з прадвызначаных значэнняў libpq, якія ваша абалонка магла ўжо задаць. Аднаўленне працоўнага злучэння — гэта чытанне налад GUI, а не пераўсталёўка тунеля.

Міф: адзін працуючы кліент даказвае шлях

Калі GUI злучаецца, тунель пераносіць трафік, і гэта ўсё, што GUI даказвае. Ён нічога не кажа пра тое, які адрас разрознівае psql, у якой ролі ён аўтэнтыфікуецца і ці пакідае камп'ютар сокет, які ён адкрывае. Шлях агульны; параметры — не.

Лакальны перанос пашырае разрыў. GUI можа злучыцца з 127.0.0.1 на порце, які ён перанес праз SSH, і гэты слухач існуе толькі падчас сеансу GUI. psql, накіраваны на localhost без пераносу, атрымлівае адмову ў злучэнні, якая не мае нічога агульнага з VPN.

Чытайце пункт прызначэння, які GUI фактычна выкарыстоўвае

Адкрыйце ўласцівасці злучэння і скапіруйце чатыры значэнні: хаст, порт, базу даных і ролю. Затым пашукайце ўкладку тунеля, бо SSH-перанос ператварае прыватны адрас у лакальны порт і змяняе тое, што трэба сказаць 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

Кожны радок зрываецца на розным узроўні, і паведамленне, якое вы атрымліваеце, называе гэты ўзровень. Устаўка зручнай назвы захаванага профілю ў psql не пераносіць ніводнага з пазначаных значэнняў, а назва службы разрозніваецца праз файл, які тэрмінал можа ніколі не прачытаць.

Што libpq наследуе ад вашай абалонкі

psql — гэта тонкі кліент над libpq, і libpq чытае асяроддзе раней, чым што-небудзь іншае. Такія зменныя, як PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE і PGSSLMODE, могуць кожная перанакіраваць частку злучэння. Яны ўспадкоўваюцца, а не ўводзяцца, таму ў камандзе, якую вы запусцілі, іх няма. Экспартаваная PGSSLMODE таксама можа змяніць тое, што прымае кліент, без адзінага слова ў камандным радку.

Дзве з гэтых зменных заслугоўваюць падазрэння ў першую чаргу. PGHOSTADDR дае лікавы пункт прызначэння, які перакрывае разрозніванне імёнаў, пакуль імя хаста ўсё яшчэ вызначае ідэнтычнасць сертыфіката, а PGSERVICE выцягвае хаст, базу даных і выбар TLS з файла службы. Выгружаць усё асяроддзе для адладкі — дрэнная звычка, бо яно можа ўтрымліваць паролі і староннія токены; замест гэтага выберыце патрэбныя зменныя.

Прапуск і host, і hostaddr выбірае сокет дамена Unix, а не сеткавы адрас. Таму выклік psql без -h можа паспешна прайсці лакальна або скончыцца памылкай сокета, нават не крануўшы маршрут, які выкарыстоўвае GUI.

Перадайце тыя ж параметры ўручную

Маючы значэнні GUI, перадайце іх явна і прапусціце файл запуску, які мог бы дадаць перакрыцці. Радок злучэння ніжэй — прыклад: заменіце пункт прызначэння, порт, базу даных і ролю на значэнні, ухваленыя вашым адміністратарам, і захавайце канфігурацыю даверу, якая ўжо працуе.

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

Тры дэталі ў гэтай камандзе наўмысныя. -X падаўляе файл запуску psql, хаця не падаўляе асяроддзе libpq ці вызначэнне службы. connect_timeout=5 не дае маршруту ў нікуды падвесіць тэрмінал на хвіліны. sslmode=verify-full пакідае праверкі сертыфіката і імя хаста ўключанымі, а гэта менавіта тое, што людзі адключаюць, калі з'яўляецца памылка TLS.

Калі ўхвалены пункт прызначэння знаходзіцца за пулам, порт 6432 і порт 5432 могуць дасягаць тых жа даных праз розныя ідэнтычнасці сервера, і праверка можа зваліцца на імені пула, а не базы даных. Выпраўце імя ў радку злучэння замест паслаблення рэжыму.

Хай паведамленне пра памылку выбірае наступны крок

Тэкст збою кажа, як далёка зайшла спроба, і гэта лепш за любыя здагадкі пра тунель. Імя, якое не разрозніваецца, зрываецца да ўзнікнення сокета, тайм-аўт азначае, што маршрут або фэйрвол скінуў пакеты, адмова азначае, што нешта адказала і адмовіла, а памылка аўтэнтыфікацыі азначае, што сетка ўжо працавала.

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

Параўнайце вывад \conninfo з жывым сеансам GUI: той жа хаст, той жа порт, тая ж роля, той жа стан TLS. Калі гэтыя чатыры супадаюць, VPN больш няма чаго тлумачыць. Пакуль яны не супадаюць, кожная дадатковая змена тунеля — здагадка пра злучэнне, якога тэрмінал ніколі не рабіў.

Падобныя артыкулы