Kedua-dua klien berada pada komputer riba yang sama, melalui terowong yang sama, dan hanya satu daripadanya menyambung. Perbandingan itu terasa seperti bukti bahawa VPN bersikap terpilih, sedangkan penjelasan yang jauh lebih lazim ialah kedua-dua klien menuju destinasi yang berbeza. GUI menyimpan hos, port, peranan dan tetapan TLS sendiri lalu membina pemajuan SSH secara senyap apabila memerlukannya, manakala psql menyusun sambungan daripada nilai lalai libpq yang mungkin sudah ditetapkan oleh shell anda. Menghasilkan semula sambungan yang berfungsi ialah soal membaca tetapan GUI, bukan memasang semula terowong.

Mitos: satu klien yang berfungsi membuktikan laluan

Jika GUI menyambung, terowong membawa trafik, dan itulah satu-satunya perkara yang dibuktikan oleh GUI. Ia tidak menyatakan apa-apa tentang alamat mana yang diselesaikan oleh psql, peranan apa yang digunakan untuk pengesahan, atau sama ada soket yang dibukanya pernah meninggalkan mesin. Laluan itu dikongsi; parameternya tidak.

Pemajuan tempatan meluaskan jurang. GUI mungkin menyambung ke 127.0.0.1 pada port yang dimajukannya melalui SSH, dan pendengar itu hanya wujud sepanjang sesi GUI. psql yang diarahkan ke localhost tanpa pemajuan menerima sambungan ditolak yang tidak ada kaitan dengan VPN.

Baca titik akhir yang sebenarnya digunakan oleh GUI

Buka sifat sambungan dan salin empat nilai: hos, port, pangkalan data dan peranan. Kemudian cari tab terowong, kerana pemajuan SSH menukar alamat peribadi menjadi port tempatan dan mengubah apa yang perlu diberitahu kepada 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

Setiap baris gagal pada lapisan berbeza, dan mesej yang anda terima menamakan lapisan itu. Menampal nama mesra profil tersimpan ke dalam psql tidak membawa mana-mana nilai di atas, dan nama perkhidmatan diselesaikan melalui fail yang mungkin tidak pernah dibaca oleh terminal.

Apa yang diwarisi libpq daripada shell anda

psql ialah klien nipis di atas libpq, dan libpq membaca persekitaran sebelum membaca apa-apa lagi. Pemboleh ubah seperti PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE dan PGSSLMODE masing-masing boleh mengubah hala sebahagian sambungan. Ia diwarisi dan bukan ditaip, jadi tiada apa dalam arahan yang anda jalankan menunjukkan ia. PGSSLMODE yang dieksport juga boleh mengubah apa yang diterima oleh klien tanpa sebaris kata pada baris arahan.

Dua daripada pemboleh ubah itu paling wajar disyaki dahulu. PGHOSTADDR membekalkan destinasi berangka yang mengatasi penyelesaian nama sementara nama hos masih menentukan identiti sijil, dan PGSERVICE menarik hos, pangkalan data dan pilihan TLS keluar daripada fail perkhidmatan. Membuang seluruh persekitaran untuk menyahpepijat ini ialah tabiat buruk, kerana ia mungkin mengandungi kata laluan dan token tidak berkaitan; sebaliknya pilih pemboleh ubah yang anda ambil berat.

Meninggalkan kedua-dua host dan hostaddr memilih soket domain Unix dan bukannya alamat rangkaian. Oleh itu panggilan psql tanpa -h boleh berjaya secara tempatan, atau gagal dengan ralat soket, tanpa pernah menyentuh laluan yang digunakan oleh GUI.

Hantar parameter yang sama dengan tangan

Dengan nilai GUI di tangan, hantarkannya secara eksplisit dan langkau fail permulaan yang boleh menambah pengatasan. Rentetan sambungan di bawah ialah ilustrasi: gantikan titik akhir, port, pangkalan data dan peranan dengan nilai yang diluluskan oleh pentadbir anda, dan kekalkan konfigurasi kepercayaan yang sudah berfungsi.

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

Tiga perincian dalam arahan itu memang disengajakan. -X menekan fail permulaan psql, walaupun ia tidak menekan persekitaran libpq atau definisi perkhidmatan. connect_timeout=5 menghalang laluan yang buntu daripada menggantung terminal selama beberapa minit. sslmode=verify-full mengekalkan pemeriksaan sijil dan nama hos dihidupkan, dan itulah bahagian yang orang matikan apabila ralat TLS muncul.

Jika titik akhir yang diluluskan berada di belakang pooler, port 6432 dan port 5432 mungkin mencapai data yang sama melalui identiti pelayan yang berbeza, dan pengesahan boleh gagal pada nama pooler dan bukan nama pangkalan data. Betulkan nama dalam rentetan sambungan daripada melemahkan mod.

Biarkan mesej ralat memilih langkah seterusnya

Teks kegagalan menyatakan sejauh mana percubaan itu pergi, dan itu mengatasi sebarang tekaan tentang terowong. Nama yang tidak dapat diselesaikan gagal sebelum soket wujud, tamat masa bermakna laluan atau firewall menggugurkan paket, penolakan bermakna sesuatu menjawab dan menolak, dan ralat pengesahan bermakna rangkaian sudah berfungsi.

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

Bandingkan keluaran \conninfo dengan sesi langsung GUI: hos sama, port sama, peranan sama, keadaan TLS sama. Apabila keempat-empatnya sepadan, VPN tidak ada apa-apa lagi untuk dijelaskan. Sehingga ia sepadan, setiap perubahan terowong tambahan ialah tekaan tentang sambungan yang tidak pernah dibuat oleh terminal.

Artikel berkaitan