单纯的使用V2Ray似乎并不安全,于是就有了加密伪装等操作。网上可能存有很多一键搭建脚本,如果服务器只运行V2Ray还好,如果还运行网站可能多多少少会有些问题,于是就需要手动搭建….

前言

  本文主要参考新 V2Ray 白话文指南。关于v2ray与v2fly,可以粗略的认为v2ray和v2fly相同。通过本文教程,可以让一个人畜无害的网站夹杂私货。
  在开始你之前,你需要有一个解析指向你的服务器IP的域名。你还需要有关于此域名的SSL证书(如果没有可以参考上篇文章将WordPress迁移至Docker及Https部署中的HTTPS证书申请部分,证书申请方式并不唯一,请自行解决)。
  本教程操作环境为Debian 10,全部操作均在Root权限下完成。
  为什么选择Nginx+WebSocket+TLS+VLESS?首先Nginx是一个优秀的高性能的HTTP和反向代理web服务器;选用WebSocket+TLS而非更好的XTLS是因为WS可以通过CDN对域名和服务器IP进行一定程度上保护;至于VLESS,VLESS是一个无状态的轻量传输协议,它分为入站和出站两部分,可以作为 V2Ray 客户端和服务器之间的桥梁。与 VMess 不同,VLESS 不依赖于系统时间,认证方式同样为 UUID,但不需要 alterId,其本身并不自带加密,所以需要Nginx来部署加密信道(TLS)。为什么不选择性能更好表现更优秀的Trojan、Trojan-GO,因为有关文档太少,而且解释不够清晰。

V2Ray安装

0.安装前你需要准备好配置文件config.json,这里给个模板如下。

{
    "log": {
        "access": "/var/log/v2ray/access.log",
        "error": "/var/log/v2ray/error.log",
        "loglevel": "warning"
    },
    "inbounds": [
        {
            "port": 65535,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "efbd5a8f-a70d-498a-a82c-65d70902bdb9",
                        "level": 1,
                        "alterId": 0
                    }
                ],
                "decryption": "none"
            },
            "listen": "0.0.0.0",
            "streamSettings": {
                "network": "ws",
                "wsSettings": {
                    "path": "/path"
                }
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            }
        }

    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "settings": {
                "domainStrategy": "UseIP"
            },
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "settings": {},
            "tag": "blocked"
        },
        {
            "protocol": "mtproto",
            "settings": {},
            "tag": "tg-out"
        }

    ],
    "dns": {
        "servers": [
            "https+local://cloudflare-dns.com/dns-query",
            "1.1.1.1",
            "1.0.0.1",
            "8.8.8.8",
            "8.8.4.4",
            "localhost"
        ]
    },
    "routing": {
        "domainStrategy": "IPOnDemand",
        "rules": [
            {
                "type": "field",
                "ip": [
                    "0.0.0.0/8",
                    "10.0.0.0/8",
                    "100.64.0.0/10",
                    "127.0.0.0/8",
                    "169.254.0.0/16",
                    "172.16.0.0/12",
                    "192.0.0.0/24",
                    "192.0.2.0/24",
                    "192.168.0.0/16",
                    "198.18.0.0/15",
                    "198.51.100.0/24",
                    "203.0.113.0/24",
                    "::1/128",
                    "fc00::/7",
                    "fe80::/10"
                ],
                "outboundTag": "blocked"
            },
            {
                "type": "field",
                "inboundTag": ["tg-in"],
                "outboundTag": "tg-out"
            },
            {
                    "type": "field",
                    "protocol": [
                        "bittorrent"
                    ],
                    "outboundTag": "blocked"
                }
        ]
    },
    "transport": {
        "kcpSettings": {
            "uplinkCapacity": 100,
            "downlinkCapacity": 100,
            "congestion": true
        }
    }
}

  有关此模板,你需要修改第9行端口号65535(这个是v2ray运行端口,建议填写非80和443端口,此外要在服务器供应商的防火墙禁用入站访问此端口),第25行伪装路径/path(注意‘/’开头,关于路径你可以理解为用户名),以及第14行idefbd5a8f-a70d-498a-a82c-65d70902bdb9,其格式是UUID,可以参考本文后面的UUID生成进行生成(关于id你可以理解为密码)。
1.v2ray安装
  可以参考之前文章[科学上网]一键V2Ray,配置过程随意填写,最后将其中的config.json替换即可。这里我选择了用Docker安装。如果你选择了脚本一键安装可忽略剩下有关docker的内容
1.1docker安装
  docker安装请参考上篇文章将WordPress迁移至Docker及Https部署的有关部分。
1.2docker下v2ray安装
1.2.1获取最新镜像

docker pull v2fly/v2fly-core

1.2.2进入存有config.json目录将其复制到一个固定位置方便维护。

mkdir /etc/v2ray
cp config.json /etc/v2ray/config.json

1.2.3启动容器

docker run --restart=always -d --name v2ray -v /etc/v2ray:/etc/v2ray -p 127.0.0.1:65535:65535 v2fly/v2fly-core  v2ray -config=/etc/v2ray/config.json

  注意这里端口号一定要与config.json中你设置的端口号一致。127.0.0.1代表本机环回ip,防止被外部恶意连接。如果返回一串16进制字符串,则表示运行成功。
  到此V2Ray就算安装完成。

有关docker下v2ray升级(修改config.json也请参照此流程)

获取最新镜像(与之前命令一致)

docker pull v2fly/v2fly-core

停止并删除旧容器(这里并不会删除配置文件)

docker container stop v2ray
docker container rm v2ray

启动新容器(与之前命令一致)

docker run --restart=always -d --name v2ray -v /etc/v2ray:/etc/v2ray -p 127.0.0.1:65535:65535 v2fly/v2fly-core  v2ray -config=/etc/v2ray/config.json
其他有关v2ray的docker命令
#查看日志
docker container logs v2ray
#停止v2ray
docker container stop v2ray
#启动v2ray,注意是start而非run
docker container start v2ray
#重启v2ray
docker container restart v2ray

UUID生成

  UUID有专门的生成网站,也可以通过控制台运行下面的JS代码生成。

function uuid() {
    var s = [];
    var hexDigits = "0123456789abcdef";
    for (var i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }
    s[14] = "4";
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
    s[8] = s[13] = s[18] = s[23] = "-";

    var uuid = s.join("");
    return uuid;
}

  具体生成方法是:在浏览器(任意网页标签),按F12打开开发者工具,切换到控制台(console)标签,将上面代码复制粘贴进入控制台,然后输入执行uuid(),即可得到一串uuid。具体如下图。

Nginx反向代理,及HTTPS部署。

和之前的将WordPress迁移至Docker及Https部署的有关部分大同小异。这里就简单叙述以下。
1.安装Nginx

apt update
apt install nginx

  启动并添加开机启动Nginx

systemctl enable nginx
systemctl start nginx

2.修改全局配置(这里可以只留TLSv1.3以获取更好的安全性,也可以保留TLSv1.2获取更好的兼容性。)

# vim /etc/nginx/nginx.conf
#ssl_protocols TLSv1.0 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE

3.创建站点配置文件(名字随意)

touch /etc/nginx/sites-available/v2ray
ln -s /etc/nginx/sites-available/v2ray /etc/nginx/sites-enabled/v2ray

4.修改配置文件/etc/nginx/sites-available/v2ray如下(根据注释掉的内容自行修改)

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        
        # 证书路径,自行修改
        ssl_certificate /root/ssl/v2ray.crt;
        # 证书私钥路径,自行修改
        ssl_certificate_key /root/ssl/v2ray.key;

        # 网站路径/var/www/html,根据跟人情况自行修改。如果非本地搭建伪装网站可忽略下面一行
        root /var/www/html;

        # 默认主页,如果非本地搭建伪装网站可忽略下面一行
        index index.html index.htm index.nginx-debian.html;
        
        # 绑定域名,请自行修改
        server_name domain.com;

        # 禁止纯ip访问
        if ($host ~ "\d+\.\d+\.\d+\.\d") {
            return 400;
        }
        
        # 伪装路径path,请自行修改,需要与config.json一致,下面这个location是核心配置
        location /path {
                # 如果非websocket协议返回403
                if ($http_upgrade != "websocket") {
                        return 403;
                }
                proxy_redirect off;
                # v2ray运行地址,注意修改最后端口号,需要与config.json一致
                proxy_pass http://127.0.0.1:65535;
                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;
        }
        
        # 伪装站点https://www.baidu.com可以自行修改,如果是本地搭建伪装网站请开头添加#注释下面三行
        location / {
                proxy_pass https://www.baidu.com;
        }
        # 本地搭建伪装网站请去掉下面三行开头的#,并在上面三行开头添加#注释。
        # location / {
        #         try_files $uri $uri/ =404;
        # }
}

  到此,服务端的配置就全部完成。有关开启BBR加速等方面的信息可以参考之前文章(建议开启BBR加速)。此外,你可以对域名启动Cloudflare等CDN减速器对域名、IP进行保护,开启CDN不影响V2ray的连接,但可能增加连接延时、降低传输速率。

客户端配置

客户端(V2RayN)配置参考如下,其他客户端(V2RayNG,V2RayU)配置大同小异

最后提醒大家,互联网不是法外之地。