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 设计