VPN не блокира psql: ваш клијент иде на друго место
psql и GUI клијент могу са једне машине да иду ка различитим крајњим тачкама. Упоредите хост, сокет, улогу и TLS пре него што оптужите VPN.
Оба клијента су на истом лаптопу, пролазе кроз исти тунел, а повезује се само један од њих. То поређење изгледа као доказ да је VPN селективан, док је много чешће објашњење да два клијента иду ка различитим одредиштима. GUI чува сопствени хост, порт, улогу и TLS поставке и тихо гради SSH прослеђивање када му је потребно, док psql саставља везу из подразумеваних вредности libpq које је ваша љуска можда већ поставила. Понављање радне везе је ствар читања GUI поставки, а не поновне инсталације тунела.
Мит: један радни клијент доказује пут
Ако се GUI повеже, тунел преноси саобраћај, и то је једино што GUI доказује. Не говори ништа о томе коју адресу psql разрешава, под којом улогом се аутентификује или да ли сокет који отвара икада напушта машину. Пут је заједнички; параметри нису.
Локално прослеђивање повећава разлику. GUI може да се повеже на 127.0.0.1 на порту који је проследио преко SSH, а тај слушалац постоји само док траје сесија GUI-ја. psql усмерен на localhost без прослеђивања добија одбијену везу која нема никакве везе са VPN-ом.
Прочитајте крајњу тачку коју GUI заиста користи
Отворите својства везе и копирајте четири вредности: хост, порт, базу података и улогу. Затим потражите картицу тунела, јер SSH прослеђивање претвара приватну адресу у локални порт и мења шта треба рећи psql-у.
| 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 |
Сваки ред пада на другом слоју, а порука коју добијете именује тај слој. Лепљење пријатељског имена сачуваног профила у 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 грешка.
Ако одобрена крајња тачка стоји иза pooler-а, порт 6432 и порт 5432 могу да стигну до истих података кроз различите идентитете сервера, а провера може да не успе на имену pooler-а уместо базе података. Исправите име у низу за повезивање уместо да ослабите режим.
Нека порука о грешци изабере следећи корак
Текст неуспеха каже докле је покушај стигао, и то побеђује сваку претпоставку о тунелу. Име које се не разрешава пада пре него што постоји сокет, истек времена значи да је путања или заштитни зид одбацио пакете, одбијање значи да је нешто одговорило и одбило, а грешка аутентификације значи да је мрежа већ радила.
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 нема шта више да објасни. Док се не поклопе, свака додатна промена тунела је претпоставка о вези коју терминал никада није направио.