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 新平台搭建