Tự dựng máy chủ Shadowsocks trên VPS với shadowsocks-rust

Chạy ssserver trên VPS: cấu hình 2022-blake3, dịch vụ systemd, mở TCP và UDP, tạo link ss:// và mã QR, rồi nhập vào Proxy Route của GreenTunnel.

WireGuard rất tốt khi mạng cho nó đi qua. Shadowsocks là một công cụ khác hẳn. Nó là proxy chứ không phải VPN, lưu lượng của nó trông như các byte ngẫu nhiên, và nó chỉ cần một cổng TCP và UDP. Nhiều người chạy cả hai trên cùng một VPS, rồi chọn cái nào chạy tốt nhất trên mạng mình đang dùng.

Bài này dùng shadowsocks-rust, bản viết bằng Rust đang được duy trì tích cực và hỗ trợ các kiểu mã hoá “2022” mới. Phía điện thoại là Proxy Route trong GreenTunnel, hỗ trợ Shadowsocks qua cả TCP lẫn UDP. Địa chỉ trong bài là địa chỉ dùng cho tài liệu. 203.0.113.20 thay cho IP công khai của VPS.

Sáu bước. Trên VPS: cài ssserver, tạo khoá bằng openssl rand -base64 32, viết config.json và unit systemd với 2022-blake3-aes-256-gcm, mở TCP và UDP 8388. Trên điện thoại: tạo link ss:// và mã QR, rồi nhập vào GreenTunnel, kiểm tra, chọn và giữ UDP bật.
Bốn bước trên máy chủ, hai bước trên điện thoại.

Chuẩn bị

  • Một VPS chạy Ubuntu hoặc Debian, có IP công khai và quyền SSH với sudo.
  • Nhà cung cấp và quốc gia bạn chọn một cách hợp pháp, với điều khoản cho phép chạy proxy cá nhân.
  • Đồng hồ trên máy chủ phải đúng. Các kiểu mã hoá 2022 từ chối gói tin có dấu thời gian lệch quá nhiều. Ubuntu mặc định đã tự đồng bộ giờ, và timedatectl nên báo “System clock synchronized: yes”.

Bước 1: cài ssserver

shadowsocks-rust phát hành sẵn bản build cho Linux trên trang releases ở GitHub. Hãy lấy tag phiên bản mới nhất ở đó, và chọn gói theo CPU: x86_64 cho phần lớn VPS, aarch64 cho VPS dùng chip ARM.

VER=v1.25.0          # thay bằng tag mới nhất trên trang releases
ARCH=x86_64-unknown-linux-gnu
cd /tmp
curl -LO https://github.com/shadowsocks/shadowsocks-rust/releases/download/$VER/shadowsocks-$VER.$ARCH.tar.xz
curl -LO https://github.com/shadowsocks/shadowsocks-rust/releases/download/$VER/shadowsocks-$VER.$ARCH.tar.xz.sha256
sha256sum -c shadowsocks-$VER.$ARCH.tar.xz.sha256
sudo tar -xJf shadowsocks-$VER.$ARCH.tar.xz -C /usr/local/bin ssserver
ssserver --version

Chỉ tải từ trang releases chính thức của dự án, và chỉ làm tiếp khi dòng kiểm tra checksum báo OK. Một số bản phân phối Linux cũng đóng gói sẵn shadowsocks-rust, hoặc bạn có thể tự build bằng cargo install shadowsocks-rust. Tránh gói shadowsocks-libev cũ, vì nó không hỗ trợ các kiểu mã hoá 2022.

Bước 2: tạo khoá

Các kiểu mã hoá 2022 không dùng mật khẩu tự gõ. Chúng cần một khoá ngẫu nhiên có độ dài chính xác. Với 2022-blake3-aes-256-gcm, khoá dài 32 byte và được viết dưới dạng Base64:

openssl rand -base64 32

Kết quả là một chuỗi 44 ký tự kết thúc bằng dấu =. Giữ nó lại cho bước sau. Đừng bao giờ dùng lại khoá lấy từ bài hướng dẫn, ảnh chụp màn hình hay một máy chủ khác.

Bước 3: config.json và dịch vụ systemd

Tạo một tài khoản hệ thống riêng để máy chủ không chạy bằng quyền root, cùng một file cấu hình chỉ tài khoản đó đọc được:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin ssrust
sudo mkdir -p /etc/shadowsocks-rust
sudo nano /etc/shadowsocks-rust/config.json
{
    "server": "0.0.0.0",
    "server_port": 8388,
    "method": "2022-blake3-aes-256-gcm",
    "password": "PASTE_THE_BASE64_KEY_HERE",
    "mode": "tcp_and_udp"
}
sudo chown root:ssrust /etc/shadowsocks-rust/config.json
sudo chmod 640 /etc/shadowsocks-rust/config.json

"mode": "tcp_and_udp" là thứ cho phép game, cuộc gọi và QUIC cũng đi qua máy chủ. Dùng "::" làm địa chỉ server nếu bạn muốn lắng nghe cả trên IPv6.

Phương án khác: chacha20-ietf-poly1305

Một số ứng dụng cũ chưa biết các kiểu mã hoá 2022. Nếu cần phục vụ cả những ứng dụng đó, hãy dùng kiểu AEAD phổ biến với một mật khẩu ngẫu nhiên đủ dài:

"method": "chacha20-ietf-poly1305",
"password": "OUTPUT_OF_openssl_rand_-base64_24",

GreenTunnel hỗ trợ cả hai. Khi mọi ứng dụng bạn dùng đều hỗ trợ, hãy ưu tiên kiểu 2022, vì nó chống được việc phát lại lưu lượng cũ (replay).

Dịch vụ systemd

Tạo file /etc/systemd/system/ssserver.service:

[Unit]
Description=Shadowsocks-rust server
After=network-online.target
Wants=network-online.target

[Service]
User=ssrust
Group=ssrust
ExecStart=/usr/local/bin/ssserver -c /etc/shadowsocks-rust/config.json
Restart=on-failure
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
LimitNOFILE=51200

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now ssserver
sudo systemctl status ssserver
sudo ss -tulpn | grep 8388

Lệnh cuối phải cho thấy ssserver lắng nghe cổng 8388 hai lần, một cho tcp và một cho udp.

Bước 4: mở tường lửa

Khác với WireGuard, proxy không cần chuyển tiếp IP hay NAT. Máy chủ tự mở các kết nối đi ra. Bạn chỉ cần mở cổng của nó, cho cả hai giao thức:

sudo ufw allow OpenSSH
sudo ufw allow 8388/tcp
sudo ufw allow 8388/udp
sudo ufw enable

Nếu nhà cung cấp có tường lửa hoặc security group trong trang quản trị, hãy mở TCP và UDP 8388 ở đó nữa.

Bước 5: tạo link ss:// và mã QR

Một link ss:// theo chuẩn SIP002 gói kiểu mã hoá, khoá, địa chỉ và cổng vào một dòng. Với kiểu 2022, khoá được ghi nguyên, chỉ các ký tự như +, / và = được mã hoá phần trăm. Đoạn script nhỏ dưới đây đọc file cấu hình và in ra link. Điền IP hoặc tên miền của VPS vào host.

sudo python3 - <<'EOF'
import json, urllib.parse as u
c = json.load(open("/etc/shadowsocks-rust/config.json"))
host = "203.0.113.20"
print(f"ss://{c['method']}:{u.quote(c['password'], safe='')}@{host}:{c['server_port']}#My%20VPS")
EOF

Kết quả có dạng ss://2022-blake3-aes-256-gcm:KEY%3D@203.0.113.20:8388#My%20VPS, với khoá thật của bạn. Với chacha20-ietf-poly1305, nhiều ứng dụng lại muốn phần method:password ở dạng Base64. Bạn có thể tạo dạng đó như sau:

printf '%s' 'chacha20-ietf-poly1305:YOUR_PASSWORD' | base64 -w0 | tr '+/' '-_' | tr -d '='

GreenTunnel đọc được cả hai dạng. Giờ hiện link thành mã QR ngay trong terminal:

qrencode -t ansiutf8 'ss://2022-blake3-aes-256-gcm:KEY%3D@203.0.113.20:8388#My%20VPS'

GreenTunnel không hỗ trợ plugin của Shadowsocks như obfs hay v2ray-plugin, nên link không được chứa ?plugin=.

Bước 6: nhập vào GreenTunnel

  1. Mở thẻ Nâng cao dưới nút nguồn, chạm Cấu hình, rồi Nhập cấu hình.
  2. Chọn Quét mã QR, hoặc sao chép link rồi chọn Dán link hoặc cấu hình.
  3. Trình chỉnh sửa mở ra với profile Shadowsocks đã điền sẵn kiểu mã hoá, khoá và Gửi cả UDP đang bật. Xem lại rồi lưu.
  4. Chạm Kiểm tra. GreenTunnel thực hiện một lần bắt tay TLS qua máy chủ của bạn và hiện thời gian tính bằng mili giây.
  5. Chọn profile trong thẻ Nâng cao, hoặc giữ Đi thẳng và chỉ cho một số trang, một số ứng dụng đi qua bằng quy tắc.
Bảng Nhập cấu hình với ba lựa chọn: dán link hoặc cấu hình, quét mã QR, chọn file
Dán link ss:// hoặc quét mã QR của nó.
Trình chỉnh sửa profile loại Shadowsocks, với máy chủ, cổng 8388, ô chọn kiểu mã hoá, ô mật khẩu và công tắc Gửi cả UDP đang bật
Trình chỉnh sửa Shadowsocks. Giữ Gửi cả UDP bật khi máy chủ chạy tcp_and_udp.

Sau đó mở một trang kiểu “IP của tôi là gì”. Trang đó phải hiện địa chỉ VPS của bạn.

UDP, QUIC và khi có sự cố

Khi Gửi cả UDP bật, lưu lượng UDP như QUIC, game và cuộc gọi cũng đi qua máy chủ của bạn. Nếu máy chủ chỉ chạy TCP, hãy tắt công tắc này. Khi đó, trong lúc profile này là tuyến đang dùng, GreenTunnel chặn mọi UDP trừ DNS. Ứng dụng sẽ chuyển sang TCP và đi qua proxy, nên không có gì lọt ra ngoài. Truy vấn DNS luôn dùng DNS mã hoá của GreenTunnel. Xem thêm vì sao chặn QUIC lại có ích.

Máy chủ Shadowsocks không bao giờ trả lời khi khoá sai. Vì vậy, sai kiểu mã hoá hoặc sai khoá sẽ hiện ra dưới dạng kiểm tra bị treo hoặc quá thời gian, chứ không có thông báo lỗi rõ ràng. Hãy so lại kiểu mã hoá và khoá với config.json trước tiên. Nếu máy chủ ngừng hoạt động, các kết nối được định tuyến tới nó sẽ thất bại chứ không chuyển sang đi thẳng. Xem bài không rò rỉ khi proxy lỗi.

Mẹo tăng cường bảo mật

  • Giữ link như giữ mật khẩu. Ai có link ss:// của bạn đều dùng được máy chủ và băng thông của bạn. Đừng đăng nó lên đâu, và đừng giữ ảnh chụp mã QR.
  • Đổi khoá khi nghi bị lộ: tạo khoá mới, sửa config.json, chạy sudo systemctl restart ssserver, rồi nhập link mới.
  • Luôn cập nhật: sudo apt install unattended-upgrades cho hệ điều hành, và thỉnh thoảng xem trang releases để cập nhật ssserver.
  • Khoá chặt SSH: chỉ đăng nhập bằng khoá với PasswordAuthentication no, và tường lửa chỉ mở những cổng cần thiết.
  • Giữ đồng hồ chính xác. Nếu kiểu 2022 bỗng dưng không chạy ở bất cứ đâu, hãy kiểm tra timedatectl trên máy chủ và giờ trên điện thoại.
  • Chỉ dùng kiểu AEAD. Các kiểu mã hoá dòng cũ như rc4-md5 đã bị phá. GreenTunnel chỉ cung cấp các kiểu AEAD và 2022.

Muốn so sánh Shadowsocks với proxy SOCKS5 và HTTPS, hãy đọc bài SOCKS5, HTTP, HTTPS hay Shadowsocks. Nếu UDP chạy tốt trên mạng của bạn, một máy chủ WireGuard trên cùng VPS là bạn đồng hành rất hợp.

Tìm hiểu thêm về GreenTunnel ở trang chủ.

Câu hỏi thường gặp

Nên chọn 2022-blake3-aes-256-gcm hay chacha20-ietf-poly1305?

Dùng kiểu 2022 nếu mọi ứng dụng của bạn đều hỗ trợ. GreenTunnel có hỗ trợ. Kiểu này chống phát lại và bắt buộc dùng khoá ngẫu nhiên đúng chuẩn. chacha20-ietf-poly1305 là lựa chọn an toàn cho ứng dụng cũ, và chạy nhanh trên điện thoại không có phần cứng tăng tốc AES.

Nhiều người dùng chung một máy chủ được không?

Được, nhưng ai có link cũng dùng được toàn bộ, và bạn không thể thu hồi riêng một người. Chạy thêm một tiến trình ssserver ở cổng khác với khoá riêng sẽ giúp tách bạch hơn.

GreenTunnel có thấy địa chỉ máy chủ hay khoá của tôi không?

Không. Link được đọc ngay trên thiết bị, và khoá được cất trong kho bảo mật của hệ điều hành. GreenTunnel không vận hành máy chủ nào và không bao giờ thu thập lưu lượng, tên miền hay nội dung duyệt web của bạn.

Vì sao kiểm tra thành công mà vài ứng dụng vẫn không chạy?

Hãy kiểm tra máy chủ có thật sự lắng nghe UDP không, và UDP 8388 đã được mở ở mọi tường lửa chưa. Nếu không làm UDP chạy được, hãy tắt Gửi cả UDP để ứng dụng dùng TCP qua proxy.

← Tất cả bài viết