The native v5/v6 manager supports choosing a configured public IPv4 and its interface, including two addresses on the same interface. Both the listener and the proxy exit use the selected address. Existing profiles can be migrated without changing their port, PSK, Snell version, or v6 mode. New profiles receive independent random PSKs.
Replace only the launcher; this does not reinstall the server or modify profiles:
sudo apt-get install -y iproute2 jq nftables openssl
(
set -e
payload=$(mktemp)
trap 'rm -f "$payload"' EXIT
curl -fLsS https://raw.githubusercontent.com/txehq/snell.sh/main/manager.sh -o "$payload"
test -s "$payload"
bash -n "$payload"
sudo install -m 755 "$payload" /usr/local/bin/snell
)Stop if downloading or checking the script fails. The snell launcher now downloads
management scripts from this fork. A fresh Ubuntu installation through this fork's
install.sh also stays on the fork.
sudo snell ips
sudo snell bind-ip main 74.219.23.240
# For an existing additional profile, use its port instead of main:
# sudo snell bind-ip 6161 74.219.23.240
sudo snell add --bind-ip 74.219.23.237
sudo snell profile main
# sudo snell profile NEW_PORTprofile also exports older v5/v6 configurations without an IP-binding marker.
For wildcard listeners it prints one client entry per discovered public IPv4; these
are connection addresses, not a promise that traffic exits through that IP. Exporting
is read-only. Use bind-ip separately when you want to pin the exit.
bind-ip backs up configuration and the previous binding under
/etc/snell-ip-bindings/backups/, preserves the original client settings, and briefly
restarts that one service. A failed restart restores the prior configuration and
binding, and attempts to recover the previous running service. An initially stopped
service remains stopped on rollback. The first migration may add an explicit upstream
DNS address when the original config relied on a local system stub.
add chooses an unused port and follows the main profile's installed version. Optional
--port PORT and --version v5|v6 select these explicitly; the requested binary must
already be installed. Without --bind-ip, a terminal displays the IP/interface picker.
With multiple addresses, noninteractive commands require an explicit choice. Client
configuration is printed with the selected IP; allow its TCP port through any host or
provider firewall, and UDP on the same port for Snell v5 QUIC mode.
The main menu's option 12 opens IP management. The multi-user Add user flow also
offers this mode; choosing n keeps the legacy creation flow, including v4 support.
Existing multi-user PSK/DNS changes and v5/v6 binary upgrades retain the IP binding.
Changing a bound profile's port via the legacy port editor is rejected before making
changes: create and test a new port first, then delete the old profile. Deletion removes
its private source rules and systemd drop-in. Locked service accounts are retained to
avoid accidental UID reuse.
Snell's native egress-interface selects an interface, but cannot by itself choose
between two IPv4 addresses on it. Each bound profile therefore has a dedicated service
UID and a private nftables SNAT table matching only that UID. Unrelated services, Docker
traffic, and sing-box are not matched. No host routes, default gateway, forwarding policy,
or global firewall tables are replaced. A systemd drop-in installs the rules before
starting Snell and reapplies them on restart/boot; it refuses startup when the selected
address or interface is missing. After an administrator flushes custom nftables tables,
restart the bound Snell services to restore their rules.
Bound profiles use IPv4 DNS resolution and cannot create IPv6 sockets, preventing an alternate IPv6 proxy exit. Netlink remains available for the startup helper. Existing DNS servers must be reachable through the selected interface; loopback-only DNS settings require adjustment before migration. Profiles using v4, Docker, socket activation/network namespaces, or a ShadowTLS/loopback frontend are outside this feature and are rejected by the migration rather than silently reconfigured.
This manager identifies profiles and units by port, so different profiles use different
ports, even when their public IPs differ. auto selection avoids existing listeners and
saved profiles. The provider must already have assigned/routed each IP and the OS must
have configured it; the manager does not allocate IPs or edit Netplan.
Verify each client through an IP-check website after migration. Automated checks:
bash tests/ip-binding.sh, python3 tests/menu.py, and the CI's isolated Linux
network test (TCP/UDP source addresses, incoming replies, rule restoration, and startup
of official Snell v5/v6 binaries). The latter is not a Snell client-protocol implementation.
一键安装与管理 Snell v4 / v5 / v6,支持 ShadowTLS v3、多用户与 BBR, 并提供启动即输出客户端配置的多架构 Docker 镜像。
三步拿到一个可用节点,第 ④ 步(ShadowTLS 伪装)可选。详细说明见 使用方法。
① 安装 —— 三选一
方式 A:脚本安装(自动识别 Debian / Ubuntu / CentOS / Alpine ≤ 3.18)
sh -c "$(curl -fsSL https://install.jinqians.com)"方式 B:docker run
docker run -d --name snell-server --restart unless-stopped \
-p 6160:6160/tcp -p 6160:6160/udp \
-e SNELL_VER=v5 -e SNELL_PORT=6160 \
-v ./snell-config:/etc/snell \
jinqians/snell-server:v5方式 C:docker compose —— 新建 compose.yml:
services:
snell:
image: jinqians/snell-server:v5
container_name: snell-server
restart: unless-stopped
ports:
- "6160:6160/tcp"
- "6160:6160/udp"
environment:
- SNELL_VER=v5
- SNELL_PORT=6160
volumes:
- ./snell-config:/etc/snelldocker compose up -d💡 上面的示例装的是 v5。如果要装 Snell v6,配置方式有变化: v6 新增了两个必须关注的参数 ——
mode(加密模式,客户端必须与服务端一致) 和dns-ip-preference(DNS 解析地址族偏好)。
- 脚本安装:选择 v6 后脚本会逐项交互询问这两个参数,并列出每个取值的适用场景,回车即用推荐值
- Docker:通过
-e SNELL_MODE=...和-e SNELL_DNS_IP_PREFERENCE=...设置, 镜像标签要用:v6且SNELL_VER=v6→ 部署 Snell v6取值含义、选型建议与推荐组合表 → Snell v6 专属参数
② 获取配置 —— 三种装法都会直接输出 Surge 格式配置,复制即可用
# 方式 A(脚本):进入菜单选 “3. 查看配置”
snell
# 方式 B(docker run):配置已打印在容器日志里
docker logs snell-server
# 方式 C(docker compose):
docker compose logs snell③ 粘贴到 Surge
HK = snell, 1.2.3.4, 6160, psk = your_psk, version = 5, reuse = true, tfo = true
④ 需要 ShadowTLS 伪装?(可选)
套一层 TLS 伪装后,Snell 后端只在本机监听,对外只暴露 ShadowTLS 端口。 详见 ShadowTLS 说明。
展开:脚本 / docker run / docker compose 三种装法
方式 A(脚本):装完 Snell 后进入菜单选 5. ShadowTLS 管理,按提示填端口和 SNI,
脚本会自动把 Snell 改为只监听 127.0.0.1 并生成新的客户端配置。
snell # 进入菜单 → 5. ShadowTLS 管理方式 B(docker run):加 4 个环境变量,对外只映射 ShadowTLS 端口,不要映射 6160。
docker run -d --name snell-shadowtls --restart unless-stopped \
-p 8443:8443/tcp \
-e SNELL_VER=v5 -e SNELL_PORT=6160 \
-e SNELL_LISTEN_HOST=127.0.0.1 \
-e SHADOWTLS_ENABLE=1 \
-e SHADOWTLS_PORT=8443 \
-e SHADOWTLS_SNI=www.microsoft.com \
-v ./snell-config:/etc/snell \
jinqians/snell-server:v5
docker logs snell-shadowtls # 首次启动的日志里有 PSK 和 ShadowTLS 密码方式 C(docker compose):
services:
snell-shadowtls:
image: jinqians/snell-server:v5
container_name: snell-shadowtls
restart: unless-stopped
ports:
- "8443:8443/tcp"
environment:
- SNELL_VER=v5
- SNELL_PORT=6160
- SNELL_LISTEN_HOST=127.0.0.1
- SHADOWTLS_ENABLE=1
- SHADOWTLS_PORT=8443
- SHADOWTLS_SNI=www.microsoft.com
volumes:
- ./snell-config:/etc/snelldocker compose up -d
docker compose logs snell-shadowtls得到的客户端配置形如(端口填 ShadowTLS 端口,PSK 与 ShadowTLS 密码是两个不同的值):
HK = snell, 1.2.3.4, 8443, psk = your_psk, version = 5, reuse = true, tfo = true, shadow-tls-password = your_stls_password, shadow-tls-sni = www.microsoft.com, shadow-tls-version = 3
| 我想…… | 看这里 |
|---|---|
| 用脚本装在 VPS 上 | 脚本安装 |
| 用 Docker / Docker Compose | Docker 部署 | Docker Compose |
| 找 PSK、ShadowTLS 密码、客户端配置 | 查看客户端配置 |
| 查 Docker 环境变量 | 环境变量 |
| 加 ShadowTLS 伪装 | ShadowTLS |
| 搞不清 v4 / v5 / v6 选哪个 | 协议介绍 |
| 安装 v6,不知道 mode 怎么选 | Snell v6 专属参数 | 建议组合 |
| 用 Docker 部署 v6 | 部署 Snell v6 |
| 做流量限额 | 流量管理 |
| Alpine 3.19+ 装不上 | Alpine 版本限制 |
| Alpine 重启后连不上 / Docker daemon 未运行 | 在 Alpine 上启用 Docker |
本项目提供 Snell 服务端的两种部署方式,两者可按需选用:
- 一键脚本 —— 直接在 VPS 上安装 systemd / OpenRC 托管的 Snell,覆盖 Debian、Ubuntu、CentOS、RHEL、Alpine,附带交互式管理菜单
- Docker 镜像 —— 多架构镜像
jinqians/snell-server,docker run一条命令起服务,启动即在日志中输出可粘贴到 Surge 的客户端配置
主要能力:
| 能力 | 说明 |
|---|---|
| Snell v4 / v5 / v6 | 三个版本任选,脚本与镜像均可互相切换 |
| 多版本共存 | 同一台机器上不同端口可以分别跑 v4 / v5 / v6,互不影响(脚本方式) |
| ShadowTLS v3 | 为 Snell 套一层 TLS 伪装,隐藏原始端口 |
| 多用户 | 单机多端口 / 多 PSK,独立增删改查,每个用户可单独选版本 |
| BBR | 一键开启 BBR 拥塞控制 |
| 出口控制 | Snell v5 / v6 的 egress-interface 设置 |
| 自动更新 | 脚本内置自更新;镜像由 GitHub Actions 每周跟随上游发布 |
| 客户端配置输出 | 脚本与容器都会自动生成 Surge 格式配置,含国家/地区标识 |
流量管理、VLESS Reality、Hysteria2 等更复杂的场景,请使用同作者的 PSM(Proxy Stack Manager),本项目专注于 Snell 本身。
仓库结构(点击展开)
snell.sh # Debian / Ubuntu 主脚本(安装、管理、更新)
snell-centos.sh # CentOS / RHEL 脚本
snell-alpine.sh # Alpine 3.18 脚本
snell-docker.sh # Alpine 本地构建 Docker 方案
shadowtls.sh # ShadowTLS v3 管理
multi-user.sh # Snell 多用户管理
menu.sh # 统一管理菜单(Snell / SS-2022 / ShadowTLS 等)
bbr.sh # BBR 管理
install.sh # 自动识别系统的安装入口
Dockerfile # 多架构镜像构建
entrypoint.sh # 容器入口:生成配置 + 输出客户端配置
build-docker-images.sh # 本地批量构建镜像
surge.conf # Surge 参考配置文件
⚠️ 根目录脚本的路径不要变动:服务端已安装的脚本通过https://raw.githubusercontent.com/jinqians/snell.sh/main/<脚本名>.sh自更新,*.jinqians.com短域名也指向这些固定路径,移动文件会导致存量用户的自动更新失效。
脚本会检测发行版并调用对应的安装脚本:
sh -c "$(curl -fsSL https://install.jinqians.com)"bash <(curl -L -s menu.jinqians.com)安装后输入 menu 即可再次进入:
=== 安装管理 === === 卸载功能 === === 系统功能 ===
1. Snell 安装管理 5. 卸载 Snell 8. 更新脚本
2. SS-2022 安装管理 6. 卸载 SS-2022 9. 流量管理(转 PSM)
3. VLESS Reality 安装管理 7. 卸载 ShadowTLS 10. 中国大陆屏蔽管理
4. ShadowTLS 安装管理
选项 3(VLESS Reality)与选项 9(流量管理)已整合到 PSM,选择后会引导安装 PSM。
Debian / Ubuntu 脚本支持每个端口单独选版本:v4、v5、v6 的二进制分开存放, 各自的 systemd 服务指向自己的版本,互不影响。
/usr/local/bin/snell-server-v4 # v4 通道
/usr/local/bin/snell-server-v5 # v5 通道
/usr/local/bin/snell-server-v6 # v6 通道
/usr/local/bin/snell-server # 软链,指向主用户所用的版本
每个用户的配置文件首行会记录它属于哪个通道:
#version-choice = v6
[snell-server]
listen = ::0:7000
psk = ...
mode = default给某个端口指定版本:主菜单 7. 多用户管理 → 2. 添加新用户,
输入端口后会让你选 v4 / v5 / v6;所选版本没装过会自动下载,不会动到其他端口。
改已有端口的版本:7. 多用户管理 → 4. 修改用户配置 → 4. 修改 Snell 版本。
配置参数(v4/v5 的 ipv6 与 v6 的 mode、dns-ip-preference)会自动转换,
切换失败会自动回滚到原版本。
主菜单 8. 版本管理 提供三个动作:
| 动作 | 说明 |
|---|---|
| 检查并更新已安装通道 | 逐个通道比对上游最新版,只重启用到该通道的服务 |
| 安装一个新通道 | 只下载二进制,不改动任何现有用户 |
| 切换某个用户使用的通道 | 含主用户,等价于多用户菜单里的「修改版本」 |
升级已有安装:直接运行新版脚本即可,会自动把原来的单一
snell-server迁成版本化布局并给所有配置补上版本标记,服务不中断。这个迁移是幂等的,重复运行无副作用。
客户端记得同步改:v4 写
version = 4,v5 可写4或5, v6 写version = 6且必须带上与服务端一致的mode。
| 系统 | 命令 |
|---|---|
| Debian / Ubuntu | bash <(curl -L -s snell.jinqians.com) |
| CentOS / RHEL | bash <(curl -L -s snell-centos.jinqians.com) |
| Alpine(Docker 本地构建) | sh -c "$(curl -fsSL https://snell-docker.jinqians.com)" |
| Alpine 3.18 及以下(原生安装) | sh -c "$(curl -fsSL https://snell-alpine.jinqians.com)" |
Alpine / CentOS 脚本与 Docker 方式暂不支持单机多版本共存, 容器方式请改为按版本各起一个容器(见 Docker 部署)。
Snell 官方二进制依赖 glibc,而 Alpine 使用 musl,需要借助 sgerrand/alpine-pkg-glibc 兼容包。 该方案在 Alpine 3.19 起失效,因此:
| Alpine 版本 | 原生安装(snell-alpine.jinqians.com) |
Docker 方案 |
|---|---|---|
| ≤ 3.18 | ✅ 可用 | ✅ 可用 |
| ≥ 3.19 | ❌ 脚本会主动拒绝并退出 | ✅ 可用(推荐) |
install.jinqians.com 检测到 Alpine 时会自动走 Docker 方案(snell-docker.jinqians.com),
所以 Alpine 3.19+ 用它也能装上,只是跑在容器里而非直接跑在宿主机上。
想要纯宿主机安装又必须用 Alpine 的话,只能停留在 3.18。
不走脚本、自己在 Alpine 上装 Docker 再用 docker run / docker compose 时,
docker 服务必须加到 default 运行级别:
apk add docker docker-cli-compose
rc-update add docker default # 不要加到 boot
rc-service docker startAlpine 的 docker 服务声明依赖网络(need net),而云厂商 Alpine 镜像的网络服务在 default 运行级别。
docker 放在 boot 运行级别时依赖不满足,重启后 dockerd 不会被拉起,所有容器离线,
表现为客户端连不上、docker compose ps 报 Cannot connect to the Docker daemon。
已经这样装过的机器执行下面三行即可修复(容器配置了 restart: unless-stopped 会自动恢复):
rc-update del docker boot
rc-update add docker default
rc-service docker startsnell-docker.jinqians.com 脚本(v1.4 起)会自动做这项校正。
Snell 主脚本菜单:
1. 安装 Snell 7. 多用户管理
2. 卸载 Snell 8. 版本管理(更新 / 追加通道 / 切换通道)
3. 查看配置 9. 更新脚本
4. 重启服务 10. 查看服务状态
5. ShadowTLS 管理 11. Snell v5/v6 出口控制设置
6. BBR 管理 0. 退出脚本
安装完成后选择 3. 查看配置,脚本会输出带国家/地区标识的 Surge 配置,直接复制即可:
=== 配置信息 ===
已安装通道: v4 v5 v6
主用户配置:
端口: 57891
版本: Snell v5
HK = snell, 1.2.3.4, 57891, psk = xxxxxxxxxxxx, version = 4, reuse = true, tfo = true
HK = snell, 1.2.3.4, 57891, psk = xxxxxxxxxxxx, version = 5, reuse = true, tfo = true
用户配置 (端口: 7000):
版本: Snell v6
HK = snell, 1.2.3.4, 7000, psk = yyyyyyyyyyyy, version = 6, mode = default, reuse = true, tfo = true
镜像标签
| 标签 | 对应版本 | 说明 |
|---|---|---|
latest |
Snell v5.0.1 | 固定跟随 v5 通道,不会自动升到 v6 |
v4 |
Snell v4.1.1 | v4 通道最新 |
v5 |
Snell v5.0.1 | v5 通道最新 |
v6 |
Snell v6.0.0rc2 | v6 通道最新(预发布) |
v4.0.0 v4.0.1 v4.1.0 v4.1.1 |
Snell v4 | 固定版本 |
v5.0.0 v5.0.1 |
Snell v5 | 固定版本 |
v6.0.0b1 … v6.0.0b4 v6.0.0rc v6.0.0rc2 |
Snell v6 | 固定版本(预发布) |
架构支持:v4 / v5 为 amd64、arm64、armv7;v6 上游未提供 armv7 构建,仅 amd64、arm64。
Alpine 宿主机:先按 在 Alpine 上启用 Docker 把 docker 服务加到
default运行级别, 否则重启后 dockerd 不会启动,容器全部离线。
容器以非特权用户
nobody(uid 65534)运行,挂载的配置目录必须对其可写, 否则 entrypoint 无法生成配置。启动前执行一次:mkdir -p ./snell-config && chown -R 65534:65533 ./snell-config
docker run -d --name snell-server \
--restart unless-stopped \
-p 6160:6160/tcp \
-p 6160:6160/udp \
-e SNELL_VER=v5 \
-e SNELL_PORT=6160 \
-v ./snell-config:/etc/snell \
jinqians/snell-server:v5
# 查看客户端配置
docker logs snell-serverSnell 后端只在容器内监听 127.0.0.1,对外仅暴露 ShadowTLS 端口,因此不需要映射 6160。
docker run -d --name snell-shadowtls \
--restart unless-stopped \
-p 8443:8443/tcp \
-e SNELL_VER=v5 \
-e SNELL_PORT=6160 \
-e SNELL_LISTEN_HOST=127.0.0.1 \
-e SHADOWTLS_ENABLE=1 \
-e SHADOWTLS_PORT=8443 \
-e SHADOWTLS_SNI=www.microsoft.com \
-v ./snell-config:/etc/snell \
jinqians/snell-server:v5
docker logs snell-shadowtlsv6 需要额外指定 SNELL_MODE,参数含义与选型见 Snell v6 专属参数。
镜像用 :v6 标签,环境变量 SNELL_VER=v6,两者必须同时设置。
docker run -d --name snell-v6 --restart unless-stopped \
-p 6160:6160/tcp -p 6160:6160/udp \
-e SNELL_VER=v6 \
-e SNELL_PORT=6160 \
-e SNELL_MODE=default \
-e SNELL_DNS_IP_PREFERENCE=default \
-v ./snell-config:/etc/snell \
jinqians/snell-server:v6
docker logs snell-v6Docker Compose 写法:
services:
snell:
image: jinqians/snell-server:v6
container_name: snell-v6
restart: unless-stopped
ports:
- "6160:6160/tcp"
- "6160:6160/udp"
environment:
- SNELL_VER=v6
- SNELL_PORT=6160
- SNELL_MODE=default # default / unshaped / unsafe-raw
- SNELL_DNS_IP_PREFERENCE=default # default / prefer-ipv4 / prefer-ipv6 / ipv4-only / ipv6-only
# - SNELL_DNS=1.1.1.1,8.8.8.8
volumes:
- ./snell-config:/etc/snell几个常用组合(完整对照见 建议组合):
-e SNELL_MODE=default -e SNELL_DNS_IP_PREFERENCE=default # 常规使用,不确定时用这个
-e SNELL_MODE=unshaped -e SNELL_DNS_IP_PREFERENCE=default # 线路干净,追求吞吐(约 +10%)
-e SNELL_MODE=default -e SNELL_DNS_IP_PREFERENCE=ipv4-only # VPS 无 IPv6 出口
-e SNELL_MODE=default -e SNELL_DNS_IP_PREFERENCE=ipv6-only # IPv6 Only VPS容器日志会直接输出带 mode 的客户端配置,客户端 mode 必须与服务端一致:
Snell = snell, 1.2.3.4, 6160, psk = xxx, version = 6, mode = unshaped, reuse = true, tfo = true
⚠️ 修改 v6 参数时注意:环境变量只在首次生成配置文件时生效。 挂载目录里已有snell-server.conf后,改SNELL_MODE重启容器不会生效, 容器会在日志里提示这一点。想修改有两种方式:# 方式一:直接改配置文件(保留 PSK,推荐) sed -i 's/^mode = .*/mode = unshaped/' ./snell-config/snell-server.conf docker restart snell-v6 # 方式二:删除配置文件让容器重新生成(PSK 会变,客户端需同步更新) rm ./snell-config/snell-server.conf docker restart snell-v6
需同时修改镜像标签和 SNELL_VER;删除旧配置文件会重新生成 PSK,保留则沿用原 PSK:
docker rm -f snell-server
rm -f ./snell-config/snell-server.conf # 想保留原 PSK 就跳过这一步
docker run -d --name snell-server \
--restart unless-stopped \
-p 6160:6160/tcp -p 6160:6160/udp \
-e SNELL_VER=v6 -e SNELL_PORT=6160 -e SNELL_MODE=default \
-v ./snell-config:/etc/snell \
jinqians/snell-server:v6./build-docker-images.sh # 构建全部通道与版本
USE_BUILDX=1 PUSH=1 ./build-docker-images.sh # 多架构构建并推送仅 Snell —— 创建 compose.yml:
services:
snell:
image: jinqians/snell-server:v5
container_name: snell-server
restart: unless-stopped
ports:
- "6160:6160/tcp"
- "6160:6160/udp"
environment:
- SNELL_VER=v5
- SNELL_PORT=6160
# - SNELL_PSK=自定义PSK # 不填则首次启动随机生成
# - SNELL_SERVER_IP=1.2.3.4 # 不填则容器自动探测公网 IP
# - SNELL_NODE_NAME=HK # 客户端配置里的节点名
volumes:
- ./snell-config:/etc/snellSnell + ShadowTLS:
services:
snell-shadowtls:
image: jinqians/snell-server:v5
container_name: snell-shadowtls
restart: unless-stopped
ports:
- "8443:8443/tcp"
environment:
- SNELL_VER=v5
- SNELL_PORT=6160
- SNELL_LISTEN_HOST=127.0.0.1
- SHADOWTLS_ENABLE=1
- SHADOWTLS_PORT=8443
- SHADOWTLS_SNI=www.microsoft.com
volumes:
- ./snell-config:/etc/snell常用命令:
docker compose up -d # 启动
docker compose logs snell-shadowtls # 查看客户端配置
docker compose down # 停止并删除容器首次启动(新生成配置时)会在日志中打印一份可直接粘贴到 Surge 的配置,无需手动拼接;后续重启不再在日志中打印明文 PSK:
docker logs snell-server # docker run 启动
docker compose logs snell-shadowtls # docker compose 启动输出示例:
==============================================================
Snell 客户端配置 (Surge 格式)
==============================================================
服务器 : 1.2.3.4
端口 : 8443
PSK : duBN4HXibFaJejO2LC61/A==
Snell 版本 : 5
ShadowTLS : v3, SNI = www.microsoft.com
ShadowTLS 密码 : vwiOI52JPMPYhpTA/n/BKQ==
Snell 后端端口 : 6160 (仅容器内监听)
--------------------------------------------------------------
Snell = snell, 1.2.3.4, 8443, psk = duBN4HXibFaJejO2LC61/A==, version = 5, reuse = true, tfo = true, shadow-tls-password = vwiOI52JPMPYhpTA/n/BKQ==, shadow-tls-sni = www.microsoft.com, shadow-tls-version = 3
--------------------------------------------------------------
同一份内容也会写入挂载目录,随时可查:
cat ./snell-config/client-config.txt # 客户端配置
cat ./snell-config/snell-server.conf # 服务端配置
cat ./snell-config/shadowtls-password # ShadowTLS 密码
- 服务器地址由容器自动探测公网 IP 得到;探测失败会显示为
服务器IP,可用SNELL_SERVER_IP手动指定。- 端口按容器内监听端口输出,若宿主机映射了不同端口请自行替换。
- 首次启动的日志中含 PSK 与 ShadowTLS 密码,请勿公开分享;后续重启的日志不再含明文 PSK。
- 任何时候都可以用
docker exec <容器名> cat /etc/snell/client-config.txt查看完整客户端配置。
Snell 通用
| 变量 | 默认值 | 说明 |
|---|---|---|
SNELL_VER |
跟随镜像标签 | Snell 配置模式:v4 / v5 / v6 |
SNELL_PORT |
6160 |
Snell 监听端口 |
SNELL_PSK |
自动生成 | Snell PSK |
SNELL_LISTEN_HOST |
0.0.0.0 |
监听地址;搭配 ShadowTLS 时用 127.0.0.1 |
SNELL_IPV6 |
true |
v4 配置项;v6 下会转换为 dns-ip-preference(false → ipv4-only) |
SNELL_TFO |
true |
v4 配置项,v5 / v6 不再写入 |
仅 Snell v6
| 变量 | 默认值 | 说明 |
|---|---|---|
SNELL_MODE |
default |
加密模式 default / unshaped / unsafe-raw,客户端必须一致 |
SNELL_DNS_IP_PREFERENCE |
跟随 SNELL_IPV6 |
default / prefer-ipv4 / prefer-ipv6 / ipv4-only / ipv6-only |
SNELL_DNS |
未设置 | 自定义 DNS 服务器,多个用逗号分隔 |
ShadowTLS
| 变量 | 默认值 | 说明 |
|---|---|---|
SHADOWTLS_ENABLE |
0 |
设为 1 启用 ShadowTLS v3 |
SHADOWTLS_PORT |
8443 |
ShadowTLS 对外监听端口 |
SHADOWTLS_PASSWORD |
自动生成 | 生成后保存到 /etc/snell/shadowtls-password |
SHADOWTLS_SNI |
www.microsoft.com |
TLS 伪装 SNI |
客户端配置输出
| 变量 | 默认值 | 说明 |
|---|---|---|
SNELL_NODE_NAME |
Snell |
输出配置中的节点名 |
SNELL_SERVER_IP |
自动探测 | 手动指定服务器地址(IP 或域名) |
SNELL_IP_LOOKUP |
1 |
设为 0 关闭公网 IP 自动探测 |
本仓库的脚本不再内置流量管理(原实现不够完善已下线),流量限额统一交由 PSM(Proxy Stack Manager) 处理。 在管理菜单中选择 9. 流量管理 会直接引导你安装 PSM。
PSM 的流量管理能力:
- 按节点设置**月度流量上限(GB)**与每月自动重置日
- 超限自动暂停节点,重置或手动恢复后自动解封
- 基于 iptables 精确计数,数据持久化保存,服务器重启后断点续计
- 统一管理 Snell / SS-2022 / Xray 等多种协议的节点流量
# 安装 PSM
bash <(curl -fsSL https://psm.jinqians.com)
# 进入后选择:15. 流量管理注意:Snell 使用 TCP,流量计数不含 UDP;暂停节点只阻断新连接, 已建立的 TCP 连接会在自然断开后失效。
如果你的需求不止 Snell,推荐使用同作者的
PSM — Proxy Stack Manager:
一个用单条 psm 命令统一管理多协议、多内核的 Linux 代理服务端工具。
bash <(curl -fsSL https://psm.jinqians.com)| 维度 | 内容 |
|---|---|
| 支持协议 | VLESS Reality / Vision / XHTTP、Shadowsocks、Hysteria2、Snell、AnyTLS |
| 并行内核 | Xray、sing-box、mihomo 三套内核可同时运行 |
| 端口复用 | Nginx SNI 分流,多协议共用 443 端口 |
| 证书管理 | 基于 acme.sh 自动申请与续期 |
| 流量管理 | 流量统计、月度限额、超限自动暂停 |
| 通知 | Telegram Bot 推送 |
| 安全加固 | SSH 加固、Fail2ban、蜜罐 |
| 其他 | 多语言界面(中/英/韩/俄)、Docker 应用管理、备份还原、节点 URI 与二维码导出 |
怎么选?
| 场景 | 建议 |
|---|---|
| 只想快速起一个 Snell 节点 | 用本项目的一键脚本或 Docker 镜像 |
| 需要 Snell + 其他协议、443 复用、证书、流量限额 | 用 PSM |
| 本项目菜单里的 VLESS Reality / 流量管理 | 均已整合进 PSM |
Snell 是 Surge 团队设计的轻量级加密代理协议,以极简的协议设计和加密传输兼顾隐私保护与传输性能。 目前** Surge/shadowrocket等 客户端支持** Snell。
| 特性 | Snell v4 | Snell v5 | Snell v6 (RC) |
|---|---|---|---|
| 状态 | 稳定版 | 稳定版 | 预发布(rc2) |
| QUIC Proxy | 不支持 | 支持 | 已移除 |
| Dynamic Record Sizing | 不支持 | 支持 | 支持 |
出口控制 (egress-interface) |
不支持 | 支持 | 支持 |
| 部署级协议多样性 | 不支持 | 不支持 | 支持(PSK 派生) |
加密模式 mode |
不支持 | 不支持 | default / unshaped / unsafe-raw |
| obfs 混淆 | 支持 http |
支持 http |
已移除 |
| 地址族控制 | ipv6 |
ipv6 |
新增 dns-ip-preference,本项目在 v6 下统一使用它 |
| 多地址监听 | 不支持 | 不支持 | 支持(listen 逗号分隔) |
| armv7l 官方构建 | 提供 | 提供 | 不提供 |
选择建议:追求稳定选 v5(服务端 v5 同时兼容 v4 客户端),需要尝鲜 v6 特性再选 v6,老设备 / armv7 只能用 v4 / v5。
客户端配置格式
# v4 / v5
HK = snell, 1.2.3.4, 6160, psk = your_psk, version = 5, reuse = true, tfo = true
# v6:mode 必须与服务端一致
HK = snell, 1.2.3.4, 6160, psk = your_psk, version = 6, mode = default, reuse = true, tfo = true
安装或升级到 v6 时,脚本会交互式询问下面两个参数;Docker 则通过环境变量设置。
服务端与客户端必须完全一致,不一致将无法连接。
| 取值 | 行为 | 建议场景 |
|---|---|---|
default |
流量混淆 + AES 加密 | 默认推荐。特征伪装最完整,抗识别与抗封锁能力最强 |
unshaped |
关闭混淆,仅 AES 加密 | 吞吐比 default 提升约 10%。线路干净、以速度为先,或已叠加 ShadowTLS 等外层伪装时使用 |
unsafe-raw |
明文转发,不加密不混淆 |
控制服务端解析目标域名后优先使用哪种地址族出站,与监听地址无关。
| 取值 | 行为 | 建议场景 |
|---|---|---|
default |
跟随系统默认解析行为 | 默认推荐,适配绝大多数 VPS |
prefer-ipv4 |
双栈可用时优先 IPv4,失败回落 IPv6 | IPv6 出口质量差,或目标站点 IPv6 解锁较差 |
prefer-ipv6 |
双栈可用时优先 IPv6,失败回落 IPv4 | IPv6 线路更优,或需要 IPv6 解锁流媒体 |
ipv4-only |
只使用 IPv4 解析结果 | VPS 无 IPv6 出口,避免连接 IPv6 目标时白等超时 |
ipv6-only |
只使用 IPv6 解析结果 | IPv6 Only 的 VPS(无 IPv4 出口) |
| 场景 | mode | dns-ip-preference |
|---|---|---|
| 常规使用(不确定时) | default |
default |
| 线路易被干扰、需要最强伪装 | default |
default |
| 干净线路、追求最大吞吐 | unshaped |
default |
| 已叠加 ShadowTLS,外层已有伪装 | unshaped |
default |
| 纯 IPv4 VPS(无 IPv6 出口) | default |
ipv4-only |
| IPv6 Only VPS | default |
ipv6-only |
| 需要 IPv6 解锁流媒体 | default |
prefer-ipv6 |
| 内网 / 可信链路性能测试 | unsafe-raw |
default |
对应的服务端配置文件:
[snell-server]
listen = ::0:6160
psk = your_psk
mode = unshaped
dns-ip-preference = default
dns = 1.1.1.1Docker 用环境变量设置同样的参数:
-e SNELL_VER=v6 -e SNELL_MODE=unshaped -e SNELL_DNS_IP_PREFERENCE=defaultv6 的
listen还支持逗号分隔的多地址监听,例如listen = 0.0.0.0:6160,[::]:6160,可显式同时绑定 IPv4 与 IPv6, 不再依赖系统的双栈兼容行为。本项目脚本暂未提供该项的交互配置,需要时可手动编辑配置文件。
ShadowTLS 是轻量级 TLS 伪装工具,把代理流量伪装成访问正常 HTTPS 站点的流量,用于提升隐蔽性与稳定性。本项目使用 ShadowTLS v3。
启用后 Snell 后端改为仅监听 127.0.0.1:Snell端口,客户端只连接 ShadowTLS 对外端口,原始 Snell 端口不再暴露在公网:
客户端 ──TLS 伪装──▶ ShadowTLS(:8443) ──明文──▶ Snell(127.0.0.1:6160)
# Snell + ShadowTLS:端口填 ShadowTLS 端口
HK = snell, 1.2.3.4, 8443, psk = your_psk, version = 5, reuse = true, tfo = true, shadow-tls-password = your_stls_password, shadow-tls-sni = www.microsoft.com, shadow-tls-version = 3
仓库内提供一份可参考的 Surge 完整配置:surge.conf
https://raw.githubusercontent.com/jinqians/snell.sh/refs/heads/main/surge.conf
包含的内容:
| 段落 | 内容 |
|---|---|
[General] |
DNS、跳过代理、日志级别等基础参数 |
[Proxy] |
Snell v4 / v5、Snell + ShadowTLS、VMess 等节点写法示例 |
[Proxy Group] |
策略组划分示例 |
[Rule] |
常用分流规则 |
[URL Rewrite] / [MITM] |
重写与 MITM 示例 |
配置中的服务器地址与 PSK 均为示例,使用前请替换成你自己的节点信息。
手搓 Snell 教程:Snell v4 部署教程
感谢以下赞助商对本项目的支持:
如果这个项目对你有帮助,欢迎点一个 ⭐ Star。
- 作者网站:jinqians.com
- PSM 项目:jinqians/proxy-stack
- Docker Hub:jinqians/snell-server
- 开源协议:GPL-3.0