VPN ไม่ได้บล็อก psql: ไคลเอนต์ของคุณเรียกที่อื่น
psql และไคลเอนต์ GUI อาจเรียกปลายทางต่างกันจากเครื่องเดียว เปรียบเทียบโฮสต์ ซ็อกเก็ต บทบาท และ TLS ก่อนโทษ VPN
ไคลเอนต์ทั้งสองอยู่บนแล็ปท็อปเครื่องเดียวกัน ผ่านอุโมงค์เดียวกัน แต่มีเพียงตัวเดียวที่เชื่อมต่อได้ การเปรียบเทียบนั้นรู้สึกเหมือนเป็นหลักฐานว่า VPN เลือกปฏิบัติ ทั้งที่คำอธิบายที่พบบ่อยกว่ามากคือไคลเอนต์สองตัวเรียกปลายทางที่ต่างกัน GUI เก็บโฮสต์ พอร์ต บทบาท และการตั้งค่า TLS ของตัวเองไว้ และสร้างการส่งต่อ SSH อย่างเงียบ ๆ เมื่อจำเป็น ในขณะที่ psql ประกอบการเชื่อมต่อจากค่าเริ่มต้นของ libpq ที่เชลล์ของคุณอาจตั้งไว้แล้ว การทำซ้ำการเชื่อมต่อที่ใช้งานได้จึงเป็นการอ่านการตั้งค่าของ GUI ไม่ใช่การติดตั้งอุโมงค์ใหม่
ความเชื่อผิด: ไคลเอนต์ที่ใช้ได้ตัวเดียวพิสูจน์เส้นทาง
ถ้า GUI เชื่อมต่อได้ อุโมงค์ก็ขนส่งทราฟฟิก และนั่นคือสิ่งเดียวที่ GUI พิสูจน์ได้ มันไม่ได้บอกว่า psql แปลงที่อยู่ใด ตรวจสอบสิทธิ์ด้วยบทบาทใด หรือซ็อกเก็ตที่มันเปิดจะออกจากเครื่องหรือไม่ เส้นทางใช้ร่วมกัน แต่พารามิเตอร์ไม่ได้ใช้ร่วมกัน
การส่งต่อภายในขยายช่องว่างให้กว้างขึ้น GUI อาจเชื่อมต่อกับ 127.0.0.1 บนพอร์ตที่ส่งต่อผ่าน SSH และตัวรับฟังนั้นมีอยู่เพียงตลอดช่วงเซสชันของ GUI psql ที่ชี้ไปยัง localhost โดยไม่มีการส่งต่อจะได้รับการปฏิเสธการเชื่อมต่อซึ่งไม่เกี่ยวกับ 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 แทนที่อยู่เครือข่าย ดังนั้นการเรียก psql โดยไม่มี -h อาจสำเร็จภายในเครื่อง หรือล้มเหลวด้วยข้อผิดพลาดซ็อกเก็ต โดยไม่แตะเส้นทางที่ 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
ถ้าปลายทางที่อนุมัติอยู่หลังพูลเลอร์ พอร์ต 6432 และพอร์ต 5432 อาจไปถึงข้อมูลเดียวกันผ่านอัตลักษณ์เซิร์ฟเวอร์ที่ต่างกัน และการตรวจสอบอาจล้มเหลวที่ชื่อของพูลเลอร์แทนที่จะเป็นชื่อฐานข้อมูล แก้ชื่อในสตริงการเชื่อมต่อแทนการลดความเข้มงวดของโหมด
ให้ข้อความแสดงข้อผิดพลาดเลือกขั้นตอนถัดไป
ข้อความล้มเหลวบอกว่าเซสชันไปได้ไกลแค่ไหน ซึ่งดีกว่าการเดาใด ๆ เกี่ยวกับอุโมงค์ ชื่อที่แปลงไม่ได้จะล้มเหลวก่อนที่ซ็อกเก็ตจะเกิดขึ้น การหมดเวลาหมายความว่าเส้นทางหรือไฟร์วอลล์ทิ้งแพ็กเก็ต การปฏิเสธหมายความว่ามีบางอย่างตอบและปฏิเสธ และข้อผิดพลาดการตรวจสอบสิทธิ์หมายความว่าเครือข่ายทำงานได้อยู่แล้ว
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 ก็ไม่มีอะไรต้องอธิบายอีก ตราบใดที่ยังไม่ตรงกัน ทุกการเปลี่ยนแปลงอุโมงค์เพิ่มเติมคือการเดาเกี่ยวกับการเชื่อมต่อที่เทอร์มินัลไม่เคยสร้าง