v2ray—TLS 分流器 + Domain Socket

近期 v2ray 发现漏洞,容易被检测到。详见:

https://github.com/v2ray/v2ray-core/issues/2542

原来单纯的 vmess + TCP (官方脚本一键安装)已经非常危险。根据建议我们必须套上 TLS 保证安全。


这里分享下 v2ray 使用 TCP+TLS分流器 + Domain Socket(即是TCP + TLS + Web + Domain Socket)的配置过程。

相比 TCP,Domain Socket (以下简称 DS) 更为高效。根据测试反馈,速度超过 50Mbps 时,通常会有较明显的性能差距。

DS 仅限分流器与服务端 V2Ray 连接,客户端连接服务器仍然使用 TCP, 即:

              TLS over TCP                DS
客户端 V2Ray --------------- TLS 分流器 -------- 服务端 V2Ray

TLS 分流器 GitHub:

https://github.com/liberal-boy/tls-shunt-proxy

介绍:

用于分流 TLS 流量,适用于 vmess + TLS + Web 方案实现,并可以与 trojan 共享端口。
sni 分流
http 和无特征流量分流
静态网站服务器
自动获取证书

搭建过程(lightsail、ubuntu 16.04):

因为涉及到TLS,所以我们要准备好一个域名。任意域名。可以是那种几块钱一年的域名。

将域名指向v2ray服务器。可以是子域名。

1、先使用 v2ray 官方安装脚本安装 v2ray:

bash <(curl -L -s https://install.direct/go.sh)

如果你之前装过老版本,则再执行一次v2ray就会更新到最新版本。

2、安装 TLS分流器

还是一键安装脚本(linux-amd64):

bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh)

安装完之后,我们可以在 /etc/tls-shunt-proxy/config.yaml 这里看到配置文件

3、配置 分流器

编辑配置文件 /etc/tls-shunt-proxy/config.yaml

可以配置的地方很多,这里我只把我们需要用到的列出来

# 监听地址和端口,就是 v2ray客户端 需要指向的地址和端口。端口一般保持默认的443即可。
listen: 0.0.0.0:443
vhosts:
    # 将 example.com 改为你的域名
  - name: example.com
    # 这里两项都需要 true,否则你就需要手动管理证书了
    tlsoffloading: true
    managedcert: true
    alpn: h2,http/1.1
    # 如果不需要兼容 tls12, 可改为 tls13
    protocols: tls12,tls13
    http:
      handler: fileServer
      # /var/www/html 是静态网站目录 保持默认即可
      args: /var/www/html
    default:
      handler: proxyPass
      args: unix:/tmp/v2ray-ds/v2ray.sock

4、配置 v2ray

编辑 v2ray 配置文件

(注意下 port 端口这个参数,这里因为采用了 Domain Socket 的方式,已经不走端口,所以保持默认即可,理论上写什么端口都行)

{
    "inbounds": [
        {
            "protocol": "vmess",
            "listen": "127.0.0.1",
            "port": 40001,
            "settings": {
                "clients": [
                    {
                        "id": "f2675e5c-9ad7-4367-836a-8341117d0a6f"
                    }
                ]
            },
            "streamSettings": {
                "network": "ds",
                "dsSettings": {
                     "path": "/tmp/v2ray-ds/v2ray.sock"
                }

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

5、配置 v2ray用户并在v2ray服务启用 v2ray.sock

创建用于运行v2ray的用户,且不允许执行解释器
useradd v2ray -s /usr/sbin/nologin
修改v2ray.service文件,加入User和Group两项,配置 Domain Socket
vim /etc/systemd/system/v2ray.service
(注意这里会自动执行 rm、mkdir、rm、chmod这些命令,请根据自己的系统配置对应的路径,我这里是Ubuntu)
(这里很容易出错,建议Ubuntu的直接复制粘贴)

[Unit]
Description=V2Ray Service
# After=network.target
# Wants=network.target
After=network.target nss-lookup.target
Wants=network-online.target

[Service]
# This service runs as root. You may consider to run it as another user for security concerns.
# By uncommenting the following two lines, this service will run as user v2ray/v2ray.
# More discussion at https://github.com/v2ray/v2ray-core/issues/1011
User=v2ray
Group=v2ray
Type=simple

CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_NET_RAW
NoNewPrivileges=yes
ExecStartPre=/bin/mkdir -p /tmp/v2ray-ds
ExecStartPre=/bin/rm -rf /tmp/v2ray-ds/*.sock

ExecStartPost=/bin/sleep 1
ExecStartPost=/bin/chmod 777 /tmp/v2ray-ds/v2ray.sock

# PIDFile=/run/v2ray.pid
ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json

Restart=on-failure
# Don't restart in the case of configuration error
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target

执行 systemctl daemon-reload

为日志目录赋权

chown -R v2ray:v2ray /var/log/v2ray

6、启用服务

service tls-shunt-proxy start
service tls-shunt-proxy restart
service v2ray stop
service v2ray start
service v2ray restart

这样就启动了 TLS分流器、v2ray

7、客户端连接

{
    "inbounds": [
        {
            "port": 1080,
            "listen": "127.0.0.1",
            "protocol": "socks"
        }
    ],
    "outbounds": [
        {
            "protocol": "vmess",
            "settings": {
                "vnext": [
                    {
                        "address": "example.com",
                        "port": 443,
                        "users": [
                            {
                                "id": "f2675e5c-9ad7-4367-836a-8341117d0a6f",
                                "security": "none"
                            }
                        ]
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls"
            }
        }
    ]
}

简要说明:

客户端使用域名连接服务端,使用 443 端口,加密可以选 无 或者 auto。设置为 tcp + tls。“跳过证书验证”设为 false。

done!


检测分流器运行状况(出现问题时可执行查看)

sudo -u tls-shunt-proxy /usr/local/bin/tls-shunt-proxy -config /etc/tls-shunt-proxy/config.yaml

故障排查

按照上面的教程操作后,仍然无法顺利连接的话,可以检查下面2点。

1、服务端、客户端的时间是否正确

这个出错的概率很低,但是我遇到过服务器时间错误的情况,纠正时间就解决了

2、查看证书是否已生成

发现有时候证书无法自动生成,

路径应该为:/etc/ssl/tls-shunt-proxy/certificates/acme-v02.api.letsencrypt.org-directory/

那么我们就手动生成证书。

wget https://dl.eff.org/certbot-auto
chmod +x ./certbot-auto
./certbot-auto certonly

生成证书后,在 /etc/tls-shunt-proxy/config.yaml 里设置 managedcert: false ,然后在下面指定证书的路径,重启分流器和v2ray就行了。

记得证书要给予读取权限(644)。比如:

chmod 644 privkey.pem

v2ray 官方GitHub:

https://github.com/v2fly/v2ray-core

参考教程:

https://guide.v2fly.org/advanced/tcp_tls_shunt_proxy.html

打赏
欢迎转载,请注明出处:轻时代 » v2ray—TLS 分流器 + Domain Socket

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

打赏一下作者,鼓励他发表更多的精彩文章

支付宝扫一扫打赏

微信扫一扫打赏