Truy cập cơ sở dữ liệu từ xa: làm sao để không phơi nó ra toàn internet
Hai cách kết nối đến cơ sở dữ liệu trên VDS từ máy tính làm việc của bạn: SSH tunnel và mở cổng với các hạn chế. Nên chọn cách nào và cách kiểm tra.
Cập nhật 23 tháng 8, 2026
Cơ sở dữ liệu lắng nghe trên 0.0.0.0 với mật khẩu root chỉ trụ được đến lần quét đầu tiên — mà toàn bộ dải địa chỉ thì bị quét liên tục. Đồng thời, việc kết nối vào cơ sở dữ liệu từ laptop bằng client lại rất tiện và thường là cần thiết. Có hai cách, và chỉ một trong số đó không có nhược điểm.
Cách 1: SSH tunnel (khuyến nghị)
Cơ sở dữ liệu vẫn gắn với 127.0.0.1, và ra bên ngoài chỉ có SSH. Trên máy của bạn:
ssh -L 5433:127.0.0.1:5432 root@YOUR_ADDRESS -N
ssh -L 3307:127.0.0.1:3306 root@YOUR_ADDRESS -N
Giờ hãy kết nối tới 127.0.0.1:5433 trong DBeaver, TablePlus hoặc psql. Từ góc nhìn của cơ sở dữ liệu, đây giống như một kết nối cục bộ.
Hầu hết client đều có thể tự thiết lập tunnel: trong phần cài đặt kết nối có tab “SSH”. Chỉ định địa chỉ máy từ mục “Overview” của bảng điều khiển /hosting/vds/m/<id> và khóa của bạn.
Ưu điểm của cách này: bạn không cần thay đổi gì trong cấu hình cơ sở dữ liệu hay tường lửa.
Cách 2: mở cổng kèm giới hạn
Đây là giải pháp cuối — dành cho trường hợp một dịch vụ bên ngoài có địa chỉ tĩnh đã biết kết nối vào. Mọi bước dưới đây đều bắt buộc:
ufw allow from 203.0.113.10 to any port 5432 proto tcp
Với PostgreSQL: listen_addresses = '*' và dòng hostssl all all 203.0.113.10/32 scram-sha-256 trong pg_hba.conf. Với MySQL: bind-address = 0.0.0.0 và một user gắn với địa chỉ cụ thể:
CREATE USER 'app'@'203.0.113.10' IDENTIFIED BY 'long-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'203.0.113.10';
Nếu không có TLS, kết nối như vậy sẽ truyền dữ liệu dưới dạng văn bản thuần. ufw allow 5432 mà không chỉ định nguồn chính là “mở nó ra cho cả internet”.
Kiểm tra
Từ một máy khác:
nmap -Pn -p 3306,5432,6379,27017 YOUR_ADDRESS
Phản hồi mong đợi là filtered hoặc closed trên mọi cổng. Còn cục bộ, hãy kiểm tra xem cái gì đang lắng nghe và ở đâu:
ss -tulpn | grep -E '3306|5432|6379'
Lỗi thường gặp
| Triệu chứng | Nguyên nhân |
|---|---|
| Client không kết nối được qua tunnel | Cổng cục bộ đã bị chiếm — hãy chọn cổng khác |
Host ... is not allowed to connect | User MySQL bị gắn với localhost |
no pg_hba.conf entry for host | Không có quy tắc cho địa chỉ của bạn |
| Cổng mở nhưng không có phản hồi | Cơ sở dữ liệu chỉ lắng nghe trên 127.0.0.1 |
| Chạy được, rồi dừng | Nhà cung cấp cấp cho bạn địa chỉ động — thêm một lý do để dùng tunnel |
Các máy không có IPv6, cũng không có địa chỉ thứ hai. Hãy viết mọi quy tắc cho địa chỉ IPv4 công khai duy nhất từ mục “Overview” — sẽ không có nhầm lẫn với hai stack.