A VPN nem blokkolja a psql-t: a kliense máshová tárcsáz
A psql és egy GUI-kliens ugyanarról a gépről különböző végpontokat hívhat. Hasonlítsa össze a hosztot, a socketet, a szerepet és a TLS-t, mielőtt a VPN-t okolná.
Mindkét kliens ugyanazon a laptopon fut, ugyanazon a tunelen halad át, és csak az egyikük csatlakozik. Ez az összehasonlítás a VPN szelektivitásának bizonyítékának tűnik, holott a sokkal gyakoribb magyarázat az, hogy a két kliens különböző célpontokat hív. A GUI a saját hosztját, portját, szerepét és TLS-beállításait tartja, és szükség esetén csendben épít egy SSH-továbbítást, míg a psql a libpq alapértelmezéseiből állítja össze a kapcsolatot, amelyeket a shell már esetleg beállított. A működő kapcsolat reprodukálása a GUI beállításainak olvasása, nem a tunel újratelepítése.
A mítosz: egy működő kliens bizonyítja az útvonalat
Ha a GUI csatlakozik, a tunel forgalmat szállít, és a GUI csak ezt bizonyítja. Nem mond semmit arról, hogy a psql melyik címet oldja fel, milyen szerepkörrel hitelesít, vagy hogy az általa megnyitott socket valaha elhagyja-e a gépet. Az útvonal közös; a paraméterek nem.
A helyi továbbítás növeli a különbséget. A GUI csatlakozhat a 127.0.0.1-hez egy porton, amelyet SSH-n továbbított, és az a figyelő csak a GUI munkamenetének idejéig létezik. A továbbítás nélkül localhostra irányított psql elutasított kapcsolatot kap, amelynek semmi köze a VPN-hez.
Olvassa el a végpontot, amelyet a GUI valóban használ
Nyissa meg a kapcsolat tulajdonságait, és másoljon ki négy értéket: hoszt, port, adatbázis és szerep. Ezután keressen egy tunel fület, mert az SSH-továbbítás egy privát címet helyi porttá alakít, és megváltoztatja, amit a psql-nek mondani kell.
| 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 |
Minden sor más rétegben hibázik, és a kapott üzenet megnevezi azt a réteget. Az elmentett profil barátságos nevének beillesztése a psql-be egyik fenti értéket sem hordozza, és a szolgáltatásnév olyan fájlon keresztül oldódik fel, amelyet a terminál talán soha nem olvas.
Mit örököl a libpq a shelljétől
A psql vékony kliens a libpq felett, és a libpq a környezetet olvassa először, minden más előtt. Az olyan változók, mint a PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE és PGSSLMODE, mindegyike átirányíthatja a kapcsolat egy részét. Öröklődnek, nem beírják őket, ezért semmi sem mutatja meg őket abban a parancsban, amelyet futtatott. Egy exportált PGSSLMODE is megváltoztathatja, mit fogad el a kliens, anélkül hogy egy szó is elhangzana a parancssorban.
E változók közül kettő érdemel elsőként gyanút. A PGHOSTADDR numerikus célpontot ad, amely felülírja a névfeloldást, miközben a hosztnév továbbra is meghatározza a tanúsítvány identitását, a PGSERVICE pedig hosztot, adatbázist és TLS-választásokat húz ki egy szolgáltatásfájlból. A teljes környezet kiírása a hibakereséshez rossz szokás, mert jelszavakat és független tokeneket tartalmazhat; válassza inkább az Önt érdeklő változókat.
A host és a hostaddr együttes elhagyása Unix-tartomány socketet választ hálózati cím helyett. Ezért a -h nélküli psql-hívás helyben sikerülhet, vagy socket-hibával meghiúsulhat, anélkül hogy valaha érintené a GUI által használt útvonalat.
Küldje el ugyanazokat a paramétereket kézzel
Ha a GUI értékei a kezében vannak, adja át őket kifejezetten, és hagyja ki a indítófájlt, amely felülírásokat adhat hozzá. Az alábbi kapcsolati karakterlánc szemléltető: cserélje ki a végpontot, a portot, az adatbázist és a szerepet az adminisztrátora által jóváhagyott értékekre, és tartsa meg a már működő bizalmi konfigurációt.
psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"Három részlet ebben a parancsban szándékos. A -X elnyomja a psql indítófájlját, bár nem nyomja el a libpq környezetét vagy egy szolgáltatásdefiníciót. A connect_timeout=5 megakadályozza, hogy egy semmibe futó útvonal percekig lógassa a terminált. A sslmode=verify-full bekapcsolva tartja a tanúsítvány- és hosztnév-ellenőrzéseket, ami pontosan az a rész, amelyet az emberek kikapcsolnak, amikor TLS-hiba jelenik meg.
Ha a jóváhagyott végpont egy pooler mögött van, a 6432-es és az 5432-es port különböző szerveridentitásokon keresztül érheti el ugyanazokat az adatokat, és az ellenőrzés a pooler nevére hiúsulhat meg az adatbázis neve helyett. Javítsa a nevet a kapcsolati karakterláncban, ahelyett hogy gyengítené a módot.
Hagyja, hogy a hibaüzenet válassza ki a következő lépést
A hiba szövege megmondja, meddig jutott a kísérlet, és ez felülmúl minden találgatást a tunelről. Egy fel nem oldható név még a socket létezése előtt meghiúsul, az időtúllépés azt jelenti, hogy az útvonal vagy egy tűzfal eldobta a csomagokat, az elutasítás azt, hogy valami válaszolt és nemet mondott, a hitelesítési hiba pedig azt, hogy a hálózat már működött.
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 --versionHasonlítsa össze a \conninfo kimenetét a GUI élő munkamenetével: ugyanaz a hoszt, ugyanaz a port, ugyanaz a szerep, ugyanaz a TLS-állapot. Amikor ez a négy egyezik, a VPN-nek nincs több magyaráznivalója. Amíg nem egyeznek, minden további tunelváltoztatás találgatás egy olyan kapcsolatról, amelyet a terminál soha nem hozott létre.