silmace

将v2隐藏在网站的tls流之中
暂无文字描述
扫描右侧二维码阅读全文
11
2020/04

将v2隐藏在网站的tls流之中

本教程已不适用,可用作参考

之前一直使用 v2 + websocket + caddy反代tls 的方法获得了不错的隐蔽性,但是tls,ws都需要握手建立连接,也就是说使用tls1.3的话也需要三个rtt才能完成连接,ws好处也只有能过cdn

最近新增了一个 sni分流器 可以按照sni分流http和无特征流量(类似trojan),使用tcp + tls只有两个rtt,虽然复用session数据传输都是一个rtt,但本着更快的原则还是来试试

*提示:请求连接首先会建立tls连接,所以无论是ws还是vmess都是看不到的,所以无论是wss还是tcp + tls不用担心安全问题。

原理

使用分流器监听在443端口,解密tls然后将http流量直接发给caddy,非http流量转发给v2 server,模拟正常的https连接。这是一个非常简单的方式,其他功能等着你去尝试

教程

#开始之前确保你使用了官方脚本安装了v2
bash <(curl -L -s https://install.direct/go.sh)

1.安装tls分流器

bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh)
#设置开机自启
systemctl enable tls-shunt-proxy

2.编辑TLS 分流器配置文件(位于/etc/tls-shunt-proxy/config.yaml)

# listen: 监听地址
listen: 0.0.0.0:443

# inboundbuffersize: 入站缓冲区大小,单位 KB, 默认值 4
# 相同吞吐量和连接数情况下,缓冲区越大,消耗的内存越大,消耗 CPU 时间越少。在网络吞吐量较低时,缓存过大可能增加延迟。
inboundbuffersize: 4

# outboundbuffersize: 出站缓冲区大小,单位 KB, 默认值 32
outboundbuffersize: 32

# vhosts: 按照按照 tls sni 扩展划分为多个虚拟 host
vhosts:

  # name 对应 tls sni 扩展的 server name
  - name: example.com

    # tlsoffloading: 解开 tls
    tlsoffloading: true

    # managedcert: 管理证书,开启后将自动从 LetsEncrypt 获取证书,根据 LetsEncrypt 的要求,必须监听 443 端口才能签发
    managedcert: true

    # 直接tls1.3
    protocols: tls13

    # http: 识别出的 http 流量转发到80
    http:
      handler: proxyPass
      args: 127.0.0.1:80

    # 把其他流量都交给v2,听说ds效率更高
    default:
      handler: proxyPass
      args: unix:/tmp/v2ray-ds/v2ray.sock

3.修改服务器 V2Ray 配置文件

#复制以下内容一起到终端
cat >  /etc/v2ray/config.json <<EOF
{
    "inbounds": [
        {
            "protocol": "vmess",
            "listen": "127.0.0.1",
            "port": 102,#随便写,反正没用
            "settings": {
                "clients": [
                    {
                        "id": "f2435e5c-9ad9-4367-836a-8341117d0a5f"
                    }
                ]
            },
            "streamSettings": {
                "network": "ds",
                "dsSettings": {
                     "path": "/tmp/v2ray-ds/v2ray.sock"
                }

            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}
EOF

4.创建用于运行v2ray的用户,且不允许执行解释器

useradd v2ray -s /usr/sbin/nologin

5.修改 V2Ray 的 systemd 配置文件

#复制以下内容一起到终端
cat > /etc/systemd/system/v2ray.service <<EOF
[Unit]
Description=V2Ray Server
After=network.target nss-lookup.target
Wants=network-online.target

[Service]
Type=simple
User=v2ray
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_NET_RAW
NoNewPrivileges=yes
ExecStartPre=/usr/bin/mkdir -p /tmp/v2ray-ds
ExecStartPre=/usr/bin/rm -rf /tmp/v2ray-ds/*.sock
ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json
ExecStartPost=/usr/bin/sleep 1
ExecStartPost=/usr/bin/chmod 777 /tmp/v2ray-ds/v2ray.sock
Restart=on-failure
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target
EOF

6.重启服务

systemctl daemon-reload
systemctl restart v2ray
systemctl restart tls-shunt-proxy

7.检测运行状态

systemctl status v2ray
systemctl status tls-shunt-proxy

实测httping的延迟少了不少
客户端选择tcp + tls ,注意更改uuid,alterid 可以填0,加密可以选none (反正有tls加密

问题

该方法的隐蔽性是否比 wss 低?
1.中间人看来,该方法在建立 TLS 连接后,比 wss 少一次握手,即 TLS 建立后直接发送请求并获得响应,该行为是符合正常的 HTTPS 请求的。
2.主动探测时,如 TLS 建立后发送 HTTP 请求,则被发给 Web 服务器按正常 HTTP 请求处理。如发送非 HTTP 请求,会被发给 V2Ray 处理,如 Vmess 认证失败,连接将被关闭,向 HTTPS 服务器发送非 HTTPS 请求,连接被关闭是正常的行为。

参考
guide.v2fly.org
github/v2ray
tls-shunt-proxy

Last modification:September 5th, 2020 at 12:55 pm

Make a comment