Aurrell's Inki

Back

这篇记录一下我在服务器上搭建私有Shadowsocks连接的过程。

核心思路很简单:Shadowsocks 本身只负责代理服务,真正的访问控制交给 Tailscale 和防火墙完成。服务端监听所有地址,但防火墙只允许来自 tailscale0 网卡的流量访问代理端口。这样公网不会暴露 Shadowsocks 端口,只有已经加入同一个 Tailscale 网络的设备才能连上。

适用场景是个人设备之间的私有访问。请遵守所在地法律法规和服务商条款。

架构思路#

最终结构大概是这样:

客户端设备
  -> Tailscale 内网
  -> LA 服务器 tailscale0
  -> Shadowsocks-libev :8388
text

公网侧只保留 SSH 等必要入口,8388 不直接对公网开放。客户端配置里填写的服务器地址也不是公网 IP,而是 Tailscale 分配的 100.x.y.z 内网 IPv4 地址。

一、接入 Tailscale#

先把服务器加入自己的 Tailscale 网络。

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
bash

执行 tailscale up 后,终端会输出一个授权链接。复制到浏览器打开,登录并授权这台服务器。

授权完成后查看服务器的 Tailscale 地址:

tailscale ip
bash

通常会看到一个 100. 开头的 IPv4 地址,也可能同时看到 IPv6。后续客户端建议优先使用这个 100.x.y.z 的 IPv4 地址,兼容性会更稳。

二、安装 Shadowsocks-libev#

这里使用轻量的 shadowsocks-libev,并选择 AEAD 加密方式。

sudo apt update
sudo apt install -y shadowsocks-libev
bash

编辑配置文件:

sudo nano /etc/shadowsocks-libev/config.json
bash

清空原内容,写入下面的配置。记得把 你的强密码 换成自己的高强度密码。

{
  "server": ["::", "0.0.0.0"],
  "server_port": 8388,
  "password": "你的强密码",
  "timeout": 300,
  "method": "aes-256-gcm",
  "nameserver": "8.8.8.8",
  "mode": "tcp_and_udp"
}
json

这里的 "server": ["::", "0.0.0.0"] 表示监听 IPv6 和 IPv4 的所有接口。这个配置本身看起来比较开放,但真正的安全边界会在下一步通过 UFW 限制。

配置完成后重启服务:

sudo systemctl restart shadowsocks-libev
sudo systemctl enable shadowsocks-libev
sudo systemctl status shadowsocks-libev
bash

如果状态是 active (running),说明服务已经起来了。

三、用 UFW 限制访问来源#

这是最关键的一步:只允许从 tailscale0 进来的流量访问 8388 端口。

如果你是通过 SSH 远程操作服务器,一定要先放行 SSH,再启用防火墙,避免把自己锁在门外。

sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow ssh
bash

如果你的 SSH 使用的不是默认 22 端口,改成类似下面这种写法:

sudo ufw allow 2222/tcp
bash

如果服务器上还有 Web 服务,再按需放行:

sudo ufw allow 80
sudo ufw allow 443
bash

然后添加 Shadowsocks 的访问规则:

sudo ufw allow in on tailscale0 to any port 8388
bash

最后启用防火墙:

sudo ufw enable
sudo ufw status
bash

期望能看到类似下面的规则:

8388                       ALLOW IN    Anywhere on tailscale0
22/tcp                     ALLOW IN    Anywhere
text

这表示 8388 只接受从 Tailscale 网卡进入的连接。公网 IP 访问这个端口会被拒绝。

四、做一些网络优化#

叠加 Tailscale 隧道后,访问速度瓶颈经常不在 Shadowsocks,而在 UDP 隧道、运营商 QoS 或 MTU。

先开启 BBR:

echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
bash

再把 tailscale0 的 MTU 调低一些:

sudo ip link set dev tailscale0 mtu 1280
bash

Tailscale 本身会增加额外包头。如果底层网络对分片不友好,默认 MTU 可能导致速度异常低,甚至表现为连接时断时续。1280 是一个相对保守的值,通常能绕开不少奇怪的跨网问题。

需要注意的是,直接用 ip link set 修改 MTU 重启后可能失效。如果确认这个值确实有帮助,再考虑写进 systemd-networkd、NetworkManager dispatcher,或者用系统启动脚本持久化。

五、客户端配置#

客户端可以使用 v2rayN、Shadowsocks-Windows、Clash 等常见工具。关键是不要把它配成带伪装、插件或 TLS 的复杂模式。

配置项
服务器地址Tailscale IPv4 地址,例如 100.x.y.z
端口8388
密码服务端配置里的强密码
加密方式aes-256-gcm
插件 / 伪装留空、None、无

最容易踩的坑是客户端打开了 HTTP、TLS、WebSocket 之类的伪装选项。服务端没有配置插件时,客户端也必须保持插件为空。否则看起来像是节点在线,但测试延迟会是 -1 或直接超时。

六、排查方法#

如果客户端连不上,先按下面顺序检查。

1. 确认 Tailscale 能互通#

在客户端机器上 ping 服务器的 Tailscale 地址:

ping 100.x.y.z
bash

如果这里不通,问题不在 Shadowsocks,而在 Tailscale 组网、登录状态或 ACL。

也可以运行:

tailscale ping 100.x.y.z
bash

如果结果显示 via DERP,说明流量走了 Tailscale 中继,速度通常会明显下降。如果显示 via IP:Port,说明是点对点直连。

2. 确认服务端正在监听#

在服务器上检查 Shadowsocks 状态:

sudo systemctl status shadowsocks-libev
bash

如果服务没有运行,先看日志:

sudo journalctl -u shadowsocks-libev -n 100 --no-pager
bash

常见问题包括 JSON 格式错误、密码字段写错、端口被其他程序占用。

3. 确认防火墙规则正确#

sudo ufw status verbose
bash

重点看有没有这一条:

8388 ALLOW IN on tailscale0
text

如果没有,重新执行:

sudo ufw allow in on tailscale0 to any port 8388
bash

4. 排除运营商对 Tailscale UDP 的影响#

如果能连上但速度只有 0.5 MB/s 左右,常见原因有两个:

第一,Tailscale 没有直连,而是走了 DERP 中继。

第二,UDP 被运营商限速或丢包。Tailscale 底层主要依赖 UDP,如果晚高峰质量明显下降,这个问题会更突出。

可以做一个临时对照实验:

sudo ufw allow 8388
bash

然后把客户端地址改成服务器公网 IP 测速。如果公网直连速度明显更快,说明瓶颈大概率在 Tailscale 隧道,而不是 Shadowsocks 配置。

测试完成后记得撤回公网开放规则:

sudo ufw delete allow 8388
bash

最后#

这个方案的优势是隐蔽和可控:Shadowsocks 端口不暴露在公网,访问权限跟着 Tailscale 设备授权走。缺点也很明确:速度上限取决于 Tailscale 的连接质量。

如果你的网络能稳定打洞直连,这套配置会非常省心。如果长期走 DERP 或被 UDP QoS 卡住,就没必要硬扛,可以考虑公网高位端口直连,或者换更适合当前线路的传输方式。

基于 Tailscale 搭建私有 Shadowsocks 节点
https://blog.inki.me/blog/tailscale-shadowsocks-private-proxy
Author Aurrell
Published at May 11, 2026
Loading comments...