VPN tidak menyekat psql: klien anda menuju tempat lain
psql dan klien GUI boleh menuju titik akhir berbeza dari satu mesin. Bandingkan hos, soket, peranan dan TLS sebelum menyalahkan VPN.
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.
| 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 |
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 --versionBandingkan 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.