İki istemci de aynı dizüstü bilgisayarda, aynı tünelden geçiyor ve yalnızca biri bağlanıyor. Bu karşılaştırma VPN'in seçici olduğunun kanıtı gibi görünüyor, oysa çok daha yaygın açıklama iki istemcinin farklı hedeflere gittiğidir. Bir GUI kendi ana bilgisayarını, bağlantı noktasını, rolünü ve TLS ayarlarını tutar ve gerektiğinde sessizce bir SSH yönlendirmesi kurar; psql ise bağlantıyı kabuğunuzun zaten ayarlamış olabileceği libpq varsayılanlarından derler. Çalışan bağlantıyı yeniden üretmek GUI'nin ayarlarını okumakla ilgilidir, tüneli yeniden kurmakla değil.

Efsane: çalışan tek bir istemci yolu kanıtlar

GUI bağlanıyorsa tünel trafiği taşır ve GUI'nin kanıtladığı tek şey budur. psql'in hangi adresi çözdüğünü, hangi rolle kimlik doğruladığını veya açtığı soketin makineden hiç çıkıp çıkmadığını söylemez. Yol ortaktır; parametreler değildir.

Yerel bir yönlendirme farkı büyütür. GUI, SSH üzerinden yönlendirdiği bir bağlantı noktasında 127.0.0.1'e bağlanabilir ve bu dinleyici yalnızca GUI oturumu sürdüğü sürece vardır. Yönlendirme olmadan localhost'a yönelen psql, VPN ile hiçbir ilgisi olmayan reddedilmiş bir bağlantı alır.

GUI'nin gerçekte kullandığı uç noktayı okuyun

Bağlantının özelliklerini açın ve dört değeri kopyalayın: ana bilgisayar, bağlantı noktası, veritabanı ve rol. Ardından bir tünel sekmesi arayın, çünkü SSH yönlendirmesi özel bir adresi yerel bağlantı noktasına çevirir ve psql'e söylenmesi gerekeni değiştirir.

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

Her satır farklı bir katmanda başarısız olur ve aldığınız mesaj o katmanı adlandırır. Kayıtlı profilin dostça adını psql'e yapıştırmak yukarıdaki değerlerin hiçbirini taşımaz ve bir hizmet adı, terminalin hiç okumayabileceği bir dosya üzerinden çözülür.

libpq kabuğunuzdan neyi devralır

psql, libpq üzerinde ince bir istemcidir ve libpq ortamı her şeyden önce okur. PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE ve PGSSLMODE gibi değişkenlerin her biri bağlantının bir bölümünü başka yöne çevirebilir. Yazılmak yerine devralınırlar, bu yüzden çalıştırdığınız komutta hiçbiri görünmez. Dışa aktarılmış bir PGSSLMODE de komut satırında tek kelime olmadan istemcinin neyi kabul ettiğini değiştirebilir.

Bu değişkenlerden ikisi önce şüpheyi hak eder. PGHOSTADDR, ad çözümlemesini atlayan sayısal bir hedef sağlar ve ana bilgisayar adı hâlâ sertifika kimliğini belirler; PGSERVICE ise ana bilgisayarı, veritabanını ve TLS seçimlerini bir hizmet dosyasından çeker. Bunu ayıklamak için tüm ortamı dökmek kötü bir alışkanlıktır, çünkü içinde parolalar ve ilgisiz belirteçler olabilir; bunun yerine sizin için önemli olan değişkenleri seçin.

Hem host hem de hostaddr atlandığında ağ adresi yerine Unix alan soketi seçilir. Bu yüzden -h olmadan yapılan bir psql çağrısı yerelde başarılı olabilir veya soket hatasıyla başarısız olabilir; GUI'nin kullandığı rotaya hiç dokunmadan.

Aynı parametreleri elle gönderin

GUI'nin değerleri elinizdeyken bunları açıkça iletin ve geçersiz kılmalar ekleyebilecek başlangıç dosyasını atlayın. Aşağıdaki bağlantı dizesi örnektir: uç noktayı, bağlantı noktasını, veritabanını ve rolü yöneticinizin onayladığı değerlerle değiştirin ve zaten çalışan güven yapılandırmasını koruyun.

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

O komuttaki üç ayrıntı kasıtlıdır. -X psql'in başlangıç dosyasını bastırır, ancak libpq ortamını veya bir hizmet tanımını bastırmaz. connect_timeout=5 çıkmaz bir rotanın terminali dakikalarca askıda bırakmasını önler. sslmode=verify-full sertifika ve ana bilgisayar adı denetimlerini açık tutar; insanların TLS hatası göründüğünde kapattığı kısım tam olarak budur.

Onaylanan uç nokta bir pooler'ın arkasındaysa, 6432 numaralı bağlantı noktası ile 5432 numaralı bağlantı noktası aynı veriye farklı sunucu kimlikleriyle ulaşabilir ve doğrulama veritabanının adı yerine pooler'ın adında başarısız olabilir. Modu zayıflatmak yerine bağlantı dizesindeki adı düzeltin.

Sıradaki adımı hata mesajı seçsin

Hata metni, denemenin ne kadar ilerlediğini söyler ve bu, tünel hakkındaki her tahminden iyidir. Çözülemeyen bir ad, soket oluşmadan başarısız olur; zaman aşımı, rotanın veya bir güvenlik duvarının paketleri düşürdüğü anlamına gelir; ret, bir şeyin yanıt verip reddettiği anlamına gelir; kimlik doğrulama hatası ise ağın zaten çalıştığı anlamına gelir.

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 çıktısını GUI'nin canlı oturumuyla karşılaştırın: aynı ana bilgisayar, aynı bağlantı noktası, aynı rol, aynı TLS durumu. Bu dördü uyuştuğunda VPN'in açıklayacak bir şeyi kalmaz. Uyuşana kadar tüneldeki her ek değişiklik, terminalin hiç kurmadığı bir bağlantı hakkında bir tahmindir.

İlgili makaleler