Tạo SSH Tunnel để kết nối từ xa an toàn
Trong quá trình vận hành server, rất nhiều dịch vụ như MongoDB, MySQL, Redis, PostgreSQL… không nên mở trực tiếp ra internet vì rủi ro bảo mật rất lớn. Hacker chỉ cần quét port là có thể tấn công brute-force hoặc khai thác lỗi dịch vụ.
Giải pháp tốt nhất và an toàn nhất chính là SSH Tunnel.
SSH Tunnel là gì?
SSH Tunnel (Secure Shell Tunnel) là một phương pháp chuyển tiếp (forward) dữ liệu qua kết nối SSH mã hóa.
Nói đơn giản:
- Bạn dùng SSH để mở một “đường hầm bảo mật”
- Tất cả dữ liệu đi qua đường hầm này đều được mã hóa
- Các dịch vụ trên server như MongoDB, MySQL… chỉ cần mở trên localhost (127.0.0.1)
- Nhưng bạn vẫn có thể truy cập từ xa qua SSH Tunnel
Lợi ích cực lớn:
- Không mở port ra internet → hacker không thể quét thấy.
- Dữ liệu truyền đi được mã hóa hoàn toàn
- Bypass được
bindIp: 127.0.0.1mà không phá cấu hình server - Không cần cài thêm VPN
Khi nào bạn cần SSH Tunnel?
- Bạn muốn kết nối MongoDB từ máy tính cá nhân nhưng MongoDB chỉ listen 127.0.0.1
- Dùng MongoDB Compass, TablePlus, Studio 3T, nhưng không muốn mở port 27017
- Muốn làm việc từ xa với MySQL nhưng không mở port 3306
- Cần test API nội bộ trong mạng server
- Muốn truy cập DB trong Kubernetes Pod hoặc Docker container
SSH Tunnel là công cụ “bất ly thân” của DevOps, SysAdmin và lập trình viên backend.
Cách tạo SSH Tunnel đơn giản nhất (Local Port Forwarding)
Giả sử:
- Server IP: 203.113.22.10
- SSH user: ubuntu
- Dịch vụ nội bộ: MongoDB chạy trên 127.0.0.1:27017
Chạy lệnh:
ssh -L 27017:localhost:27017 ubuntu@203.113.22.10
Ý nghĩa:
-L→ Local port forwarding- Truy cập localhost:27017 trên máy bạn
- → được chuyển vào localhost:27017 trên server thông qua SSH
Giờ bạn có thể kết nối từ máy cá nhân:
mongo --host 127.0.0.1 --port 27017 -u webuser -p password
MongoDB nghĩ rằng bạn đang truy cập từ trong server → chấp nhận.
Kết nối bằng MongoDB Compass (có SSH Tunnel)
Trong Compass:
- Chọn SSH Tunnel
-
Nhập:
- SSH Host:
203.113.22.10 - SSH Username:
ubuntu - SSH Private Key:
~/.ssh/id_rsa
- SSH Host:
-
Phần MongoDB:
- Hostname:
127.0.0.1 - Port:
27017 - Username/password như bình thường
- Hostname:
→ Kết nối thành công mà không mở port 27017.
Tạo SSH Tunnel chạy ngầm (background mode)
Nếu bạn không muốn mở terminal treo suốt, dùng:
ssh -f -N -L 27017:localhost:27017 ubuntu@203.113.22.10
Giải thích:
-f→ chạy background-N→ không chạy command nào, chỉ tạo tunnel
Muốn kiểm tra tunnel đang chạy:
ps aux | grep ssh
Muốn tắt tunnel:
pkill -f "ssh -f -N -L"
Tạo SSH Tunnel ngược lại (Reverse Tunnel)
Trong trường hợp bạn cần “mở port ra ngoài” từ server nội bộ:
ssh -R 9000:localhost:3000 user@your_remote_host
- Máy remote có thể truy cập localhost:3000 của server nội bộ qua port 9000.
Rất phù hợp khi NAT, firewall chặn chiều vào.
Ưu điểm của SSH Tunnel
| Lợi ích | Giải thích |
|---|---|
| Rất bảo mật | Traffic mã hóa hoàn toàn |
| Không cần mở port DB | Tránh brute-force & quét port |
| Không cần VPN | Nhẹ, đơn giản, có sẵn |
| Hoạt động trên mọi OS | Windows, macOS, Linux |
| Dễ dùng | Một lệnh là xong |
Nhược điểm
- Cần SSH key/có quyền SSH vào server
- Nếu SSH disconnect → tunnel ngắt
- Cần thiết lập lại nếu đổi máy hoặc đổi mạng
Nhưng đây vẫn là giải pháp an toàn nhất để truy cập DB từ xa.
Kết luận
Nếu bạn đang chạy MongoDB, MySQL, Redis, PostgreSQL… trên server, bạn không nên mở port trực tiếp ra internet.
Thay vào đó hãy dùng SSH Tunnel để kết nối từ xa:
- An toàn
- Bảo mật
- Không cấu hình phức tạp
- Không lo bị hacker scan port
Đây là cách mà hầu hết DevOps chuyên nghiệp đang sử dụng hàng ngày.

Bình luận gần đây