VPN nebloķē psql: jūsu klients vēršas citur
psql un GUI klients var no vienas mašīnas vērsties pie dažādiem galapunktiem. Pirms vainot VPN, salīdziniet hostu, socket, lomu un TLS.
Abi klienti atrodas tajā pašā portatīvajā datorā, iet caur to pašu tuneli, un tikai viens no tiem izveido savienojumu. Šis salīdzinājums šķiet kā pierādījums, ka VPN ir selektīvs, lai gan daudz biežākais skaidrojums ir tas, ka abi klienti vēršas pie dažādiem mērķiem. GUI patur savu hostu, portu, lomu un TLS iestatījumus un klusi izveido SSH pārkraušanu, kad tā ir vajadzīga, savukārt psql veido savienojumu no libpq noklusējuma vērtībām, kuras jūsu shell jau var būt iestatījusi. Strādājošā savienojuma reproducēšana ir GUI iestatījumu lasīšana, nevis tuneļa pārinstalēšana.
Mīts: viens strādājošs klients pierāda ceļu
Ja GUI izveido savienojumu, tunelis pārvadā datplūsmu, un tas ir vienīgais, ko GUI pierāda. Tas neko nesaka par to, kuru adresi psql atrisina, ar kādu lomu tas autentificējas, vai tā atvērtais socket kādreiz atstāj datoru. Ceļš ir kopīgs; parametri nav.
Lokāla pārkraušana palielina atšķirību. GUI var izveidot savienojumu ar 127.0.0.1 uz portu, kuru tas pārkrausa pa SSH, un šis klausītājs pastāv tikai GUI sesijas laikā. psql, kas vērsts uz localhost bez pārkraušanas, saņem atteiktu savienojumu, kam nav nekāda sakara ar VPN.
Izlasiet galapunktu, kuru GUI faktiski izmanto
Atveriet savienojuma rekvizītus un nokopējiet četras vērtības: hostu, portu, datubāzi un lomu. Pēc tam meklējiet tuneļa cilni, jo SSH pārkraušana privātu adresi pārvērš lokālā portā un maina to, kas jāsaka 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 |
Katra rinda neizdodas citā slānī, un saņemtais ziņojums nosauc šo slāni. Ielīmējot psql saglabātā profila draudzīgo nosaukumu, netiek pārnesta neviena no iepriekš minētajām vērtībām, un pakalpojuma nosaukums tiek atrisināts caur failu, ko terminālis var nekad neizlasīt.
Ko libpq manto no jūsu shell
psql ir plāns klients virs libpq, un libpq vidi nolasa pirms visa cita. Tādi mainīgie kā PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE un PGSSLMODE katrs var novirzīt daļu savienojuma. Tie tiek mantoti, nevis ierakstīti, tāpēc nekas jūsu palaistajā komandā tos nerāda. Eksportēts PGSSLMODE arī var mainīt to, ko klients pieņem, bez viena vārda komandrindā.
Divi no šiem mainīgajiem vispirms ir pelnījuši aizdomas. PGHOSTADDR nodrošina ciparu mērķi, kas ignorē nosaukumu atrisināšanu, kamēr hosta nosaukums joprojām nosaka sertifikāta identitāti, un PGSERVICE izvelk hostu, datubāzi un TLS izvēles no pakalpojuma faila. Visas vides izmešana atkļūdošanai ir slikts ieradums, jo tajā var būt paroles un nesaistīti marķieri; tā vietā izvēlieties sev svarīgos mainīgos.
Izlaidot gan host, gan hostaddr, tiek izvēlēts Unix domēna socket, nevis tīkla adrese. Tāpēc psql izsaukums bez -h var izdoties lokāli vai neizdoties ar socket kļūdu, pat neskarot maršrutu, ko izmanto GUI.
Nosūtiet tos pašus parametrus ar roku
Ja GUI vērtības ir rokā, nododiet tās skaidri un izlaidiet palaišanas failu, kas varētu pievienot pārrakstījumus. Zemāk redzamā savienojuma virkne ir ilustratīva: aizstājiet galapunktu, portu, datubāzi un lomu ar administratora apstiprinātajām vērtībām un saglabājiet jau strādājošo uzticēšanās konfigurāciju.
psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"Trīs šīs komandas detaļas ir apzinātas. -X nomāc psql palaišanas failu, lai gan nenomāc libpq vidi vai pakalpojuma definīciju. connect_timeout=5 neļauj tukšam maršrutam minutēm pakārt termināli. sslmode=verify-full patur ieslēgtas sertifikāta un hosta nosaukuma pārbaudes, un tas ir tieši tā daļa, ko cilvēki izslēdz, kad parādās TLS kļūda.
Ja apstiprinātais galapunkts atrodas aiz pooler, port 6432 un port 5432 var sasniegt tos pašus datus ar dažādām servera identitātēm, un pārbaude var neizdoties uz pooler nosaukuma, nevis datubāzes nosaukuma rēķina. Izlabojiet nosaukumu savienojuma virknē, nevis vājiniet režīmu.
Ļaujiet kļūdas ziņojumam izvēlēties nākamo soli
Neveiksmes teksts pasaka, cik tālu devās mēģinājums, un tas ir labāk par jebkuru minējumu par tuneli. Nosaukums, kas netiek atrisināts, neizdodas pirms socket rašanās, taimauts nozīmē, ka maršruts vai ugunsmūris izmeta paketes, atteikums nozīmē, ka kaut kas atbildēja un atteicās, un autentifikācijas kļūda nozīmē, ka tīkls jau strādāja.
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 --versionSalīdziniet \conninfo izvadi ar GUI dzīvo sesiju: tas pats hosts, tas pats ports, tā pati loma, tas pats TLS stāvoklis. Kad šie četri sakrīt, VPN vairs nav ko paskaidrot. Kamēr tie nesakrīt, katra papildu tuneļa izmaiņa ir minējums par savienojumu, kuru terminālis nekad nav izveidojis.