v2ray—TLS 分流器 + Domain Socket

本文最后更新于 2020年9月17日 09:25 可能会因为没有更新而失效。如已失效或需要修正,请留言

文章阅读解释:删除线的命令与文字已失效,无需理会

近期 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):

准备工作:

1、因为涉及到TLS,所以我们要准备好一个域名。任意域名。可以是那种几块钱一年的域名。将域名指向v2ray服务器。可以是子域名。

2、服务器开启 443 端口。不然后面无法自动生成 SSL 证书。


开始搭建:

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

(说明:2020.8.15左右,官方安装脚本更新,安装方式有点改变。详见文章最后的链接):

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

bash <(curl -L -s https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
systemctl enable v2ray
bash <(curl -L -s https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-dat-release.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 配置文件,替换UUID即可(说明:新的脚本将配置文件分开为数个文件,个人觉得逐一编辑还是麻烦,所以这里仍然采用原来的config.json的单文件方式)

cd /usr/local/etc/v2ray/ && rm * && wget http://pikachu.im/test/config.json && nano config.json

(注意下 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(新版本安装脚本默认用 nobody 用户运行v2ray,故这一步可以放弃了)

创建用于运行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 nss-lookup.target

[Service]
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true

# 下面这4行就是 Domain Socket 的配置,其他的都是保持默认
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

Environment=V2RAY_LOCATION_ASSET=/usr/local/share/v2ray/
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/
Restart=on-failure

[Install]
WantedBy=multi-user.target

执行 systemctl daemon-reload

为日志目录赋权

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

6、启用服务

service tls-shunt-proxy start     #执行后需等待10秒左右,等证书下载完成
ll /etc/ssl/tls-shunt-proxy/      #查看证书,如出现 certificates 文件夹则表示证书申请成功,可以执行下一步
service v2ray start

这样就启动了 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、服务端、客户端的时间是否正确

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

# 将系统时区改为上海时间 (亦即CST时区)
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 查看时间、时区
date -R

# 校准时间
ntpdate -u 1.cn.pool.ntp.org

# 设置系统硬件时间,与操作系统的软件时间同步
hwclock -w

# 重启分流器、v2ray,使v2ray正常运行
service tls-shunt-proxy restart
service v2ray restart

2、查看证书是否已生成

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

路径应该为: /etc/ssl/tls-shunt-proxy/certificates/xxxxxxxxxxx/

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

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

近期官方安装脚本更新的说明:

v2fly官网说明

新脚本GitHub页面

依據 FHS 修改 V2Ray 的安裝路徑

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

评论 抢沙发

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

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

支付宝扫一扫打赏

微信扫一扫打赏