Skip to content
Go back

搭建 VMess + WebSocket + TLS 节点并通过 Nginx 进行伪装分流

| 0 Views Edit page

前言

久违地接触点新事物,尝试使用 acme 申请 TLS 证书,搭建一个 VMess + WebSocket + TLS + Web 的节点。


方案概述

  1. 域名解析到对应的节点服务器上。
  2. 使用官方的安装脚本安装 V2Ray
  3. 使用 acme 申请 TLS 证书。
  4. 配置 VMess + WebSocket + TLS 节点。
  5. 通过 Nginx 建立伪装网站。

操作步骤

一、域名解析

前往域名托管处操作。

二、安装 V2Ray

官方脚本仓库:v2fly/fhs-install-v2ray
运行脚本后,不需要进行任何其他操作,V2Ray 在安装后也不会启动:

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

三、申请 SSL 证书

# 安装所需软件
apt-get install curl
apt-get install socat
# 安装 acme
curl https://get.acme.sh | sh
# 添加软链接
ln -s  /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
# 切换 CA 机构
acme.sh --set-default-ca --server letsencrypt
# 申请证书
acme.sh  --issue -d $your_domain --standalone -k ec-256

确保你在 V2Ray 安装完成后再进行下一步证书安装过程,否则你没有 /usr/local/etc/v2ray 这个目录:

# 安装证书
acme.sh --install-cert -d $your_domain --ecc --key-file /usr/local/etc/v2ray/server.key --fullchain-file /usr/local/etc/v2ray/server.crt --reloadcmd "systemctl restart v2ray"

四、配置 VMess + WebSocket + TLS 节点

需要更新的配置文件为 /usr/local/etc/v2ray/config.json

vi /usr/local/etc/v2ray/config.json

配置文件参考:

  • 节点服务在 18388 端口
  • 只监听来自 127.0.0.1 的请求
  • 用户 ID 为 UUID 形式,最好通过 v2ray uuid 命令重新生成。
  • 节点路径为 /download,后续会被 Nginx 分流。
{
    "log": {
        "loglevel": "warning"
    },
    "inbounds": [
        {
            "port": 18388,
            "listen":"127.0.0.1",
            "protocol": "vmess",
            "settings": {
                "clients": [
                    {
                        "id": "76a9f1b5-2fe2-4715-ba0d-e4b0d66ae30e",
                        "alterId": 64
                    }
                ]
            },
            "streamSettings": {
                "network": "ws",
                "wsSettings": {
                    "path": "/download"
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "settings": {}
        }
    ]
}

如果你不想分流的只想搭建一个简单的 TCP + TLS 节点的话,可以使用下面的配置:

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 8443,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "76a9f1b5-2fe2-4715-ba0d-e4b0d66ae30e",
            "alterId": 64
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "certificates": [
            {
              "certificateFile": "/usr/local/etc/v2ray/server.crt", 
              "keyFile": "/usr/local/etc/v2ray/server.key" 
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

客户端配置,以 Surge 为例:
TCP + TLS 节点

修改完配置,重启下服务:

systemctl daemon-reload
systemctl restart v2ray

如果启动失败的话,需要修改下 v2ray.service 的启动用户:

vi /etc/systemd/system/v2ray.service

nobody 修改为 root

...
[Service]
User=root
...

参考:systemctl 启动v2ray 失败,命令行启动正常。。。

五、通过 Nginx 进行伪装、分流

没有 Nginx 的话先安装:

apt-get install nginx

Nginx 的配置文件编辑 /etc/nginx/nginx.conf 即可:

vi /etc/nginx/nginx.conf

http 配置段内增加:

server {
    listen 80;
    # 修改为你的域名
    server_name $your_domain;
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
   
   # 修改为你的域名
    server_name $your_domain;
    ssl_certificate       /usr/local/etc/v2ray/server.crt; 
    ssl_certificate_key   /usr/local/etc/v2ray/server.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols         TLSv1.2 TLSv1.3;
    ssl_ciphers           ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    # 伪装网址
    location / {
        proxy_pass https://www.hostloc.com;
        proxy_ssl_server_name on;
        proxy_redirect off;
        sub_filter_once off;
        sub_filter "www.hostloc.com" $server_name;
        proxy_set_header Host "www.hostloc.com";
        proxy_set_header Referer $http_referer;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header User-Agent $http_user_agent;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Accept-Encoding "";
        proxy_set_header Accept-Language "zh-CN";
    }
    
    # 分流到 V2Ray 服务
    location /download {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:18388;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}

之后重启下 Nginx:

nginx -s reload
service nginx restart

访问下域名,如果打开(跳转到)目标的伪装网站:
伪装网站
并且访问分流的路径返回 Bad Request:
Bad Request
就说明节点服务端启动成功了。

客户端配置,以 Surge 为例(注意端口为 443,路径为 /download):
WebSocket + TLS 节点

六、进阶操作

1. 开启 TCP BBR 加速

# 修改系统变量
echo net.core.default_qdisc=fq >> /etc/sysctl.conf
echo net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.conf
# 保存生效
sysctl -p

确实是否生效:

sysctl net.ipv4.tcp_available_congestion_control

TCP BBR 生效

2. 定时更新证书和重启服务

原博文没有提到,但是在使用 acme.sh --install-cert 安装证书的时候其实就已经做了:

# 安装证书
acme.sh --install-cert -d $your_domain --ecc --key-file /usr/local/etc/v2ray/server.key --fullchain-file /usr/local/etc/v2ray/server.crt --reloadcmd "systemctl restart v2ray"

我们指定了 --reloadcmd "systemctl restart v2ray" 证书更新的时候重启 V2Ray,这就会使得新证书被正确使用。


参考文章:


Edit page