VPN ei estä psql:ää: asiakkaasi valitsee toisen kohteen
psql ja GUI-asiakas voivat valita eri päätepisteet samasta koneesta. Vertaa isäntää, socketia, roolia ja TLS:ää ennen kuin syytät VPN:ää.
Molemmat asiakkaat istuvat samalla kannettavalla, kulkevat saman tunnelin läpi, ja vain toinen niistä yhdistää. Vertailu tuntuu todisteelta siitä, että VPN on valikoiva, kun taas paljon yleisempi selitys on, että kaksi asiakasta valitsevat eri kohteet. GUI pitää omat isäntänsä, porttinsa, roolinsa ja TLS-asetuksensa ja rakentaa hiljaa SSH-edelleenohjauksen tarvitessaan sellaista, kun taas psql kokoaa yhteyden libpq:n oletusarvoista, jotka kuoresi on ehkä jo asettanut. Toimivan yhteyden toistaminen on GUI:n asetusten lukemista, ei tunnelin uudelleenasennusta.
Myytti: yksi toimiva asiakas todistaa polun
Jos GUI yhdistää, tunneli kuljettaa liikennettä, ja se on ainoa asia, jonka GUI todistaa. Se ei kerro, minkä osoitteen psql ratkaisee, millä roolilla se tunnistautuu tai poistuuko sen avaama socket koskaan koneesta. Polku on yhteinen; parametrit eivät.
Paikallinen edelleenohjaus kasvattaa eroa. GUI voi yhdistää osoitteeseen 127.0.0.1 portissa, jonka se ohjasi SSH:n kautta, ja kyseinen kuuntelija on olemassa vain GUI-istunnon ajan. Ilman edelleenohjausta localhostiin osoitettu psql saa hylätyn yhteyden, jolla ei ole mitään tekemistä VPN:n kanssa.
Lue päätepiste, jota GUI todella käyttää
Avaa yhteyden ominaisuudet ja kopioi neljä arvoa: isäntä, portti, tietokanta ja rooli. Etsi sitten tunnelivälilehti, sillä SSH-edelleenohjaus muuttaa yksityisen osoitteen paikalliseksi portiksi ja muuttaa sitä, mitä psql:lle on kerrottava.
| 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 |
Jokainen rivi epäonnistuu eri kerroksessa, ja saamasi viesti nimeää sen kerroksen. Tallennetun profiilin ystävällisen nimen liittäminen psql:ään ei kuljeta yhtäkään yllä olevista arvoista, ja palvelun nimi ratkaistaan tiedostosta, jota pääte ei ehkä koskaan lue.
Miten libpq perii kuorestasi
psql on ohut asiakas libpq:n päällä, ja libpq lukee ympäristön ennen kuin lukee mitään muuta. Muuttujat kuten PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE ja PGSSLMODE voivat kukin ohjata osan yhteydestä toisin. Ne peritään eikä kirjoiteta, joten mikään suorittamassasi komennossa ei näytä niitä. Viety PGSSLMODE voi myös muuttaa sitä, mitä asiakas hyväksyy ilman sanaakaan komentorivillä.
Kaksi näistä muuttujista ansaitsee epäilyn ensimmäisenä. PGHOSTADDR tarjoaa numeerisen kohteen, joka ohittaa nimien ratkaisun, kun taas isäntänimi hallitsee edelleen varmenteen identiteettiä, ja PGSERVICE vetää isännän, tietokannan ja TLS-valinnat palvelutiedostosta. Koko ympäristön tulostaminen tämän selvittämiseksi on huono tapa, koska se voi sisältää salasanoja ja asiaankuulumattomia tunnisteita; valitse sen sijaan muuttujat, joista välität.
Sekä hostin että hostaddrin jättäminen pois valitsee Unix-verkkotunnuksen socketin verkkosoitteen sijaan. Siksi psql-kutsu ilman -h voi onnistua paikallisesti tai epäonnistua socket-virheeseen koskematta koskaan reittiin, jota GUI käyttää.
Lähetä samat parametrit käsin
Kun GUI:n arvot ovat käsissäsi, välitä ne eksplisiittisesti ja ohita käynnistystiedosto, joka voisi lisätä ohituksia. Alla oleva yhteysmerkkijono on havainnollinen: korvaa päätepiste, portti, tietokanta ja rooli arvoilla, jotka ylläpitäjäsi on hyväksynyt, ja pidä luottamusasetukset, jotka jo toimivat.
psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"Kolme yksityiskohtaa tuossa komennossa on tarkoituksellista. -X vaimentaa psql:n käynnistystiedoston, vaikka ei vaimenna libpq:n ympäristöä tai palvelumääritelmää. connect_timeout=5 estää tyhjään menevää reittiä jumittamasta päätettä minuuteiksi. sslmode=verify-full pitää varmenteen ja isäntänimen tarkistukset päällä, mikä on juuri se osa, jonka ihmiset kytkevät pois, kun TLS-virhe ilmestyy.
Jos hyväksytty päätepiste on poolerin takana, portti 6432 ja portti 5432 voivat tavoittaa samat tiedot eri palvelinidentiteettien kautta, ja varmennus voi epäonnistua poolerin nimeen eikä tietokannan nimeen. Korjaa nimi yhteysmerkkijonossa sen sijaan, että heikennät tilaa.
Anna virheilmoituksen valita seuraava askel
Epäonnistumisen teksti kertoo, kuinka pitkälle yritys pääsi, ja se voittaa kaikki arvaukset tunnelista. Nimi, joka ei ratkea, epäonnistuu ennen kuin socket on olemassa, aikakatkaisu tarkoittaa, että reitti tai palomuuri pudotti paketteja, hylkäys tarkoittaa, että jokin vastasi ja kieltäytyi, ja todennusvirhe tarkoittaa, että verkko toimi jo.
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 --versionVertaa \conninfo-tulostetta GUI:n elävään istuntoon: sama isäntä, sama portti, sama rooli, sama TLS-tila. Kun ne neljä täsmäävät, VPN:llä ei ole enää mitään selitettävää. Kunnes ne täsmäävät, jokainen ylimääräinen tunnelimuutos on arvaus yhteydestä, jota pääte ei koskaan tehnyt.