Thủ thuật SSH

Đã đụng tới server Linux thì ta không thể tránh SSH. Tuy nhiên, SSH có nhiều ứng dụng hơn là chạy lệnh cho VPS. Trong bài này, tôi sẽ hướng dẫn vài thủ thuật SSH tôi hay dùng để vượt tường lửa, truy cập máy ở nhà mà không cần port forwarding của router và dùng remote desktop khi bị chặn port mặc định.

Vượt tường lửa với proxy SOCKS 5

Thỉnh thoảng, tôi có nhu cầu vượt tường lửa nhưng do không dùng máy tính cá nhân nên không thể cài VPN. Do vậy, tôi thường dùng VPS Ubuntu làm proxy. Chỉ cần gõ một dòng lệnh và chỉnh cấu hình Firefox, tôi có thể vượt tường lửa dễ dàng. Sau đây là cách thực hiện.

Trước tiên, ta phải có server Ubuntu (hoặc bất kì distro nào). Nếu tạo VPS trên Digital Ocean hoặc Vultr thì SSH đã cài sẵn (nếu không thì làm sao kết nối với server?). Còn nếu dùng Azure thì lúc tạo máy ảo, tôi chọn mở port SSH.

Vì máy có Git Bash nên tôi dùng nó để tạo SSH tunnel.

ssh -D 8080 [email protected] -C -q -N
  • -D: Tạo SOCKS tunnel với port 8080 (chọn tùy ý từ 1025 đến 65536).
  • -C: Nén data trước khi gởi đi (compression).
  • -q: Chế độ im lặng (quiet mode).
  • -N: Báo rằng tunnel không dùng để chạy command.
  • hieu: Tên user để đăng nhập Ubuntu.
  • 12.23.34.45: Địa chỉ IP của server.

Tiếp theo, tôi bật Firefox, tìm mục Network Proxy trong Options. Tôi chọn Manual proxy configuration, rồi nhập localhost vào dòng SOCKS Host, còn phần Port tôi nhập 8080. Tôi chọn Proxy DNS when using SOCKS v5 để trình duyệt gởi truy vấn DNS qua SSH (một cách chống lộ IP).

Cấu hình SOCKS 5 cho Firefox

Tôi vào dnsleaktest.com để kiểm tra IP. Nếu IP của VPS hiện ra thì mọi thứ hoạt động tốt. Sau đó, tôi vào tiếp speedtest.net để thử tốc độ.

Nếu không dùng Git Bash, ta có thể dùng PuTTY. Dưới đây là cách thực hiện.

Đầu tiên tôi nhập IP và port của server Ubuntu.

Nhập IP và port của server

Tiếp theo, tôi cấu hình SSH tunnel.

Chọn kết nối Dynamic và port của máy local

Cuối cùng, tôi chỉnh proxy SOCKS 5 của Firefox như đã trình bày ở trên.

Truy cập máy trong LAN từ Internet không cần port forwarding

Tôi hiện có một NAS chạy ở nhà và nó cho phép truy cập file thông qua giao diện web. Đôi lúc khi đi xa, tôi muốn lấy vài file trong NAS ở nhà. Để làm việc này, tôi phải cấu hình port forwarding trong router. Vì là IP động nên tôi phải dùng thêm dịch vụ Dynamic DNS. Nếu có server Ubuntu, tôi có thể dùng nó làm cầu nối để vô NAS. Đặc biệt, tôi không phải mở port trên router ra Internet, giúp tăng cường bảo mật.

Cách hoạt động của phương pháp này như sau: Đầu tiên tôi tạo tunnel ngược (reverse tunnel) để mở đường từ server Ubuntu đến NAS thông qua máy tôi (máy trong LAN có thể truy cập web NAS). Mỗi khi đi xa mà cần lấy file của NAS, tôi tạo tunnel đến server Ubuntu. Hai tunnel sẽ gặp nhau tại server này và tạo thành cầu nối để truyền traffic giữa máy ở Internet và NAS ở nhà.

Tôi dùng lệnh sau để tạo SSH reverse tunnel cho máy ở nhà.

ssh -R 8081:192.168.1.6:80 [email protected] -C -q -N
  • -R: Khai báo port của máy remote (server Ubuntu).
  • 8081: Port localhost của server Ubuntu.
  • 192.168.1.6: IP của NAS trong LAN.
  • 80: Port của web NAS trong LAN.

Từ máy ở Internet, tôi dùng lệnh sau để tạo tunnel đến server Ubuntu.

ssh -L 8080:localhost:8081 [email protected] -C -q -N
  • -L: Khai báo port của máy local (máy đang chạy lệnh này).
  • 8080: Port localhost của máy local.
  • localhost: Localhost của server Ubuntu.
  • 8081: Port localhost của server Ubuntu.

Nếu cảm thấy SSH quá bí hiểm, hãy tham khảo bài trên StackExchange để hiểu cách hoạt động của SSH tunnel.

Bây giờ, tôi mở trình duyệt và nhập địa chỉ localhost:8080 là có thể vô web NAS như đang ở nhà. Cái hay của phương pháp này là tôi không cần mở bất kì port nào ra Internet, và mọi thứ đều được mã hóa trong SSH tunnel (ngoại trừ traffic giữa máy trong LAN và NAS).

Remote desktop khi bị chặn port 3389

Có đôi khi tôi cần remote desktop đến máy nằm ngoài mạng LAN nhưng do tường lửa chặn port 3389 (port mặc định của remote desktop) nên không thể truy cập được. Để giải quyết vấn đề này, tôi sẽ kết nối server Ubuntu bằng SSH rồi dùng nó như trung gian giữa tôi và máy cần remote desktop.

Đầu tiên, tôi tạo một SSH tunnel đến server Ubuntu.

ssh -L 8080:13.46.79.25:3389 [email protected] -C -q -N
  • 13.46.79.25: IP của máy cần remote desktop.
  • 3389: Port mặc định của remote desktop.

Sau đó tôi dùng ứng dụng Remote Desktop của Windows để kết nối đến địa chỉ localhost:8080. Lúc này, mọi traffic sẽ đi qua SSH tunnel và tường lửa sẽ không phát hiện ra tôi đang dùng remote desktop.

Remote desktop

SSH tunnel thường được dùng để chuyển hướng traffic đến một server trung gian thay vì đi thẳng đến đích, giúp che giấu IP của máy đích.