▎覆盖用于验证证书的域名,但不会改变 SNI
免流等场景下, SNI 改为混淆, 不关验证, 仍然验证证书的域名
verifyPeerCertByName, URI 上叫 vcn$server['name-cert-verify'] = 'b.com'- ❤️1
verifyPeerCertByName, URI 上叫 vcn$server['name-cert-verify'] = 'b.com'
certificate_public_key_sha256)session_id、conversation_id、thread_id),否则多账号环境下的粘性会话(Sticky Session)会失效。http {
underscores_in_headers on;
}xcaddy build master --output /usr/bin/caddyservers :443 {
expected_underscore_headers session_id conversation_id thread_id
}curl https://mise.run | shecho 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrcecho '~/.local/bin/mise activate fish | source' >> ~/.config/fish/config.fishgomise use -g gogo install github.com/caddyserver/xcaddy/cmd/xcaddy@latestxcaddy build master 但是可能也有新鲜的 bug 🐶xcaddy build latest --with github.com/pberkel/caddy-storage-redis --output /usr/bin/caddy/etc/caddy/Caddyfileencryption_key 开启加密compression 开启压缩
0.0.0.0:12446, 加密 2022-blake3-aes-256-gcm, 密码 SaAj4IC+cHEyWoCaUXeNBE+A8DcqKRsOELe4FOuuNJE=curl -L https://github.com/ihciah/shadow-tls/releases/download/v0.2.25/shadow-tls-x86_64-unknown-linux-musl -o /usr/local/bin/shadow-tls; chmod a+x /usr/local/bin/shadow-tlscurl -L https://github.com/ihciah/shadow-tls/releases/download/v0.2.25/shadow-tls-arm-unknown-linux-musleabi -o /usr/local/bin/shadow-tls; chmod a+x /usr/local/bin/shadow-tls/etc/systemd/system/shadow-tls.service 抄了下 snell 的服务 微调了下[Unit]
Description=Shadow-TLS Server Service
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
LimitNOFILE=32767
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStartPre=/bin/sh -c ulimit -n 51200
ExecStart=shadow-tls --fastopen --v3 --strict server --wildcard-sni=authed --listen [::]:443 --server 127.0.0.1:12446 --tls p11.douyinpic.com:443 --password MVlWnwyr9vEOK8hL
[Install]
WantedBy=multi-user.target12446 是 TCP 端口. 如果你的 SS TCP 监听的是其他端口, 这里自己改systemctl daemon-reload
systemctl enable --now shadow-tlssystemctl status shadow-tls
journalctl -f -o cat -n 100 -u shadow-tlsvps [ss2022][shadow-tls-v3] = ss, 服务器地址, 443, encrypt-method=2022-blake3-aes-256-gcm, password=SaAj4IC+cHEyWoCaUXeNBE+A8DcqKRsOELe4FOuuNJE=, shadow-tls-password=MVlWnwyr9vEOK8hL, shadow-tls-sni=p11.douyinpic.com, shadow-tls-version=3, udp-relay=true, udp-port=1244612446 是 UDP 端口. 如果你的 SS UDP 监听的是其他端口, 这里自己改udp-portshadowsocks 协议支持配置 udp-port 参数,用于单独指定 UDP 模式的服务端端口号,可在使用 ShadowTLS 时使用原端口号。
udp-port(ss 监听的 udp 端口 需要监听公网)--wildcard-sni=authed 所以 可以在客户端改 shadow-tls-sni 不用跟服务端设置的相同p11.douyinpic.com 是混淆--strict 具体可以看这个文档proxies:
- name: "direct"
type: direct
udp: true
ip-version: ipv4-prefer
listeners:
- name: snell-in
type: snell
port: 443
listen: "::"
psk: vgyCqVVztA9fNVYB4ZfW
proxy: direct
version: 4
udp: true
shadow-tls:
enable: true
version: 3
users:
- name: user
password: zdYFc1fSSi6oBZeon84ojA
handshake:
dest: p11.douyinpic.com:4431 [snell][shadow-tls]=snell,xxxx,443,version=4,psk="vgyCqVVztA9fNVYB4ZfW",udp-relay=true,shadow-tls-password="zdYFc1fSSi6oBZeon84ojA",shadow-tls-sni=p11.douyinpic.com,shadow-tls-version=3,reuse=true
wget -O snell.sh --no-check-certificate https://git.io/Snell.sh && chmod +x snell.sh && ./snell.sh127.0.0.1, 假设你监听的端口为 63000, 密码为 oKObPL9BuHcU2c5c 不开 obfs/etc/snell/config.conf[snell-server]
listen = 127.0.0.1:63000
ipv6 = true
psk = oKObPL9BuHcU2c5c
tfo = true
version = 4systemctl restart snell-server
systemctl status snell-servercurl -L https://github.com/ihciah/shadow-tls/releases/download/v0.2.25/shadow-tls-x86_64-unknown-linux-musl -o /usr/local/bin/shadow-tls; chmod a+x /usr/local/bin/shadow-tlscurl -L https://github.com/ihciah/shadow-tls/releases/download/v0.2.25/shadow-tls-arm-unknown-linux-musleabi -o /usr/local/bin/shadow-tls; chmod a+x /usr/local/bin/shadow-tls/etc/systemd/system/shadow-tls.service 抄了下 snell 的服务 微调了下[Unit]
Description=Shadow-TLS Server Service
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
LimitNOFILE=32767
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStartPre=/bin/sh -c ulimit -n 51200
ExecStart=shadow-tls --fastopen --v3 --strict server --wildcard-sni=authed --listen [::]:443 --server 127.0.0.1:63000 --tls p11.douyinpic.com:443 --password MVlWnwyr9vEOK8hL
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl enable --now shadow-tlssystemctl status shadow-tls
journalctl -f -o cat -n 100 -u shadow-tlsvps [snell][shadow-tls-v3] = snell, 服务器IP , 443, psk=oKObPL9BuHcU2c5c, version=4, reuse=true, tfo=true, shadow-tls-password=MVlWnwyr9vEOK8hL, shadow-tls-version=3, shadow-tls-sni=p11.douyinpic.com--wildcard-sni=authed 所以 可以在客户端改 shadow-tls-sni 不用跟服务端设置的相同p11.douyinpic.com 是混淆, 需要你的套餐支持. 一般需要 443 端口--strict 具体可以看这个文档
sni, 其次节点服务端certificate_public_key_sha256)Trojan-Go : verify_hostname 表示服务端是否校验客户端提供的SNI与服务端设置的一致性 文档Xray : rejectUnknownSni 服务端接收到的 SNI 与证书域名不匹配即拒绝 TLS 握手 文档sing-box: 问了下薄荷佬, 官版没有,server-cert-fingerprint TLS 握手时验证服务器证书 SHA256 指纹 文档server-cert-fingerprint-sha256 文档skip-cert-verify=true :Surge will not verify the server's certificate.
sni=off :turn off SNI completely
sni 为 IP 时, 也不发 sniverifyPeerCertByName, URI 上叫 vcn$server['name-cert-verify'] = 'b.com'bing.com 自签证书:openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) -keyout private.key -out certificate.pem -subj "/CN=bing.com" -days 36500openssl x509 -noout -fingerprint -sha256 -inform pem -in certificate.pemopenssl s_client -connect foo.com:443 -servername foo.com </dev/null 2>/dev/null | openssl x509 -noout -fingerprint -sha256 | cut -d= -f2tls-fingerprint 可自动转其他客户端, 但是 sing-box 的不一样, 没法直接转, 所以开放了字段让你自己设{ "name": "节点名", "type": "anytls", "server": "服务器", "port": 443, "password": "xYbpwdF9vIELWoLmdC", "udp": true, "sni": "a.foo.com", "fingerprint": "SHA256 指纹", "_certificate_public_key_sha256": [ "SHA-256 哈希" ] } openssl x509 -in certificate.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64echo | openssl s_client -servername foo.com -connect foo.com:443 2>/dev/null | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64$server._certificate_public_key_sha256 = [ "428F7quaQJvBhEr5TclcjPpsl1ryyNQo7oLBGhhC3UU=" ]