คำตอบสั้น ๆ: ใช้ DBeaver เชื่อมต่อ MySQL, MariaDB หรือ PostgreSQL บนเซิร์ฟเวอร์ผ่าน SSH Tunnel โดยไม่ต้องเปิดพอร์ตฐานข้อมูลสู่อินเทอร์เน็ต พร้อมวิธีแก้ปัญหาที่พบบ่อย
คู่มือนี้อธิบาย SSH Tunnel ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
การเปิดพอร์ตฐานข้อมูล (MySQL 3306 หรือ PostgreSQL 5432) สู่อินเทอร์เน็ตเพียงเพื่อให้ผู้ดูแลเปิดดูข้อมูลด้วยโปรแกรมบนเครื่องตัวเอง เพิ่มความเสี่ยงโดยไม่จำเป็น วิธีที่ปลอดภัยกว่าคือ SSH Tunnel ซึ่งให้โปรแกรมบนเครื่องของคุณส่งการเชื่อมต่อผ่าน SSH ที่เข้ารหัสไปยังเซิร์ฟเวอร์ แล้วเชื่อมต่อฐานข้อมูลที่ localhost ของเซิร์ฟเวอร์อีกที ฐานข้อมูลจึงยังฟังเฉพาะภายในเครื่องได้ตามเดิม
บทความนี้ใช้ DBeaver Community ซึ่งเป็นโปรแกรมฟรีที่ใช้ได้บน Windows, macOS และ Linux รองรับทั้ง MySQL, MariaDB และ PostgreSQL ในโปรแกรมเดียว และมีฟีเจอร์ SSH Tunnel ในตัว
สิ่งที่ต้องเตรียม
- เข้าเซิร์ฟเวอร์ผ่าน SSH ได้แล้ว ด้วยรหัสผ่านหรือ SSH Key (แนะนำ SSH Key ดู ตั้งค่า SSH Key และปิดการเข้าสู่ระบบด้วยรหัสผ่านบน Linux)
- ผู้ใช้ฐานข้อมูลและรหัสผ่านที่ใช้งานได้จากภายในเซิร์ฟเวอร์ ดู สร้างฐานข้อมูลและผู้ใช้ MySQL/MariaDB พร้อมกำหนดสิทธิ์ หรือ ติดตั้ง PostgreSQL และสร้างผู้ใช้บน Ubuntu
- DBeaver Community รุ่นปัจจุบัน ดาวน์โหลดจาก dbeaver.io/download
- ข้อมูลตัวอย่างในบทความ: เซิร์ฟเวอร์
203.0.113.10พอร์ต SSH22ผู้ใช้ SSHdeployฐานข้อมูลshopdbผู้ใช้ฐานข้อมูลshopuser
หลักการทำงานของ SSH Tunnel
เส้นทางของข้อมูลเป็นดังนี้: DBeaver บนเครื่องคุณ เปิดพอร์ตชั่วคราวบนเครื่องตัวเอง ส่งข้อมูลผ่าน SSH ไปยัง 203.0.113.10:22 จากนั้น SSH Server บนเซิร์ฟเวอร์ส่งต่อไปยัง 127.0.0.1:3306 หรือ 127.0.0.1:5432 ดังนั้นในหน้าตั้งค่าการเชื่อมต่อฐานข้อมูล ค่า Host ต้องเป็นที่อยู่ของฐานข้อมูล เมื่อมองจากเซิร์ฟเวอร์ ซึ่งก็คือ localhost ไม่ใช่ IP สาธารณะ จุดนี้เป็นสาเหตุของความสับสนที่พบบ่อยที่สุด
ขั้นตอนที่ 1: ตรวจสอบฝั่งเซิร์ฟเวอร์
SSH เข้าเซิร์ฟเวอร์ แล้วตรวจว่าฐานข้อมูลฟังพอร์ตอยู่ที่ localhost
sudo ss -ltnp | grep -E ':3306|:5432'
ควรเห็นบรรทัดเช่น 127.0.0.1:3306 จากนั้นตรวจว่า SSH Server อนุญาต TCP Forwarding (ค่าเริ่มต้นคือ yes แต่เซิร์ฟเวอร์ที่ผ่านการ Hardening อาจปิดไว้)
sudo sshd -T | grep -i allowtcpforwarding
ถ้าได้ allowtcpforwarding no ต้องแก้ใน /etc/ssh/sshd_config หรือไฟล์ใน /etc/ssh/sshd_config.d/ ให้เป็น yes ก่อน ขณะแก้ค่า SSH ให้เปิด Session เดิมค้างไว้เสมอ แล้วทดสอบเข้าจากหน้าต่างใหม่ก่อนปิด Session เดิม เพื่อไม่ให้ล็อกตัวเองออกจากเซิร์ฟเวอร์
สุดท้ายทดสอบว่าผู้ใช้ฐานข้อมูลเข้าผ่าน TCP ภายในเครื่องได้ เพราะ Tunnel จะเข้ามาทาง TCP ไม่ใช่ Socket
# MySQL / MariaDB
mysql -h 127.0.0.1 -P 3306 -u shopuser -p shopdb
# PostgreSQL
psql -h 127.0.0.1 -U appuser -d appdb
ขั้นตอนที่ 2: สร้างการเชื่อมต่อใหม่ใน DBeaver
- เปิด DBeaver คลิกเมนู Database แล้วเลือก New Database Connection (หรือไอคอนปลั๊กที่มุมซ้ายบน)
- เลือกชนิดฐานข้อมูล MySQL, MariaDB หรือ PostgreSQL แล้วกด Next
- ในแท็บ Main กรอกข้อมูลฐานข้อมูลเมื่อมองจากเซิร์ฟเวอร์:
- Server Host:
localhost(หรือ127.0.0.1) - Port:
3306สำหรับ MySQL/MariaDB หรือ5432สำหรับ PostgreSQL - Database:
shopdb - Username และ Password: ผู้ใช้ฐานข้อมูล ไม่ใช่ผู้ใช้ SSH
- Server Host:
ขั้นตอนที่ 3: ตั้งค่า SSH Tunnel
- ในหน้าต่างเดียวกัน ไปที่แท็บ SSH (บางรุ่นอยู่ในกลุ่ม Network configs หรือกดปุ่ม SSH ที่ด้านล่างของหน้า Main ชื่อและตำแหน่งอาจต่างกันเล็กน้อยตามเวอร์ชัน)
- เลือก Use SSH Tunnel
- Host/IP:
203.0.113.10และ Port:22(หรือพอร์ตที่เปลี่ยนไว้ตาม วิธีเปลี่ยน SSH Port บน Linux Server) - User Name:
deploy - Authentication Method: เลือก Public Key แล้วเลือกไฟล์ Private Key ในช่อง Private key (เช่น
~/.ssh/id_ed25519หรือC:\Users\ชื่อผู้ใช้\.ssh\id_ed25519) และใส่ Passphrase ถ้ามี หรือเลือก Password ถ้าเซิร์ฟเวอร์ยังใช้รหัสผ่าน - กดปุ่ม Test tunnel configuration ถ้าสำเร็จจะมีข้อความยืนยันว่าเชื่อมต่อ SSH ได้
ไม่จำเป็นต้องระบุ Local port ปล่อยว่างไว้ DBeaver จะเลือกพอร์ตว่างบนเครื่องให้อัตโนมัติ