VPN psql ਨੂੰ ਨਹੀਂ ਰੋਕਦਾ: ਤੁਹਾਡਾ ਕਲਾਇੰਟ ਕਿਤੇ ਹੋਰ ਡਾਇਲ ਕਰਦਾ ਹੈ
psql ਅਤੇ GUI ਕਲਾਇੰਟ ਇੱਕੋ ਮਸ਼ੀਨ ਤੋਂ ਵੱਖਰੇ ਐਂਡਪੌਇੰਟਾਂ 'ਤੇ ਡਾਇਲ ਕਰ ਸਕਦੇ ਹਨ। VPN ਨੂੰ ਦੋਸ਼ ਦੇਣ ਤੋਂ ਪਹਿਲਾਂ ਹੋਸਟ, ਸਾਕਟ, ਭੂਮਿਕਾ ਅਤੇ TLS ਦੀ ਤੁਲਨਾ ਕਰੋ।
ਦੋਵੇਂ ਕਲਾਇੰਟ ਇੱਕੋ ਲੈਪਟਾਪ 'ਤੇ ਹਨ, ਇੱਕੋ ਟਨਲ ਵਿੱਚੋਂ ਲੰਘਦੇ ਹਨ, ਅਤੇ ਉਨ੍ਹਾਂ ਵਿੱਚੋਂ ਸਿਰਫ਼ ਇੱਕ ਜੁੜਦਾ ਹੈ। ਇਹ ਤੁਲਨਾ VPN ਦੇ ਚੋਣਵਾਂ ਹੋਣ ਦਾ ਸਬੂਤ ਜਾਪਦੀ ਹੈ, ਜਦੋਂ ਕਿ ਕਿਤੇ ਵੱਧ ਆਮ ਵਿਆਖਿਆ ਇਹ ਹੈ ਕਿ ਦੋਵੇਂ ਕਲਾਇੰਟ ਵੱਖਰੇ ਟਿਕਾਣਿਆਂ 'ਤੇ ਡਾਇਲ ਕਰਦੇ ਹਨ। ਇੱਕ GUI ਆਪਣਾ ਹੋਸਟ, ਪੋਰਟ, ਭੂਮਿਕਾ ਅਤੇ TLS ਸੈਟਿੰਗਾਂ ਰੱਖਦਾ ਹੈ ਅਤੇ ਲੋੜ ਪੈਣ 'ਤੇ ਚੁੱਪਚਾਪ SSH ਫਾਰਵਰਡ ਬਣਾਉਂਦਾ ਹੈ, ਜਦੋਂ ਕਿ psql ਤੁਹਾਡੇ ਸ਼ੈੱਲ ਵੱਲੋਂ ਪਹਿਲਾਂ ਹੀ ਸੈੱਟ ਕੀਤੇ libpq ਡਿਫਾਲਟਾਂ ਤੋਂ ਕਨੈਕਸ਼ਨ ਜੋੜਦਾ ਹੈ। ਕੰਮ ਕਰਦੇ ਕਨੈਕਸ਼ਨ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਉਣਾ GUI ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹਨ ਦੀ ਗੱਲ ਹੈ, ਟਨਲ ਮੁੜ ਸਥਾਪਤ ਕਰਨ ਦੀ ਨਹੀਂ।
ਦੰਤਕਥਾ: ਇੱਕ ਕੰਮ ਕਰਦਾ ਕਲਾਇੰਟ ਰਾਹ ਸਾਬਤ ਕਰਦਾ ਹੈ
ਜੇ GUI ਜੁੜਦਾ ਹੈ, ਟਨਲ ਟ੍ਰੈਫਿਕ ਢੋਂਦੀ ਹੈ, ਅਤੇ GUI ਸਿਰਫ਼ ਇਹੀ ਸਾਬਤ ਕਰਦਾ ਹੈ। ਇਹ ਨਹੀਂ ਦੱਸਦਾ ਕਿ psql ਕਿਹੜਾ ਪਤਾ ਹੱਲ ਕਰਦਾ ਹੈ, ਕਿਹੜੀ ਭੂਮਿਕਾ ਨਾਲ ਪ੍ਰਮਾਣਿਤ ਹੁੰਦਾ ਹੈ, ਜਾਂ ਇਹ ਜੋ ਸਾਕਟ ਖੋਲ੍ਹਦਾ ਹੈ ਕਦੇ ਮਸ਼ੀਨ ਤੋਂ ਬਾਹਰ ਜਾਂਦਾ ਹੈ ਜਾਂ ਨਹੀਂ। ਰਾਹ ਸਾਂਝਾ ਹੈ; ਪੈਰਾਮੀਟਰ ਨਹੀਂ।
ਲੋਕਲ ਫਾਰਵਰਡ ਫ਼ਰਕ ਨੂੰ ਹੋਰ ਵਧਾਉਂਦਾ ਹੈ। GUI ਸ਼ਾਇਦ SSH ਰਾਹੀਂ ਫਾਰਵਰਡ ਕੀਤੇ ਪੋਰਟ 'ਤੇ 127.0.0.1 ਨਾਲ ਜੁੜੇ, ਅਤੇ ਉਹ ਸਰੋਤਾ ਸਿਰਫ਼ GUI ਸੈਸ਼ਨ ਦੇ ਦੌਰਾਨ ਹੀ ਹੁੰਦਾ ਹੈ। ਫਾਰਵਰਡ ਤੋਂ ਬਿਨਾਂ localhost ਵੱਲ ਇਸ਼ਾਰਾ ਕਰਦਾ psql ਇੱਕ ਨਾਮਨਜ਼ੂਰ ਕਨੈਕਸ਼ਨ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ ਜਿਸਦਾ VPN ਨਾਲ ਕੋਈ ਸੰਬੰਧ ਨਹੀਂ।
GUI ਅਸਲ ਵਿੱਚ ਜਿਹੜਾ ਐਂਡਪੌਇੰਟ ਵਰਤਦਾ ਹੈ ਉਹ ਪੜ੍ਹੋ
ਕਨੈਕਸ਼ਨ ਦੇ ਗੁਣ ਖੋਲ੍ਹੋ ਅਤੇ ਚਾਰ ਮੁੱਲ ਕਾਪੀ ਕਰੋ: ਹੋਸਟ, ਪੋਰਟ, ਡੇਟਾਬੇਸ ਅਤੇ ਭੂਮਿਕਾ। ਫਿਰ ਟਨਲ ਟੈਬ ਲੱਭੋ, ਕਿਉਂਕਿ SSH ਫਾਰਵਰਡ ਇੱਕ ਨਿੱਜੀ ਪਤੇ ਨੂੰ ਲੋਕਲ ਪੋਰਟ ਵਿੱਚ ਬਦਲਦਾ ਹੈ ਅਤੇ 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 |
ਹਰ ਕਤਾਰ ਵੱਖਰੀ ਪਰਤ 'ਤੇ ਫੇਲ੍ਹ ਹੁੰਦੀ ਹੈ, ਅਤੇ ਤੁਹਾਨੂੰ ਮਿਲਣ ਵਾਲਾ ਸੁਨੇਹਾ ਉਸ ਪਰਤ ਦਾ ਨਾਮ ਲੈਂਦਾ ਹੈ। ਸੰਭਾਲੀ ਪ੍ਰੋਫਾਈਲ ਦਾ ਦੋਸਤਾਨਾ ਨਾਮ psql ਵਿੱਚ ਪੇਸਟ ਕਰਨ ਨਾਲ ਉੱਪਰਲੇ ਕੋਈ ਮੁੱਲ ਨਹੀਂ ਜਾਂਦੇ, ਅਤੇ ਸੇਵਾ ਦਾ ਨਾਮ ਅਜਿਹੀ ਫਾਈਲ ਰਾਹੀਂ ਹੱਲ ਹੁੰਦਾ ਹੈ ਜੋ ਟਰਮੀਨਲ ਕਦੇ ਨਹੀਂ ਪੜ੍ਹ ਸਕਦਾ।
libpq ਤੁਹਾਡੇ ਸ਼ੈੱਲ ਤੋਂ ਕੀ ਵਿਰਾਸਤ ਵਿੱਚ ਲੈਂਦਾ ਹੈ
psql, libpq ਉੱਤੇ ਇੱਕ ਪਤਲਾ ਕਲਾਇੰਟ ਹੈ, ਅਤੇ libpq ਕਿਸੇ ਹੋਰ ਚੀਜ਼ ਤੋਂ ਪਹਿਲਾਂ ਵਾਤਾਵਰਣ ਪੜ੍ਹਦਾ ਹੈ। PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE ਅਤੇ PGSSLMODE ਵਰਗੇ ਵੇਰੀਏਬਲ ਹਰ ਇੱਕ ਕਨੈਕਸ਼ਨ ਦਾ ਕੋਈ ਹਿੱਸਾ ਹੋਰ ਪਾਸੇ ਮੋੜ ਸਕਦਾ ਹੈ। ਇਹ ਟਾਈਪ ਹੋਣ ਦੀ ਥਾਂ ਵਿਰਾਸਤ ਵਿੱਚ ਮਿਲਦੇ ਹਨ, ਇਸ ਲਈ ਤੁਹਾਡੇ ਚਲਾਏ ਕਮਾਂਡ ਵਿੱਚ ਕੁਝ ਵੀ ਇਨ੍ਹਾਂ ਨੂੰ ਨਹੀਂ ਦਿਖਾਉਂਦਾ। ਬਰਾਮਦ ਕੀਤਾ PGSSLMODE ਵੀ ਕਮਾਂਡ ਲਾਈਨ 'ਤੇ ਇੱਕ ਸ਼ਬਦ ਬੋਲੇ ਬਿਨਾਂ ਬਦਲ ਸਕਦਾ ਹੈ ਕਿ ਕਲਾਇੰਟ ਕੀ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ।
ਇਨ੍ਹਾਂ ਵੇਰੀਏਬਲਾਂ ਵਿੱਚੋਂ ਦੋ ਪਹਿਲਾਂ ਸ਼ੱਕ ਦੇ ਹੱਕਦਾਰ ਹਨ। PGHOSTADDR ਇੱਕ ਸੰਖਿਆਤਮਕ ਟਿਕਾਣਾ ਦਿੰਦਾ ਹੈ ਜੋ ਨਾਮ-ਹੱਲ ਨੂੰ ਟੱਪ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਕਿ ਹੋਸਟਨਾਮ ਅਜੇ ਵੀ ਸਰਟੀਫਿਕੇਟ ਦੀ ਪਛਾਣ ਤੈਅ ਕਰਦਾ ਹੈ, ਅਤੇ PGSERVICE ਸੇਵਾ ਫਾਈਲ ਵਿੱਚੋਂ ਹੋਸਟ, ਡੇਟਾਬੇਸ ਅਤੇ TLS ਚੋਣਾਂ ਖਿੱਚ ਲੈਂਦਾ ਹੈ। ਇਸ ਨੂੰ ਡੀਬੱਗ ਕਰਨ ਲਈ ਪੂਰਾ ਵਾਤਾਵਰਣ ਡੰਪ ਕਰਨਾ ਮਾੜੀ ਆਦਤ ਹੈ, ਕਿਉਂਕਿ ਇਸ ਵਿੱਚ ਪਾਸਵਰਡ ਅਤੇ ਅਸੰਬੰਧਿਤ ਟੋਕਨ ਹੋ ਸਕਦੇ ਹਨ; ਇਸ ਦੀ ਥਾਂ ਉਹ ਵੇਰੀਏਬਲ ਚੁਣੋ ਜਿਨ੍ਹਾਂ ਦੀ ਤੁਹਾਨੂੰ ਪਰਵਾਹ ਹੈ।
host ਅਤੇ hostaddr ਦੋਵੇਂ ਛੱਡਣ ਨਾਲ ਨੈੱਟਵਰਕ ਪਤੇ ਦੀ ਥਾਂ Unix ਡੋਮੇਨ ਸਾਕਟ ਚੁਣਿਆ ਜਾਂਦਾ ਹੈ। ਇਸ ਲਈ -h ਤੋਂ ਬਿਨਾਂ psql ਕਾਲ ਸਥਾਨਕ ਤੌਰ 'ਤੇ ਸਫਲ ਹੋ ਸਕਦੀ ਹੈ, ਜਾਂ ਸਾਕਟ ਗਲਤੀ ਨਾਲ ਫੇਲ੍ਹ ਹੋ ਸਕਦੀ ਹੈ, GUI ਵੱਲੋਂ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਰਾਹ ਨੂੰ ਕਦੇ ਛੂਹੇ ਬਿਨਾਂ।
ਉਹੀ ਪੈਰਾਮੀਟਰ ਹੱਥੀਂ ਭੇਜੋ
GUI ਦੇ ਮੁੱਲ ਹੱਥ ਵਿੱਚ ਹੋਣ 'ਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਭੇਜੋ ਅਤੇ ਉਹ ਸ਼ੁਰੂਆਤੀ ਫਾਈਲ ਛੱਡੋ ਜੋ ਓਵਰਰਾਈਡ ਜੋੜ ਸਕਦੀ ਹੈ। ਹੇਠਾਂ ਦਿੱਤੀ ਕਨੈਕਸ਼ਨ ਸਟ੍ਰਿੰਗ ਉਦਾਹਰਨ ਹੈ: ਐਂਡਪੌਇੰਟ, ਪੋਰਟ, ਡੇਟਾਬੇਸ ਅਤੇ ਭੂਮਿਕਾ ਨੂੰ ਤੁਹਾਡੇ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ ਮਨਜ਼ੂਰ ਕੀਤੇ ਮੁੱਲਾਂ ਨਾਲ ਬਦਲੋ, ਅਤੇ ਪਹਿਲਾਂ ਹੀ ਕੰਮ ਕਰ ਰਹੀ ਭਰੋਸਾ ਸੰਰਚਨਾ ਰੱਖੋ।
psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"ਉਸ ਕਮਾਂਡ ਵਿੱਚ ਤਿੰਨ ਵੇਰਵੇ ਜਾਣ-ਬੁੱਝ ਕੇ ਹਨ। -X psql ਦੀ ਸ਼ੁਰੂਆਤੀ ਫਾਈਲ ਦਬਾਉਂਦਾ ਹੈ, ਪਰ libpq ਦਾ ਵਾਤਾਵਰਣ ਜਾਂ ਸੇਵਾ ਪਰਿਭਾਸ਼ਾ ਨਹੀਂ ਦਬਾਉਂਦਾ। connect_timeout=5 ਖਾਲੀ ਰਾਹ ਨੂੰ ਟਰਮੀਨਲ ਮਿੰਟਾਂ ਤੱਕ ਲਟਕਾਉਣ ਤੋਂ ਰੋਕਦਾ ਹੈ। sslmode=verify-full ਸਰਟੀਫਿਕੇਟ ਅਤੇ ਹੋਸਟਨਾਮ ਦੀਆਂ ਜਾਂਚਾਂ ਚਾਲੂ ਰੱਖਦਾ ਹੈ, ਅਤੇ TLS ਗਲਤੀ ਦਿਖਣ 'ਤੇ ਲੋਕ ਠੀਕ ਇਹੀ ਹਿੱਸਾ ਬੰਦ ਕਰਦੇ ਹਨ।
ਜੇ ਮਨਜ਼ੂਰ ਐਂਡਪੌਇੰਟ ਕਿਸੇ pooler ਦੇ ਪਿੱਛੇ ਹੈ, ਤਾਂ ਪੋਰਟ 6432 ਅਤੇ ਪੋਰਟ 5432 ਵੱਖਰੀਆਂ ਸਰਵਰ ਪਛਾਣਾਂ ਰਾਹੀਂ ਉਹੀ ਡੇਟਾ ਤੱਕ ਪਹੁੰਚ ਸਕਦੇ ਹਨ, ਅਤੇ ਤਸਦੀਕ ਡੇਟਾਬੇਸ ਦੇ ਨਾਮ 'ਤੇ ਨਹੀਂ, pooler ਦੇ ਨਾਮ 'ਤੇ ਫੇਲ੍ਹ ਹੋ ਸਕਦੀ ਹੈ। ਮੋਡ ਕਮਜ਼ੋਰ ਕਰਨ ਦੀ ਥਾਂ ਕਨੈਕਸ਼ਨ ਸਟ੍ਰਿੰਗ ਵਿੱਚ ਨਾਮ ਸੁਧਾਰੋ।
ਅਗਲਾ ਕਦਮ ਗਲਤੀ ਸੁਨੇਹੇ ਨੂੰ ਚੁਣਨ ਦਿਓ
ਫੇਲ੍ਹ ਦਾ ਪਾਠ ਦੱਸਦਾ ਹੈ ਕਿ ਕੋਸ਼ਿਸ਼ ਕਿੰਨੀ ਦੂਰ ਗਈ, ਅਤੇ ਇਹ ਟਨਲ ਬਾਰੇ ਕਿਸੇ ਵੀ ਅੰਦਾਜ਼ੇ ਨਾਲੋਂ ਬਿਹਤਰ ਹੈ। ਜੋ ਨਾਮ ਹੱਲ ਨਹੀਂ ਹੁੰਦਾ ਉਹ ਸਾਕਟ ਬਣਨ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਫੇਲ੍ਹ ਹੁੰਦਾ ਹੈ, ਸਮਾਂ ਸਮਾਪਤ ਹੋਣ ਦਾ ਮਤਲਬ ਹੈ ਰਾਹ ਜਾਂ ਫਾਇਰਵਾਲ ਨੇ ਪੈਕਟ ਸੁੱਟੇ, ਇਨਕਾਰ ਦਾ ਮਤਲਬ ਹੈ ਕਿਸੇ ਨੇ ਜਵਾਬ ਦੇ ਕੇ ਮਨਾਹੀ ਕੀਤੀ, ਅਤੇ ਪ੍ਰਮਾਣੀਕਰਨ ਗਲਤੀ ਦਾ ਮਤਲਬ ਹੈ ਨੈੱਟਵਰਕ ਪਹਿਲਾਂ ਹੀ ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ।
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\conninfo ਦੇ ਆਉਟਪੁੱਟ ਦੀ GUI ਦੇ ਜੀਵੰਤ ਸੈਸ਼ਨ ਨਾਲ ਤੁਲਨਾ ਕਰੋ: ਉਹੀ ਹੋਸਟ, ਉਹੀ ਪੋਰਟ, ਉਹੀ ਭੂਮਿਕਾ, ਉਹੀ TLS ਸਥਿਤੀ। ਜਦੋਂ ਇਹ ਚਾਰੇ ਮਿਲ ਜਾਂਦੇ ਹਨ, ਤਾਂ VPN ਕੋਲ ਕਹਿਣ ਲਈ ਕੁਝ ਨਹੀਂ ਬਚਦਾ। ਜਦੋਂ ਤੱਕ ਇਹ ਨਹੀਂ ਮਿਲਦੇ, ਟਨਲ ਵਿੱਚ ਹਰ ਵਾਧੂ ਬਦਲਾਅ ਉਸ ਕਨੈਕਸ਼ਨ ਬਾਰੇ ਅੰਦਾਜ਼ਾ ਹੈ ਜੋ ਟਰਮੀਨਲ ਨੇ ਕਦੇ ਨਹੀਂ ਬਣਾਇਆ।