这篇是我整理的一份 SS2022 部署备忘:用 Docker 在 Ubuntu 上跑 shadowsocks-rust,再把同一个节点填进 Shadowrocket 或 Mihomo。示例端口统一用 8388,地址和密钥都留作占位符。照着操作时,先确认端口没有被现有服务占用;如果改了端口,服务端、云安全组和客户端也要一起改。

下面的安装命令都在 Ubuntu 服务器的 SSH 终端执行。准备好 Ubuntu 22.04/24.04、公网 IP、sudo 权限,以及支持 SS2022 的客户端。

先把密钥和配置写对

如果服务器还没有 Docker,先安装它:

sudo apt update
sudo apt install -y docker.io openssl nano
sudo systemctl enable --now docker
sudo docker version

这里选用 2022-blake3-aes-256-gcm。它的密码不是随手写的一串字符,而是 32 字节随机密钥的 Base64 表示。在服务器上生成一次,妥善保存完整输出,末尾的 = 也不要漏掉:

openssl rand -base64 32

如果改用 2022-blake3-aes-128-gcm,则要用 openssl rand -base64 16。这里的 16 和 32 指 Base64 解码后的字节数。

创建服务端配置文件:

sudo install -d -m 700 /etc/ss2022
sudo nano /etc/ss2022/config.json

把刚才生成的密钥填入 password:

{
  "server": "0.0.0.0",
  "server_port": 8388,
  "password": "替换成完整的 Base64 密钥",
  "method": "2022-blake3-aes-256-gcm",
  "mode": "tcp_and_udp"
}

保存后收紧文件权限:

sudo chmod 600 /etc/ss2022/config.json

0.0.0.0 是服务端监听地址,客户端要填服务器的公网 IP,不是这个地址。配置文件和后面的客户端 YAML 都含有密钥,别把填好真实值的文件公开上传。

启动容器,别忘了 UDP

先在云服务商的安全组里放行 8388/TCP 和 8388/UDP。如果机器还经过路由器,也要转发这两个协议的端口。已经启用 UFW 的服务器,可以补上:

sudo ufw allow 8388/tcp
sudo ufw allow 8388/udp
sudo ufw status

这一步只适用于正在使用 UFW 的机器。准备新启用 UFW 时,要先放行实际使用的 SSH 端口,免得把自己锁在服务器外。

然后拉取镜像、启动容器:

sudo docker pull ghcr.io/shadowsocks/ssserver-rust:latest
sudo docker run -d \
  --name ss2022 \
  --restart unless-stopped \
  --network host \
  -v /etc/ss2022/config.json:/etc/shadowsocks-rust/config.json:ro \
  ghcr.io/shadowsocks/ssserver-rust:latest

这里使用宿主机网络,因此没有写 -p 端口映射。--restart unless-stopped 会在 Docker 重启后恢复容器,手动停止的容器则保持停止。先看容器和端口是否正常:

sudo docker ps -a --filter name=ss2022
sudo docker logs --tail 50 ss2022
sudo ss -lntup | grep ':8388'

看到容器处于 Up、TCP 和 UDP 都在监听,只能说明服务端启动了。最终还是要在客户端打开网页,确认代理真的能转发流量。

在客户端填同一个节点

Shadowrocket 里手动新增 Shadowsocks 节点,地址填服务器公网 IP,端口填 8388,算法选 2022-blake3-aes-256-gcm,密码粘贴刚才生成的完整密钥。UDP 转发开启;这里没有配置插件或混淆,也不需要开启 UDP over TCP。保存、选中节点并打开网页试一次。

使用 Mihomo 内核的 Clash 客户端,可以在自己的电脑上保存下面这份基础配置为 ss2022.yaml,再替换地址与密钥:

mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false

proxies:
  - name: "Ubuntu SS2022"
    type: ss
    server: "替换成服务器公网 IP"
    port: 8388
    cipher: 2022-blake3-aes-256-gcm
    password: "替换成完整的 Base64 密钥"
    udp: true

proxy-groups:
  - name: "代理选择"
    type: select
    proxies:
      - "Ubuntu SS2022"
      - DIRECT

rules:
  - MATCH,代理选择

导入后,在“代理选择”里选 Ubuntu SS2022,并开启客户端的系统代理。这份 YAML 只用于确认连接:进入 Mihomo 的流量都会匹配最后一条规则,并没有国内外分流;需要接管更多应用时,再按客户端情况配置 TUN。

连不上时,先查这几处

有延迟,不等于网页能打开。 先核对服务端和客户端的算法、端口、密钥是否完全一致。2022-blake3-aes-256-gcm 要使用解码后 32 字节的密钥;不要把 128 位算法与 256 位密钥混用。改了服务端配置后执行 sudo docker restart ss2022,客户端也要同步保存新值。

接着在服务器上看日志,并在客户端实际发起一次网页请求:

sudo docker logs --follow --since 1m ss2022

如果日志里没有对应连接,回头检查安全组、UDP/TCP 放行、客户端是否真的选中了节点。日志出现解密或连接错误,再查密钥、服务端出网和 DNS。按 Ctrl+C 只是退出日志查看,不会停掉容器。

还有一个容易漏的地方是系统时间。SS2022 会校验请求时间,客户端和服务器相差超过 30 秒时,请求会被视为重放。服务器可用 timedatectl status 检查时间同步,必要时执行 sudo timedatectl set-ntp true;客户端设备也打开自动校时。时区不同没关系,实际时间要准。

平时需要重启、停止或查看日志,分别用 sudo docker restart ss2022、sudo docker stop ss2022 和 sudo docker logs --tail 100 ss2022。镜像用了 latest 标签,日后更新时先看项目的发布说明,再决定是否拉取新版。

参考:shadowsocks-rust 官方 Docker 说明 · SS2022 协议说明 · Mihomo Shadowsocks 配置说明