运维 · 2020年12月26日

如何自建 Snell 节点

Snell 是 Surge 团队开发,仅适用于 Surge 用户的精简加密代理协议,以下是一些亮点:

  • 极致的性能;
  • 支持 UDP over TCP 转发;
  • 具有零依赖关系的单一二进制文件 (除了 glibc);
  • 一个帮助入门的向导;
  • 如果遇到远程错误,代理服务器将向客户端报告。客户端可以针对不同的场景选择对策;

搭建

Linux

在 Surge 官网根据你的服务器获取独立服务端二进制文件: https://kb.nssurge.com/surge-knowledge-base/zh/release-notes/snell

此处以 linux-amd64 为例:

# 如果系统没有预装可能需要先下载安装 wget 及 unzip
# APT
sudo apt update && sudo apt install wget unzip
# DNF
sudo dnf install unzip

# Snell v5
# https://dl.nssurge.com/snell/snell-server-v5.0.0-linux-amd64.zip
# https://dl.nssurge.com/snell/snell-server-v5.0.0-linux-i386.zip
# https://dl.nssurge.com/snell/snell-server-v5.0.0-linux-aarch64.zip
# https://dl.nssurge.com/snell/snell-server-v5.0.0-linux-armv7l.zip

wget https://dl.nssurge.com/snell/snell-server-v5.0.0-linux-amd64.zip

# 解压 Snell Server 到指定目录
sudo unzip snell-server-v*-linux-amd64.zip -d /usr/local/bin

然后编写配置文件:

# 可以使用 Snell 的 wizard 生成一个配置文件
sudo snell-server --wizard -c /etc/snell-server.conf
# 或者自己编写一个
sudo vim /etc/snell-server.conf
[snell-server]
listen = ::0:11807
psk = AijHCeos15IvqDZTb1cJMX5GcgZzIVE
dns = 1.1.1.1, 8.8.8.8, 2001:4860:4860::8888
  • listen:监听地址及端口;
  • psk:密钥;
  • obfsoff 为关闭混淆,或使用流量混淆 http
  • dns:用于自定义 DNS 服务器地址,支持配置多个地址;

然后配置 Systemd 服务文件:

sudo vim /lib/systemd/system/snell.service
[Unit]
Description=Snell Proxy Service
After=network.target

[Service]
Type=simple
User=nobody
Group=nogroup
LimitNOFILE=32768
ExecStart=/usr/local/bin/snell-server -c /etc/snell-server.conf

[Install]
WantedBy=multi-user.target
  • 在一些 Linux 发行版 (CentOS7) 中并无 nogroup 群组,但可以尝试修改成 Group=nobody 解决或注释 Group
  • 如果需要使用特权端口,可以在 [Service] 增加一条:AmbientCapabilities=CAP_NET_BIND_SERVICE 以解决权限不足不能绑定的问题;

然后使用命令:

# 重载服务
sudo systemctl daemon-reload

# 开机运行 Snell
sudo systemctl enable snell

# 开启 Snell
sudo systemctl start snell

# 关闭 Snell
sudo systemctl stop snell

## 查看 Snell 状态
sudo systemctl status snell

对于 Snell v3 可以尝试增加内核缓冲区大小可以显著提高 UDP 性能:

sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.rmem_default=26214400

macOS

如果你正在使用 Surge Mac 并想以此部署 Snell Server 是非常简单的,只要在 Surge 的配置文件中加入以下字段:

[Snell Server]
interface = 0.0.0.0
port = 6160
psk = RANDOM_KEY_HERE
obfs = off

interface:监听地址 port:端口 psk:密钥 obfsoff 为关闭混淆,或使用流量混淆 http

⚠️ 注意:Surge 中的嵌入式 Snell 服务端使用 Snell V1 协议

版本演变

Snell v5

Dynamic Record Sizing 动态记录大小调整 该特性将提高在存在丢包的网络环境下延迟表现。技术细节可参考 :Cloudflare Blog

QUIC Proxy Mode QUIC 代理模式 Snell v5 加入了专为 QUIC 流量设计的 QUIC Proxy 模式,该模式工作属于 UDP over UDP,以避免 TCP over UDP 问题。(服务端需开放 UDP 端口)

  • 该工作模式为 QUIC 进行了特殊优化,仅当 Surge 识别到 QUIC 流量时会启用,其他 UDP 流量依然使用 UDP over TCP 模式。
  • QUIC Proxy 只会对 QUIC Handshake 数据包进行强加密,以保护 SNI 和目标主机名,同时进行鉴权。后续的所有 QUIC 数据包,由于本身已经被 QUIC 强加密,将直接以裸包进行转发,大幅降低了不必要的加解密开销。同时由于未引入额外字节,不会影响 QUIC 的 PMTU 探测。

Snell v4

  • 新增客户端参数 reuse=true,可选开启 v2 版本的连接复用机制。连接复用机制可以避免后续请求的连接建立开销,但是在出现网络异常或其他问题时,可能会需要更长的时间才能检查到错误并重建连接,优劣参半,建议对于延迟较高的服务器开启。该功能不需要在服务端额外使用参数开启。
  • 取消支持 TLS 流量混淆 (obfs=tls) 功能;
  • 服务器端程序已不能够与客户端自动协商密码和版本,客户端需手动配置 version=4

Snell v3

但是在实际使用中,由于大多数网站和程序均已使用 HTTP/2 协议,自带了 multiplex 支持,所以并不会产生很多的底层 TCP 连接,代理层再支持 multiplex 的优化意义不大。 考虑到 multiplex 的支持会导致额外的问题,如单 TCP 连接被限速,更加复杂繁琐的连接错误检查和纠错等。所以在 Snell v3 中已经取消了 multiplex 支持;

Snell v2

提供了完整的 TCP 全状态机支持的 multiplex 支持,以提高性能和减少延迟。


浏览「Surge 专题」可查看更多内容