一. You Are (Not) Decentralized

Shadowsocks 从来不是一套完整的安全协议,也不是一个匿名网络。它的起点只是一个轻量的自用加密 SOCKS 代理。这种轻量化设计天然契合个人在 VPS 上自建服务端的使用方式,客观上打散了对少数公共 VPN 节点的集中依赖。随着廉价 VPS、详尽教程和一键部署脚本相继普及,Shadowsocks 在中文技术社区里逐渐形成了"小规模、自建、分散部署"的实践范式。

但这种去中心化并不彻底。大量节点依然集中在少数云服务商、相近的数据中心 ASN 和高度雷同的配置模板之上,依旧可以被基于 IP 段、流量统计、主动探测和实现指纹进行批量识别。

SIP003 插件机制进一步将传输伪装从核心协议中解耦,使外层流量可以经由插件转换为不同的传输形态。这一设计思路与 Tor 的 Pluggable Transport 相近,但现实中真正有能力设计并维护生产级混淆插件的人寥寥无几。结果是:协议层在理论上具备灵活的定制空间,多数用户却仍然集中复用少数成熟项目,v2ray、xray、hysteria 等项目的协议指纹,事实上成为了新的公共指纹。

2025–2026 年间,AI 编程能力的跃升正在切实改变这一生态格局。过去十余年间,开源社区积累的大量代码、协议文档与 issue 讨论:涵盖 Shadowsocks、V2Ray、Xray、Trojan、Hysteria、NaïveProxy 等主流项目。如今已经可以被模型辅助检索、解释、移植和改写。其直接影响不是"人人都能设计安全协议",而是部署、配置、阅读协议文档与快速原型化的工程门槛明显降低。

在这个背景下,SIP003 的插件架构具有了新的价值。核心协议继续负责加密、认证与代理转发,插件则专注于外层传输形态的包装。当识别压力集中在首包长度、包长分布、时序特征或协议外观时,开发者可以优先在插件层进行试验,而无需每次重写核心。这一分层设计大幅降低了私有变体和实验性传输方案的供给成本。

当然,抗审查协议的设计门槛并未因此消失。密码学安全、主动探测防御、流量行为拟态、跨实现一致性与真实网络验证,依然需要高度专业的工程能力。更值得警惕的是:AI 同样降低了审查方分析开源工具、构造探测策略的成本。这不是一个单方向的技术红利,而是攻防两端工程自动化水平的同步提升。

类别已经较容易被模型辅助处理的内容仍然没有被"自动解决"的部分
协议与传输规范Shadowsocks AEAD / SIP003 / SIP022、VMess、VLESS、Trojan、Hysteria2、REALITY、NaïveProxy / Chromium 网络栈相关资料规范理解不等于安全设计能力;模型可以复述协议结构,但无法自动保证实现无指纹、无漏洞、抗主动探测
实现细节AEAD 中 salt、subkey、nonce、tag 的基本处理;Trojan 的 TLS 外观与 fallback;REALITY 的握手伪装;Hysteria2 的 QUIC 传输模式正确实现密码学、错误处理、防重放与跨平台行为一致性仍然困难;“能跑"不等于"安全可靠”
部署与运维systemd 单元、Docker / Compose、ufw / nftables / firewalld、acme.sh / certbot、Cloudflare DNS API、反向代理与证书自动化部署成功不等于隐蔽;默认模板、相同端口、相同证书配置、相同 fallback 页面可能形成新的公共指纹
工具链与配置shadowsocks-rust、sing-box、xray-core、hysteria、trojan-go 等主流实现的常见 CLI、配置 schema、日志排错和迁移示例不同版本行为差异、配置组合副作用、兼容性问题仍需人工判断;模型容易混用旧版本参数或混淆不同项目的概念
插件与扩展SIP003 插件的工程骨架、本地端口转发、参数解析、字节流包装、基础 transport 原型生产级插件的难点在流量拟态、主动探测防御、时序特征、包长分布、TLS/QUIC 指纹和真实网络验证
对抗经验公开讨论中的常见检测面:高熵流量、首包长度、包长分布、TCP 时序、TLS-in-TLS 指纹、SNI / ALPN / 证书链暴露、主动探测响应差异模型能总结已知失败模式,但无法仅凭训练语料预测新的审查策略;攻防双方都会使用自动化工具
AI 带来的变化降低阅读协议、生成配置、改写样板代码、移植实现、快速原型化的成本降低的是工程入口门槛,而非抗审查协议的设计门槛;安全性、不可区分性和长期可维护性仍需专业验证

二. You Can (Not) Advance

这一章想说明一件具体的事:触发以下全部内容所需要的输入,是几行话。并且这几行具体的话,也可以由AI生成。

Prompt 1

用 shadowsocks-rust 在 443 端口部署服务端,挂 SIP003 插件做 HTTP/2 流量伪装。给我:服务端 JSON 配置、客户端 JSON 配置、以及对应的 systemd 单元文件。插件名 http2-obfs,伪装路径 /cdn-cgi/trace,加密方式 aes-256-gcm,只走 TCP。

服务端配置:

{
  "server": "0.0.0.0",
  "server_port": 443,
  "password": "<strong-random-password>",
  "method": "aes-256-gcm",
  "mode": "tcp_only",
  "plugin": "/usr/local/bin/http2-obfs",
  "plugin_opts": "mode=server;host=example.com;path=/cdn-cgi/trace"
}

systemd 单元:

[Unit]
Description=Shadowsocks Rust Server
After=network-online.target
Wants=network-online.target

[Service]
User=shadowsocks
Group=shadowsocks
ExecStart=/usr/local/bin/ssserver -c /etc/shadowsocks-rust/server.json
Restart=on-failure
RestartSec=3
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

客户端配置:

{
  "server": "<vps-public-ip-or-domain>",
  "server_port": 443,
  "local_address": "127.0.0.1",
  "local_port": 1080,
  "password": "<same-strong-random-password>",
  "method": "aes-256-gcm",
  "plugin": "/usr/local/bin/http2-obfs",
  "plugin_opts": "mode=client;host=example.com;path=/cdn-cgi/trace"
}

Prompt 2

用 Go 实现上面的 http2-obfs SIP003 插件。要求:读取标准 SIP003 环境变量(SS_LOCAL_HOST/PORT、SS_REMOTE_HOST/PORT、SS_PLUGIN_OPTIONS),支持 client 和 server 两种模式,把 TCP 字节流包装成 HTTP/2 HEADERS + DATA 帧,帧写入用互斥锁保护。

type Config struct {
    LocalAddr  string
    RemoteAddr string
    Mode       string
    Host       string
    Path       string
}

func loadConfig() Config {
    opts := parseOpts(os.Getenv("SS_PLUGIN_OPTIONS"))

    local := net.JoinHostPort(
        env("SS_LOCAL_HOST", "127.0.0.1"),
        mustEnv("SS_LOCAL_PORT"),
    )

    remote := net.JoinHostPort(
        mustEnv("SS_REMOTE_HOST"),
        mustEnv("SS_REMOTE_PORT"),
    )

    return Config{
        LocalAddr:  local,
        RemoteAddr: remote,
        Mode:       opts["mode"],
        Host:       valueOr(opts["host"], "example.com"),
        Path:       valueOr(opts["path"], "/cdn-cgi/trace"),
    }
}

func chooseRoute(c Config) (listenAddr string, forwardAddr string) {
    if c.Mode == "server" {
        return c.RemoteAddr, c.LocalAddr
    }
    return c.LocalAddr, c.RemoteAddr
}

type frameWriter struct {
    mu sync.Mutex
    f  *http2.Framer
}

func newFrameWriter(w io.Writer) *frameWriter {
    return &frameWriter{f: http2.NewFramer(w, nil)}
}

func (w *frameWriter) writeData(streamID uint32, payload []byte) error {
    w.mu.Lock()
    defer w.mu.Unlock()
    return w.f.WriteData(streamID, true, payload)
}

func rawToHTTP2(raw io.Reader, fw *frameWriter, host, path string) error {
    streamID := uint32(1)
    buf := make([]byte, 16*1024)

    for {
        n, err := raw.Read(buf)
        if err != nil {
            return err
        }

        var header bytes.Buffer
        enc := hpack.NewEncoder(&header)
        _ = enc.WriteField(hpack.HeaderField{Name: ":method", Value: "POST"})
        _ = enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
        _ = enc.WriteField(hpack.HeaderField{Name: ":authority", Value: host})
        _ = enc.WriteField(hpack.HeaderField{Name: ":path", Value: path})
        _ = enc.WriteField(hpack.HeaderField{Name: "content-type", Value: "application/octet-stream"})

        fw.mu.Lock()
        _ = fw.f.WriteHeaders(http2.HeadersFrameParam{
            StreamID:      streamID,
            EndHeaders:    true,
            BlockFragment: header.Bytes(),
        })
        err = fw.f.WriteData(streamID, true, buf[:n])
        fw.mu.Unlock()

        if err != nil {
            return err
        }

        streamID += 2
    }
}

Prompt 3

给我一份验证清单和对应的 shell 脚本,覆盖进程、端口、功能、出口 IP、协议抓包、稳定性(100 次请求)、并发(20 并发)、重启恢复八个维度。

层级验证项通过标准
进程层systemctl is-active ssserver返回 active
端口层`ss -ltnpgrep :443`
功能层curl --proxy socks5h://127.0.0.1:1080 https://example.com -I返回 HTTP/2 200HTTP/1.1 200
出口层curl --proxy socks5h://127.0.0.1:1080 https://ifconfig.me返回 VPS 出口 IP
协议层抓包观察 client 到 server可见 HTTP/2 preface / SETTINGS / HEADERS / DATA
稳定性连续 100 次请求成功率 100%,日志无 panic
并发性20 并发请求无帧交错,无连接卡死
重启恢复reboot 后再测systemd 自动拉起,代理仍可用
systemctl status ssserver --no-pager
systemctl is-enabled ssserver
ss -ltnp | grep ':443'
journalctl -u ssserver -n 100 --no-pager
curl --proxy socks5h://127.0.0.1:1080 https://example.com -I
curl --proxy socks5h://127.0.0.1:1080 https://ifconfig.me
for i in $(seq 1 100); do
  curl -fsS --proxy socks5h://127.0.0.1:1080 https://example.com >/dev/null || exit 1
done
echo "100 requests passed"

你无法仅此推进。“能跑"只是证明了入口门槛的位移,而不是证明问题已经解决。TLS 握手细节、ALPN 协商、SNI 与证书链的完整拟态,以及真实网络环境中的行为验证,这些都还而未决。


三. You Can (Not) Complete

SIP003 的核心价值在于分层:将外层传输的伪装职责从 Shadowsocks 核心中抽离,使两者可以独立演进。这个接口在工程上为第三方插件打开了空间,但现实中并未催生出高度多样化的插件生态。多数用户仍然集中使用少数默认配置,新的公共指纹随之形成。

AI 编程能力的提升,正在改变这一局面的供给侧结构。生成插件骨架、移植已有实现、快速原型化一套新的传输方案,对当下的代码模型而言已经接近普通网络编程任务的难度。但"能跑"和"能抗检测"之间的距离,远比生成代码本身要大得多。流量是否自然、能否抵抗主动探测、是否形成了新的可识别指纹、是否经过了真实网络环境的验证,这些问题的答案,不取决于代码能否编译。

从宏观上看,供给成本下降的直接效果是:私有变体和小规模定制传输方案会增多,对基于默认指纹的批量封锁形成一定的稀释压力。但这并不意味着深度包检测会因此规模性失效。审查系统仍然可以按协议族、行为特征簇、TLS/QUIC 指纹、时序分布、包长特征与节点部署集中度进行识别和分类。

技术门槛的降低,从来都是双向的。补完,尚未完成。