Trong một số tình huống, bạn có thể gặp phải một mạng không an toàn hoặc có tường lửa quá hạn chế, và bạn muốn đảm bảo rằng không ai có thể theo dõi lưu lượng truy cập của bạn. Một giải pháp là thiết lập VPN trên Ubuntu 22.04 / 20.04 / 18.04, nhưng nhiều VPN yêu cầu phần mềm khách đặc biệt trên máy của bạn, điều này có thể bạn không có quyền cài đặt. Tuy nhiên, nếu nhu cầu của bạn chỉ là bảo mật việc duyệt web, có một giải pháp thay thế nhanh chóng, miễn phí và hữu ích: một proxy SOCKS 5.
Một proxy SOCKS là một tunnel SSH mã hóa, trong đó các ứng dụng đã được cấu hình sẽ chuyển tiếp lưu lượng truy cập của chúng xuống, và sau đó, ở phía máy chủ, proxy sẽ chuyển tiếp lưu lượng truy cập đến Internet chung. Khác với VPN, một proxy SOCKS cần phải được cấu hình cho từng ứng dụng trên máy khách, nhưng bạn có thể thiết lập các ứng dụng mà không cần phần mềm khách đặc biệt, miễn là ứng dụng đó có khả năng sử dụng proxy SOCKS. Ở phía máy chủ, tất cả những gì bạn cần cấu hình là SSH.
Trong hướng dẫn này, bạn sẽ sử dụng một máy chủ chạy Ubuntu 22.04 (mặc dù bất kỳ bản phân phối Linux nào có thể truy cập qua SSH đều có thể sử dụng), và trình duyệt web Firefox làm ứng dụng khách. Vào cuối bài học này, bạn sẽ có thể duyệt web một cách an toàn thông qua tunnel SSH mã hóa.
Yêu cầu cần có trước khi sử dụng Tunnel SOCKS
Nếu bạn đang sử dụng phiên bản Ubuntu 16.04 hoặc thấp hơn, chúng tôi khuyến nghị bạn nâng cấp lên phiên bản mới hơn vì Ubuntu không còn cung cấp hỗ trợ cho các phiên bản này nữa. Bộ hướng dẫn này sẽ giúp bạn nâng cấp phiên bản Ubuntu của mình.
- Một máy chủ Linux chạy Ubuntu (các bản phân phối khác cũng có thể sử dụng) với người dùng sudo và quyền truy cập SSH. Để được hướng dẫn cách thiết lập, vui lòng chọn bản phân phối của bạn từ danh sách này và làm theo Hướng Dẫn Thiết Lập Máy Chủ Ban Đầu của chúng tôi.
- Một ứng dụng để cấu hình với proxy SOCKS, chẳng hạn như trình duyệt web Firefox.
- Đối với người dùng Windows, bạn cũng sẽ cần công cụ PuTTY hoặc Windows Subsystem for Linux (WSL).
Lưu ý: PuTTY được sử dụng để thiết lập proxy tunnel cho người dùng Windows. Người dùng macOS hoặc Linux đã có sẵn công cụ để thiết lập tunnel.
Bước 1 (macOS/Linux) — Cài Đặt Tunnel
Trên máy tính cục bộ của bạn, tạo một khóa SSH nếu bạn chưa tạo khi cài đặt Droplet. Sau khi khóa được tạo, đảm bảo rằng phần khóa công khai đã được thêm vào tệp authorized_keys
trên SSH Droplet của bạn. Sau đó, mở một ứng dụng terminal để tạo một SSH tunnel với proxy SOCKS được kích hoạt.
Cài đặt tunnel với lệnh sau:
ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
Giải thích các tham số:
-i
: Đường dẫn đến khóa SSH dùng để kết nối với máy chủ.-D
: Báo cho SSH biết rằng chúng ta muốn một tunnel SOCKS trên cổng số đã chỉ định (bạn có thể chọn một số từ 1025 đến 65536).-f
: Chạy tiến trình ở chế độ nền.-C
: Nén dữ liệu trước khi gửi.-q
: Sử dụng chế độ im lặng.-N
: Báo cho SSH biết sẽ không gửi bất kỳ lệnh nào sau khi tunnel được thiết lập.
Hãy chắc chắn thay thế sammy@your_domain
bằng người dùng sudo của bạn và địa chỉ IP/máy chủ của bạn.
Khi bạn nhập lệnh, bạn sẽ quay lại dòng lệnh mà không có dấu hiệu thành công hay thất bại, điều này là bình thường.
Để xác nhận rằng tunnel đang chạy, bạn có thể sử dụng lệnh sau:
ps aux | grep ssh
Output:
sammy 14345 0.0 0.0 2462228 452 ?? Ss 6:43AM 0:00.00 ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
Bạn có thể thoát khỏi ứng dụng terminal và tunnel vẫn sẽ hoạt động vì chúng ta đã sử dụng tham số -f
, điều này giúp cho phiên SSH chạy trong nền.
Lưu ý: Để dừng tunnel, bạn cần lấy PID thông qua lệnh ps
. Trong ví dụ của chúng tôi, PID là 14345. Sau đó, bạn sử dụng lệnh kill
để kết thúc tiến trình: kill 14345
.
Bước 1 (Windows) — Cài Đặt Tunnel
Mở PuTTY.
Nếu bạn chưa cài đặt PuTTY, hãy tải xuống và lưu nó ở nơi bạn thích. PuTTY không yêu cầu quyền quản trị để cài đặt, chỉ cần tải tệp .exe
và chạy nó.
Hoàn thành các bước sau để thiết lập tunnel:
- Trong phần Session, thêm tên máy chủ (hoặc địa chỉ IP) của bạn và Cổng SSH (thường là cổng 22).
- Ở bên trái, điều hướng đến: Connection > SSH > Tunnels.
- Nhập bất kỳ số cổng nguồn nào từ 1025 đến 65536, ví dụ:
1337
. - Chọn nút radio Dynamic.
- Nhấp vào nút Add.
- Quay lại phần Session ở bên trái.
- Thêm tên vào mục Saved Sessions và nhấp vào nút Save.
- Sau đó nhấp vào nút Open để kết nối.
- Nhập tên người dùng sudo và mật khẩu của máy chủ để đăng nhập.
Bây giờ bạn có thể thu nhỏ cửa sổ PuTTY, nhưng đừng đóng nó. Kết nối SSH của bạn sẽ mở.
Lưu ý: Bạn có thể lưu tên người dùng sudo (sammy) và khóa SSH cho phiên làm việc này bằng cách làm theo hướng dẫn về SSH Key của PuTTY. Điều này sẽ giúp bạn không phải nhập tên người dùng và mật khẩu mỗi lần mở kết nối.
Bước 2 — Cấu Hình Firefox Sử Dụng Tunnel
Bây giờ bạn đã có một SSH tunnel, đã đến lúc cấu hình Firefox để sử dụng tunnel đó. Hãy nhớ rằng để một tunnel SOCKS 5 hoạt động, bạn phải sử dụng một ứng dụng cục bộ có khả năng thực hiện tunnel; Firefox có khả năng này.
Bước này giống nhau cho Windows, macOS và Linux.
Hãy chắc chắn rằng bạn có số cổng mà bạn đã sử dụng trong lệnh SSH; trong ví dụ của chúng tôi, chúng tôi đã sử dụng 1337
.
Các bước sau được thực hiện với phiên bản Firefox 80 nhưng cũng sẽ hoạt động trên các phiên bản khác, mặc dù vị trí các tùy chọn có thể khác nhau:
- Mở Firefox.
- Ở góc trên bên phải, nhấp vào biểu tượng ba thanh ngang để mở menu Firefox.
- Chọn Preferences hoặc Options.
- Cuộn xuống dưới cùng và chọn nút Settings… trong phần Network Settings.
- Dưới tiêu đề Configure Proxy Access to the Internet, chọn Manual proxy configuration.
- Đối với SOCKS Host, nhập
localhost
hoặc127.0.0.1
, và đối với port, sử dụng cổng tùy chỉnh mà bạn đã chỉ định trong tunnel (1337). - Gần cuối, đánh dấu ô Proxy DNS when using SOCKS v5.
- Nhấn nút OK để lưu và đóng cấu hình.
Bây giờ, hãy mở một tab mới trong Firefox và bắt đầu duyệt web. Bạn sẽ có thể duyệt web một cách an toàn qua tunnel SSH của mình. Dữ liệu bạn nhận được từ trang web sẽ được mã hóa. Thêm vào đó, vì bạn đã chọn tùy chọn Proxy DNS, các yêu cầu DNS của bạn cũng sẽ được mã hóa, vì vậy nhà cung cấp dịch vụ internet của bạn không thể thấy những gì bạn đang xem hoặc bạn đã đi đâu để truy cập chúng.
Để xác minh rằng bạn đang sử dụng proxy, quay lại cài đặt Network Settings trong Firefox và nhập một số cổng khác và lưu cấu hình. Bây giờ, nếu bạn thử duyệt web, bạn sẽ nhận được một thông báo lỗi: “The proxy server is refusing connections.” Điều này chứng minh rằng Firefox đang sử dụng proxy và không chỉ kết nối mặc định. Ngoài ra, bạn có thể vào một trang web kiểm tra địa chỉ IP công cộng, chẳng hạn như ipecho.net, và địa chỉ IP mà nó trả về sẽ là IP của SSH Droplet của bạn, vì nó hiện đang hoạt động như một proxy.
Bước 3 — Khôi Phục Proxy Trong Firefox
Khi bạn không còn cần đến tính năng bảo mật của SSH tunnel nữa, hãy quay lại cài đặt proxy mạng trong Firefox. Nhấp vào nút radio cho Use system proxy settings và nhấn OK.
Giờ đây, vì Firefox không còn sử dụng tunnel SOCKS, chúng ta có thể đóng tunnel. Bạn có thể để tunnel hoạt động để có thể bật và tắt proxy trong Firefox bất cứ khi nào bạn muốn, nhưng nếu để tunnel không hoạt động quá lâu, nó có thể tự đóng.
Đóng Tunnel (macOS/Linux)
Tunnel mà chúng ta tạo trước đó trên máy cục bộ đã được đưa vào nền, vì vậy việc đóng cửa sổ terminal mà bạn đã dùng để mở tunnel sẽ không kết thúc nó. Để dừng tunnel, chúng ta cần xác định Process ID (PID) bằng lệnh ps
, sau đó sử dụng lệnh kill
để kết thúc tiến trình.
Tìm tất cả các tiến trình SSH đang hoạt động trên máy của bạn:
ps aux |grep ssh
Output:
sammy 14345 0.0 0.0 2462228 452 ?? Ss 6:43AM 0:00.00 ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
Tìm dòng giống như lệnh bạn đã nhập trước đó để tạo tunnel. Dưới đây là ví dụ về output:
Từ đầu dòng, trong một trong hai cột đầu tiên, có một số từ 3-5 chữ số. Đây chính là PID. Ví dụ PID ở đây là 14345
.
Bây giờ bạn đã biết PID, bạn có thể sử dụng lệnh kill
để đóng tunnel:
kill 14345
Đóng Tunnel (Windows)
Để đóng tunnel trên Windows, bạn chỉ cần đóng cửa sổ PuTTY mà bạn đã sử dụng để tạo tunnel. Đơn giản như vậy.
Bước 4 (macOS/Linux) — Tạo Lối Tắt Cho Việc Sử Dụng Lặp Lại
Đối với hệ thống macOS hoặc Linux, chúng ta có thể tạo một alias hoặc một script để nhanh chóng tạo tunnel cho chúng ta. Dưới đây là hai cách để tự động hóa quy trình tạo tunnel:
Cả hai phương pháp lối tắt này đều yêu cầu xác thực SSH không mật khẩu (hoặc không có passphrase) đối với máy chủ.
Script Bash Có Thể Nhấp
Nếu bạn muốn có một biểu tượng mà khi nhấp vào sẽ bắt đầu tunnel, chúng ta có thể tạo một script Bash nhỏ để làm công việc đó. Script này sẽ thiết lập tunnel và sau đó mở Firefox, mặc dù bạn vẫn cần phải thêm cấu hình proxy thủ công trong Firefox lần đầu tiên.
Trên macOS, tệp nhị phân của Firefox mà chúng ta có thể mở từ dòng lệnh nằm trong Firefox.app
. Giả sử ứng dụng nằm trong thư mục Applications, tệp nhị phân sẽ có đường dẫn là /Applications/Firefox.app/Contents/MacOS/firefox
.
Trên hệ thống Linux, nếu bạn cài đặt Firefox từ repository hoặc nếu nó đã được cài sẵn, đường dẫn của Firefox sẽ là /usr/bin/firefox
. Bạn có thể luôn sử dụng lệnh which firefox
để tìm vị trí của Firefox trên hệ thống nếu nó không ở vị trí chuẩn.
Trong script này, thay thế đường dẫn đến Firefox với đường dẫn thích hợp cho hệ thống của bạn. Bạn cũng có thể cần điều chỉnh dòng SSH để phản ánh lệnh thành công mà bạn đã sử dụng trước đó để tạo tunnel.
Sử dụng một trình soạn thảo văn bản như nano để tạo một tệp mới:
nano ~/socks.sh
Thêm các dòng sau:
socks.sh #!/bin/bash -e ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@`your_domain` /Applications/Firefox.app/Contents/MacOS/firefox &
- Thay thế
1337
với số cổng mà bạn mong muốn (nó phải khớp với những gì bạn đã nhập trong Firefox). - Thay
sammy@your_domain
với người dùng SSH của bạn @ tên miền hoặc IP. - Thay
/Applications/Firefox.app/Contents/MacOS/firefox
với đường dẫn đến tệp nhị phân của Firefox trên hệ thống của bạn.
Lưu tệp script. Đối với nano, bạn nhấn CONTROL + o, sau đó để thoát, nhấn CONTROL + x.
Tiếp theo, tạo script có thể thực thi, để khi bạn nhấp đúp vào, nó sẽ thực hiện. Từ dòng lệnh, sử dụng lệnh chmod
để thêm quyền thực thi:
chmod +x /path/to/socks.sh
Trên macOS, bạn có thể cần thực hiện một bước bổ sung để macOS biết rằng tệp .sh
nên được thực thi như một chương trình và không mở trong trình soạn thảo. Để làm điều này, nhấp chuột phải vào tệp socks.sh
và chọn Get Info.
Tìm phần Open with: và nếu biểu tượng tam giác không hướng xuống, nhấp vào nó để thấy menu thả xuống. Nếu Xcode được thiết lập làm ứng dụng mặc định, thay đổi nó thành Terminal.app. Nếu không thấy Terminal.app, chọn Other…, sau đó điều hướng đến Applications > Utilities > Terminal.app.
Bây giờ, để mở proxy SOCKS, chỉ cần nhấp đúp vào tệp socks.sh
. Script sẽ mở cửa sổ terminal, bắt đầu kết nối SSH và mở Firefox. Bạn có thể đóng cửa sổ terminal sau khi đã mở Firefox.
Alias Dòng Lệnh
Nếu bạn thường xuyên sử dụng dòng lệnh và muốn mở tunnel, bạn có thể tạo một alias dòng lệnh để làm công việc này cho bạn.
Phần khó nhất của việc tạo alias là tìm vị trí lưu lệnh alias. Các bản phân phối Linux khác nhau và các phiên bản macOS lưu alias ở các vị trí khác nhau. Cách tốt nhất là tìm một trong các tệp sau và tìm kiếm từ khóa alias
để xem alias được lưu ở đâu:
- ~/.bashrc
- ~/.zshrc
- ~/.bash_aliases
- ~/.bash_profile
- ~/.profile
Khi đã tìm được tệp đúng, thêm alias sau vào bất kỳ đâu trong tệp (hoặc ở cuối tệp nếu không có alias nào):
.bashrc alias firesox='ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain && /Applications/Firefox.app/Contents/MacOS/firefox &'
- Thay
1337
với số cổng bạn muốn (phải khớp với những gì bạn đã nhập trong Firefox). - Thay
sammy@your_domain
với người dùng SSH của bạn @ tên miền hoặc IP. - Thay
/Applications/Firefox.app/Contents/MacOS/firefox
với đường dẫn đến tệp nhị phân của Firefox.
Bước 5 (Tùy Chọn) — Khắc Phục Sự Cố: Vượt Qua Các Tường Lửa
Nếu kết nối của bạn hoạt động bình thường, bạn có thể dừng đọc và tiếp tục công việc của mình. Tuy nhiên, nếu bạn phát hiện rằng không thể tạo kết nối SSH do một tường lửa hạn chế, có khả năng cổng 22 — cổng cần thiết để tạo tunnel — đã bị chặn. Nếu bạn có quyền kiểm soát cài đặt SSH của máy chủ proxy (với quyền root trên một DataOnline Droplet, bạn sẽ có quyền này), bạn có thể thiết lập SSH lắng nghe trên một cổng khác ngoài cổng 22.
Vậy bạn có thể sử dụng cổng nào mà không bị chặn?
Các cổng thường mở bao gồm cổng 80 (dành cho lưu lượng web thông thường) và cổng 443 (TLS, lưu lượng web bảo mật). Nếu máy chủ SSH của bạn không phục vụ nội dung web, bạn có thể chỉ định cho SSH sử dụng một trong những cổng web này thay vì cổng mặc định là 22. Cổng 443 là lựa chọn tốt nhất vì nó thường được mong đợi sẽ có lưu lượng được mã hóa, và lưu lượng SSH của chúng ta sẽ được mã hóa.
Từ một vị trí không bị tường lửa, SSH vào DataOnline Droplet mà bạn đang sử dụng cho proxy hoặc sử dụng bảng điều khiển của DataOnline để vào console.
Chỉnh sửa cài đặt SSH của máy chủ:
sudo nano /etc/ssh/sshd_config
Tìm dòng Port 22
.
Thay thế 22
bằng một cổng khác mà bạn muốn SSH lắng nghe, ví dụ như cổng 443. Bạn cũng có thể thêm một dòng dưới dòng Port 22
để cho SSH lắng nghe cả hai cổng:
sshd_config . . . Port 22 Port 443 . . .
Port 22 Port 443
Khởi động lại dịch vụ SSH để áp dụng các thay đổi cấu hình:
sudo service ssh restart
Lưu ý: Tên dịch vụ SSH có thể thay đổi tùy vào phân phối của bạn, có thể là ssh
hoặc sshd
. Nếu một trong các tên này không hoạt động, hãy thử tên còn lại.
Để xác minh rằng cổng SSH mới hoạt động, mở một cửa sổ shell mới (đừng đóng cửa sổ hiện tại, phòng trường hợp bạn vô tình bị khóa khỏi máy chủ) và SSH vào máy chủ sử dụng cổng mới:
ssh sammy@your_domain -p 443
Nếu kết nối thành công, bạn có thể đăng xuất khỏi cả hai shell và mở lại tunnel SSH sử dụng cổng mới:
ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain -p 443
Cài đặt Firefox sẽ không thay đổi vì nó không phụ thuộc vào cổng SSH, chỉ cần cổng tunnel (1337 ở trên) là đủ.
Kết Luận
Trong thời đại hiện nay, có rất nhiều cách để duyệt web một cách an toàn khi bạn đang sử dụng một mạng có thể không an toàn, chẳng hạn như wifi công cộng ở quán cà phê. Trong hầu hết các trường hợp, nếu bạn có thể sử dụng VPN để bảo mật và bảo vệ toàn bộ lưu lượng của mình, thì việc sử dụng VPN là ưu tiên. Tuy nhiên, nếu không thể sử dụng hoặc tin tưởng vào VPN, một tunnel SOCKS sẽ cung cấp cho bạn sự bảo mật cần thiết trong khi duyệt web.
Một tunnel SOCKS dễ dàng thiết lập và sử dụng trong những tình huống khẩn cấp, và bạn có toàn quyền kiểm soát nó. Nó là một lựa chọn tuyệt vời cho việc duyệt web an toàn khi bạn không thể hoặc không muốn sử dụng VPN.