Και οι δύο πελάτες βρίσκονται στο ίδιο φορητό υπολογιστή, περνούν από το ίδιο τούνελ και μόνο ένας από αυτούς συνδέεται. Αυτή η σύγκριση μοιάζει με απόδειξη ότι το VPN είναι επιλεκτικό, ενώ η πολύ συχνότερη εξήγηση είναι ότι οι δύο πελάτες καλούν διαφορετικούς προορισμούς. Ένα GUI κρατά το δικό του host, θύρα, ρόλο και ρυθμίσεις TLS και χτίζει σιωπηλά μια προώθηση SSH όταν τη χρειάζεται, ενώ το psql συναρμολογεί μια σύνδεση από τις προεπιλογές του libpq που το κέλυφός σας μπορεί ήδη να έχει ορίσει. Το να αναπαράγετε τη λειτουργική σύνδεση είναι θέμα ανάγνωσης των ρυθμίσεων του GUI, όχι επανεγκατάστασης του τούνελ.

Ο μύθος: ένας λειτουργικός πελάτης αποδεικνύει τη διαδρομή

Αν το GUI συνδέεται, το τούνελ μεταφέρει κίνηση, και αυτό είναι το μόνο που αποδεικνύει το GUI. Δεν λέει τίποτα για το ποια διεύθυνση επιλύει το psql, με ποιον ρόλο πιστοποιείται ή αν το socket που ανοίγει φεύγει ποτέ από το μηχάνημα. Η διαδρομή είναι κοινή, αλλά οι παράμετροι δεν είναι.

Μια τοπική προώθηση μεγαλώνει το χάσμα. Το GUI μπορεί να συνδεθεί στη 127.0.0.1 σε μια θύρα που προώθησε μέσω SSH, και αυτός ο ακροατής υπάρχει μόνο όσο διαρκεί η συνεδρία του GUI. Το psql που δείχνει στο localhost χωρίς την προώθηση παίρνει μια απορριφθείσα σύνδεση που δεν έχει καμία σχέση με το VPN.

Διαβάστε το τελικό σημείο που χρησιμοποιεί πραγματικά το GUI

Ανοίξτε τις ιδιότητες της σύνδεσης και αντιγράψτε τέσσερις τιμές: host, θύρα, βάση δεδομένων και ρόλο. Έπειτα αναζητήστε μια καρτέλα τούνελ, γιατί μια προώθηση SSH μετατρέπει μια ιδιωτική διεύθυνση σε τοπική θύρα και αλλάζει το τι πρέπει να ειπωθεί στο 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

Κάθε γραμμή αποτυγχάνει σε διαφορετικό επίπεδο, και το μήνυμα που παίρνετε ονομάζει αυτό το επίπεδο. Η επικόλληση του φιλικού ονόματος του αποθηκευμένου προφίλ στο psql δεν μεταφέρει καμία από τις παραπάνω τιμές, και ένα όνομα υπηρεσίας επιλύεται μέσω αρχείου που το τερματικό μπορεί να μην διαβάσει ποτέ.

Τι κληρονομεί το libpq από το κέλυφός σας

Το psql είναι ένας λεπτός πελάτης πάνω από το libpq, και το libpq διαβάζει το περιβάλλον πριν διαβάσει οτιδήποτε άλλο. Μεταβλητές όπως PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE και PGSSLMODE μπορούν καθεμία να ανακατευθύνει μέρος της σύνδεσης. Κληρονομούνται αντί να πληκτρολογούνται, οπότε τίποτα στην εντολή που εκτελέσατε δεν τις δείχνει. Ένα εξαγόμενο PGSSLMODE μπορεί επίσης να αλλάξει το τι δέχεται ο πελάτης χωρίς λέξη στη γραμμή εντολών.

Δύο από αυτές τις μεταβλητές αξίζουν πρώτες υποψία. Το PGHOSTADDR παρέχει έναν αριθμητικό προορισμό που υπερισχύει της επίλυσης ονομάτων ενώ το όνομα host εξακολουθεί να καθορίζει την ταυτότητα του πιστοποιητικού, και το PGSERVICE τραβά host, βάση δεδομένων και επιλογές TLS από ένα αρχείο υπηρεσίας. Το να πετάτε όλο το περιβάλλον για αποσφαλμάτωση είναι κακή συνήθεια, αφού μπορεί να περιέχει κωδικούς πρόσβασης και άσχετα token, οπότε επιλέξτε αντί αυτού τις μεταβλητές που σας ενδιαφέρουν.

Η παράλειψη και του host και του hostaddr επιλέγει socket τομέα Unix αντί για διεύθυνση δικτύου. Μια κλήση psql χωρίς -h μπορεί επομένως να πετύχει τοπικά ή να αποτύχει με σφάλμα socket, χωρίς να αγγίξει ποτέ τη διαδρομή που χρησιμοποιεί το 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 κρατά ενεργούς τους ελέγχους πιστοποιητικού και ονόματος host, που είναι ακριβώς το κομμάτι που απενεργοποιούν οι άνθρωποι όταν εμφανιστεί σφάλμα TLS.

Αν το εγκεκριμένο τελικό σημείο βρίσκεται πίσω από ένα pooler, η θύρα 6432 και η θύρα 5432 μπορεί να φτάνουν στα ίδια δεδομένα μέσω διαφορετικών ταυτοτήτων διακομιστή, και η επαλήθευση μπορεί να αποτύχει στο όνομα του pooler αντί για εκείνο της βάσης δεδομένων. Διορθώστε το όνομα στο αλφαριθμητικό σύνδεσης αντί να αποδυναμώσετε τη λειτουργία.

Αφήστε το μήνυμα σφάλματος να διαλέξει το επόμενο βήμα

Το κείμενο της αποτυχίας λέει πόσο μακριά έφτασε η προσπάθεια, και αυτό υπερτερεί κάθε εικασίας για το τούνελ. Ένα όνομα που δεν επιλύεται αποτυγχάνει πριν υπάρξει socket, ένα timeout σημαίνει ότι η διαδρομή ή ένα firewall έριξε πακέτα, μια άρνηση σημαίνει ότι κάτι απάντησε και αρνήθηκε, και ένα σφάλμα πιστοποίησης σημαίνει ότι το δίκτυο ήδη λειτουργούσε.

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: ίδιος host, ίδια θύρα, ίδιος ρόλος, ίδια κατάσταση TLS. Όταν αυτά τα τέσσερα συμφωνούν, το VPN δεν έχει τίποτα άλλο να εξηγήσει. Μέχρι να συμφωνήσουν, κάθε επιπλέον αλλαγή στο τούνελ είναι μια εικασία για μια σύνδεση που το τερματικό δεν έκανε ποτέ.

Σχετικά άρθρα