Board logo

標題: Project V:入學編 [打印本頁]

作者: kingwilliam    時間: 2019-2-27 11:19     標題: 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-2-27 11:20

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

00 - 前言

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

以下贴文我会尽我所能浅白,但始终会有技术部分,如 端口53是甚麽, 甚麽是1.1.1.1, 114.114.114.114。所以大家往下看时 最好对网络已有一些基本认识。
作者: kingwilliam    時間: 2019-2-27 11:21

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

01 - 序

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

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

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

02 - v2ray的基本概念

*** 图01 ***
[attach]4308[/attach]

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

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

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

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

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

如要用文子表述 入 和 出

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

郊外
入 - 接收由 桥 过来的 要求 後解密。
出 - 处理 市内 入 的 要求,找到後原路返回。
作者: kingwilliam    時間: 2019-2-27 11:25

本帖最後由 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. }
複製代碼
这样大家是否容易理解。
作者: kingwilliam    時間: 2019-2-27 11:35

本帖最後由 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. }
複製代碼

作者: kingwilliam    時間: 2019-2-27 11:35

本帖最後由 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设定档,已經可以运行。
作者: kingwilliam    時間: 2019-2-27 11:36

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

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

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

*** 图02 ***
[attach]4307[/attach]

如 图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. }
複製代碼

作者: kingwilliam    時間: 2019-2-27 14:13

本帖最後由 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: 有甚麽用?在一份旧的使用手册有以下描述:

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


- "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。(留代最後附录才簡述)

“ 终极服务器”就留给各位折腾吧。 现在继续上路。
作者: kingwilliam    時間: 2019-2-27 14:14

本帖最後由 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第一个出站口 即 预设 出站。
作者: kingwilliam    時間: 2019-2-27 14:14

本帖最後由 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 技术在代理环境中的应用
作者: kingwilliam    時間: 2019-2-27 14:14

本帖最後由 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 只需要在客户端启用,服务器端自动适配”。官网已说明了,不用再解说。


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个功能  自问因没了解过,所以就不写了。
作者: kingwilliam    時間: 2019-2-27 14:14

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

11 - 小结

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

再住下走,就已离开入学范围,进入“兴趣编”。
作者: kingwilliam    時間: 2019-2-27 14:15

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

13 - 反向代理

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

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

*** 图03 ***
[attach]4313[/attach]
上图正是官网所说的 多入站,多路由,多出站 架构

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

因代码有点长,所以分了段落和简化。
先上客户端
=== 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. ]
複製代碼
。。。後续。。。
作者: kingwilliam    時間: 2019-2-27 14:15

本帖最後由 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

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

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

喜欢如何运用v2ray搭桥过河,就留给大家“八仙过海 各显神通”
作者: 角色    時間: 2019-2-27 14:24

谢谢CHing能抽出非常宝贵的时间为了一些我们走过小白的阶段,从不同角度去探讨怎样使用Project V中的V2Ray。其实我写透明代理都是得到师兄的提点才能成功,不然光看官网和白话文都实现不出来,特别是官网,很多都没有例题,当时看真的看不懂官网,幸好有白话文才能懂一点点,现在呢?比我之前好很多!只要有像CHing这样无私奉献,让很多小白(像我之前的我)都能获益不浅!!!

大家小白(包括我)不懂的地方可以跟帖讨论,那么大家学起来就比较有趣。

kingwilliam CHing 加油!
作者: vpn-learner    時間: 2019-2-28 23:20

回復 5# kingwilliam


    请教师兄,config.json 中的逗号 和 括号 有什么要注意的地方? 我是过在加 shadowsocks 和 Vmess 账号时,就不成功,也不知自己错在哪里?!
网上的教程我又不太了解, 像我这样的小白很难明白!@-@
望师兄指教。谢谢!
作者: kingwilliam    時間: 2019-3-1 06:31

本帖最後由 kingwilliam 於 2019-3-1 07:15 編輯

回復 17# vpn-learner


    可否張你有問題的 代碼 放上來, 一齊研究.

記得先刪除 服務器 端口 密碼 這些參數
作者: kingwilliam    時間: 2019-3-7 18:27

本帖最後由 kingwilliam 於 2019-8-24 07:41 編輯

15 - 负载均衡器 (balancer)

如果您 郊外 有多於1個 服務器 就可運用“负载均衡器”這功能,分散運用,避免長期使同用1個郊外服務器。

先在client outbounds建立所有郊外服務器資料。
  1. "outbounds": [
  2.    {
  3.       "tag": "svr1",
  4.       ...
  5.    },
  6.    {
  7.       "tag": "svr2",
  8.       ...
  9.    },
  10.    {
  11.       "tag": "svr3",
  12.       ...
  13.    }
  14. ]
複製代碼
再在routing建立balancers group和routing rules,
  1. "routing": {
  2.    "balancers": [
  3.       {
  4.          "tag": "group1",
  5.          "selector": [
  6.             "svr1",
  7.             "svr2",
  8.             "svr3"
  9.          ],
  10.          "tag": "group2",
  11.          "selector": [
  12.             "svr1",
  13.             "svr3"
  14.          ]
  15.       }
  16.    ],
  17.    "rules": [
  18.       {
  19.          "type": "field",
  20.          "network": "tcp,udp",
  21.          "balancerTag": "group1"  
  22.       }
  23.    ]
  24. }
複製代碼
可以这样理解上面的设定

作者: kingwilliam    時間: 2019-3-7 19:55

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

16 - 附录

在第7节“强化“桥”的基础”最後部份讲到“如何用reverse proxy(反向代理)和 web server(真正的网站)保护和隠藏v2ray”。

例:v2ray 用ws+tls port 443 path /v2path/
域名 : www.test123.com.cn
ip : 111.111.111.111

先解说如服务器直接上网有甚麽问题?

问题来了


如 问题1+问题2 这个ip或域名就!!!大有可疑!!!。真实例子

这就是为甚麽,老生常谈也是这句“做戏要做全”。

所以要加入 reverse proxy(反向代理)做保护,这个反向不是v2ray那个,是一个真正的如 HAPROXY 或 SQUID。他有如大门口的保安,每次有人访问,他都会问你找谁,答不出不给他过。就是用来防止有人试探ip如“问题2”(这只是反向代理其中一个功能,也可在同1个ip同1个端口443,跟据不同SNI,转发到後台不同服务或服务器)

如答对了"www.test123.com.cn",这个人就会顺利通过反向 到达之後的网站。这时他会看见一个你想给他看的网站,这样就解决了“问题1”

那麽v2ray在那?

先解说网站的基本架构,跟目录一样,有很多子目录如下
  1. /index.html
  2. /pic/
  3. /doc/
  4. /script/
  5. /cgi-bin/
  6. /php/
  7. ...
  8. ...
  9. /v2path/
  10. ...
  11. ...
複製代碼
/v2path/就是很多子目录内其中之一,这就等同打哑谜游戏,不告知您密室机关在那,您永远不会知在厨房右上角第三格磁砖一样。否则同入到一个普通厨房一样,没甚麽特别。

这样就可以用反向代理保护网站,再用网站隠藏v2ray。

所以服务器一定要准备:
1。一个真正的域名
2。一张真正的电子证书


***最後,如v2ray也更新上 TLS 1.3 时候(我想不会太久),这时上网也就更安全。***2019年5月18日v4.18.2已支援
***但要连SNI也给加密,恐怕也要等多好几年,因ESNI(Encrypted Server Name Indication),到2019年5月24日今天还没定案***
作者: kingwilliam    時間: 2019-3-10 11:09

本帖最後由 kingwilliam 於 2019-3-22 18:46 編輯

17 - WS + TLS + WEB

先看看 白话文教学 WS+TLS+WEB 有这一节介绍。

*** 图04 ***
[attach]4314[/attach]

先了解加入web server後,服务器要如何配合。


在第7节WS+TLS开绐,“桥”就加入TLS作保护,但图就没刻意表示。现在图04就表示TLS方便理解。
web server在客户端是透明的,所以客户端不用配合,但同样要设定TLS。
web server有保护和隠藏v2ray的功用,在这个架构下还有脱去TLS外衣,张桥交给服务器的功能。所以服务器不用设定TLS。

场景:
web+v2ray在同一个伺服器
web: port 443, v2ray path:/v2path/
v2ray: ws, port:10443, path:/v2path/

先理解运作流程:
客户端发出ws+tls+/v2path/要求 -> web接收後,脱去TLS外衣,张ws+/v2path/ redirect到127.0.0.1:10443

因web server可以有很多选择, 大家可以参考 白话文教学 WS+TLS+WEB.

*** 申请domain ***
[attach]4315[/attach]
这张图就给大家对URL每部份都有基本认识。
FQDN = hostname + domain name + TLD

如可以,可自行到www.godaddy.com申请一个domain,如:"test001.info"都只是 hk$23/年

godaddy本身已有免费dns parking服务,但就没dynamic update,如大家现在的服务器是有fixed IP就没问题,如需要dynamic update,就建议dns.he.net。他们的dns parking服务是可以dynamic update,更窝心的是每一个host都可以有各自的update password。同样是免费的。

即是老婆的 wife.test001.info 一个update password
外(面的老)婆 wife2.test001.info 又是另一个update password

自己有一个domain好处就是可以有无限多个hosts,当然如只用来过河,我会建议用最平的就可以,因每年续的价钱未必最平。

Remarks : DNS服务最基本的就是每个hosts都要给1个A record 即ipv4地址

*** 申请电子证书 ***
申请domain不是每个人都有需要,如已有noip或dyndns. 就可以直接申请一张真正的电子证书,还是免费的。但每3个月要续一次。
免费的可以到www.sslforfree.com

[attach]4317[/attach]

他们要确认你是这个FQDN的持有人,方法有3
1。准备 这个FQDN 的 ftp 给他们下载一个档案
2。准备 这个FQDN 的 http 给他们下载一个档案
3。在 这个domain 的 DNS 加入一个TXT Record给他们确认你是这个domain持有人。

通个後,网页就会出现你的 public key 和 private key

可參考 如何申請免費SSL?又要怎麼安裝SSL?(以SSL For Free – Let’s Encrypt為例)
作者: kingwilliam    時間: 2019-3-13 20:18

本帖最後由 kingwilliam 於 2019-3-14 19:35 編輯

  

因自己真的不太会linux,所以原先不准备解说如何隠藏服务器。但最後都尽我一点点所知分享,希望对大家有用。如有错误请指正。

这个彩蛋不会出现在contet page,因真的显丑。

caddy nginx apache,三选一的话,个人会选caddy,因设定简单。

*** 因本人是用ubuntu,所以 以下都是已ubuntu做base ***
参考网页
https://hostadvice.com/how-to/ho ... n-ubuntu-18-04-vps/

* install
  1. $ curl https://getcaddy.com | bash -s personal
複製代碼
* Configure Caddy
  1. $ sudo mkdir /etc/caddy
  2. $ sudo chown -R root:www-data /etc/caddy
  3. $ sudo mkdir /etc/ssl/caddy
  4. $ sudo chown -R www-data:root /etc/ssl/caddy
  5. $ sudo chmod 0770 /etc/ssl/caddy
  6. $ sudo touch /etc/caddy/Caddyfile
  7. $ sudo mkdir /var/www
  8. $ sudo chown www-data: /var/www
複製代碼
* Create Caddy Systemd service unit
参考网页
https://computingforgeeks.com/in ... h-lets-encrypt-ssl/
  1. $ wget https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service
  2. $ sudo cp caddy.service /etc/systemd/system/
  3. $ sudo chown root:root /etc/systemd/system/caddy.service
  4. $ sudo chmod 644 /etc/systemd/system/caddy.service
  5. $ sudo systemctl daemon-reload
複製代碼
*建立网页
参考网页
https://linuxhint.com/install_caddy_server_ubuntu/
  1. [code]
  2. $ sudo mkdir /var/www/mysite
複製代碼
/var/www/mysite/index.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>This page is servered by Caddy Server</title>
  5. </head>
  6. <body>

  7. <h3>This page is servered by Caddy Server</h3>
  8. <p>This is a paragraph.</p>

  9. </body>
  10. </html>
複製代碼
测试
参考网页
https://linuxhint.com/install_caddy_server_ubuntu/
  1. $ cd /var/www/mysite
  2. $ caddy
複製代碼
如这服务器ip是192.168.55.66
就用browser http://192.168.55.66:2015
  1. This page is servered by Caddy Server
  2. This is a paragraph.
複製代碼
如见到以上两行字,这就表示web server and web page都已正常运作

*建立FQDN
例:
FQDN: wife2.test01.com.cn
v2ray path : /v2path
v2ray service : ws, port:10443, path:/v2path
/etc/ssl/caddy/cert.crt <-证书
/etc/ssl/caddy/cert.key <-密钥
  1. $ nano /etc/caddy/Caddyfile
  2. wife2.test01.com.cn
  3. {
  4.         proxy /v2path localhost:10443 {
  5.                 websocket
  6.                 header_upstream -Origin
  7.         }
  8.         tls /etc/ssl/caddy/cert.crt /etc/ssl/caddy/cert.key
  9.         root /var/www/mysite
  10. }
複製代碼
到这里,大家应该已可隠藏服务器。
index.html 大家可以参考一些 login page. 做最基本假象。但如有一些旅游网或blog就更好。

以下是一些login page sample.
https://speckyboy.com/login-pages-html5-css/

希望帮到大家

index.html.zip是login page的sample, 内有2个档案,index.html, style.css 要放在同一个目录
[attach]4319[/attach]
[attach]4320[/attach]
作者: kingwilliam    時間: 2019-3-28 18:51

本帖最後由 kingwilliam 於 2019-4-6 11:23 編輯

18 - (WS/H2)+ TLS + Caddy 范例

如 服务器 正常 ws+tls
  1. "streamSettings": {
  2.         "network": "ws",
  3.         "wsSettings": {
  4.                 "path": "/vpath2/"
  5.         },
  6.         "security": "tls",
  7.         "tlsSettings": {
  8.                 "certificates": [
  9.                         {
  10.                                 "certificateFile": "/etc/v2ray/cert/cert.crt",
  11.                                 "keyFile": "/etc/v2ray/cert/cert.key"
  12.                         }
  13.                 ]
  14.         }
  15. }
複製代碼

当加入 Caddy 再配合 ws+tls 时,电子证书就要由v2ray转移到Caddy
Caddyfile
  1. www.mydomain.com
  2. {
  3.         proxy /vpath2/ localhost:44301 {
  4.                 websocket
  5.                 header_upstream -Origin
  6.         }
  7.         tls /etc/ssl/caddy/cert.crt /etc/ssl/caddy/cert.key
  8.         root /var/www/mysite
  9. }
複製代碼

config.json
  1. "streamSettings": {
  2.         "network": "ws",
  3.         "wsSettings": {
  4.                 "path": "/vpath2/"
  5.         }
  6. }
複製代碼



如 服务器 正常 h2+tls
  1. "streamSettings": {
  2.         "network": "h2",
  3.         "httpSettings": {
  4.                 "path": "/vpath2/"
  5.         },
  6.         "security": "tls",
  7.         "tlsSettings": {
  8.                 "certificates": [
  9.                         {
  10.                                 "certificateFile": "/etc/v2ray/cert/cert.crt",
  11.                                 "keyFile": "/etc/v2ray/cert/cert.key"
  12.                         }
  13.                 ]
  14.         }
  15. }
複製代碼

当加入 Caddy 再配合 h2+tls 时,电子证书 要保留在v2ray,同时要拷贝到Caddy
Caddyfile
  1. www.mydomain.com
  2. {
  3.         proxy /vpath2/ https://localhost:44301 {
  4.                 insecure_skip_verify
  5.                 header_upstream host "www.mydomain.com"
  6.         }
  7.         tls /etc/ssl/caddy/cert.crt /etc/ssl/caddy/cert.key
  8.         root /var/www/mysite
  9. }
複製代碼

httpsetting要加入 "host" 参数
config.json
  1. "httpSettings": {
  2.         "host": "www.mydomain.com",
  3.         "path": "/vpath2/"
  4. }
複製代碼

作者: kingwilliam    時間: 2019-3-28 21:39

本帖最後由 kingwilliam 於 2019-3-30 08:25 編輯

19 - 进行 TLS 通讯时,可以关闭 VMess 的加密。

!!! 以下方式只适用於 TLS加密场景 !!!
!!! 以下方式只适用於 TLS加密场景 !!!
!!! 以下方式只适用於 TLS加密场景 !!!


原文出於:官网 QUIC

“QUIC 强制要求开启 TLS,在传输配置中没有开启 TLS 时,V2Ray 会自行签发一个证书进行 TLS 通讯。在使用 QUIC 传输时,可以关闭 VMess 的加密。”

但 “进行 TLS 通讯时,可以关闭 VMess 的加密”。不只可用於HTTP/3(即QUIC),同时也适用於HTTP/2和HTTP/1.1(包括TCP和WS)。

可以这样理解,TLS=集装箱,VMSS+加密=夹万。

如果 你的宝贵资料先放入“夹万”,再张“夹万”放入“集装箱” 才进行运输,你的资料就保正安全(在今天还是)。
但这样就有点“架床叠屋”,因“集装箱”已可保正你的资料安全,所以就可不用“夹万”
(不用“夹万”还有一个好处,就是只需加密1次,不用加密2次,少了一次加密,对一些cpu不太高的设备应该有点帮助)

在“07 - 强化“桥”的基础”时出现过以下例子

=== 客户端 出 的例子 ===
=== 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.                }
  14.             ]
  15.          }]
  16.       }
  17.    }
  18. ]
複製代碼

如何“关闭 VMess 的加密”?
就是在 security 参数 转 none
  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": "none"
  13.                }
  14.             ]
  15.          }]
  16.       }
  17.    }
  18. ]
複製代碼

只需客户端设置,服务器自行适应。
作者: kingwilliam    時間: 2019-7-10 13:00

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

20 - WS + TLS + CDN(CloudFlare) + WEB

去到这里 WS + TLS  相信已没问题,就算加入Web Server大家也可应付。

- 加入Content Delivery Network(CDN)有甚麽好处?

延迟 和 稳定  不是所有人多有改善,已我的个案为例,用了大约3天,2方面都有改善.
(可參考這個網頁: 大佬们有没有cloudflare的亚洲ip)

- 当然有好处,也会有坏处


CF须然国内也有服务,就因没ICP备案所以也不能申请,以我的例子 最近的CDN Node在美国加利福尼亚州,
但ping time比我现在还好 以下是我中午12点的测试
ping CDN ~25ms
ping HGC IP ~80ms

FTP file transfer
经CDN ~8-10Mbit/s
直连HGC ~16Mbit/s

入正题,开始
* 01. 一个真实和你可全掌控的 domain name (如:example.com)
* 02. 到www.cloudflare.com申请account
* 03.成功建立account後就要放入domain
[attach]4413[/attach]
* 04.放入domain後就要建立你的 SERVER 资料
- TYPE 选 A 就可以,即是用ipv4
- NAME键入你的HOST Name(如:www.example.com 就建入www, photo.example.com 就入photo)
- IPv4 address 你的VPS IP
- TTL Automatic 就可以
- 最後“云”的图案有2个选择,灰就不用CDN, 橙就启用CDN.
[attach]4414[/attach]
* 05. 记得到你申请domain网页 修改你domain 的 Name Server.
[attach]4416[/attach]
* 06. 在Crypto设定电子证书
[attach]4417[/attach]
* ssl - Full (strict)
* Order SSL Certificate - Universal SSL 就可以
* Origin Certificates - Create Certificate
(之後会显示 crt 和 key, 这时要先copy出来save to file,因过後安全问题只能看见crt已没有key. 如真的没了, 只要删除旧电子证书再建立新的就可以。)
[attach]4418[/attach]
* Always Use HTTPS - ON
* Minimum TLS Version - TLS 1.2
* TLS 1.3 - Enabled+0RTT
* Automatic HTTPS Rewrites - Off

Others :
* HTTP Strict Transport Security (HSTS) - 自行决定
* Authenticated Origin Pulls - 如想你的VPS减少不必要的干扰,可考虑选用“Authenticated Origin Pulls” - 这个可自行决定
- 一般情况下,只有client看电子证书,确认要连接的服务器是你要的服务器,这时服务器可以说是来者不佢,如启动了这功能,服务器就可以只接受CF过来的要求。

=====
Q:为何选 Websocket 而不用HTTP/2?
短A:因CF还没完全支援HTTP/2所以只能用WS.
长A:因CF有说明 CF入站支援HTTP/2, 但CF与VPS之间只能HTTP/1.1.


如果大家要加入CDN,CloudFlare(CF)相信是今天唯一选择,何解?国内有很多CDN服务单位(如:Baidu, Alibaba , Tencent), 因他们都要求你的网站先要有 工信部网站备案(即ICP),没ICP就不能申请CDN。唯独CF可没有ICP也能用CDN,还是“免费”。(其实CF-CDN不是完全免费,有很多部份是要收费的,但免费部份已完全足够v2ray所需)。
作者: kingwilliam    時間: 2019-7-25 12:11

本帖最後由 kingwilliam 於 2019-8-6 16:11 編輯

R01 - 反向代理 或 {VPN} over dokodemo

现有问题

- 因“反向代理”成功建立连线後客户端的port口会一直用到中断。就是这一长时间连线会引起“墙”的注意,“墙”会主动断开这个连接,当v2ray发现连接断开後,会开一个新的port口再发起连接,就是这样不断循环最终引至“墙”封锁server side listening port{ 以上是我正在面对的问题 }
- 就算不是"反向代理",如客户端用例如openvpn over dokodemo. 也会出现同一情况{ 以上是我正在面对的问题 }
- 如在“墙”的位置看,有一个连接长时间连接不断,“墙”主动断开,但好快又再连接,再断再连接,结论就是“有一不知名服务在运作”
{ 以上纯是个人推测 }

所以在这建议各位,如有用 "反向代理" 或 "{VPN} over dokodemo",在还没有解决方案前,小心给“墙”发现你正在"暗度陈仓"。


=== 2019.07.23 07:44 ===[start]
在官網未有解決方法前,可用現有工具自組方案處理,須未必是最好,但總比沒有好。

解決方法思路:形勢比人弱時,最好的方法是主動出擊。與其等"牆" 中斷連線,不如自行restart service 重新取一個新端口。

但 不選擇restart v2ray 因個人覺得不是好辦法。所以不選這方案。

因不restart v2ray 就不能另返向代理重新連接,所以決定放棄官方返向代理(自組返代 下文詳述)

因我有用openvpn 所以我就用 schedule restart openvpn client 去完成 轉客戶端 tcp端口 和用openvpn做反向代理。

(已終止)
=== 2019.07.23 07:44 ===[end]

原先準備在client side restart openvpn every 3mins, 引發client取一個新port, 避免長時間用同一port口引起“墙”的關注。
但看來“墙”不只看一個port口conection time, 還會看client mac address -> server mac address 兩個mac address之間的connection time.即不管你多少時間轉多少port, 只要一段時間兩個mac address持續連接就會被“墙”   “暫停你連接你的server”   

原來自己真的太天真,“墙”真的不好應付,現在還是停用“反向代理”同“{VPN} over dokodemo”比較好。
作者: kingwilliam    時間: 2019-8-13 20:32

本帖最後由 kingwilliam 於 2019-8-13 20:53 編輯

R02 - 不要钻牛角尖 websocket + http/2

如已运用到“炉火纯青”的时候,难免会挑战难到,但也不要有钻牛角尖的意图,如websocket + http/2,何解?因已有人提问,也有完美答案。(因我也想过 哈哈哈)

节录:
。。。“websocket就是http1.1,一旦成为http2了就没有websocket了(因为http2协议包含了websocket的功能了,你可以理解为融为一体了,也可以理解为http2就是websocket的升级版)”。。。

全文:
[纯讨论]v2ray+websocket+tls/v2ray+http2+tls和普通的http2代理有区别吗 #1128




歡迎光臨 電訊茶室 (http://www.telecom-cafe.com/forum/) Powered by Discuz! 7.2