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.

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

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 --version

Salī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.

Saistītie raksti