返回列表 發帖

Project V:入學編

本帖最後由 kingwilliam 於 2019-9-7 08:06 編輯

最後更新:2019.09.06
v2ray:v4.20.0还适用

* 因文章比较长,和会不断更新,如大家有题问或讨论,可到以下角色师兄帖子一起讨论。
* Project V:入学编 —— members 讨论篇

00 - 前言
01 - 序
02 - v2ray的基本概念
03 - 如何看json格式
04 - config.json架构
05 - 建立基本的“桥头堡”(inbounds and outbounds 入站与出站)
06 - 市内?过桥?分流(routing路由)
07 - 强化“桥”的基础
08 - routing(路由)的概念和用法
09 - 优化 DNS
10 - 拾遗
11 - 小結
*** 兴趣编 ***
13 - 反向代理
14 - 底层传输方式(transport)介紹
15 - 负载均衡器 (balancer)
16 - 附录
*** 参考编 ***
17 - WS + TLS + WEB
18 - (WS/H2)+ TLS + Caddy 范例
19 - 进行 TLS 通讯时,可以关闭 VMess 的加密
20 - WS + TLS + CDN(CloudFlare) + WEB
!!! 留意事项 !!!
R01 - 反向代理 或 {VPN} over dokodemo
R02 - 不要钻牛角尖 websocket + http/2



最後9次修改:
2019.04.17 17:23:09 - 优化 DNS:补充GeoDNS
2019.04.17 16:51:07 - 强化“桥”的基础:补充AlterId
2019.07.10 12:57:加入 !!! 留意事项 !!!
2019.07.10 12:57:加入 19 - 进行 TLS 通讯时,可以关闭 VMess 的加密
2019.07.10 14:39:07 - 强化“桥”的基础:删除“旧的使用手册”网址,因已不存在
2019.07.25 12:10:加入 20 - WS + TLS + CDN(CloudFlare) + WEB
2019.07.25 15:48:10 - 拾遗:补充Log
2019.08.13 20:07:10 - 拾遗:加入inbounds listen和outbounds sendThrough
2019.08.13 20:38:R02 - 不要钻牛角尖 websocket + http/2

本帖最後由 kingwilliam 於 2019-3-1 12:06 編輯

00 - 前言

如这个贴文遗返了版规,请通知删除,谢谢。

以下贴文我会尽我所能浅白,但始终会有技术部分,如 端口53是甚麽, 甚麽是1.1.1.1, 114.114.114.114。所以大家往下看时 最好对网络已有一些基本认识。

TOP

本帖最後由 kingwilliam 於 2019-4-17 16:58 編輯

01 - 序

为何会选写这个Project V“入学编”,因自己做过小白(现在还是小白),但project V出了名是“超级复杂”,“超级难用”,所以常试用小白的角度出发 等大家容易明白 组合自己的project V客户和服务器。

这编内容只会集中Project V(或v2ray)内的config.json设定,而前期的系统安装和最後 终极客户端“透明代理” 和 终极服务器“如何用WS+TLS+WEB将v2ray服务器隠藏於网页後”这些高阶设定 网络上已有高人指路 小白我就不此在班门弄斧 所以只会有“入学编”。

TOP

本帖最後由 kingwilliam 於 2019-8-22 17:27 編輯

02 - v2ray的基本概念

*** 图01 ***


v2ray最基本 要1个客户 和 1个服务器 组成

v2ray当然是要用来吸收“其他文明”(我暂称呼“郊外”)的知识,所以最少要在郊外的地方设置1个 服务器 做接应。而“本土文明”(我暂称呼”市内”),也要步署1个 客户 才可成事。

所以曾经有人在市内问“我手机已安装v2rayNG,为何还是不能呼吸郊外的空气”,就因为郊外没有设置 服务器 对应,所以用不了。

市内,郊外 已交代
河,桥 意会吧
桥头堡 河两边的v2ray

大家看见 两边的桥头堡 都会有 入 和 出

如要用文子表述 入 和 出

市内
入 - 接收 要求(发出的可以是手机 也可以是电脑)
出 - 把 入 的要求 经过加密後 过桥。

郊外
入 - 接收由 桥 过来的 要求 後解密。
出 - 处理 市内 入 的 要求,找到後原路返回。
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

TOP

本帖最後由 kingwilliam 於 2019-2-28 21:19 編輯

03 - 如何看json格式

config.json 是用json格式
  1. {
  2.   "inbounds": [
  3.     {
  4.       "port": 1080, // 监听端口
  5.       "protocol": "socks" // 入口协议为 SOCKS 5
  6.     }
  7.   ],
  8.   "outbounds": [
  9.     {
  10.       "protocol": "shadowsocks",
  11.       "settings": {
  12.         "servers": [
  13.           {
  14.             "address": "serveraddr.com", // Shadowsocks 的服务器地址
  15.             "method": "aes-128-gcm", // Shadowsocks 的加密方式
  16.             "password": "sspasswd", // Shadowsocks 的密码
  17.             "port": 1024  
  18.           }
  19.         ]
  20.       }
  21.     }
  22.   ]
  23. }
複製代碼
如大家第一次接触json格式,好多时都会碰到 括号不对 豆号不对 就上面的例子是json的直式,如简略到横式 就会容易明白。

以下开始慢慢解说上面的例子:
1. 开始头尾都要有 括号
  1. {}
複製代碼
2. 开始加入一组设定,如我给这个设定名 甲
  1. {甲}
複製代碼
3. 如要加多一组设定 乙,需要用豆号分格
  1. {甲,乙}
複製代碼
4. 如甲="inbounds":[] 乙="outbounds":[]
  1. {"inbounds":[],"outbounds":[]}
複製代碼
5. 如我要在inbounds内加入两组设定 丙和丁
  1. {"inbounds":[丙,丁],"outbounds":[]}
複製代碼
6. 如丙="port":1080 丁="protocol":"socks"
  1. {"inbounds":["port":1080,"protocol":"socks"],"outbounds":[]}
複製代碼
7. 如我要在outbounds再内加 戊,。。。。等等,太长了很难处理,所以要由横式转直式

  1. {"inbounds":["port":1080,"protocol":"socks"],"outbounds":[戊]}


  2. {
  3.    "inbounds":[
  4.       "port":1080,
  5.       "protocol":"socks"
  6.    ],
  7.    "outbounds":[
  8.       戊
  9.    ]
  10. }
複製代碼
这样大家是否容易理解。

TOP

本帖最後由 kingwilliam 於 2019-3-1 11:20 編輯

04 - config.json 架构

因v2ray成长太快,以下是以2019.02.27选写时的 config.json 架构
  1. {
  2.   "log": {},
  3.   "api": {},
  4.   "dns": {},
  5.   "stats": {},
  6.   "routing": {},
  7.   "policy": {},
  8.   "reverse": {},
  9.   "inbounds": [],
  10.   "outbounds": [],
  11.   "transport": {}
  12. }
複製代碼
客户端 和 服务器端 都是同一套config.json 架构(但内容是有不同,後文详述)

如只想到郊外呼吸一下清新空气,只需在 客户端 和 服务器 各自建立最基本的 inbounds 和 outounds 就成.
=== code00-basic ===
  1. {
  2.   "inbounds": [],
  3.   "outbounds": []
  4. }
複製代碼
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

TOP

本帖最後由 kingwilliam 於 2019-3-1 11:28 編輯

05 - 建立基本的“桥头堡”(inbounds and outbounds 入站与出站)

“桥”的两端 即是 市内的出 和 郊外的入 protocol, id, port 两端必需一至,

=== 客户端 outbounds 出 的例子 ===
=== code01-client-out ===
  1. "outbounds": [
  2.    {
  3.       "protocol": "vmess",
  4.       "settings": {
  5.          "vnext": [{
  6.             "address": "server", // 服务器地址
  7.             "port": 10086,  // 服务器端口
  8.             "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
  9.           }]
  10.       }
  11.    }
  12. ]
複製代碼
=== 服务器 inbounds 入 的例子 ===
=== code01-server-in ===
  1. "inbounds": [
  2.    {
  3.       "protocol": "vmess",
  4.       "port": 10086, // 服务器监听端口
  5.       "settings": {
  6.          "clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
  7.       }
  8.    }
  9. ]
複製代碼
- Protocol:可参考官网的 协议列表
但现今河水越来越高 VMess 是今天比较稳妥的协议(到2019.02.28今天还是).
其他的协议 有兴趣的 可到官网了解。

- 服务器地址 和 服务器端口:不用说吧

- id:是甚麽?你可视为密码 但不是随意乱打的, v2ray本身已有一个uuid生成器,  上网也可找到很多的
  1. v2ctl uuid
複製代碼
现在“桥”已建成,到开门给进出

先讲 郊外 那边的出口,因真的太简单
=== code01-server-out ===
  1. "outbounds": [
  2.    {
  3.       "protocol": "freedom"
  4.    }
  5. ]
複製代碼
只有这麽多,就是 自由吧。

到市内那边的入口(如您是用手机就不用设定这边的入站协议)。
=== code01-client-in ===
  1. "inbounds": [
  2.    {
  3.       "protocol": "socks",
  4.       "port": 1080
  5.    }
  6. ]
複製代碼
protocol:客户端入站一般都是 socks,http或dokodemo 现在先用socks做例

好了 所有入站和出站协议都已建立完成,开始合体
由 服务器 开始
张 code00-basic + code01-server-in + code01-server-out
=== code01-server-semifinal ===
  1. {
  2.    "inbounds": [code01-server-in],
  3.    "outbounds": [code01-server-out]
  4. }
複製代碼
客户端
张 code00-basic + code01-client-in + code01-client-out
=== code01-client-semifinal ===
  1. {
  2.    "inbounds": [code01-client-in],
  3.    "outbounds": [code01-client-out]
  4. }
複製代碼
*
*
*
*
*
=== code01-server-final === 服务器 完成
  1. {
  2.    "inbounds": [
  3.       {
  4.          "protocol": "vmess",
  5.          "port": 10086, // 服务器监听端口
  6.          "settings": {
  7.             "clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
  8.          }
  9.       }
  10.    ],
  11.    "outbounds": [
  12.       {
  13.          "protocol": "freedom"
  14.       }
  15.    ]
  16. }
複製代碼
*
*
*
*
*
=== code01-client-final === 客户端 完成
  1. {
  2.    "inbounds": [
  3.       {
  4.          "protocol": "socks",
  5.          "port": 1080
  6.       }
  7.    ],
  8.    "outbounds": [
  9.       {
  10.          "protocol": "vmess",
  11.          "settings": {
  12.             "vnext": [{
  13.                "address": "server", // 服务器地址
  14.                "port": 10086,  // 服务器端口
  15.                "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
  16.              }]
  17.          }
  18.       }
  19.    ]
  20. }
複製代碼
上面2组代码,就是v2ray最基本的config.json设定档,已經可以运行。
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

TOP

本帖最後由 kingwilliam 於 2019-3-4 11:41 編輯

06 - 市內?过桥?分流(routing路由)

上一个贴子"05 - 建立基本的“桥头堡”(inbounds and outbounds 入站与出站)"已可自由过河,但就是全都过了河,如要淘宝(因过了河,超慢)丶看爱奇艺(更说我所在地区受限不能看)。

*** 图02 ***


如 图02 在 客户端 出站前加1个路由,凡是 市内的网址 或 市内的IP地址 就直接在市内出站不用过桥,馀下的全都过桥由郊外那边出站。

=== code02-client-out ===
  1. {
  2.         "protocol": "freedom",
  3.         "settings": {}
  4. }
複製代碼
首先要在 outbounds 出站处加入一个新的出站口,目的是处理市内直连的要求。而这个出站口一定要处於现有的出站口下方。因v2ray outbounds 第一个出站口是有default即 预设 的意思。

因现在出口已多於1个,要为每个出口设定一个标签,用於之後路由设定。
=== 以下是 code01-client-out + code02-client-out ===
=== code02-client-out02 ===
  1. "outbounds": [
  2.    {
  3.       "tag": "defaultout",
  4.       "protocol": "vmess",
  5.       "settings": {
  6.          "vnext": [{
  7.             "address": "server", // 服务器地址
  8.             "port": 10086,  // 服务器端口
  9.             "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
  10.           }]
  11.       }
  12.    },
  13.    {
  14.       "tag": "direct",
  15.       "protocol": "freedom",
  16.       "settings": {}
  17.    }
  18. ]
複製代碼
上面的 代码 看见"tag" 就是给那组设定一个标签
过桥的那个出口我给了 "defaultout"
新的市内出口我给了 "direct"

现在加入路由设定
=== code02-client-routing00 ===
  1. "routing": {
  2.    "domainStrategy": "IPOnDemand",
  3.    "rules": []
  4. }
複製代碼
domainStrategy: 有3个选择 "AsIs" | "IPIfNonMatch" | "IPOnDemand"
如想进一步了解如何运用, 可到官网了解

以下的代码是所有 市内 常用域名 全都用 "direct" 这个出口
=== code02-client-routing01 ===
  1. {
  2.    "type": "field",
  3.    "domain": [
  4.       "geosite:cn"
  5.    ],
  6.    "outboundTag": "direct"
  7. }
複製代碼
"type" : 目前只支持"field"这一个选项。
"domain" : 详情请参考官网 RuleObject
"outbountTag" : 就是附合上面条件的都用"direct"这个出口
"geosite:cn" : 不是 .com.cn 或 .cn 意思. geosite和下面张会出现的 geoip 都是project V一个特殊功能,cn是指一般常用的市内网站,详情请参考官网 预定义域名列表

以下的代码是所有 市内 的IP地址 和 一些私有地址 全都用 "direct" 这个出口
=== code02-client-routing02 ===
  1. {
  2.    "type": "field",
  3.    "ip": [
  4.       "geoip:cn",
  5.       "geoip:private"
  6.    ],
  7.    "outboundTag": "direct"
  8. }
複製代碼
留意 今次是 "IP" 做路由条件
"geoip:cn" : 是市内 ip
"geoip:private" : 是私有地址(即192.168, 172.16 那些)

好了 所有路由设定已建立完成,开始合体
张 code02-client-routing00 + code02-client-routing01 + code02-client-routing02
=== code02-client-routing-semifinal ===
  1. "routing": {
  2.    "domainStrategy": "IPOnDemand",
  3.    "rules": [
  4.       code02-client-routing01,
  5.       code02-client-routing02
  6.    ]
  7. }
複製代碼
*
*
*
*
*
=== code02-client-routing-final ===
  1. "routing": {
  2.    "domainStrategy": "IPOnDemand",
  3.    "rules": [
  4.       {
  5.          "type": "field",
  6.          "domain": [
  7.             "geosite:cn"
  8.          ],
  9.          "outboundTag": "direct"
  10.       },
  11.       {
  12.          "type": "field",
  13.          "ip": [
  14.             "geoip:cn",
  15.             "geoip:private"
  16.          ],
  17.          "outboundTag": "direct"
  18.       }
  19.    ]
  20. }
複製代碼
*
*
*
*
*
这样 客户端 就可市内直连,馀下的就全都过桥由郊外那边出站。
现在可张 code02-client-rounting-final 放入之前的 code01-client-final
=== code02-client-final ===
  1. {
  2.    "inbounds": [
  3.       {
  4.          "protocol": "socks",
  5.          "port": 1080
  6.       }
  7.    ],
  8.    "outbounds": [
  9.       {
  10.          "tag": "defaultout",
  11.          "protocol": "vmess",
  12.          "settings": {
  13.             "vnext": [{
  14.                "address": "server", // 服务器地址
  15.                "port": 10086,  // 服务器端口
  16.                "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
  17.              }]
  18.          }
  19.       },
  20.       {
  21.          "tag": "direct",
  22.          "protocol": "freedom",
  23.          "settings": {}
  24.       }
  25.    ],
  26.    "routing": {
  27.       "domainStrategy": "IPOnDemand",
  28.       "rules": [
  29.          {
  30.             "type": "field",
  31.             "domain": [
  32.                "geosite:cn"
  33.             ],
  34.             "outboundTag": "direct"
  35.          },
  36.          {
  37.             "type": "field",
  38.             "ip": [
  39.                "geoip:cn",
  40.                "geoip:private"
  41.             ],
  42.             "outboundTag": "direct"
  43.          }
  44.       ]
  45.    }
  46. }
複製代碼
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

TOP

本帖最後由 kingwilliam 於 2019-8-23 10:57 編輯

07 - 强化“桥”的基础

继续深化前,先强化“桥”的基础。
我相信大家都看过 官网 和 白话文教程 无数次,大家都会看到我的vmess vnext users设定代码只有id一项,应该还有其他的。

对!现在再多加3个选顼,alterid丶security和level
=== 客户端 出 的例子 ===
=== code03-client-out ===
  1. "outbounds": [
  2.    {
  3.       "protocol": "vmess",
  4.       "settings": {
  5.          "vnext": [{
  6.             "address": "server", // 服务器地址
  7.             "port": 10086,  // 服务器端口
  8.             "users": [
  9.                {
  10.                   "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
  11.                   "alterid": 4,
  12.                   "security": "auto",
  13.                   "level": 0
  14.                }
  15.             ]
  16.          }]
  17.       }
  18.    }
  19. ]
複製代碼
=== 服务器 inbounds 入 的例子 ===
=== code03-server-in ===
  1. "inbounds": [
  2.    {
  3.       "protocol": "vmess",
  4.       "port": 10086, // 服务器监听端口
  5.       "settings": {
  6.          "clients": [
  7.             {
  8.                "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
  9.                "alterid": 64,
  10.                "level": 0
  11.             }
  12.          ]
  13.       }
  14.    }
  15. ]
複製代碼
- "alterid: 有甚麽用?在一份旧的使用手册有以下描述:

  • VMess 依赖于系统时间,请确保使用 V2Ray 的系统 UTC 时间误差在 90 秒之内。
  • 时间戳的取值范围只有 60 个值,当客户端产生大量数据请求时,部分请求可能会使用了相同的时间戳,进而产生相同的认证信息。在这种情况下,通讯数据有可能被模式识别。为了降低可识别性,VMess 配置中有一个 alterId 设置。如果 alterId > 0,VMess 在当前 ID 的基础上自动生成 alterId 个不同的 ID,并用于通讯。alterId 的值越大,认证信息重复的概率就越小。实际的 alterId 值可以根据你的上网情况推算出来,一般的网页浏览平均每秒打开最多一个网页,平均一个网页发起 10 个连接,那么 alterId 的值设为 10 即可。

所以官网就直接地不要问,只要做

  • “为了进一步防止被探测,一个用户可以在主 ID 的基础上,再额外生成多个 ID。这里只需要指定额外的 ID 的数量”。但客户端一定要小过服务器,建议 服务器:64,客户:4


- "secureity: 这选项只需设在客户端,服务器自行适应。有4个选择 "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none",官网建议"auto",但喜欢自行选择也没太大关系。

- "level": 官网也没多话说, 是要配合 "policy" 这个选项,就可不同users有不同的设定,如level:1 buffer可有10MB,但level:2的就只有2MB。

因level用的机会不多,就在这轻轻带过。
=== 以下是 "policy" 的例子 ===
  1. "policy": {
  2.    "levels": {
  3.       "0": {
  4.          "handshake": 4,
  5.          "connIdle": 300,
  6.          "uplinkOnly": 10,
  7.          "downlinkOnly": 10,
  8.          "statsUserUplink": false,
  9.          "statsUserDownlink": false,
  10.          "bufferSize": 10240
  11.       }
  12.       "1": {
  13.          "handshake": 4,
  14.          "connIdle": 300,
  15.          "uplinkOnly": 2,
  16.          "downlinkOnly": 2,
  17.          "statsUserUplink": false,
  18.          "statsUserDownlink": false,
  19.          "bufferSize": 10240
  20.       }
  21.    },
  22.    "system": {
  23.       "statsInboundUplink": false,
  24.       "statsInboundDownlink": false
  25.    }
  26. }
複製代碼

以上3项,可到 官网 再详细了解


住下走,继续强化“桥”,加入WS+TLS

v2ray 除了 ws+tls 之外比较安全的个人会选HTTP/2。但“mkcp”和“HTTP 伪装”个人就不太建议,为何?官网这样说“。。。mKCP 牺牲带宽来降低延迟。。。一般比 TCP 消耗更多的流量”我曾试个用traffic monitor观察过,“消耗更多的流量”是去到惊吓情况,不值得。(抱歉 已离题!)

现在来回桥的资料已给vmess加了密(我暂用“散装货”形容),如有 海盗 在河上要检查过桥的包裹是看不到甚麽的,但包裹一定会有 寄件者 和 收件者资料(当然是IP地址)如果 海盗 也有大数据,他们会发现为何郊外那边的地址全都是“散装货”。

好 场景说完,现在说如何由“散装货”(普通加密资料)转到“集装箱”(广范采用的https 是真正的tls加密资料 不是伪装)好浑水模鱼骗过海盗。
有句话“做戏要做全”首先要申请一个网域".com .site .info"甚麽也可以。(如何申请网域丶寄存丶更新DNS,可问 谷哥)SSL FOR Free  可在这申请免费电子证书。每3个月续1次



以下客户例子是在上面 code03-client-out 加入streamsettings
=== 客户端 出 的例子 ===
=== code03-client-out02 ===
  1. "outbounds": [
  2.    {
  3.       "protocol": "vmess",
  4.       "settings": {
  5.          "vnext": [{
  6.             "address": "server", // 服务器地址
  7.             "port": 10086,  // 服务器端口
  8.             "users": [
  9.                {
  10.                   "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
  11.                   "alterid": 4,
  12.                   "security": "auto",
  13.                }
  14.             ]
  15.          }]
  16.       },
  17.       "streamSettings": {
  18.          "network": "ws",
  19.          "security": "tls",
  20.          "tlsSettings": {
  21.             "allowInsecure": true
  22.          },
  23.          "wsSettings": {
  24.             "path": "/freepath/"
  25.          }
  26.       }
  27.    }
  28. ]
複製代碼
- "network": "ws" 是指http升级到wetsocks
- "security": "tls" 是指用tls做加密
- "allowinsecure": "true" 不会检查远端主机所提供的 TLS 证书的有效性。
- "path": "/freepath/" 加强安全性,内容随意,但客户和服务器两边必需一致。



=== 服务器 inbounds 入 的例子 ===
=== code03-server-in02 ===
  1. "inbounds": [
  2.    {
  3.       "protocol": "vmess",
  4.       "port": 10086, // 服务器监听端口
  5.       "settings": {
  6.          "clients": [
  7.             {
  8.                "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
  9.                "alterid": 64,
  10.                "level": 0
  11.             }
  12.          ]
  13.       },
  14.       "streamSettings": {
  15.          "network": "ws",
  16.          "security": "tls",
  17.          "tlsSettings": {
  18.             "certificates": [
  19.                {
  20.                   "certificateFile": "/etc/v2ray/cert.crt",
  21.                   "keyFile": "/etc/v2ray/key.key"
  22.                }
  23.             ]
  24.          },
  25.          "wsSettings": {
  26.             "path": "/freepath/"
  27.          }
  28.       }
  29.    }
  30. ]
複製代碼
服务器这边就多了"certificates"就是证书和密钥

现在过“桥”的资料包已用广范采用的https(WS+TLS)处理。如想再進一步强化,就是在v2ray服務器前安装两层保护层,可以尽量降低避探测和攻击的机会。

這两层是 reverse proxy(反向代理)和 web server(真正的网站) 流程会是 互联网>反向代理>网站>v2ray
- 反向代理:好处是1个IP,在同1个443端口可以有限多服务器,同時保护网站。(如何保护网站,有机会再详述)
- 网站:是用来隐藏背後的v2ray。(留代最後附录才簡述)

“ 终极服务器”就留给各位折腾吧。 现在继续上路。

TOP

本帖最後由 kingwilliam 於 2019-10-4 08:51 編輯

08 - routing(路由)的概念和用法

如有编程经验的人一定会用过

if... 或 case 这类指令 简单描述就是 符合条件就做甚麽

  1. case
  2.    您的年龄 <=6岁 就是"小朋友"
  3.    您是“男” 就是“哥哥”
  4.    您是“女” 就是“姐姐”
  5. endcase
複製代碼
上面的例子就由上而下

如果您是6岁或以下,不轮男女 第一条件已符合 就是 “小朋友”,任务已完成会直接跳到endcase

如果您已是一位美美 第一条件不符合,就看第二条件,如都不符合 就到第三条件。

如是这般


但也要留意
  1. case
  2.    您是“男” 就是“哥哥”
  3.    您是“女” 就是“姐姐”
  4.    您的年龄 <=6岁 就是"小朋友
  5. Endcase
複製代碼
如上面这例 指令一样 只是先後有异 就会是另一个境况。就是永远不会有 小朋友 只有男或女。


好 为何routing会说到编程。看看下面routing例子
=== 这是上面出现过的 code02-client-routing-final ===
  1. "routing": {
  2.    "domainStrategy": "AsIs",
  3.    "rules": [
  4.       {
  5.          "type": "field",
  6.          "domain": [
  7.             "geosite:cn"
  8.          ],
  9.          "outboundTag": "direct"
  10.       },
  11.       {
  12.          "type": "field",
  13.          "ip": [
  14.             "geoip:cn",
  15.             "geoip:private"
  16.          ],
  17.          "outboundTag": "direct"
  18.       }
  19.    ]
  20. }
複製代碼


=== code02-client-out02 ===
  1. "outbounds": [
  2.    {
  3.       "tag": "defaultout",
  4.       "protocol": "vmess",
  5.       "settings": {
  6.          "vnext": [{
  7.             "address": "server", // 服务器地址
  8.             "port": 10086,  // 服务器端口
  9.             "users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
  10.           }]
  11.       }
  12.    },
  13.    {
  14.       "tag": "direct",
  15.       "protocol": "freedom",
  16.       "settings": {}
  17.    }
  18. ]
複製代碼
在上文 code02-client-out02 已提及
outbounds 第一个出站口是有default即 预设 的意思。

如在 code02-client-routing-final 这个例子,如去 taobao.com 就会在条件1时就已去了"direct"出口"。
但如果要去 google.com,就因条件1和2都不符合,就会没条件符合而出了routing,这时就会用outbounds第一个出站口 即 预设 出站。

TOP

本帖最後由 kingwilliam 於 2019-4-17 17:22 編輯

09 - 优化 DNS

在章节 “06 - 市内?过桥?分流(routing路由)”已提及过“因全都过了河,如要淘宝(因过了河,超慢)丶看爱奇艺(更说所在地区受限不能看)。”所以“在 客户端 出站前加1个路由,凡是 市内的网址 或 市内的IP地址 就直接在市内出站不用过桥,馀下的全都过桥由郊外那边出站。”

理论上已是完美,但不是。因现在上网是访问 郊外的DNS 取网站ip地址,问题就在这。因DNS会跟据您的IP 位置回报最近的伺服器IP(这服务叫GeoDNS - 可参考“什麽是GeoDNS?”)。所以 如果在访问DNS前 就跟据访问的网站分流 市内 的就访问市内DNS,馀下就访问郊外那边DNS 。这样就真的非常完满。

例如:百度 www.baidu.com
由114.114.114.114回来的是 104.193.88.77 或 104.193.88.123
  1. > www.baidu.com
  2. Server:  public1.114dns.com
  3. Address:  114.114.114.114

  4. Non-authoritative answer:
  5. Name:    www.wshifen.com
  6. Addresses:  104.193.88.77
  7.           104.193.88.123
  8. Aliases:  www.baidu.com
  9.           www.a.shifen.com
複製代碼
但 1.1.1.1 回来的是 103.235.46.39
  1. > www.baidu.com
  2. Server:  one.one.one.one
  3. Address:  1.1.1.1

  4. Non-authoritative answer:
  5. Name:    www.wshifen.com
  6. Address:  103.235.46.39
  7. Aliases:  www.baidu.com
  8.           www.a.shifen.com
複製代碼
在上面两个dns访问就会发现 市内dns回应和郊外的dns是有不同 这就会影响上网质素。

所以Project V团队在v2ray内加入一个dns服务模组做dns分流。
  1. "dns": {
  2.    servers": [
  3.       {
  4.          "address": "114.114.114.114",
  5.          "port": 53,
  6.          "domains": ["geosite:cn"]
  7.       },
  8.       1.1.1.1
  9.    ]
  10. }
複製代碼
如何解读这组代码? 如要找的网域是 市内 就用114.114.114.114 其他就用1.1.1.1。

所以 v2ray 内置dns 有1个参数 "clientip" 就是通知dns你的位置。一般情况下是不用设置。

想详细了解v2ray的dns运作,可参考 漫谈各种黑科技式 DNS 技术在代理环境中的应用

TOP

本帖最後由 kingwilliam 於 2019-9-6 21:22 編輯

10 - 拾遗

1。v2ray内是有log这个功能,为何放到最後,因没事时真的没用,但要他的时候又真的很有用。

没甚特别,初学时真的log也可以没有。
  1. {
  2.   "access": "文件地址" | "none",
  3.   "error": "文件地址" | "none",
  4.   "loglevel": "debug" | "info" | "warning" | "error" | "none"
  5. }

  6. 文件地址格式:
  7. (Linux):"/var/log/v2ray/_access.log"
  8. (Windows):"C:\\Temp\\v2ray\\_access.log" <- 沒打錯,真的要用 \\
複製代碼
官网也说得很清楚 LogObject


2。还有一个 可能已给放弃的功能(因官网也找不到)“动态端口”,现在只可在“白话文教程”内找到解说。这个功能我也曾深研,也用过一个短时间,最後也给放弃。有兴趣的 可到“白话文教程”了解。

3。Mux:“是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频丶下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配”。官网已说明了,不用再解说。

  • 但mux有甚麽用?可用“减少连接数量”理解。
  • 例:有一网页index.html, 内有6个jpg要下载,这样客户端会问服务器取7(1个html+6个jpg)个档案,每下载一次,都会制做1个连接,如mux这时设定8,这时1个连接就可以。如有9个jpg,因这时要取10个档案,所以要制做2个连接。
  • 启动与否,连接数量,视各自情况决定,没有准则。


4。如系統有多個1個ip地址可用時,"inbounds"可用"listen"指定那個ip用那個port入站,"outbounds"可用"sendThrough"指定用那個ip出站.

範例:
  1. "inbounds": [
  2.         {
  3.                 "tag": "in01",
  4.                 "listen": "10.0.0.1",
  5.                 "port": 443,
  6.                 ...
  7.         },
  8.         {
  9.                 "tag": "in02",
  10.                 "listen": "10.0.0.2",
  11.                 "port": 443,
  12.                 ...
  13.         }
  14. ],

  15. "outbounds": [
  16.         {
  17.                 "tag": "out01",
  18.                 "sendThrough": "10.0.0.3",
  19.                 ...
  20.         },
  21.         {
  22.                 "tag": "out02",
  23.                 "sendThrough": "10.0.0.4",
  24.                 ...
  25.         }
  26. ]
複製代碼
上面的范例就是 10.0.0.1和 10.0.0.2 负责入站。 10.0.0.3 和 10.0.0.4 就负责出站。

5。"api","stats","transport" 这3个功能  自问因没了解过,所以就不写了。

TOP

本帖最後由 kingwilliam 於 2019-3-7 18:26 編輯

11 - 小结

到这里 桥 已建好,出郊外已可畅通无阻(但天朝要下雨,可水上涨关桥,就另作别论)

再住下走,就已离开入学范围,进入“兴趣编”。

TOP

本帖最後由 kingwilliam 於 2019-7-10 12:52 編輯

13 - 反向代理

这个功能不止官网所说只是连接回家看看那个伺服器那麽简单。

这个功能最大的好处就是市内的“桥头堡”没有真正IP,路由也不能“端口影射”。就可靠这个“反向代理”功能,在郊外也可看市内的“爱奇艺”。

*** 图03 ***

上图正是官网所说的 多入站,多路由,多出站 架构

也是我现用 反向代理 的架构图。由两座桥组成,预设那座是一般由市内出郊外用的。反向那座是给郊外入市内用的。
*** 如有师兄可以用一座桥完城 请告知 *** 因我试了很多不同组合,但都有不同问题,两座桥的组合暂时发觉是最稳定。

因代码有点长,所以分了段落和简化。
先上客户端
=== code04-client-inbound ===
  1. "inbounds": [
  2.    {
  3.       "protocol": "socks",
  4.       "port": 1080
  5.    }
  6. ]
複製代碼
只是一般入站代码

=== code04-client-reverse ===
  1. "reverse": {
  2.    "bridges":[  
  3.       {  
  4.          "tag":"bridge",
  5.          "domain":"reverse.tunnel.projectv"
  6.       }
  7.    ]
  8. }
複製代碼
这段就是 触发 反向代理的代码
"domain": 是给服务器那边 识认 这是一个反向代理的標籤,所以要给一个两边一至不存在的域名。


=== code04-client-routing ===
  1. "routing": {
  2.    "domainStrategy": "IPOnDemand",
  3.    "rules": [
  4.       {
  5.          "type": "field",
  6.          "inboundtag": [
  7.             "bridge"
  8.          ],
  9.          "domain": [
  10.              "full:reverse.tunnel.projectv"
  11.          ],
  12.          "outboundTag": "tunnel"
  13.       },
  14.       {
  15.          "type": "field",
  16.          "inboundTag": [
  17.             "bridge"
  18.          ],
  19.          "outboundTag": "direct"
  20.       },
  21.       {
  22.          "type": "field",
  23.          "domain": [
  24.             "geosite:cn"
  25.          ],
  26.          "outboundTag": "direct"
  27.       },
  28.       {
  29.          "type": "field",
  30.          "ip": [
  31.             "geoip:cn",
  32.             "geoip:private"
  33.          ],
  34.          "outboundTag": "direct"
  35.       }
  36.    ]
  37. }
複製代碼
内有四组路由,第三四组是基本的,第一组路由解读是“inbound是bridge时,带着reverse.tunnel.projectv时就走 tag:tunnel出站”建立反向代理
第二组解读是“inbound是bridge时就走tag:direct出站”这组意思是,由郊外入来的都在市内出站。
*** 迟些再补充 ***


=== code04-client-outbound ===
  1. "outbounds": [
  2.    {
  3.       "tag": "defaultout",
  4.       "protocol": "vmess",
  5.       "settings": {
  6.          "vnext": [
  7.             {
  8.                "address": "address",
  9.                "port": 443,
  10.                "users": [
  11.                   {
  12.                      "id": "id"
  13.                   }
  14.                ]
  15.             }
  16.          ]
  17.       }
  18.    },
  19.    {
  20.       "tag": "tunnel",
  21.       "protocol": "vmess",
  22.       "settings": {
  23.          "vnext": [
  24.             {
  25.                "address": "server",
  26.                "port": 443,
  27.                "users": [
  28.                   {
  29.                      "id": "id"
  30.                   }
  31.                ]
  32.             }
  33.          ]
  34.       }
  35.    },
  36.    {
  37.       "tag": "direct",
  38.       "protocol": "freedom",
  39.        "settings": {}
  40.    }
  41. ]
複製代碼
出站有3组 第三组freedom不用说,第一二组给是建立 预设 和 反向 的出站。





服務器
=== code04-server-reverse ===
  1. "reverse": {
  2.    "portals":[  
  3.       {  
  4.          "tag":"portal",
  5.          "domain":"reverse.tunnel.projectv"
  6.       }
  7.    ]
  8. }
複製代碼
domain:用來識別市內發出建立反向代理的標籤


=== code04-server-inbound ===
  1. "inbounds": [
  2.    {
  3.       "tag": "defaultin"
  4.       "port": 44303,
  5.       "protocol": "vmess",
  6.       "settings": {
  7.          "clients": [
  8.             {
  9.                "id": "id",
  10.                "alterId": 64,
  11.                "level": 1
  12.             }
  13.          ]
  14.       }
  15.    },
  16.    {
  17.       "tag": "tunnel",
  18.       "port": 44305,
  19.       "protocol":"vmess",
  20.       "settings":{  
  21.          "clients":[  
  22.             {  
  23.                "id": "id",
  24.                "alterId":64,
  25.                "level": 1
  26.             }
  27.          ]
  28.       }
  29.    },
  30.  {
  31.   "protocol": "socks",
  32.   "port": 1080
  33.  },
  34. ]
複製代碼
預設 和 反向 的入站口 和 socks入站


=== code04-server-routing ===
  1. "routing": {
  2.    "domainStrategy": "IPOnDemand",   
  3.    "rules": [
  4.       // connect from cn
  5.       {
  6.          "type":"field",
  7.          "inboundTag":[
  8.             "tunnel"
  9.          ],
  10.          "outboundTag":"portal"
  11.       },

  12.       // domain to cn
  13.       {
  14.          "type": "field",
  15.          "domain": [
  16.             "domain:iqiyi.com"
  17.          ],
  18.          "outboundTag": "portal"
  19.       }
  20.    ]
  21. },
複製代碼
第一組路由解讀“由tunnel來的 就由portal回應” 接受市內要求 建立反向
第二組路由解讀“如果有iqiyi.com要求 就由portal出站” (需然這邊是郊外,但一樣可以有socks入站)


=== code04-server-outbounds ===
  1. "outbounds": [
  2.    {
  3.       "tag": "direct",
  4.       "protocol": "freedom",  
  5.       "settings": {}
  6.    }
  7. ]
複製代碼
。。。後续。。。
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

TOP

本帖最後由 kingwilliam 於 2019-9-6 21:10 編輯

14 - 底层传输方式(transport)介绍

{
  "tcpSettings": {},
  "kcpSettings": {},
  "wsSettings": {},
  "httpSettings": {},
  "dsSettings": {},
  "quicSettings": {}
}

底层传输 可分udp,tcp 和 domainsocket
udp 有 quic, kcp
tcp 有 tcp, wetsocket, http2
domainsocket

  • 如果你的网络支援udp(指你的网路供应商没有给udp设定qos),个人会建议用quic(个人不建议用kcp)
  • kcp/mkcp:上网经常看见一时kcp,一时mkcp,但kcp和mkcp是甚麽?有甚麽分别?可以理解成“UDP伪装TCP流量”,官网是这样说明“V2Ray 引入了 KCP 传输协议,并且做了一些不同的优化,称为 mKCP。要了解的一点是,mKCP 与 KCPTUN 同样是 KCP 协议,但两者并不兼容。”这样就全明白了。
  • 如更想了解kcp多一点,可参考 kcptun-raw:应对UDP QoS,重新实现kcptun的一次尝试
  • tcp和wetsocket(WS) 个人建议,最好加入TLS一起运用(个人不建议单独tcp+伪装或单独WS)。或用http2
  • domainsocket:个人功力不够,还在参详中。有兴趣可参考下面网页。

https://kkdev.org/post/what-is-unix-domain-socket/
https://github.com/v2ray/discussion/issues/16

需然个人会比较用喜欢用TLS搭桥,同时也会建议用TLS。但很久前SS作者也论及应否用https搭桥。
为什么不应该用 SSL 翻墙(补充:文章日期是2013年)
为什么应该用 SSL 翻墙

喜欢如何运用v2ray搭桥过河,就留给大家“八仙过海 各显神通”

TOP

返回列表