V2ray 新平台搭建

2018-02-27 15990点热度 14人点赞

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


本文主要采取 CloudFlare+WebSocket 和 HTTP/2 两种方式构成,食用前请遵循说明。


1 、前言

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

1 、前言
2 、准备
3 、开始
3.1 、安装 V2ray
3.2 、配置 V2ray 服务端
3.3 、修改 Nginx 配置
3.4 、配置 V2ray 客户端
3.5 、配置 CloudFlare
4 、测试
5 、其他配置
5.1 、 HTTP/2
5.2 、使用 Docker 运行 v2ray 实例
5.3 、 V2ray 的 DNS 传出代理配置
6 、备注


2 、准备

V2RAY 官网:旧 https://www.v2ray.com/ 新 https://www.v2fly.org/

V2RAY 的初级部署,仅 Vmess 方式,在这里就不多重复了,可以到官网详细查看

本次部署主要采用 V2ray+Nginx+CloudFlare+WebSocket+TLS 方式,所以准备内容略多,但是效果显著,可以利用 CDN 让被墙的服务器 10% 血量复活。

提前准备

一份域名+Cloudflare

一台 Vps+Ubuntu/CentOS (本文中使用的 Vultr 服务器)

一套 Linux+Nginx

一个 v2ray

前提要素

cloudflare 上挂靠的域名可以正常解析

域名的证书在有效期内

关于域名获取证书的途径,可以参照本站文章 点击查看

关于 Nginx 安装与配置,可以参照本站文章  点击查看

关于 V2ray 安装包可以到我的站点下载:下载点 1  或者 下载点 2

关于 Cloudflare 开启 CDN 时支持的服务器端口情况 [ 链接 ]

最后文末补充了 http/2 方式、 docker 方式、 dns 传出代理方式。


3 、开始

3.1 、安装 V2ray

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

输入完上述命令即可自动安装(参照官方的安装方式)(老的方式已被新的替代)

Linux 的服务文件在 /etc/systemd/system/v2ray.service
配置文件位置在 /usr/local/etc/v2ray/config.json
查看 V2ray 服务的命令为  systemctl status v2ray -l
重启 V2ray 服务的命令为  systemctl restart v2ray

FHS 文件标准 [ 链接 ]

如果你想要删除相关文件可以使用命令

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh) --remove

3.2 、配置 V2ray 服务端 Websocket

注意本节采用 Websocket+CDN 的方式配置,所以 V2ray 服务端只允许本机访问。
仿造下方格式,修改配置文件  /usr/local/etc/v2ray/config.json 的接入部分。

"inbounds": [{
  "port": 8963,
  "listen":"127.0.0.1",
  "protocol": "vmess",
  "settings": {
    "clients": [
      {
      "id": "88888888-8888-8888-8888-888888888888",
      "level": 1,
      "alterId": 0,
      "email": "user1"
      },
      {
      "id": "66666666-6666-6666-6666-666666666666",
      "level": 1,
      "alterId": 0,
      "email": "user2"
    }],
    "disableInsecureEncryption": true
  },
  "streamSettings": {
    "network": "ws",
    "wsSettings": {
      "path": "/word/"
    }
  },
  "sniffing": {
    "enabled": true,
    "destOverride": ["http","tls"]
  },
  "tag": "Websocket"
}],

主要修改内容有两处,一处 "listen":"127.0.0.1", 一处"streamSettings": {"network": "ws","streamSettings": {"network": "ws","wsSettings": {"path": "/word/"}}}
地址推荐 127.0.0.1 保证限定在内部使用,streamSettings 的字段含义参照 Nginx 的配置
修改请注意换行要符合 json 格式。

其中 email 随意,仅作为此 UUID 的备注。 Level 和 AlterID 请参照官方 WIKI,一般用不到。
sniffing 用于捕捉流量类型,在一些不常见场景下可能有干扰(如语音)上网页肯定没问题
tag 用于在 V2ray 内标记流量


3.3 、修改 Nginx 配置

直接创建一个配置,如下为跳过 Cloudflare 的直连 WS+TLS 配置。
实际上,如果使用了 Cloudflare 的时候,不需要指定协议版本等额外配置。
如果可以的话,添加一个 location / {} 并在里面指定一下网站文件,可以伪装。

访问域名 https://your.domain.name:443
配置文件 /etc/nginx/sites-enabled/websocket.conf
证书文件 /etc/letsencrypt/live/your.domain.name/fullchain.pem
证书私钥 /etc/letsencrypt/live/your.domain.name/privkey.pem
网页根目录 /opt/web/proxy
server {
  listen   443 ssl http2;
  listen   [::]:443 ssl http2;
  ssl_certificate /etc/letsencrypt/live/your.domain.name/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/your.domain.name/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;
  server_name your.domain.name;
  root /opt/web/proxy;

  location /word/ {
    proxy_redirect off;
    proxy_pass http://127.0.0.1:8963;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_intercept_errors on;
    access_log off;
  }

  error_page 400 404 /404.html;
    location = /404.html {
  }
}

配置文件如何被 Nginx 调用在此不赘述。
SSL 证书地址为 Letsencrypt 生成的证书地址,可以用自己创建的。
proxy_intercept_errors on; 是为了伪装,此命令会将代理的错误同步到 nginx 的错误代码 400 的页面中。

localtion 后面的 /word/ 要和服务端中的 "wsSettings": {"path": "/word/"} 对应。
proxy_pass http://127.0.0.1:8963; 中的 8963 要和服务端中的  "inbounds": [{"port": 8963 }] 对应。
server_name 中的 your.domain.name 为你本次使用的域名,要和客户端 address 以及 serverName 对应。

添加一个 root 主要防止默认页面展示出去,同时最好这个文件夹创建后保持空文件夹或者做一个 index.html 伪造。
其他都是普通配置,可从官方 wiki 查阅。


3.4 、配置 V2ray 客户端

客户端部分比较简单,仅仅修改几处即可,Core 使用者仿造下面修改 config 配置文件

"outbounds": [{
  "protocol": "vmess",
  "settings": {
    "vnext": [{
      "address": "your.domain.name",
      "port": 443,
      "users": [{
        "id": "88888888-8888-8888-8888-888888888888",
        "alterId": 0,
        "security": "auto"
      }]
    }]
  },
  "streamSettings": {
    "network": "ws",
    "security": "tls",,
    "tlsSettings": {
      "allowInsecure": false,
      "serverName": "your.domain.name",
      "alpn": [
        "h2",
        "http/1.1"
      ],
      "fingerprint": "firefox"
    },
    "wsSettings": {
      "path": "/word/",
      "headers": {
        "Host": "your.domain.name"
      }
    }
  },
  "mux": {
    "enabled": true,
    "concurrency": 8
  }
}],

其中此配置文件没有加密方式和伪装类型。

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

地址 your.domain.name
端口 443
用户 ID  UUID
AlterID  0
加密方式  Auto
传输协议  ws
伪装类型  none
(可选) 伪装域名  your.domain.name
伪装路径  /word/
底层传输  tls
允许不安全的 TLS 链接 false
(可选)ALPN 配置 h2+http/1.1
(可选)SNI 配置  your.domain.name
(可选)uTLS 配置 Firefox

其中客户端控制意思为,此选项不影响服务器,以及用户怎么设置此选项都可以。

在这里粘贴一份 V2rayN 对于 V2ray 自动生成的客户端完整配置。

{
  "log": {
    "access": "",
    "error": "",
    "loglevel": ""
  },
  "inbounds": [{
    "port": 1080,
    "listen": "0.0.0.0",
    "protocol": "socks",
    "sniffing": {
      "enabled": false,
      "destOverride": [
        "http",
        "tls"
      ]
    },
    "settings": {
      "auth": "noauth",
      "udp": false,
      "allowTransparent": false
    }
  }],
  "outbounds": [{
    "tag": "proxy",
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "your.domain.name",
          "port": 443,
          "users": [
            {
              "id": "66666666-6666-6666-6666-666666666666",
              "alterId": 0,
              "security": "auto"
            }
          ]
        }
      ]
    },
    "streamSettings": {
      "network": "ws",
      "security": "tls",
      "tlsSettings": {
        "allowInsecure": false,
        "serverName": "your.domain.name",
        "alpn": [
          "h2",
          "http/1.1"
        ],
        "fingerprint": "firefox"
      },
      "wsSettings": {
        "path": "/word/",
        "headers": {
          "Host": "your.domain.name"
        }
      }
    },
    "mux": {
      "enabled": true,
      "concurrency": 8
    }
  },
  {
    "protocol": "freedom",
    "settings": {
      "domainStrategy": "AsIs"
    },
    "tag": "direct"
  },
  {
    "protocol": "blackhole",
    "settings": {
      "response": {
        "type": "http"
      }
    },
    "tag": "block"
  }],
  "dns": {
    "hosts": {
      "geosite:category-ads-all": [
        "127.0.0.1",
        "127.0.0.2",
        "::1"
      ]
    },
    "servers": [
      {
        "address": "119.29.29.29",
        "port": 53,
        "clientIp": "202.96.69.38",
        "skipFallback": true,
        "domains": [
          "domain:baidu.com",
          "geosite:cn"
        ],
        "expectIPs": [
          "geoip:cn"
        ]
      },
      "1.1.1.1",
      "1.0.0.1",
      "8.8.8.8",
      "8.8.4.4",
      "114.114.114.114",
      "localhost"
    ]
  },
  "routing": {
    "domainStrategy": "AsIs",
    "domainMatcher": "mph",
    "rules": [
      {
        "type": "field",
        "outboundTag": "direct",
        "ip": [
          "geoip:private"
        ],
        "enabled": true
      },
      {
        "type": "field",
        "outboundTag": "block",
        "domain": [
          "geosite:category-ads-all"
        ],
        "enabled": true
      }
    ]
  }
}

3.5 、配置 CloudFlare

默认配置我实在记不住了,但是有几个必须要调整的,和一些可能要调整的,在这里说明

第一个是 Network 中的 Websocket,必须开启

第二个是 DNS 中的对应域名的解析,必须套用 CDN,即黄色

第三个是 Crypto 中的 Require Modern TLS,必须关闭

可能的,Crypto 中,Authenticated Origin Pulls 应该要关闭,Opportunistic Encryption 应该要关闭 具体是否有影响,不清楚。


4 、测试

注意,注意,完成配置后确认无误,仍然需要等待 3-10 分钟让 CDN 反应,允许 websocket 。所以期间不要着急。

数据流向为,V2 客户端 - > CDN:443 - > Nginx:443  - >  V2 服务端:8963

同时,不要使用:伪装 http 报头 (必须一致),加密协议为 none 或者 aes-128-cfb,开启 UDP 。

还有,此方式存在一个小问题就是如果手动访问会出现 400 Bad request 现象,如果想整改可以尝试修改 Nginx 错误代码,本文教程已将代码改为 404 not found 。

本人测试,使用客户端连接,套 CDN 无 Error,可访问 Google,速度大约在 500KB 左右。并且此方式突破 GFW 封锁 IP 地址,但是不排除封域名。


5 、其他配置

5.1 、 HTTP/2

当你认为经过 CDN 的流量实在实在太卡的时候,你可以让 Client 直链 Server,并使用 HTTP/2 作为伪装以避免干扰。当然这个不保证还会被墙。

由于客户端现在很多人都用 GUI 界面的了,所以只贴出服务端额外增加的配置,注意放在 inbounds 里面

{
  "port": 12345,
  "protocol": "vmess",
  "settings": {
    "clients": [
      {
        "id": "b97be824-4072-4469-839a-0a29eb6206c7",
        "level": 1,
        "alterId": 0,
        "email": "user1"
      },
      {
          "id": "fe6226d0-286b-4e27-9819-a61cb40bbbe7",
          "level": 1,
          "alterId": 0,
          "email": "user2"
       }
     ],
     "allowTransparent": false
    },
    "streamSettings": {
      "network": "h2",
      "security": "tls",
      "httpSettings": {
        "path": "/h2word/",
        "host": [
          "your.domain.name",
          "your.fixdomain.name"
        ]
      },
      "tlsSettings": {
        "certificates": [{
          "certificateFile": "/etc/letsencrypt/live/your.domain.name/fullchain.pem",
          "keyFile": "/etc/letsencrypt/live/your.domain.name/privkey.pem"
        }]
      }
    },
    "sniffing": {
        "enabled": false,
        "destOverride": ["http","tls"]
    },
    "tag": "HTTP2"
  }

注意此处因为不经过 CDN 所以可以使用虚假的伪装域名 your.fixdomain.name 在 host 字段中

放入格式和位置按照下方的样子,就可以两个接入配置同时使用

"inbounds": [{
  "port": 8963,
  "listen":"127.0.0.1",
  "protocol": "vmess",
  ……
},{
  "port": 12345,
  "listen":"0.0.0.0",
  "protocol": "vmess",
  ……
}],

配置导入正确后,需要额外开启 V2ray 专用的 https 端口(本例 12345)以供于 HTTP/2 使用

而 GUI 界面的客户端使用者需要填以下内容,因为不经过 CDN 所以地址可以写 IP 但是对应 SNI 必须写域名

地址 your.domain.name
端口 12345
用户 ID  UUID
AlterID  0
加密方式  Auto
传输协议  ws
伪装类型  none
伪装域名  your.fixdomain.name
伪装路径  /h2word/
底层传输  tls
允许不安全的 TLS 链接 true
ALPN 配置 h2+http/1.1
SNI 配置  your.domain.name
uTLS 配置 Firefox

5.2 、使用 Docker 运行 v2ray 实例

觉得上面的安装比较容易水表,或者说用 docker 更喜欢,你可以使用这种方式


5.2.1 、安装 Docker-CE

首先我们需要卸载旧版本 docker

yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

然后我们安装 docker 运行所需要的内容

yum install -y yum-utils device-mapper-persistent-data lvm2

接着我们需要安装 docker-ce 的源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

最后我们安装 docker-ce 并配置开机启动

yum install -y docker-ce
systemctl enable docker
systemctl start docker

启动后可以查看一下 docker 情况,如果看到警告则利用下面引用的内容排除警告

docker info

默认配置下,如果在 CentOS 使用 Docker CE 看到下面的这些警告信息:

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

请添加内核配置参数以启用这些功能。

sudo tee -a /etc/sysctl.conf <<-EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

然后重新加载 sysctl.conf 即可

sudo sysctl -p
systemctl restart docker

5.2.2 、安装 docker 版 V2ray 并管理

先拉取 v2ray 镜像

docker pull v2ray/official

运行 v2ray 镜像并配置实例名称为 v2ray

docker run -d --name v2ray -v /etc/v2ray:/etc/v2ray -v /etc/letsencrypt/live/your.domain.name:/etc/letsencrypt/live/your.domain.name -v /var/log/v2ray:/var/log/v2ray -p 127.0.0.1:443:443 -p 12345:12345 --restart=unless-stopped v2ray/official v2ray -config=/etc/v2ray/config.json

第一条 -v /etc/v2ray:/etc/v2ray  映射配置文件到 docker 中,注意检查自己的配置文件位置
第二条 -v /etc/letsencrypt/live/your.domain.name:/etc/letsencrypt/live/your.domain.name  映射证书文件到 docker 中(如果不用 H2 方式则不需要)
第三条  -v /var/log/v2ray:/var/log/v2ray  映射日志文件存放地点到 docker 中。
第四条 -p 127.0.0.1:443:443  映射 V2ray 端口到本地网络中(WS 模式用)
第五条 -p 12345:12345  映射 V2ray 端口到全部网络中
第六条 --restart=unless-stopped  配置此实例为非错误停止自动重启

额外注意:如果你的配置文件里锁定 ws 绑定再 127.0.0.1,需要取消掉该绑定,因为 docker 的 localhost 和宿主机的 localhost 不通。

查看 docker 运行的实例

docker container ls

查看 v2ray 实例的日志

docker container start v2ray

对于 v2ray 实例的起停与重启

docker container start v2ray
docker container stop v2ray
docker container restart v2ray

删除 v2ray 实例

docker container rm v2ray

如果想更新,则先删除实例,然后重新拉取镜像,最后重新创建实例即可


5.3 、 V2ray 的 DNS 传出代理配置

在 V4.15 版本后,V2ray 支持了 DNS 传出代理,由于和以前的 DNS 概念比较容易混淆,本文在此重新记录。


5.3.1 、关于 DNS 传出代理

首先你需要了解一下 DNS:DNS 是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 DNS 使用 TCP 和 UDP 端口 53 。

然后你需要了解一下 V2ray 的 DNS:V2Ray 内置了一个 DNS 服务器,可以将 DNS 查询根据路由设置转发到不同的远程服务器中。由此 DNS 服务器所发出的 DNS 查询请求,会自动根据路由配置进行转发,无需额外配置。

所以在这里,你需要清楚 V2ray 的 DNS 传出代理的工作流程

由 V2ray 监听 53 端口,在收到用户的 DNS 请求后,由V2ray 进程先在本地缓存与配置进行匹配,匹配失败然后作为客户端去向其他 DNS 服务器发出查询请求,并将得到的结果转发给用户。


5.3.2 、 dokodemo-door 监听 53 端口的配置

你需要在 inbounds 中添加下列内容(已模块化)以监听端口并获得用户 DNS 请求报文

  {
    "tag": "dns-in",
    "port": 53,
    "listen": "0.0.0.0",
    "protocol": "dokodemo-door",
    "settings": {
      "address": "1.0.0.1",
      "port": 53,
      "network": "tcp,udp",
      "timeout": 0,
      "followRedirect": false
    }
  }

说明:
第一个 Port 代表 V2ray 监听的端口为 53
listen 代表 V2ray 监听的地址为 0.0.0.0(本机所有 IPV4 地址)
address 代表 V2ray 将获得的流量的三层目的 IPV4 地址修改为 1.0.0.1
第二个 Port 代表 V2ray 将获得的流量的四层目的端口地址修改为 53
network 代表 V2ray 将处理的四层流量类型,为 tcp 和 udp


5.3.3 、 dns 传出代理的配置

你需要在 outbounds 中添加下列内容(已模块化)用于拦截和转发 DNS 查询给 V2ray 内部的 DNS 服务器。

  {
    "tag": "dns-out",
    "sendThrough": "0.0.0.0",
    "protocol": "dns",
    "settings": {
      "network": "tcp,udp",
      "address": "1.1.1.1",
      "port": 53
    }
  }

说明:
sendThrough 代表从哪个 IP 地址发送数据出去(本例为 0.0.0.0 所有 IPV4 地址)
network 代表 V2ray 将处理的四层流量类型,为 tcp 和 udp
address 代表 V2ray 将非 A/AAAA 记录的 DNS 请求转发给目标 DNS
port 代表转发目标 DNS 的端口为 53


5.3.4 、 dokodemo-door 与 dns 传出代理关联的配置

你需要在 routing 的 rules 中添加下列内容(已模块化)用于联动两者的数据。

      {
        "type": "field",
        "inboundTag": ["dns-in"],
        "outboundTag": "dns-out"
      }

5.3.5 、 V2ray 内部 DNS 服务器的配置
{
  "hosts": {
    "www.baidu.com": "127.0.0.1"
  },
  "servers": [
    "8.8.8.8",
    "localhost",
    {
      "address": "8.8.4.4",
      "port": 53,
      "domains": [
        "domain:www.pixiv.net"
      ]
    }
  ],
  "clientIp": "1.2.3.4",
  "tag": "dns_inbound"
}

说明:
host 字段代表本地 DNS 服务器将所有查询 www.baidu.com 的 DNS 请求直接返回 127.0.0.1 这个 IP 地址(最高优先)
server 字段中 domains 字段,将让对应域名使用指定的 DNS 获取查询结果(第二优先级)
server 字段中,处理没有匹配 host 字段的其他查询,并按顺序优先发送到 8.8.8.8 这个地址中,如果返回错误则尝试 localhost 本机的 DNS(第三优先级)
clientIp 是用于 DNS 查询时,通知服务器客户端的所在位置。(为本机 IP)(需要公网 IP)
tag 为本地 DNS 服务器的所有查询流量附加 tag,可以将此 tag 做对应的路由调整(比如所有 DNS 查询都走 A 代理通道)


5.3.7 、不同流量的流经过程细则

查询 www.baidu.com
address:53 -> timeout 并返回 127.0.0.1

查询 www.pixiv.net
address:53 -> 8.8.4.4

查询 www.google.com
address:53 -> 8.8.8.8

查询 zoho.com 的 TXT 记录
address:53 -> 1.1.1.1

发送到 53 端口的 HTTP 请求报文
address:53 -> 1.0.0.1


6 、备注

梯子倒了这么多,但是仍然有 SS 存活下来,因为 SS 仍然有人更新,而 SSR 没有人更新。

V2RAY 有人更新,但是仍然需要大家的努力。

20180808:增加 HTTP/2.0 连接方式

20181118:修改 V2ray 文件路径适配本站下载服务器,修改为 V4.1 版本新的配置文件格式

20181218:增加 Docker 实例使用方式

20190210:完善个别词意的准确性,修改为 v4.9 版下载链接

20190220:修改为 v4.16 版下载链接,添加 DNS 传出代理相关配置,替换前言部分

20200520:修改为 v4.22.1 版下载链接,修订文字

20201210:随官方更换安装脚本进而修改文章。

StarryVoid

Have a good time