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 SOCKS5

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.

Dùng Git Bash

Vì máy có Git Bash nên tôi dùng nó để tạo SSH tunnel. Ta gõ lệnh sau:

ssh -D 8080 hieu@server-ip -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.
  • server-ip: Địa chỉ IP của server.

Dùng PuTTY

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, ta nhấn nút Open để kết nối đến server.

Cấu hình Firefox

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 SOCKS5 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 độ.

Cấu hình Chrome

Chrome không có cài đặt proxy như Firefox vì nó dùng chung cấu hình với Internet Explorer. Tuy nhiên, ta có thể thêm tham số vào shortcut của nó trên desktop.

Click phải chuột vào shortcut Chrome, chọn Properties. Ở mục Target, ta thêm hai thông số:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
    --user-data-dir="%USERPROFILE%\proxy"
    --proxy-server="socks5://localhost:8080"

Cấu hình cho Chrome shortcut

Từ giờ, mỗi khi muốn dùng proxy, ta chạy Chrome bằng shortcut này.

Truy cập máy trong LAN từ Internet

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:nas-ip:80 hieu@server-ip -C -q -N
  • -R: Khai báo port của máy remote (server Ubuntu).
  • 8081: Port localhost của server Ubuntu.
  • nas-ip: 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 hieu@server-ip -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 về cách hoạt động của SSH tunnel.

Bây giờ, tôi mở trình duyệt và nhập localhost:8080 là có thể vô web của NAS. Cái hay của phương pháp này là tôi không cần mở port ra Internet và mọi thứ đượ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:remote-desktop-ip:3389 hieu@server-ip -C -q -N
  • remote-desktop-ip: IP của máy cần remote desktop.
  • 3389: Port mặc định của remote desktop.

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

Remote desktop