V2ray 新平台搭建

V2ray 是一个新型的工具,由于官网说明的很多地方说的不够直白,所以本文记录了一些使用方法

本实例采取 V2Ray、Cloudflare、Nginx、WebSocket 和 TLS 技术搭建一个科学上网的环境,以便绕过防火墙的封锁,并实现安全、隐蔽的网络连接。

Project V 是一个工具集合,它可以帮助你打造专属的基础通信网络。Project V 的核心工具称为 V2Ray,其主要负责网络协议和功能的实现,与其它 Project V 通信。V2Ray 可以单独运行,也可以和其它工具配合,以提供简便的操作流程。

科学上网担心 IP 被墙? 你可以使用 Cloudflare 中转 V2Ray WebSocket 的流量来避免 IP 被墙。简单说就是使用 V2Ray 的 WebSocket + TLS 传输协议,并且由于使用了 Cloudflare 中转,所以墙根本不知道背后的 IP 是多少,还怎么墙你的 IP 呢?

V2ray 官网:https://www.v2ray.com/

本次部署主要采用 V2ray+Nginx+CloudFlare+WwebSocket+TLS 方式,所以准备内容略多,但是效果显著,可以利用 CDN 让被墙的服务器 80% 血量复活。(我的测试之后满血复活)

准备条件

  1. CentOS 7
  2. freenom (域名)
  3. Cloudflare (CDN)
  4. Nginx
  5. V2ray
  6. SSL证书 (acme.sh)

安装和配置 V2Ray 服务端

一键安装脚本 官方安装说明

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

go.sh 参数

  • -p--proxy: 使用代理服务器来下载 V2Ray 的文件,格式与 curl 接受的参数一致,比如 socks5://127.0.0.1:1080http://127.0.0.1:3128
  • -f--force: 强制安装。在默认情况下,如果当前系统中已有最新版本的 V2Ray,go.sh 会在检测之后就退出。如果需要强制重装一遍,则需要指定该参数。
  • --version: 指定需要安装的版本,比如 v1.13。默认值为最新版本。
  • --local: 使用一个本地文件进行安装。如果你已经下载了某个版本的 V2Ray,则可通过这个参数指定一个文件路径来进行安装。

示例:

  • 使用地址为 127.0.0.1:1080 的 SOCKS 代理下载并安装最新版本:

    ./go.sh -p socks5://127.0.0.1:1080
    
  • 安装本地的 v1.13 版本:

    ./go.sh --version v1.13 --local /path/to/v2ray.zip
    

配置文件修改

编辑 /etc/v2ray/config.json 配置文件,修改监听端口、UUID 和 WebSocket 设置等。

UUID 在线生成

{
  "inbounds": [{
    "port": 10000,         // 设置监听端口
    "listen":"127.0.0.1",  // 要指定监听内网地址
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "ef5af5fe-96f9-4072-b393-4f3b392af0a2",  // UUID 填在这里, 用在线生成的即可
          "level": 1,
          "alterId": 64
        }
      ]
    },
    "streamSettings": {
      "network": "ws",   // 设置WebSocket 模式
      "wsSettings": {
      "path": "/ray"
      }
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      },
      {
        "type": "field",
        "outboundTag": "block", // 禁止BT下载
        "protocol": [
          "bittorrent"
        ]
      }
    ]
  }
}

复制配置文件, 然后替换前 4 个注释的内容即可

freenom 域名注册

  1. 注册域名成功后把 DNS 服务器设置成 Cloudflare 提供的 DNS
  2. 登陆 Cloudflare 添加域名, 它会提供 DNS 服务器地址
  3. 在 freenom 修改 nameserver 之后, 稍等10分钟
  4. 在 Cloudflare 选择申请验证 DNS 服务器. 等待 5 分钟左右
  5. 验证成功后会收到 Cloudflare 的邮件, 告诉你 DNS 修改成功, 可以开始使用了

配置 SSL 证书

在 Cloudflare 的个人资料里面找到 API Keys –> Global API Key 创建一个 API key 留作备用.

使用 acme.sh 工具获取免费的 Let’s Encrypt SSL 证书

curl https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh
acme.sh --upgrade --auto-upgrade

# 替换成你自己的 API key
export CF_Key="o0xrmni6602i4sbeq13b4i5uwn2hswk3"
# 换成你的 Cloudflare 登录邮箱
export CF_Email="email@example.com"

# example.com 换成自己的域名 下面的也要换
acme.sh --issue --dns dns_cf -d example.com
acme.sh --install-cert -d example.com --fullchain-file /etc/v2ray/v2ray.crt --key-file /etc/v2ray/v2ray.key --reloadcmd "nginx -s reload"

配置 Nginx 反向代理

本部分的官网文档: WebSocket

修改 Nginx 配置文件 /etc/nginx/nginx.conf,首先把文件里面默认开启的 80 和 443 的服务器注释掉

创建新的配置文件来代理 V2Ray WebSocket 流量, 在 /etc/nginx/conf.d 目录下新建一个文件 v2ray.conf

server {
  listen 443 ssl;
  ssl on;
  ssl_certificate /etc/v2ray/v2ray.crt;
  ssl_certificate_key /etc/v2ray/v2ray.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;
  server_name example.com; #替换成自己的域名

  location / {
    default_type application/json;
    add_header Content-Type "text/plain;charset=utf-8";
    return 200 "OK~!";
  }

  location /ray {
    proxy_redirect off;
    proxy_pass http://127.0.0.1:10000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;

    # Show realip in v2ray access.log
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

注意事项

  • V2Ray 暂时不支持 TLS 1.3,如果开启并强制 TLS 1.3 会导致 V2Ray 无法连接

  • 如果在设置完成之后不能成功使用,可能是由于 SElinux 机制 (如果你是 CentOS 7 的用户请特别留意 SElinux
    这一机制) 阻止了 Nginx 转发向内网的数据。如果是这样的话,在 V2Ray 的日志里不会有访问信息,在 Nginx
    的日志里会出现大量的 Permission Denied 字段,要解决这一问题需要在终端下键入以下命令:

    setsebool -P httpd_can_network_connect 1
    
  • 请保持服务器和客户端的 wsSettings 严格一致,对于 V2Ray,/ray 和 /ray/ 是不一样的

  • 不安全的因素在于人,自己的问题就不要甩锅,哪怕我把示例中的 path 改成一个 UUID,依然有不少人原封不动地 COPY

Apache 配置

<VirtualHost *:443>
  ServerName example.com
  SSLCertificateFile /etc/v2ray/v2ray.crt
  SSLCertificateKeyFile /etc/v2ray/v2ray.key

  SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2
  SSLCipherSuite HIGH:!aNULL

  <Location "/ray/">
    ProxyPass ws://127.0.0.1:10000/ray/ upgrade=WebSocket
    ProxyAddHeaders Off
    ProxyPreserveHost On
    RequestHeader append X-Forwarded-For %{REMOTE_ADDR}s
  </Location>
</VirtualHost>

配置 Cloudflare CDN

修改默认配置,以下是必须调整的

  1. Network 中的 Websocket,必须开启
  2. DNS 中的对应域名的解析,必须套用 CDN,即黄色 DNS and HTTP proxy(CDN)
  3. Cloudflare 的 Crypto 选项卡的 SSL 为 Full

可能的要调整的,具体是否有影响,不清楚。

  1. Crypto 中,Authenticated Origin Pulls 应该要关闭 (我没关)
  2. Opportunistic Encryption 应该要关闭(我关了)

测试

注意,注意,完成配置后确认无误,仍然需要等待 10-20 分钟让 CDN 反应,允许 websocket。所以期间不要着急. 刚刚配置完的延迟会非常高. 要等待 24-48 小时左右匹配到最佳线路. 延迟才会下降.

数据流向为

V2 客户端 –> CDN:443 –> Nginx:443  –>  V2 服务端:10000
  • 不要使用伪装 http 报头
  • 加密协议为 none 或者 aes-128-cfb
  • 开启 UDP 与 KCP

使用客户端连接,套 CDN 无 Error,可访问 Google,速度大约在 500KB 左右。并且此方式突破 GFW 封锁 IP 地址,但是不排除封域名。24小时之后, 速度可以达到 22m/s (满血复活)

客户端配置

官方推荐的工具: 神一样的工具们

以 V2RayN 为例, 服务器配置文件没有加密方式和伪装类型。

而 GUI 界面的客户端使用者需要填以下内容

地址 example.com
端口 443
用户 ID  ef5af5fe-96f9-4072-b393-4f3b392af0a2
AlterID  64
加密方式  客户端控制  # 建议aes-128-gcm
传输协议  ws
伪装类型  客户端控制  # 默认none
伪装域名  /ray
底层传输  tls

扩展阅读

内置的域名文件 geosite.dat

在下载 V2Ray 的时候,下载的压缩包有一个 geosite.dat。这个文件是在路由功能里用到的,文件内置了许多常见的网站域名。配置方式如下,geosite 指 geosite.dat 文件,后面的 cn 是一个标签,代表着使用 geosite.dat 文件里的 cn 规则

{
    "type": "field",
    "outboundTag": "direct",
    "domain": [
        "geosite:cn"
    ]
}

通过它可以设定这些国内域名走直连, 这样就相当把规则的域名写到一个文件里,然后在配置中引用这个域名文件,其中有一个好处是配置比较简洁,看起来比较清爽。

外置的域名文件 (自定义的 geosite.dat)

很多时候,V2Ray 内置的国内域名不能满足使用。不过 V2Ray 可以使用外部自定义的像 geosite.dat 这样的域名文件,刚好我也制作了一个,可以供大家使用

  1. github.com/ToutyRater/V2Ray-SiteDAT/tree/master/geofiles 下载 h2y.dat 文件放到 V2Ray 运行文件的目录下

  2. 按需要写路由规则,格式为 ext:h2y.dat:tag

    • ext 表示使用外部文件
    • h2y.dat 是具体的文件名
    • tag 泛指标签,有哪些标签由文件提供
  3. 步骤 1 下载的 h2y.dat 文件目前只有 adgfw 两个标签,ad 包含着常见的广告域名,gfw 包含着常见的被 gfw 屏蔽的域名。它们各自所包含的域名在这里可以看到。这个域名文件每星期自动更新,如果你使用了我提供的域名文件也请定期更新。

  4. 路由配置示例如下

    "rules": [
        {
            "type": "field",
            "outboundTag": "block", // 拦截广告相关域名
            "domain": [
                "ext:h2y.dat:ad"
            ]
        },
        {
            "type": "field",
            "outboundTag": "proxy", // 被 gfw 屏蔽的域名走代理
            "domain": [
                "ext:h2y.dat:gfw"
            ]
        },
        {
            "type": "field",
            "network": "tcp,udp",
            "outboundTag": "direct" // 默认直连
        }
    ]
    

    因为使用了 gfw 列表的用户,通常是想要默认情况下直连,但有时候习惯上在 outbounds 的第一个是代理的出站,所以在上面的配置中,最后加了一条直连的规则。那个 "network": "tcp,udp" 是为了让所有流量都能匹配上。

  5. 运行 V2Ray

需要注意的是,目前所有第三方的 V2Ray GUI 客户端都不支持加载外置的域名文件

禁止 BT 流量

国外版权意识比较重,如果下载盗版的影音文件很有可能会吃官司,所以大多数国外的 VPS 的使用条例都不允许下载 BT。但是一些人并不清楚这点,经常使用朋友分享给他的翻墙账号进行 BT 下载最终导致 VPS 被提供商封禁。

尽管有时候说了不能使用代理下载 BT,对方也表示明白了清楚了,但总是有软件喜欢设置系统代理,也总有软件喜欢使用系统代理,好像也有不少人把路由器翻墙当成了不可或缺的,最终还是逃不了封禁的厄运。

这个问题似乎从进入到 VPS 翻墙时代就困扰这大家,于是各种禁止 BT 的一键脚本也随之应运而生,也时常有人在讨论哪个脚本比较好用,其实最根本的几乎全是 IPTABLES 的字符串匹配。

在 V2Ray, 修改配置文件的路由配置即可禁用 BT。单从禁用 BT 来说的话,也许 IPTABLES 的方式会好一些,也可能不是。但是别忘了,V2Ray 的路由功能可不是只能禁止连接而已,本质应该是转发。也就是说,如果你有一台无视版权的 VPS,那么大可将 BT 流量转到这台 VPS 上。

服务器配置

"routing": {
  "domainStrategy": "AsIs",
  "rules": [
    {
      "type": "field",
      "outboundTag": "block",
      "protocol": [
        "bittorrent"
      ]
    }
  ]
}

注意: inbound 的 sniffing 必须开启


原文

V2ray 新平台搭建
禁用 BT

最后更新于 2019-09-24
使用 Hugo 构建
主题 StackJimmy 设计