v2ray nginx

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

手动安装方法: CENTOS 7 系统手动安装V2RAY程序

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

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

go.sh 参数

  • -p 或 --proxy: 使用代理服务器来下载 V2Ray 的文件,格式与 curl 接受的参数一致,比如
    "socks5://127.0.0.1:1080" 或 "http://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

配置 V2ray 服务端

修改配置文件 /etc/v2ray/config.json
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修改成功,可以开始使用了.

修改 Nginx 配置

本部分的官网文档
首先把/etc/nginx/nginx.conf 文件里面 默认开启的 80 和 443的 服务器注释掉.
/etc/nginx/conf.d 目录下新建一个文件v2ray.conf

vim /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 { # 与 V2Ray 配置中的 path 保持一致
        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;
        }
}

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>

注意事项

  • V2Ray 暂时不支持 TLS1.3,如果开启并强制 TLS1.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;

配置SSL证书

1.在Cloudflare 的个人资料里面找到 API Keys –> Global API Key 创建一个API key 留作备用.
使用acme.sh 一键部署Let’s Encrypt 的免费SSL.
2.替换下面代码中的注释的命令

curl https://get.acme.sh | sh
export CF_Key="o0xrmni6602i4sbeq13b4i5uwn2hswk3"   //替换成你自己的API key
export CF_Email="email@example.com"                //换成你的Cloudflare 登录邮箱
alias acme.sh=~/.acme.sh/acme.sh
acme.sh --upgrade --auto-upgrade
acme.sh --issue --dns dns_cf -d example.com        //example.com 换成自己的域名 下面的也要换
acme.sh --install-cert -d example.com --cert-file /etc/v2ray/v2ray.crt --key-file /etc/v2ray/v2ray.key --reloadcmd "systemctl restart nginx"

配置 CloudFlare

修改默认配置,以下是必须调整的.
第一个是 Network 中的 Websocket,必须开启.
第二个是 DNS 中的对应域名的解析,必须套用 CDN,即黄色 DNS and HTTP proxy(CDN)
第三个是 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 (满血复活).

客户端配置

官方推荐的工具
Windows: V2RayN
Mac OS: V2RayX,ClashX
iOS: Shadowrocket
Android: V2RayNG

以V2RayN为例,服务器配置文件没有加密方式和伪装类型。
而 GUI 界面的客户端使用者需要填以下内容

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

扩展阅读

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

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

通过它可以设定这些国内域名走直连,这样就相当把规则的域名写到一个文件里,然后在配置中引用这个域名文件,其中有一个好处是配置比较简洁,看起来比较清爽。
1.2.外置的域名文件
很多时候,V2Ray 内置的国内域名不能满足使用。不过 V2Ray 可以使用外部自定义的像 geosite.dat 这样的域名文件,刚好我也制作了一个,可以供大家使用。
1.到 https://github.com/ToutyRater/V2Ray-SiteDAT/tree/master/geofiles 下载 h2y.dat 文件放到 V2Ray 运行文件的目录下。

2.按需要些路由规则,格式为 “ext:h2y.dat:tag”。ext 表示使用外部文件;h2y.dat 是具体的文件名;tag 泛指标签,有哪些标签由文件提供。上个步骤下载的 h2y.dat 文件目前只有 ad 和 gfw 两个标签,ad 包含着常见的广告域名,gfw 包含着常见的被 gfw 屏蔽的域名。它们各自所包含的域名在这里可以看到。这个域名文件每星期自动更新,如果你使用了我提供的域名文件也请定期更新。路由配置示例如下。

3.运行 V2Ray。

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

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

2.禁用 BT
国外版权意识比较重,如果下载盗版的影音文件很有可能会吃官司,所以大多数国外的 VPS 的使用条例都不允许下载 BT。但是一些人并不清楚这点,经常使用朋友分享给他的翻墙账号进行 BT 下载最终导致 VPS 被提供商封禁。尽管有时候说了不能使用代理下载 BT,对方也表示明白了清楚了,但总是有软件喜欢设置系统代理,也总有软件喜欢使用系统代理,好像也有不少人把路由器翻墙当成了不可或缺的,最终还是逃不了封禁的厄运。这个问题似乎从进入到 VPS 翻墙时代就困扰这大家,于是各种禁止 BT 的一键脚本也随之应运而生,也时常有人在讨论哪个脚本比较好用,其实最根本的几乎全是 IPTABLES 的字符串匹配。

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

服务器配置

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

注意: inbound 的 sniffing 必须开启。
V2ray 新平台搭建

安装 V2Ray

1. 安装

本节将说明如何安装 V2Ray,内容包含服务器安装和客户端安装。需要注意的是,与 Shadowsocks 不同,从软件上 V2Ray 不区分服务器版和客户端版,也就是说在服务器和客户端运行的 V2Ray 是同一个软件,区别只是配置文件的不同。因此 V2Ray 的安装在服务器和客户端上是一样的,但是通常情况下 VPS 使用的是 Linux 而 PC 使用的是 Windows,因此本章默认服务器为 Linux VPS,客户端为 Windows PC。如果你的 PC 使用的是 Linux 操作系统,那么请参考本文的服务器安装;VPS 使用的是 Windows,参考本文的客户端安装;如果你使用的是 MacOS ,请你自行研究怎么安装吧,安装完了跳过本节继续往下看。

本文中会有不少的命令以 sudo 开头,代表着以管理员权限运行,如果你是用 root 账户执行文中的命令,就不用打 sudo。


1.1. 时间校准

对于 V2Ray,它的验证方式包含时间,就算是配置没有任何问题,如果时间不正确,也无法连接 V2Ray 服务器的,服务器会认为你这是不合法的请求。所以系统时间一定要正确,只要保证时间误差在90秒之内就没问题。

对于 VPS(Linux) 可以执行命令 date -R 查看时间:

$ date -R
Sun, 22 Jan 2017 10:10:36 -0500

输出结果中的 -0500 代表的是时区为西 5 区,如果转换成东 8 区时间则为 2017-01-22 23:10:36

如果时间不准确,可以使用 date --set 修改时间:

$ sudo date --set="2017-01-22 16:16:23"
Sun 22 Jan 16:16:23 GMT 2017

如果你的服务器架构是 OpenVZ,那么使用上面的命令有可能修改不了时间,直接发工单联系 VPS 提供商的客服吧,就说你在 VPS 上运行的服务对时间有要求,要他们提供可行的修改系统时间的方法。

对 VPS 的时间校准之后接着是个人电脑,如何修改电脑上的时间我想不必我多说了。

无论是 VPS 还是个人电脑,时区是什么无所谓,因为 V2Ray 会自动转换时区,但是时间一定要准确。


1.2. 服务器安装

1.2.1. 脚本安装

在 Linux 操作系统, V2Ray 的安装有脚本安装、手动安装、编译安装 3 种方式,选择其中一种即可,本指南仅提供使用使用脚本安装的方法,并仅推荐使用脚本安装,该脚本由 V2Ray 官方提供。该脚本仅可以在 Debian 系列或者支持 Systemd 的 Linux 操作系统使用。

除非你是大佬,或者能够自行处理类似 command not found 的问题,否则请你使用 Debian 8.x 以上或者 Ubuntu 16.04 以上的 Linux 系统。 本指南默认使用 Debian 8.7 系统作为示范。

首先下载脚本:

$ wget https://install.direct/go.sh
--2018-03-17 22:49:09--  https://install.direct/go.sh
Resolving install.direct (install.direct)... 104.27.174.71, 104.27.175.71, 2400:cb00:2048:1::681b:af47, ...
Connecting to install.direct (install.direct)|104.27.174.71|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: ‘go.sh’

go.sh                             [ <=>                                                 ]  11.24K  --.-KB/s    in 0.001s  

2018-03-17 22:49:09 (17.2 MB/s) - ‘go.sh’ saved [11510]

然后执行脚本安装 V2Ray:

$ sudo bash go.sh
Installing curl
Updating software repo
Installing curl
Selecting previously unselected package curl.
(Reading database ... 36028 files and directories currently installed.)
Preparing to unpack .../curl_7.38.0-4+deb8u5_amd64.deb ...
Unpacking curl (7.38.0-4+deb8u5) ...
Processing triggers for man-db (2.7.0.2-5) ...
Setting up curl (7.38.0-4+deb8u5) ...
Installing V2Ray v2.33 on x86_64
Donwloading V2Ray.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   608    0   608    0     0   2403      0 --:--:-- --:--:-- --:--:--  2412
100 2583k  100 2583k    0     0  1229k      0  0:00:02  0:00:02 --:--:-- 1847k
Installing unzip
Installing unzip
Selecting previously unselected package unzip.
(Reading database ... 36035 files and directories currently installed.)
Preparing to unpack .../unzip_6.0-16+deb8u3_amd64.deb ...
Unpacking unzip (6.0-16+deb8u3) ...
Processing triggers for mime-support (3.58) ...
Processing triggers for man-db (2.7.0.2-5) ...
Setting up unzip (6.0-16+deb8u3) ...
Extracting V2Ray package to /tmp/v2ray.
Archive:  /tmp/v2ray/v2ray.zip
  inflating: /tmp/v2ray/v2ray-v2.33-linux-64/readme.md  
  inflating: /tmp/v2ray/v2ray-v2.33-linux-64/systemd/v2ray.service  
  inflating: /tmp/v2ray/v2ray-v2.33-linux-64/systemv/v2ray  
  inflating: /tmp/v2ray/v2ray-v2.33-linux-64/v2ray  
  inflating: /tmp/v2ray/v2ray-v2.33-linux-64/vpoint_socks_vmess.json  
  inflating: /tmp/v2ray/v2ray-v2.33-linux-64/vpoint_vmess_freedom.json  
PORT:40827
UUID:505f001d-4aa8-4519-9c54-6b65749ee3fb
Created symlink from /etc/systemd/system/multi-user.target.wants/v2ray.service to /lib/systemd/system/v2ray.service.
V2Ray v2.33 is installed.

看到类似于这样的提示就算安装成功了。如果安装不成功脚本会有红色的提示语句,这个时候你应当按照提示除错,除错后再重新执行一遍脚本安装 V2Ray。对于错误提示如果看不懂,使用翻译软件翻译一下就好。

在上面的提示中,有一行 “PORT:40827” 代表着端口号为 40827,还有一行 “UUID:505f001d-4aa8-4519-9c54-6b65749ee3fb” 代表着 id 为 505f001d-4aa8-4519-9c54-6b65749ee3fb。这两个都是随机生成的,不用担心跟别人撞上了。

安装完之后,使用以下命令启动 V2Ray:

$ sudo systemctl start v2ray

在首次安装完成之后,V2Ray 不会自动启动,需要手动运行上述启动命令。而在已经运行 V2Ray 的 VPS 上再次执行安装脚本,安装脚本会自动停止 V2Ray 进程,升级 V2Ray 程序,然后自动运行 V2Ray。在升级过程中,配置文件不会被修改。

对于安装脚本,还有更多用法,在此不多说了,可以执行 bash go.sh -h 看帮助。

1.2.2. 升级更新

在 VPS,重新执行一遍安装脚本就可以更新了,在更新过程中会自动重启 V2Ray,配置文件保持不变。

$ sudo bash go.sh

V2Ray 的更新策略是快速迭代,每周更新(无意外的情况下)。版本号的格式是 vX.Y.Z,如 v2.44.0。v是固定的字母v,version 的首字母;X、Y、Z都是数字,X是大版本号,每年更新一个大版本(现在是 v4.Y.Z,V2Ray 已经走到了第四个年头),Y 是小版本,每周五更新一个小版本。Z是区分正式版和测试版,Z是0代表着是正式版,不是0说明是测试版。例如,v4.7.0 是正式版,v4.7.1是测试版,建议只使用正式版,不手动指定的情况下V2Ray 的安装脚本也只会安装最新的正式版。

有些细心的朋友可能会注意到有时候周五 V2Ray 刚发布了一个新版本,次日或过两日又更新一个正式版。出现这种情况是因为周五发布的正式版出现了影响使用严重的 BUG,需要立马发布一个新版本。这种情况比较烦,但是为了保证兼容性、性能优化等又需要保证版本不要太老旧。所以我比较建议在周四更新,选这么一个日子是因为有重大的 BUG 肯定在前面几天就已经修复了,小问题(恐怕都不知道有)的话不会影响使用;而且版本号与最新版相比迟那么一两个也没什么关系。

1.3. 客户端安装

这里下载 V2Ray 的 Windows 压缩包,如果是 32 位系统,下载 v2ray-windows-32.zip,如果是 64 位系统,下载 v2ray-windows-64.zip(下载速度慢或无法下载请考虑挂已有的翻墙软件来下载)。下载并且解压之后会有下面这些文件:

  • v2ray.exe 运行 V2Ray 的程序文件
  • wv2ray.exe 同 v2ray.exe,区别在于wv2ray.exe是后台运行的,不像 v2ray.exe 会有类似于 cmd 控制台的窗口。运行 V2Ray 时从 v2ray.exe 和 wv2ray.exe 中任选一个即可
  • config.json V2Ray 的配置文件,后面我们对 V2Ray 进行配置其实就是修改这个文件
  • v2ctl.exe V2Ray 的工具,有多种功能,除特殊用途外,一般由 v2ray.exe 来调用,用户不用太关心
  • geosite.dat 用于路由的域名文件
  • geoip.dat 用于路由的 IP 文件
  • 其它 除上面的提到文件外,其他的不是运行 V2Ray 的必要文件。更详细的说明可以看 doc 文件夹下的 readme.md 文件,可以通过记事本或其它的文本编辑器打开查看

实际上双击 v2ray.exe (或wv2ray.exe) 就可以运行 V2Ray 了,V2Ray 会读取 config.json 中的配置与服务器连接。默认的配置文件包含 V2Ray 官方服务器的配置,也就是说你可以不自己搭建服务器而直接使用 V2Ray 提供的服务器科学上网。在不修改 config.json 的情况下,双击运行 v2ray.exe,可以直接科学上网(V2Ray 官方服务器已下线)。 

V2Ray 将所有选择权交给用户,它不会自动设置系统代理,因此还需要在浏览器里设置代理。以火狐(Firefox)为例,点菜单 -> 选项 -> 高级 -> 设置 -> 手动代理设置,在 SOCKS Host 填上 127.0.0.1,后面的 Port 填 1080,再勾上使用 SOCKS v5 时代理 DNS (这个勾选项在旧的版本里叫做远程 DNS)。操作图见下:

如果使用的是其它的浏览器,请自行在网上搜一下怎么设置 SOCKS 代理。