本文作者:zhujue

V2Ray 配置指南-基本篇

zhujue 2023-12-26 18:53:45 54 抢沙发
V2Ray 配置指南-基本篇摘要: ...

1. 基本篇

本篇是一些基本简单的配置。

在本篇当中会有大量描述语言对配置进行讲解,目的是为了让大家简要理解 V2Ray 的工作方式。

本章每小节的提供配置样例都有服务器和客户端的,也就是说你可以直接复制到你的机器上然后修改一下服务器地址即可使用,这是最少工作量的,你也可以针对自己的情况对其它的选项参数作调整。



  • 一、VMess 协议


1. VMess

VMess 协议是由 V2Ray 原创并使用于 V2Ray 的加密传输协议,如同 Shadowsocks 一样为了对抗墙的深度包检测而研发的。在 V2Ray 上客户端与服务器的通信主要是通过 VMess 协议通信。

本小节给出了 VMess 的配置文件,其实也就是服务器和客户端的基本配置文件,这是 V2Ray 能够运行的最简单的配置。

V2Ray 使用 inbound(传入) 和 outbound(传出) 的结构,这样的结构非常清晰地体现了数据包的流动方向,同时也使得 V2Ray 功能强大复杂的同时而不混乱,清晰明了。形象地说,我们可以把 V2Ray 当作一个盒子,这个盒子有入口和出口(即 inbound 和 outbound),我们将数据包通过某个入口放进这个盒子里,然后这个盒子以某种机制(这个机制其实就是路由,后面会讲到)决定这个数据包从哪个出口吐出来。以这样的角度理解的话,V2Ray 做客户端,则 inbound 接收来自浏览器数据,由 outbound 发出去(通常是发到 V2Ray 服务器);V2Ray 做服务器,则 inbound 接收来自 V2Ray 客户端的数据,由 outbound 发出去(通常是如 Google 等想要访问的目标网站)。


1.1. 配置前的准备

实际上,根本不用准备什么,只要有一个文本编辑器(text editor)就可以修改配置了。但我还是打算啰嗦一些,因为我发现新手容易犯语法(格式)不正确的错误,这个很正常新手上路对路况总会不是很熟悉;另外一个就是不会使用工具,用了很多年电脑文本编辑还是 Windows 自带的记事本(在我身边有不少敲代码的,平常看某个代码文件很少打开 IDE 或者使用好点的文本编辑器,而是直接用记事本看),用水果刀切菜可以吗?当然可以,建议你亲自体验一下。如果你会用工具,会非常高效的而且装有一些插件可以语法检查,将代码格式化。

文本编辑器有许多,比如说 Sublime Text、VS code、atom、notepad++,上面这些都是跨平台的,具体如何使用请自行 Google 吧。这些软件都可以做到高亮显示、折叠、格式化等,建议使用,如果你不想安装软件,网上也有一些在线的 json 编辑器,还自动检查语法。如果你非要用 Windows 的记事本我也无话可说。

下面是一张 Windows 自带的记事本对比 Sublime Text 查看同一个 json 文件的图片,孰优孰劣大家心中自有判断。 V2Ray 配置指南-基本篇 科学上网 第1张

又比如格式化功能: V2Ray 配置指南-基本篇 科学上网 第2张

对于 Linux 有一个软件叫 jq,可以执行这样的指令检查配置文件的语法是否正确:

$ jq . config.json

这里的 config.json 是当前目录下的 config.json。特别注意命令中的点 . 不能省去。

V2Ray 配置指南-基本篇 科学上网 第3张 当我把 "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297" 后的逗号 , 删去时:

V2Ray 配置指南-基本篇 科学上网 第4张

(从 v2.11 起新增了一个注释功能,配置文件允许 // 和 /**/ 注释。但是 JSON 的标准格式的没有注释的,也就是说如果你给配置文件加了注释,再使用上文我说的格式化功能会报错说你的 JSON 语法(格式)不对。)

不过,最好还是使用 V2Ray 提供的配置检查功能(test 选项),因为可以检查 JOSN 语法错误外的问题,比如说突然间手抖把 vmess 写成了 vmss,一下子就检查出来了。

$ /usr/bin/v2ray/v2ray -test -config /etc/v2ray/config.json
failed to parse json config: Ext|Tools|Conf|Serial: failed to parse json config > Ext|Tools|Conf: failed to load inbound detour config. > Ext|Tools|Conf: unknown config id: vmss
Main: failed to read config file: /etc/v2ray/config.json > Main|Json: failed to execute v2ctl to convert config file. > exit status 255

如果是配置文件没问题,则是这样的:

$ /usr/bin/v2ray/v2ray -test -config /etc/v2ray/config.json
V2Ray v3.15 (die Commanderin) 20180329
An unified platform for anti-censorship.
Configuration OK.

1.2. 配置

以下给出了 VMess 的配置文件,包含客户端和服务器端,将你的配置替换成下面给出的配置,然后将服务器地址修改成你的就可以正常使用。修改完配置之后要重启 V2Ray 才能使用新配置生效。

VMess 协议的认证基于时间,一定要保证服务器和客户端的系统时间相差要在一分钟以内。

1.2.1. 客户端配置

以下是客户端配置,将客户端的 config.json 文件修改成下面的内容,修改完成后要重启 V2Ray 才会使修改的配置生效。

{  "inbound": {    "port": 1080, // 监听端口
    "protocol": "socks", // 入口协议为 SOCKS 5
    "domainOverride": ["tls","http"],    "settings": {      "auth": "noauth"  //socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
    }
  },  "outbound": {    "protocol": "vmess", // 出口协议
    "settings": {      "vnext": [
        {          "address": "serveraddr.com", // 服务器地址,请修改为你自己的服务器 IP 或域名
          "port": 16823,  // 服务器端口
          "users": [
            {              "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,必须与服务器端配置相同
              "alterId": 64 // 此处的值也应当与服务器相同
            }
          ]
        }
      ]
    }
  }
}

在配置当中,有一个 id (在这里的例子是 b831381d-6324-4d53-ad4f-8cda48b30811),作用类似于 Shadowsocks 的密码(password), VMess 的 id 使用的是 UUID 格式。关于 id 或者 UUID 没必要了解很多,在这里只要清楚以下几点就足够了:

  • 相对应的 VMess 传入传出的 id 必须相同(如果你不是很明白这句话,那么可以简单理解成服务器与客户端的 id 必须相同)

  • 由于 id 使用的是 UUID,我们可以使用任何 UUID 生成工具生成 UUID 作为这里的 id。比如 UUID Generator 这个网站,只要一打开或者刷新这个网页就可以得到一个 UUID,如下图。或者可以在 Linux 使用命令 cat /proc/sys/kernel/random/uuid 生成。

V2Ray 配置指南-基本篇 科学上网 第5张

1.2.2. 服务器配置

以下是服务器配置,将服务器 /etc/v2ray 目录下的 config.json 文件修改成下面的内容,修改完成后要重启 V2Ray 才会使修改的配置生效。

{  "inbound": {    "port": 16823, // 服务器监听端口
    "protocol": "vmess",    // 主传入协议
    "settings": {      "clients": [
        {          "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,客户端与服务器必须相同
          "alterId": 64
        }
      ]
    }
  },  "outbound": {    "protocol": "freedom",  // 主传出协议
    "settings": {}
  }
}

1.3. 原理简析

根据上文给出的配置,在这里简单的介绍一下 V2Ray 的工作原理。

1.3.1. 客户端

请看配置中的 inbound,port 为 1080,V2Ray 监听了一个端口 1080,协议是 socks。之前我们已经把浏览器的代理设置好了(SOCKS Host: 127.0.0.1,Port: 1080),假如访问了 google.com,浏览器就会发出一个数据包打包成 socks 协议发送到本机(127.0.0.1指的本机,localhost)的 1080 端口,这个时候数据包就会被 V2Ray 接收到。

再看 outbound,protocol 是 vmess,说明 V2Ray 接收到数据包之后要将数据包打包成 VMess 协议并且使用预设的 id 加密(这个例子 id 是 b831381d-6324-4d53-ad4f-8cda48b30811),然后发往服务器地址为 serveraddr.com 的 16823 端口。服务器地址 address 可以是域名也可以是 IP,只要正确就可以了。

在客户端配置的 inbound 中,有一句 "domainOverride": ["tls","http"],V2Ray 手册解释为“识别相应协议的流量,并根据流量内容重置所请求的目标”,不少人不太理解,简单说这东西就是从网络流量中识别出域名。这个 domainOverride 有两个用处:1. 解决 DNS 污染;2. 对于 IP 流量可以应用后文提到的域名路由规则。如果这段话不懂,没关系,照着写吧,没坏处。

1.3.2. 服务器

接着看服务器,服务器配置的 id 是 b831381d-6324-4d53-ad4f-8cda48b30811,所以 V2Ray 服务器接收到客户端发来的数据包时就会尝试用 b831381d-6324-4d53-ad4f-8cda48b30811 解密,如果解密成功再看一下时间对不对,对的话就把数据包发到 outbound 去,outbound.protocol 是 freedom(freedom 的中文意思是自由,在这里姑且将它理解成直连吧),数据包就直接发到 google.com 了。

实际上数据包的流向就是:

{浏览器} <--(socks)--> {V2Ray 客户端 inbound <-> V2Ray 客户端 outbound} <--(VMess)-->  {V2Ray 服务器 inbound <-> V2Ray 服务器 outbound} <--(Freedom)--> {目标网站}

配置中还有一个 alterId 参数,这个参数主要是为了加强防探测能力。理论上 alterId 越大越好,但越大就约占内存(只针对服务器,客户端不占内存),所以折中之下设一个中间值才是最好的。那么设多大才是最好的?其实这个是分场景的,我没有严格测试过这个,不过根据经验,alterId 的值设为 30 到 100 之间应该是比较合适的。alterId 的大小要保证客户端的小于等于服务器的。

有人疑惑请求发出去后数据怎么回来,毕竟大多数的场景是下载。这个其实不算是问题,既然请求通过 V2Ray 发出去了,响应数据也会通过 V2Ray 原路返回(也许会有朋友看到这话会马上反驳说不一定是原路返回的,有这种想法的估计是非常了解 TCP/IP 协议的,何必较这个劲,这是底层的东西,又掌控在运营商手里,从应用层理解原路返回又有何不可)。


1.4. 注意事项

  • 为了让浅显地介绍 V2Ray 的工作方式,本节中关于原理简析的描述有一些地方是错误的。但我知识水平又不够,还不知道该怎么改,暂且将错就错。正确的工作原理在用户手册的 VMess 协议 有详细的说明。

  • id 为 UUID 格式,请使用软件生成,不要尝试自己造一个,否则很大程度上造出一个错误的格式来。

  • VMess 协议可以设定加密方式,但 VMess 不同的加密方式对于过墙没有明显差别,本节没有给出相关配置方式(因为这不重要,默认情况下 VMess 会自己选择一种比较合适的加密方式),具体配置可见 V2Ray 手册,不同加密方式的性能可参考性能测试


1.5. 排错指引

按照前文的指导操作,通常都能成功部署 V2Ray。然而总会有部分读者可能是看漏某些地方,导致虽然安装好了却无法连接。如果出现了这样的问题,可以尝试按下面的步骤一一进行排错。

1.5.1. 打开客户端闪退

可能原因:客户端的配置文件上不正确。

修正方法:请仔细检查配置文件并修改正确。

1.5.2. 客户端提示 Socks: unknown Socks version:

可能原因:客户端配置的 inboud 设置成了 socks 而浏览器的代理协议设置为 http。

修正方法:修改配置文件使客户端的 inboud 的 protocol 和浏览器代理设置的协议保持一致。

1.5.3. 客户端提示 Proxy|HTTP: failed to read http request > malformed HTTP request "\x05\x01\x00"

可能原因:客户端配置的 inboud 设置成了 https 而浏览器的代理协议设置为 socks4 或者 socks5。

修正方法:修改配置文件使客户端的 inboud 的 protocol 和浏览器代理设置的协议保持一致。

1.5.4. 服务器执行 systemctl status v2ray 输出提示 Main: failed to read config file...

可能原因:服务器的配置文件不正确。

修正方法:请仔细检查配置文件并修改正确。

1.5.5. 执行 cat /var/log/v2ray/error.log 或者 systemctl status v2ray 出现 rejected Proxy|VMess|Encoding: invalid user

可能原因:服务器与客户端的系统时间或者 id 不一致或者 alterId 不一致。

修正方法:请校准系统时间或将 id 以及 alterId 修改一致。

1.5.6. 以上几点都排除之后,请仔细检查:

1). 浏览器的代理设置中的端口号与客户端的inbound 的port 是否一致;

2). 客户端中的outbound 设置的address与vps 的ip是否一致;

3). 客户端中的outbound 设置的address与服务器的outbound 的 port 是否一致;

4). VPS 是否开启了防火墙将连接拦截了;

5). 客户端是否安装在如学校、公司之类的场所,如果是,确认这些单位是否有防火墙拦截了连接;

对于 1) 到 3),可以通过检查配置确定是否有问题。对于 4) 和 5),你需要与 VPS 提供商和单位网管联系沟通。

1.5.7. 如果你仔细检查了以上几点并将问题排除了,结果还是无法通过 V2Ray 上网,那么你可以考虑:

1). 仔细看前方的教程,逐步按照教程来不要错在漏,重新部署 V2Ray。部署过程中时刻注意部署之前提到的注意点;

2). 直接放弃;

3). 向大婶请教。


1.6. 更新历史

  • 2017-08-08 排错指引补充

  • 2017-08-06 添加排错指引

  • 2018-02-09 补充说明

  • 2018-04-05 内容补充

  • 2018-09-03 更进一些 V2Ray 的变化,并修改一些描述






  • 二、Shadowsocks 协议


1. Shadowsocks

本节讲述 Shadowsocks 的配置。

什么?这不是 V2Ray 吗?怎么说配置 Shadowsocks 呢?

骚年别紧张。V2Ray 集成有 Shadowsocks 模块的,用 V2Ray 配置成 Shadowsocks 服务器或者 Shadowsocks 客户端都是可以的,兼容 Shadowsocks-libev。

配置与 VMess 大同小异,客户端服务器端都要有 inbound 和 outbound,只不过是 protocol 和 settings 不同,不作过多说明,直接给配置,如果你配置过 Shadowsocks,对比之下就能够明白每个参数的意思(配置还有注释说明呢)。

1.1. 配置

1.1.1. 客户端配置

{  "inbound": {    "port": 1080, // 监听端口
    "protocol": "socks", // 入口协议为 SOCKS 5
    "domainOverride": ["tls","http"],    "settings": {      "auth": "noauth"  // 不认证
    }
  },  "outbound": {    "protocol": "shadowsocks",    "settings": {      "servers": [
        {          "address": "serveraddr.com", // Shadowsocks 的服务器地址
          "method": "aes-128-gcm", // Shadowsocks 的加密方式
          "ota": true, // 是否开启 OTA,true 为开启
          "password": "sspasswd", // Shadowsocks 的密码
          "port": 1024  
        }
      ]
    }
  }
}

1.1.2. 服务器配置

{  "inbound": {    "port": 1024, // 监听端口
    "protocol": "shadowsocks",    "settings": {      "method": "aes-128-gcm",      "ota": true, // 是否开启 OTA
      "password": "sspasswd"
    }
  },  "outbound": {    "protocol": "freedom",  
    "settings": {}
  }
}

1.1.3. 注意事项

  • 因为协议漏洞,Shadowsocks 已放弃 OTA(一次认证) 转而使用 AEAD,V2Ray 的 Shadowsocks 协议已经跟进 AEAD,但是仍然兼容 OTA。建议使用 AEAD (method 为 aes-256-gcm、aes-128-gcm、chacha20-poly1305 即可开启 AEAD), 使用 AEAD 时 OTA 会失效;

  • 可以搭配 simple-obfs 使用,具体我没试过,有这个需要的就自己研究吧;

  • 可以使用 V2Ray 的传输层配置(详见高级篇),但如果这么设置了将与原版 Shadowsocks 不兼容。

1.1.4. 更新历史

  • 2018-02-09 AEAD 更新

  • 2018-09-03 描述更新







  • 三、日志文件


1. 日志文件

使用一个软件总是不可避免出现一些问题,比如说你用着某个软件突然间崩溃了,兴冲冲向开发者反馈说软件有崩溃现象。开发者问你日志,你没有;问你详细情况,你支支吾吾说不出来。比较和蔼的开发者可能会跟你说:好的,我知道了,这个问题会解决的。内心独白却是:mdzz,啥也说不出来,日志也没有还瞎 bb。

以上纯属杜撰,我非计算机软件的从业人员,不清楚里边的情况,诸位看官一看笑过便好不必当真。

但是,对于软件开发者来说使用查看日志是一种非常有效的调试手段。普通用户使用日志可以知道软件的运行状况,并且当软件出现异常时提供日志给开发者可以令开发者更加容易找到问题的根源,加快修复问题。

1.1. 配置

1.1.1. 客户端配置

{  "log": {    "loglevel": "warning", // 日志级别
    "access": "D:\\v2ray\\access.log",  // 这是 Windows 系统的路径
    "error": "D:\\v2ray\\error.log"
  },  "inbound": {    "port": 1080,    "protocol": "socks",    "domainOverride": ["tls","http"]    "settings": {      "auth": "noauth"
    }
  },  "outbound": {    "protocol": "vmess",    "settings": {      "vnext": [
        {          "address": "serveraddr.com",          "port": 16823,  
          "users": [
            {              "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  
              "alterId": 64
            }
          ]
        }
      ]
    }
  }
}

1.1.2. 服务器配置

{  "log": {    "loglevel": "warning",    "access": "/var/log/v2ray/access.log", // 这是 Linux 的路径
    "error": "/var/log/v2ray/error.log"
  },  "inbound": {    "port": 16823,    "protocol": "vmess",   
    "settings": {      "clients": [
        {          "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  
          "alterId": 64
        }
      ]
    }
  },  "outbound": {    "protocol": "freedom",  
    "settings": {}
  }
}

依次看 log 的选项:

  • loglevel:日志级别,分别有5个,本例中设定的是 warning

    • debug:最详细的日志信息,专用于软件调试

    • info:比较详细的日志信息,可以看到 V2Ray 详细的连接信息

    • warning:警告信息。轻微的问题信息,经我观察 warning 级别的信息大多是网络错误。推荐使用 warning

    • error:错误信息。比较严重的错误信息。当出现 error 时该问题足以影响 V2Ray 的正常运行

    • none:空。不记录任何信息

  • access:将访问的记录保存到文件中,这个选项的值是要保存到的文件的路径

  • error:将错误的记录保存到文件中,这个选项的值是要保存到的文件的路径

  • error、access 字段留空,并且在手动执行 V2Ray 时,V2Ray 会将日志输出在 stdout 即命令行中(terminal、cmd 等),便于排错

需要注意的一点是,在 json 中,反斜杠 \ 有特殊意义,因此 Windows 操作系统目录的 \ 符号在配置中要使用 \\ 来表示。


1.2. 更新历史

  • 2018-09-03 Update







. 四、路由功能

1. 路由功能

本小节将介绍路由功能的使用。V2Ray 的一大特点就是内置了路由功能,用大白话说就是可以根据自己的实际情况制定一些规则来满足自己的上网需求,最简单最常见的就是直连国内网站、拦截特站点以及代理被墙网站。

1.1. 路由简介

先简单举几个例子,都是客户端的。

{  "log": {    "loglevel": "warning",    "access": "D:\\v2ray\\access.log",    "error": "D:\\v2ray\\error.log"
  },  "inbound": {    "port": 1080,    "protocol": "socks",    "domainOverride": ["tls","http"],    "settings": {      "auth": "noauth",  
    }
  },  "outbound": {    "protocol": "vmess",    "settings": {      "vnext": [
        {          "address": "serveraddr.com",          "port": 16823,  
          "users": [
            {              "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  
              "alterId": 64
            }
          ]
        }
      ]
    }
  }
}

像上面这个配置就是前面 VMess 的客户端配置文件,假如改一下 outbound 的内容,变成这样:

{  "log": {    "loglevel": "warning",    "access": "D:\\v2ray\\access.log",    "error": "D:\\v2ray\\error.log"
  },  "inbound": {    "port": 1080,    "protocol": "socks",    "settings": {      "auth": "noauth",  
    }
  },  "outbound": {    "protocol": "freedom", //原来是 VMess,现在改成 freedom
    "settings": {
    }
  }
}

如果修改成这个配置重启客户端之后,你会发现这个时候浏览器设不设置代理其实是一样的,像 Google 这类被墙的网站没法访问了,taobao 这种国内网站还是跟平常一样能上。如果是前面的介绍 VMess,数据包的流向是:

{浏览器} <--(socks)--> {V2Ray 客户端 inbound <-> V2Ray 客户端 outbound} <--(VMess)-->  {V2Ray 服务器 inbound <-> V2Ray 服务器 outbound} <--(Freedom)--> {目标网站}

但因为现在 V2Ray 客户端的 outbound 设成了 freedom,freedom 就是直连,所以呢修改后数据包流向变成了这样:

{浏览器} <--(socks)--> {V2Ray 客户端 inbound <-> V2Ray 客户端 outbound} <--(Freedom)--> {目标网站}

V2Ray 客户端从 inbound 接收到数据之后没有经过 VPS 中转,而是直接由 freedom 发出去了,所以效果跟直接访问一个网站是一样的。

再来看下面这个:

{  "log":{    "loglevel": "warning",    "access": "D:\\v2ray\\access.log",    "error": "D:\\v2ray\\error.log"
  },  "inbound": {    "port": 1080,    "protocol": "socks",    "settings": {      "auth": "noauth",  
    }
  },  "outbound": {    "protocol": "blackhole",    "settings": {
    }
  }
}

这样的配置生效之后,你会发现无论什么网站都无法访问。这是为什么呢?blackhole 是黑洞的意思,在 V2Ray 这里也差不多相当于是一个黑洞,就是说 V2Ray 从 inbound 接收到数据之后发到 outbound,因为 outbound 是 blackhole,来什么吞掉什么,就是不转发到服务器或者目标网站,相当于要访问什么就阻止访问什么。

到这儿为止,总共介绍了 4 种 outbound 协议:用于代理的 VMess 和 Shadowsocks 协议,用于直连的 freedom 协议,以及用于拦截的 blackhole 协议。我们可以利用这几种协议再配合路由功能可以灵活地根据自己的需求针对不同网站进行代理、直连或者拦截。举个简单的例子,比较大众的需求是被墙网站走代理,国内网站直连,其他一些不喜欢的则拦截(比如说百度的高精度定位)。

等等!你这里有 VMess、freedom 和 blackhole 3 个呢,可是 outbound 只有一个,这可怎么办呢?

这个问题 V2Ray 也想到了,就像下面这样的配置,加一个 outboundDetour 数组,格式与 outbound 一致,甚至不止 3 个,30 个都可以。

{  "log": {    "loglevel": "warning",    "access": "D:\\v2ray\\access.log",    "error": "D:\\v2ray\\error.log"
  },  "inbound": {    "port": 1080,    "protocol": "socks",    "settings": {      "auth": "noauth",  
    }
  },  "outbound": {    "protocol": "vmess", // 出口协议
    "settings": {      "vnext": [
        {          "address": "serveraddr.com", // 服务器 IP 地址
          "port": 16823,  // 服务器端口
          "users": [
            {              "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,须与服务器端配置相同
              "alterId": 64
            }
          ]
        }
      ]
    }
  },  "outboundDetour": [ //outboundDetour,是一个数组,可以放若干个如 outbound 格式的内容
    {      "protocol": "freedom",      "settings": {}
    },
    {      "protocol": "blackhole",      "settings": {}
    }
  ]
}

当然这个配置只是包含了多个协议而已,要达到上面说的被墙网站走代理,国内网站直连,其他特殊网站拦截的效果,还得加入路由功能的配置。关于路由功能的配置见后面两小节。

第一小节、 国内直连

1.1. 配置

1.1.1. 客户端

{  "log": {    "loglevel": "warning",    "access": "D:\\v2ray\\access.log",    "error": "D:\\v2ray\\error.log"
  },  "inbound": {    "port": 1080,    "protocol": "socks",    "domainOverride": ["tls","http"],    "settings": {      "auth": "noauth",      "udp": true
    }
  },  "outbound": {    "protocol": "vmess",    "settings": {      "vnext": [
        {          "address": "serveraddr.com",          "port": 16823,  
          "users": [
            {              "id": "b831381d-6324-4d53-ad4f-8cda48b30811",              "alterId": 64
            }
          ]
        }
      ]
    }
  },  "outboundDetour": [
    {      "protocol": "freedom",      "settings": {},      "tag": "direct" //如果要使用路由,这个 tag 是一定要有的,在这里 direct 就是 freedom 的一个标号,在路由中说 direct V2Ray 就知道是这里的 freedom 了
    }
  ],  "routing": {    "strategy": "rules",    "settings": {      "domainStrategy": "IPOnDemand",      "rules": [
        {          "type": "field",          "outboundTag": "direct",          "domain": ["geosite:cn"]
        },
        {          "type": "chinaip",          "outboundTag": "direct",          "ip": ["geoip:cn"]
        }
      ]
    }
  }
}

1.1.2. 服务器

{  "log": {    "loglevel": "warning",    "access": "/var/log/v2ray/access.log",    "error": "/var/log/v2ray/error.log"
  },  "inbound": {    "port": 16823,    "protocol": "vmess",    
    "settings": {      "clients": [
        {          "id": "b831381d-6324-4d53-ad4f-8cda48b30811"
        }
      ]
    }
  },  "outbound": {    "protocol": "freedom",    "settings": {}
  }
}

1.2. 说明

看客户端配置,注意 routing 那里有一个 "strategy": "rules",这是固定格式,什么也别管照着写就好了(因为我也不知道这有什么用~)。settings.domainStrategy 也跟着写,当然也可以设成其它的,这里我不说,想知道就看用户手册。重点在 settings.rules,我们要设置的路由规则就放在这里,注意这是一个数组,也就是说可以设置多个路由规则,当访问一个网站,数据包进入 V2Ray 之后路由就会先看看有没有能够匹配的规则,然后执行规则。在settings.rules 数组中的每个规则由一组大括号{ }扩起来。规则中的 type 是固定的(也就是照抄就行), 两个规则分别有 "domain": ["geosite:cn"] 和 "ip": ["geoip:cn"],这两个分别包含了中国大陆主流网站大部分域名和几乎所有的 ip 。两个规则的 outboundTag 都是 direct (看 outboundDetour tag 为 direct 的是 freedom)那么如果访问了国内的网站路由就会将这个数据包发往 freedom,也就是直连了。比如说我访问了 qq.com,qq.com 是国内网站包含在 chinasites 里,就会匹配路由规则发往 freedom。

也许有的朋友会觉得奇怪,在这个例子当中路由规则只有国内网站直连,没有关于走代理的规则,但仍然可以访问 google.com、twitter.com 这类等众多被墙的网站的。这因为 outbound 是作为默认的传出,当一个数据包没有匹配的规则时,路由就会把数据包发往 outbound,在本例中 outbound 设置成了 VMess,即不是访问中国大陆网站的数据包将通过 VPS 代理。

服务器配置与前面 VMess 一样,不再赘述。


到这里为止的配置已经可以满足基本的翻墙需求了。但是如果仅仅止步于此,那么也没什么使用 V2Ray 的必要,还不如用 Shadowsocks,毕竟 Shadowsocks 的配置不过 10 行,网上文章又多。

指南到这里还没完结,后面还有许多强大的功能等着我们来挖掘呢。少年,来吧!


第二小节、 广告过滤

1.1. 配置

1.1.1. 客户端

{  "log": {    "loglevel": "warning",    "access": "D:\\v2ray\\access.log",    "error": "D:\\v2ray\\error.log"
  },  "inbound": {    "port": 1080,    "protocol": "socks",    "domainOverride": ["tls","http"],    "settings": {      "auth": "noauth",
    }
  },  "outbound": {    "protocol": "vmess",    "settings": {      "vnext": [
        {          "address": "serveraddr.com",          "port": 16823,          "users": [
            {              "id": "2b831381d-6324-4d53-ad4f-8cda48b30811",  
              "alterId": 64
            }
          ]
        }
      ]
    }
  },  "outboundDetour": [
    {      "protocol": "freedom",      "settings": {},      "tag": "direct"//如果要使用路由,这个 tag 是一定要有的,在这里 direct 就是 freedom 的一个标号,在路由中说 direct V2Ray 就知道是这里的 freedom 了
    },
    {      "protocol": "blackhole",      "settings": {},      "tag": "adblock"//同样的,这个 tag 也是要有的,在路由中说 adblock 就知道是这里的 blackhole(黑洞) 了
    }
  ],  "routing": {    "strategy": "rules",    "settings": {      "domainStrategy": "IPOnDemand",      "rules": [
        {          "domain": [            "tanx.com",            "googeadsserving.cn",            "baidu.com"
          ],          "type": "field",          "outboundTag": "adblock"       
        },
        {          "domain": [            "amazon.com",            "microsoft.com",            "jd.com",            "youku.com",            "baidu.com"
          ],          "type": "field",          "outboundTag": "direct"
        },
        {          "type": "field",          "outboundTag": "direct",          "domain": ["geosite:cn"]
        },
        {          "type": "chinaip",          "outboundTag": "direct",          "ip": ["geoip:cn"]
        }
      ]
    }
  }
}

1.1.2. 服务器

{  "log": {    "loglevel": "warning",    "access": "/var/log/v2ray/access.log",    "error": "/var/log/v2ray/error.log"
  },  "inbound": {    "port": 16823,    "protocol": "vmess",    
    "settings": {      "clients": [
        {          "id": "b831381d-6324-4d53-ad4f-8cda48b30811",          "alterId": 64
        }
      ]
    }
  },  "outbound": {    "protocol": "freedom",    "settings": {}
  }
}

1.2. 说明

相对于上小节,在本小节的配置变化只在于客户端配置的 outboundDetour 和 routing 添加了新的内容,请大家自行比较。

在 routing 中,新添加了两个规则:

{  "domain": [    "tanx.com",    "googeadsserving.cn",    "baidu.com"
  ],  "type": "field",  "outboundTag": "adblock"       },
{  "domain": [    "amazon.com",    "microsoft.com",    "jd.com",    "youku.com",    "baidu.com"
  ],  "type": "field",  "outboundTag": "direct"}

在第一个规则中,域名包含有 tanx.com 或 baidu.com 的就会被阻止连接,如果想拦截某些网站,往 adblock 的规则中写想要拦截的域名就可以了。在第二个规则当中,域名中包含有 amazon.com 或 microsoft.com 或 youku.com 或 baidu.com 的会直连。有一个问题大家发现没有,两个规则都有 baidu.com ,那么会执行哪个呢?答案是只会执行第一个(即adblock),原因是:

  1. 规则是放在 routing.settings.rules 这个数组当中,数组的内容是有顺序的,也就是说在这里规则是有顺序的,匹配规则时是从上往下匹配;

  2. 当路由匹配到一个规则时就会跳出匹配而不会对之后的规则进行匹配;

关于路由更多内容请参考 V2Ray 用户手册


第三小节、关于路由规则的注意事项

本节记录了一些新手朋友使用 V2Ray 使用路由功能时常范的错误,希望大家能够避免。

1.1. 通配符

如果我想让淘宝和京东的域名直连,路由功能的规则写成下面这样的,你觉得这样的规则有问题吗?

[
    {
        "type": "field",
        "outboundTag": "direct",
        "domain": [
            "*.taobao.com",
            "*.jd.com"
        ]
    }
]

看起来没有什么问题,但事实上,有。如果使用了这样的规则,你会发现根本没有直接。很奇怪?这并不奇怪。这是因为你的经验在作祟。在 V2Ray 中,星号 * 不具备通配符的意义,只是一个普通的字符而已,是你以为星号 * 是通配符,这是臆想。如果想要匹配所有子域名的话,可以这么写规则:

[
    {
        "type": "field",
        "outboundTag": "direct",
        "domain": [
            "domain:taobao.com",
            "domain:jd.com"
        ]
    }
]

domain: 代表子域名,如 "domain:taobao.com" 这样一条规则包含了所有 taobao.com 域名及其子域名。

1.2. IP & domain

[
    {
        "type": "field",
        "outboundTag": "direct",
        "domain": [
            "domain:taobao.com"
        ],
        "ip": [
            "192.168.0.0/16"
        ]
    }
]

这样的一个规则的严格来说没有问题,真正的问题在与使用者不理解规则的配置。如果要匹配以上的规则,那么代表这有一个数据包的目标地址域名是 taobao.com 并且 IP 属于 192.168.0.0.1/16。通常情况下这是不可能的,所以你访问淘宝是不会匹配这个规则。如果你要满足域名和 IP 任一条件都能够匹配规则,那么应该这么写:

[
    {
        "type": "field",
        "outboundTag": "direct",
        "domain": [
            "domain:taobao.com"
        ]
    },
    {
        "type": "field",
        "outboundTag": "direct",
        "ip": [
            "192.168.0.0/16"
        ]
    }
]

1.3. subdomain

1.4. regexp

1.5. private ip








  • 五、小结


1. 小结

现在对本章作个总结。

1.1. 配置文件格式

V2Ray 的配置文件格式就像这样:

  "log": {},  "inbound": {},  "outbound": {},  "inboundDetour": [],  "outboundDetour": [],  "routing": {},  "transport": {},  "dns": {},  "policy": {},  "stats": {},  "api": {},

总的来说,V2Ray 的配置有 11 个项,每个项都可以展开成具体的配置。这些配置项当中,本章都有涉及到前面 6 项,关于 dns 和 transport 将在后文说明。而 api、policy 和 stats 的内容我不考虑出,对这些感兴趣的仔细研究手册吧。

要深刻理解,V2Ray 只是一个转发数据的软件,无论是客户端还是服务器,只要它从 inbound(Detour) 当中接收到数据包,不管 V2Ray 对这些数据包做了什么(加密、解密、协议转换等),到最后肯定是要把这些数据包从 outbound(Detour) 发出去。

1.2. inbound / outbound 和 inboundDetour / outboundDetour 的区别

配置当中有 inbound 和 inboundDetour 以及 outbound 和 outboundDetour,有部分网友对此可能比较迷惑,我这里说明一下。inbound 和 inboundDetour 都是传入,outbound 和 outboundDetour 都是传出。先来看传入,inbound 和 inboundDetour 的格式形如:

"inbound": {  "port": 1080,  "listen": "127.0.0.1",  "protocol": "协议名称",  "settings": {},  "streamSettings": {},  "allowPassive": false,  "tag": "标识"},"inboundDetour": [
  {    "port": 2080,    "listen": "127.0.0.1",    "protocol": "协议名称",    "settings": {},    "streamSettings": {},    "allowPassive": false,    "tag": "标识",    "allocate": {      "strategy": "always",      "refresh": 5,      "concurrency": 3
    }
  },
  {    "port": 3080,    "listen": "127.0.0.1",    "protocol": "协议名称",    "settings": {},    "streamSettings": {},    "allowPassive": false,    "tag": "标识",    "allocate": {      "strategy": "always",      "refresh": 5,      "concurrency": 3
    }
  }
]

可以很明显地看出来,inbound 和 inboundDetour 基本是一样的,只不过 inboundDetour 是 inbound 的集合。还有一点不同的是 inboundDetour 多了一个 allocate 参数,这是只有在动态端口才会用到的参数,如果不配置动态端口 inboundDetour 和 inbound 无异。

即有两点不同:

  • 配置中 inbound 只能并且必须设置一个传入的配置,而 inboundDetour 可以设置任意多个传入配置

  • inboundDetour 的传入配置多了一个给动态端口用的 allocate 参数

接着是传出,outbound 和 outboundDetour 格式形如:

"outbound": {  "sendThrough": "0.0.0.0",  "protocol": "协议名称",  "settings": {},  "tag": "标识",  "streamSettings": {},  "proxySettings": {    "tag": "another-outbound-tag"
  }  
},"outboundDetour": [
  {    "sendThrough": "0.0.0.0",    "protocol": "协议名称",    "settings": {},    "tag": "标识",    "streamSettings": {},    "proxySettings": {      "tag": "another-outbound-tag"
    }
  },
  {    "sendThrough": "0.0.0.0",    "protocol": "协议名称",    "settings": {},    "tag": "标识",    "streamSettings": {},    "proxySettings": {      "tag": "another-outbound-tag"
    }
  }
]

单纯从配置格式来看,outbound 和 outboundDetour 没有任何区别。但是实际上 outbound 和 outboundDetour 也有两点不同:

  • 配置中 outbound 只能并且必须设置一个传出的配置,而 outboundDetour 可以设置任意多个传出配置(实际上不可能任意多)

  • 当没有配置路由规则或者路由没有匹配的情况下,默认由 outbound 将数据包发出去

在上面给出的传入和传出配置格式当中,有一些参数不曾提到过,主要是因为:

  • 一般情况下使用 V2Ray 默认设置即可

  • 将会在后面的章节介绍

1.3. 协议

V2Ray 的传入协议有 HTTP、SOCKS、VMess、Shadowsocks、Dokodemo-door;传出协议有 VMess、Shadowsocks、Blackhole、Freedom、SOCKS。

在 inbound(Detour) 和 outbound(Detour) 当中,无论使用了什么协议,inbound(Detour) 或者 outbound(Detour) 的配置格式都是一样的,区别只在于不同的协议对应的 settings 内容不一样。


1.4. 更新历史

  • 2018-04-05 补充





文章投稿或转载声明

来源:123版权归原作者所有,转载请保留出处。本站文章发布于 2023-12-26 18:53:45
温馨提示:文章内容系作者个人观点,不代表天云博客对其观点赞同或支持。

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,54人围观)参与讨论

还没有评论,来说两句吧...