Hər iki müştəri eyni noutbukdadır, eyni tuneldən keçir və yalnız biri qoşulur. Bu müqayisə VPN-in seçici olduğuna dair sübut kimi görünür, halbuki daha çox rast gəlinən izah iki müştərinin fərqli ünvanlara müraciət etməsidir. GUI öz hostunu, portunu, rolunu və TLS parametrlərini saxlayır və lazım olanda səssizcə SSH forvardı qurur, psql isə shell-inizin artıq təyin etmiş ola biləcəyi libpq defoltlarından əlaqə yığır. İşləyən əlaqəni təkrar etmək tuneli yenidən quraşdırmaq deyil, GUI-nin parametrlərini oxumaq məsələsidir.

Mif: bir işləyən müştəri yolu sübut edir

GUI qoşulursa, tunel trafiki daşıyır və GUI-nin sübut etdiyi yeganə şey budur. O, psql-in hansı ünvanı həll etdiyi, hansı rolla autentifikasiya olduğu və ya açdığı soketin maşından heç çıxıb-çıxmadığı barədə heç nə demir. Yol ortaqdır; parametrlər deyil.

Lokal forvard fərqi daha da genişləndirir. GUI SSH ilə forvard etdiyi portda 127.0.0.1-ə qoşula bilər və o dinləyici yalnız GUI sessiyası boyu mövcud olur. Forvard olmadan localhost-a yönəldilmiş psql isə VPN-lə heç bir əlaqəsi olmayan rədd cavabı alır.

GUI-nin həqiqətən istifadə etdiyi son nöqtəni oxuyun

Əlaqənin xassələrini açın və dörd dəyəri kopyalayın: host, port, verilənlər bazası və rol. Sonra tunel nişanını axtarın, çünki SSH forvardı şəxsi ünvanı lokal porta çevirir və psql-ə deyilməli olanı dəyişir.

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

Hər sətir fərqli layda uğursuz olur və aldığınız mesaj həmin layı adlandırır. Saxlanmış profilin dost adını psql-ə yapışdırmaq yuxarıdakı dəyərlərin heç birini daşımır və xidmət adı terminalın heç vaxt oxuya bilməyəcəyi fayl vasitəsilə həll olunur.

libpq shell-inizdən nə miras alır

psql libpq üzərində nazik müştəridir və libpq hər şeydən əvvəl mühiti oxuyur. PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE və PGSSLMODE kimi dəyişənlərin hər biri əlaqənin bir hissəsini yönləndirə bilər. Onlar yazılmır, miras alınır, ona görə işə saldığınız əmrdə heç biri görünmür. İxrac edilmiş PGSSLMODE də əmr sətrində bir söz olmadan müştərinin qəbul etdiyini dəyişə bilər.

Bu dəyişənlərdən ikisi ilk növbədə şübhə doğurur. PGHOSTADDR ad həllini üstələyən rəqəmsal ünvan verir, host adı isə sertifikat kimliyini idarə etməyə davam edir və PGSERVICE host, verilənlər bazası və TLS seçimlərini xidmət faylından çıxarır. Bunu ayıklamaq üçün bütün mühiti boşaltmaq pis vərdişdir, çünki orada parollar və əlaqəsiz tokenlər ola bilər; əvəzinə sizi maraqlandıran dəyişənləri seçin.

Həm host, həm hostaddr buraxıldıqda şəbəkə ünvanı deyil, Unix domen soketi seçilir. Buna görə -h olmadan psql çağırışı lokalda uğur qazana və ya soket xətası ilə uğursuz ola bilər, GUI-nin istifadə etdiyi marşruta heç toxunmadan.

Eyni parametrləri əl ilə göndərin

GUI-nin dəyərləri əlinizdə olarkən onları açıq şəkildə ötürün və əlavə üstünlüklər qoşa biləcək başlatma faylını keçin. Aşağıdakı əlaqə sətri nümunədir: son nöqtəni, portu, verilənlər bazasını və rolu administratorunuzun təsdiqlədiyi dəyərlərlə əvəz edin və artıq işləyən etimad konfiqurasiyasını saxlayın.

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

Bu əmrdəki üç detal qəsdəndir. -X psql-in başlatma faylını sıxışdırır, amma libpq mühitini və ya xidmət tərifini sıxışdırmır. connect_timeout=5 qara dəlikli marşrutun terminalı dəqiqələrlə asmasının qarşısını alır. sslmode=verify-full sertifikat və host adı yoxlamalarını işlək saxlayır, bu da TLS xətası görünəndə insanların söndürdüyü hissənin elə özüdür.

Təsdiqlənmiş son nöqtə bir hovuzun arxasındadırsa, 6432 portu və 5432 portu eyni məlumata fərqli server kimlikləri ilə çata bilər və yoxlama verilənlər bazasının deyil, hovuzun adı ilə uğursuz ola bilər. Rejimi zəiflətmək əvəzinə əlaqə sətrindəki adı düzəldin.

Növbəti addımı səhv mesajı seçsin

Uğursuzluq mətni cəhdin nə qədər getdiyini deyir və bu, tunel haqqında hər hansı təxmini üstələyir. Həll olunmayan ad soket yaranmadan uğursuz olur, timeout marşrutun və ya firewall-un paketləri atdığını bildirir, rədd bir şeyin cavab verib imtina etdiyini, autentifikasiya xətası isə şəbəkənin artıq işlədiyini göstərir.

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 çıxışını GUI-nin canlı sessiyası ilə müqayisə edin: eyni host, eyni port, eyni rol, eyni TLS vəziyyəti. Bu dördü uyğun gəldikdə VPN-in izah edəcəyi heç nə qalmır. Uyğun gəlməyənə qədər hər əlavə tunel dəyişikliyi terminalın heç vaxt qurmadığı əlaqə haqqında təxmindir.

Əlaqəli məqalələr