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.1 mà 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:

  1. Chọn SSH Tunnel
  2. Nhập:

    • SSH Host: 203.113.22.10
    • SSH Username: ubuntu
    • SSH Private Key: ~/.ssh/id_rsa
  3. Phần MongoDB:

    • Hostname: 127.0.0.1
    • Port: 27017
    • Username/password như bình thường

→ 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.

Mr.Phan

KTS, KSXD, Developer

You may also like...

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *