Mae’r ddau glient ar yr un gliniadur, yn mynd trwy’r un twnnel, a dim ond un ohonynt yn cysylltu. Mae’r gymhariaeth honno’n teimlo fel prawf bod y VPN yn ddetholus, tra bod yr esboniad llawer mwy cyffredin yn un bod y ddau glient yn deialu cyrchfannau gwahanol. Mae GUI yn cadw ei westeiwr, porth, rôl a gosodiadau TLS ei hun ac yn adeiladu anfon SSH yn dawel pan fo angen un, tra bod psql yn crynhoi cysylltiad o ragosodiadau libpq y mae eich plisgyn efallai eisoes wedi’u gosod. Mae ailgynhyrchu’r cysylltiad sy’n gweithio yn fater o ddarllen gosodiadau’r GUI, nid o ailosod y twnnel.

Y myth: un cleient sy’n gweithio sy’n profi’r llwybr

Os yw’r GUI yn cysylltu, mae’r twnnel yn cludo traffig, a dyna’r unig beth mae’r GUI yn ei brofi. Nid yw’n dweud dim am ba gyfeiriad mae psql yn ei ddatrys, pa rôl mae’n dilysu â hi, na ph’un a yw’r soced mae’n ei agor yn gadael y peiriant o gwbl. Mae’r llwybr yn gyffredin; nid yw’r paramedrau.

Mae anfoniad lleol yn ehangu’r bwlch. Gall y GUI gysylltu â 127.0.0.1 ar borth y gwnaeth ei anfon dros SSH, ac mae’r gwrandäwr hwnnw’n bodoli dim ond cyhyd ag y bydd sesiwn y GUI. Mae psql wedi’i gyfeirio at localhost heb yr anfoniad yn cael cysylltiad a wrthodwyd nad oes ganddo ddim i’w wneud â’r VPN.

Darllenwch y cyrchfan mae’r GUI yn ei defnyddio mewn gwirionedd

Agorwch briodweddau’r cysylltiad a chopïwch bedwar gwerth: gwesteiwr, porth, cronfa ddata a rôl. Yna chwiliwch am dab twnnel, oherwydd mae anfoniad SSH yn troi cyfeiriad preifat yn borth lleol ac yn newid yr hyn y mae’n rhaid ei ddweud wrth 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

Mae pob rhes yn methu ar haen wahanol, ac mae’r neges a gewch yn enwi’r haen honno. Nid yw gludo enw cyfeillgar y proffil a gadwyd i psql yn cario unrhyw un o’r gwerthoedd uchod, ac mae enw gwasanaeth yn cael ei ddatrys trwy ffeil na fydd y terfynell efallai byth yn ei darllen.

Beth mae libpq yn ei etifeddu o’ch plisgyn

Mae psql yn glient tenau dros libpq, ac mae libpq yn darllen yr amgylchedd cyn darllen unrhyw beth arall. Gall newidynnau fel PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE a PGSSLMODE ailgyfeirio rhan o’r cysylltiad. Cânt eu hetifeddu yn hytrach na’u teipio, felly nid oes dim yn y gorchymyn a redwyd gennych yn eu dangos. Gall PGSSLMODE a allforiwyd hefyd newid yr hyn y mae’r cleient yn ei dderbyn heb air ar y llinell orchymyn.

Mae dau o’r newidynnau hynny’n haeddu amheuaeth yn gyntaf. Mae PGHOSTADDR yn darparu cyrchfan rifiadol sy’n diystyru datrysiad enwau tra bod yr enw gwesteiwr yn dal i lywodraethu hunaniaeth tystysgrif, ac mae PGSERVICE yn tynnu gwesteiwr, cronfa ddata a dewisiadau TLS allan o ffeil gwasanaeth. Mae dympio’r amgylchedd cyfan i ddadfygio hyn yn arferiad drwg, gan y gall gynnwys cyfrineiriau a thocynnau digyswllt; dewiswch y newidynnau sy’n bwysig i chi yn lle hynny.

Mae hepgor host a hostaddr ill dau yn dewis soced parth Unix yn hytrach na chyfeiriad rhwydwaith. Felly gall galwad psql heb -h lwyddo’n lleol, neu fethu â gwall soced, heb gyffwrdd byth â’r llwybr y mae’r GUI yn ei ddefnyddio.

Anfonwch yr un paramedrau â llaw

Gyda gwerthoedd y GUI wrth law, trowch nhw’n benodol a hepgorwch y ffeil gychwyn a allai ychwanegu trefniadau. Mae’r llinyn cysylltu isod yn ddarluniadol: disodlwch y gyrchfan, y porth, y gronfa ddata a’r rôl gyda’r gwerthoedd a gymeradwywyd gan eich gweinyddwr, a chadwch y ffurfweddiad ymddiriedaeth sy’n gweithio’n barod.

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

Mae tri manylyn yn y gorchymyn hwnnw’n fwriadol. Mae -X yn atal ffeil gychwyn psql, er nad yw’n atal amgylchedd libpq na diffiniad gwasanaeth. Mae connect_timeout=5 yn cadw llwybr wedi’i dagu rhag hongian y terfynell am funudau. Mae sslmode=verify-full yn cadw gwiriadau tystysgrif ac enw gwesteiwr ymlaen, sef yn union y rhan y mae pobl yn ei diffodd pan fo gwall TLS yn ymddangos.

Os yw’r gyrchfan a gymeradwywyd y tu ôl i bwll, gall porth 6432 a phorth 5432 gyrraedd yr un data trwy hunaniaethau gweinydd gwahanol, ac gall dilysu fethu ar enw’r pwll yn hytrach nag enw’r gronfa ddata. Cywirwch yr enw yn y llinyn cysylltu yn lle gwanhau’r modd.

Gadewch i’r neges gwall ddewis y cam nesaf

Mae testun y methiant yn dweud pa mor bell yr aeth yr ymgais, ac mae hynny’n well nag unrhyw ddyfaliad am y twnnel. Mae enw na fydd yn datrys yn methu cyn bod soced, mae terfyn amser yn golygu bod y llwybr neu wal dân wedi gollwng pecynnau, mae gwrthodiad yn golygu bod rhywbeth wedi ateb ac wedi gwrthod, ac mae gwall dilysu yn golygu bod y rhwydwaith eisoes wedi gweithio.

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

Cymharwch allbwn \conninfo â sesiwn fyw’r GUI: yr un gwesteiwr, yr un porth, yr un rôl, yr un cyflwr TLS. Pan fydd y pedwar hynny’n cytuno, nid oes gan y VPN ddim ar ôl i’w esbonio. Hyd nes iddynt gytuno, mae pob newid twnnel ychwanegol yn ddyfaliad am gysylltiad na wnaeth y terfynell erioed.

Erthyglau cysylltiedig