標題:
淺談 v2ray 配置
[打印本頁]
作者:
kingwilliam
時間:
2019-10-16 10:27
標題:
淺談 v2ray 配置
本帖最後由 kingwilliam 於 2019-11-3 12:49 編輯
最後更新:2019.11.03
v2ray:v4.20.0还适用
* 因文章比较长,和会不断更新,如大家有题问或讨论,可到以下角色师兄帖子一起讨论。
*
Project V:入学编 —— members 讨论篇
00 - 前言
01 - Routing
02 - 内置 DNS 服务器
* * * 代 续 * * *
作者:
kingwilliam
時間:
2019-10-16 10:27
本帖最後由 kingwilliam 於 2019-10-22 08:23 編輯
00 - 前言
早前撰写了
Project V:入学编
, 当时自己是个初学者, 所以用了初學者的角度出發,等同是初学者有个容易的起步点.
现在自问略有小成, 在一两个范畴可同大家分享一些心得.
为何不在旧的贴子上继续? 因如在 入学编 加入一些中高阶讨论, 可能会吓怕一些初学者. 所以另开一个新贴.
其实还有另一构想,是类似 reference manual, 每一项目 续一细说. 但到现在还没整理好, 希望有机会可同大家分享。
作者:
kingwilliam
時間:
2019-10-16 10:28
本帖最後由 kingwilliam 於 2019-11-3 12:50 編輯
01 - Routing
V2ray 内的routing相信大家已可灵活运用。
所以在这会集中解说 比较少用的 domainStrategy: "AsIs" | "IPIfNonMatch" | "IPOnDemand"
官网
Routing
有这样描述:
域名解析策略,根据不同的设置使用不同的策略。
"AsIs": 只使用域名进行路由选择。默认值。
"IPIfNonMatch": 当域名没有匹配任何规则时,将域名解析成 IP(A 记录或 AAAA 记录)再次进行匹配;
当一个域名有多个 A 记录时,会尝试匹配所有的 A 记录,直到其中一个与某个规则匹配为止;
解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名;
"IPOnDemand": 当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配;
在解说v2ray内置routing前,先轻轻带过domain和IP的关系,如问 先有鸡?还是先有蛋?这会很难回答。但如问 先有domain?还是先有IP?就一定先有IP。因今主宰互联网的是IP网络(网络历史自己找吧), 但如只得IP的话,我想互联网限难发展,看看以下例子:
你知 47.246.24.234 是那个网站吗?还有 104.193.88.77?如不给你domain name前面2组IP转个面就会忘掉,如我说
www.taobao.com
和
www.baidu.com
这就容易记得。这就是domain和IP的关系,domain name 出现最初真的是方便人记的。
现在可入正题,v2ray的routing,预设是"AsIs"即只看domain, 例如
*** 例01 ***
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"domain": [
"baidu.com"
],
"outboundTag": "direct"
}
]
}
複製代碼
例01:如何解读? 即是要去
www.baidu.com
, pic.baidu.com, blog.baidu.com 总之是 *.baidu.com 都走 direct。
*** 例02 ***
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"domain": [
"baidu.com",
"taobao.com"
],
"outboundTag": "direct"
}
]
}
複製代碼
例02:是 *.baidu.com 或 *.taobao.com 都走 direct
*** 例03 ***
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"domain": [
"baidu.com"
],
"domain": [
"taobao.com"
],
"outboundTag": "direct"
}
]
}
複製代碼
例03:但千万不要这样设定,需然这是合法设定,但是你永远去不到 baidu 或 taobao 可解?因 例01 和 例02 是“或”/"or"意思,而 例03 是“同时”/"and"意思,所以 例03 意思是
www.baidu.com
同时
www.taobao.com
就走direct,这世界是不全在的。
*** 例03.a ***
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"domain": [
"baidu.com"
],
"outboundTag": "direct"
},
{
"domain": [
"taobao.com"
],
"outboundTag": "direct"
}
]
}
複製代碼
例03.a:将两个domain分拆成两个独立rules就可行。
现在说说 domainStrategy: "IPIfNonMatch"
一个domain 可以包含多个IP 如:
www.taobao.com
,以下6个IP都是淘宝网站。
47.246.58.233
47.246.58.234
47.88.135.251
47.88.135.252
47.246.1.233
47.246.1.234
*** 例04 ***
"routing": {
"domainStrategy": "AsIs"
"rules": [
{
"domain": [
"baidu.com"
],
"outboundTag": "direct"
},
{
"ip": [
"47.246.1.233"
"47.246.1.234"
],
"outboundTag": "direct"
}
]
}
複製代碼
例04:如我要去
www.taobao.com
,但因routing 设定"domainStrategy": "AsIs",同时rules内没有配合
www.taobao.com
,所以v2ray在没有合适条件下离开routing。
*** 例05 ***
"routing": {
"domainStrategy": "IPIfNonMatch"
"rules": [
{
"domain": [
"baidu.com"
],
"outboundTag": "direct"
},
{
"ip": [
"47.246.58.233",
"47.246.58.234"
],
"outboundTag": "direct"
}
]
}
複製代碼
例05:如我要去
www.taobao.com
,这时routing内的确找不到合适
www.taobao.com
的条件,但因为"domainStrategy"设定了"IPIfNonMatch"所以如去到routing末端还没有合适条件时,routing会问dns将
www.taobao.com
转为IP再重新比对,如
www.taobao.com
有6个IP,v2ray会由第1个IP开始续一配对。
就算配对成工与否,http或https内的SNI也会保留原始
www.taobao.com
,不会转到IP地址。
现在说说 domainStrategy: "IPOnDemand"
在解说"IPOnDemand"前,先重温"IPIfNonMatch"的运作,如运用 例05 去
www.taobao.com
,在第一轮配对时。domain 和ip都没有条件付合,但因"IPIfNonMatch"设定,v2ray会将
www.taobao.com
转为IP再重新匹配。即第一轮配对时没有合适,到第二轮配对时就找到IP配合。
*** 例06 ***
"routing": {
"domainStrategy": "IPOnDemand"
"rules": [
{
"domain": [
"baidu.com"
],
"outboundTag": "direct"
},
{
"ip": [
"47.246.58.233",
"47.246.58.234"
],
"outboundTag": "direct"
}
]
}
複製代碼
例06:就是一碰到IP就即时由domain转换到IP. 在第一轮的第一项在配对时, 当然不配合,但第一轮的第二项在配对时,因碰到是IP条件,所以v2ray即时问dns转换domain到IP作配对。
所以一般情况下,预设值"AsIs"就已足够。
作者:
kingwilliam
時間:
2019-10-16 10:28
本帖最後由 kingwilliam 於 2019-11-3 12:50 編輯
02 - 内置 DNS 服务器
现今国内dns污染已不用多说,但如全用国外dns也会出现geodns 问题,即身在国内翻墙出外 如遇到要去淘宝 你会取了国外网站 而会有超慢和看不到国内东西。 这样就会时常出现 一时要翻墙 一时又不用的情况。 所以project V团队在v2ray内开发了dns项目,用作dns分流。目的就是解决上述问题。但官网也提到
由于 DNS 协议的复杂性,V2Ray 只支持最基本的 IP 查询(A 和 AAAA 记录)。推荐使用本机 DNS 配合一个额外的 DNS 服务器来做 DNS 查询,如 CoreDNS,以使用完整的 DNS 功能。
就是上述因由,所以在这会解说v2ray 内的dns如何运作 为何会建议加入第三方dns伺服器作配合 。
讲到v2ray内的dns伺服器如何运作 不得不提
漫谈各种黑科技式 DNS 技术在代理环境中的应用
。他解说得非常详细。但又真的非常巨细无遗 所以会看得有点累 我会节录一部份用来解说 还会加入一些个人说明作补充。
在开始解说前,先基本了解互联网两个同速度有关的指标
延迟(Latency):一个封包从来源端送出後,到目的端接收到这个封包,中间所花的时间。
频宽(Bandwidth):传输媒介的最大吞吐量(throughput)。
如想详细了解,可参考
网路的延迟(Latency)与频宽(Bandwidth)是什麽
重点是 延迟 和 频宽 是两个独立项目 没有任何关系 即你的上网是 10Mbit/s 100Mbit/s 甚至是 1Gbit/s 在同一传送媒体下 两者 是没关联的。
*** 例201 *** "domainStrategy": "AsIs"
{
"dns": {
"servers": [
{
"address": "114.114.114.114",
"port": 53,
"domains": ["geosite:cn"]
},
"address": "8.8.8.8"
]
},
"routing": {
// "domainStrategy": "AsIs",
"rules": [
// direct-domain
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
// direct-ip
{
"type": "field",
"ip": [
"geoip:cn",
"geoip:private"
],
"outboundTag": "direct"
}
]
},
"inbounds": [
// socks:1080
{
"tag": "socks-in",
"protocol": "socks",
"port": 1080,
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
// default_out
{
"tag": "default_out",
"protocol": "vmess",
"settings": {
},
},
//direct
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
]
}
複製代碼
请紧记 v2ray 流悜是 inbounds -> routing -> outbounds
我相信 例201 是现在一般所用的设定, 现在开始讲解流程,
浏览器发出访问
www.google.com
要求
inbounds(socks:1080)会接收这个要求.
routing 会看direct-domain是不是geosite:cn
routing 再看是不是geoip:cn 或 geoip:private
routing 最後 在没有合适条件下离开routing
outbounds 因routing内没有付合任何要求,所以outbounds会用第一设定 在例201即default_out 上网。
例201 的流程如下:
inbounds -> routing -> outbounds
这时dns还没参与运作。
作者:
kingwilliam
時間:
2019-10-16 10:29
本帖最後由 kingwilliam 於 2019-11-3 12:50 編輯
例201 和 例202 coding是一样的,只是"domainStrategy"不同
*** 例202 *** "domainStrategy": "IPIfNonMatch"
{
"dns": {
"servers": [
{
"address": "114.114.114.114",
"port": 53,
"domains": ["geosite:cn"]
},
"address": "8.8.8.8"
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
// direct-domain
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
// direct-ip
{
"type": "field",
"ip": [
"geoip:cn",
"geoip:private"
],
"outboundTag": "direct"
}
]
},
"inbounds": [
// socks:1080
{
"tag": "socks-in",
"protocol": "socks",
"port": 1080,
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
// default_out
{
"tag": "default_out",
"protocol": "vmess",
"settings": {
},
},
//direct
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
]
}
複製代碼
请紧记 v2ray 流悜是 inbounds -> routing -> outbounds
现在将"domainStrategy"设定 "IPIfNonMatch",看看流程会有甚麽变化。
浏览器发出访问
www.google.com
要求
inbounds(socks:1080)会接收这个要求
routing 会看direct-domain是不是geosite:cn
routing 再看是不是geoip:cn 或 geoip:private
routing 最後 routing内没有合适要求
***因"domainStrategy" 是 "IPIfNonMatch" 所以这时v2ray会问内置dns取
www.google.com
IP地址***
dns 会看看要查询的域名是不是 geosite:cn 如是就用114.114.114.114
dns 如要查询的域名不付合上面条件,所以会用预设dns 即8.8.8.8 查询
***这时会再入routing查找8.8.8.8走那一个outbound***
routing 会看direct-domain是不是geosite:cn
routing 再看是不是geoip:cn 或 geoip:private
routing 最後在没有合适条件下离开routing
outbounds 因routing内没有付合8.8.8.8任何要求,所以outbounds会用第一设定 在例202即default_out 上网问8.8.8.8取
www.google.com
IP地址
***但还没完结, 这是只取到
www.google.com
的IP地址。因触发点"domainStrategy" 是 "IPIfNonMatch"所以要再走一次routing(如不明白为何要走多次routing, 请参考01 - Routing "IPIfNonMatch" 部份)***
routing 会看direct-domain是不是geosite:cn
routing 再看是不是geoip:cn 或 geoip:private
routing 最後 在没有合适条件下离开routing
outbounds 因routing内没有付合任何要求,所以outbounds会用第一设定 在例202即default_out 上网
例202 的流程如下:
inbounds -> routing(1) -> dns -> routing(2) -> outbounds(1) -> routing(3) -> outbounds(2)
第一次outbounds(1) 是要去8.8.8.8取
www.google.com
IP地址
第二次outbounds(2)才要去
www.google.com
上网
作者:
kingwilliam
時間:
2019-10-16 10:29
本帖最後由 kingwilliam 於 2019-11-3 12:51 編輯
例201 和 例202 是讲解如 socks 或 http inbounds, 以下会解说 透明代理时 dokodemo, dns 和 http/https 或 非http/https的流程。
以下coding 会原用 例201 再加入 routing dns, inbounds dns dokodemo 和 outbound dns 部份, 因原用 例201 所以留意 "domainStrategy": "AsIs"
*** 例203 *** 会加入coding
"routing": {
"rules": [
// dns
{
"type": "field",
"inboundTag": "dns-in",
"outboundTag": "dns-out"
}
]
},
"inbounds": [
// dokodemo-door:53
{
"protocol": "dokodemo-door",
"port": 53,
"tag": "dns-in",
"settings": {
"address": "114.114.114.114",
"port": 53,
"network": "udp,tcp"
}
},
// dokodemo-door:1088
{
"protocol": "dokodemo-door",
"port": 1088,
"tag": "tproxy-in",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"network": "tcp,udp",
"followRedirect": true
}
}
],
"outbounds": [
// dns
{
"tag": "dns-out",
"protocol": "dns"
},
],
複製代碼
*
*
因coding太长, 所以由 例204 开始coding会适量简化, 简化後部份会用 ... 代替
*
*** 例204 *** (例201 + 例203)
{
"dns": {
"servers": [
{
"address": "114.114.114.114",
"port": 53,
"domains": ["geosite:cn"]
},
"address": "8.8.8.8"
]
},
"routing": {
// "domainStrategy": "AsIs",
"rules": [
// direct-domain
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
// direct-ip
{
"type": "field",
"ip": ["geoip:cn","geoip:private"],
"outboundTag": "direct"
},
// dns
{
"type": "field",
"inboundTag": "dns-in",
"outboundTag": "dns-out"
}
]
},
"inbounds": [
// socks:1080
{
"tag": "socks-in",
"protocol": "socks"
...
},
// dokodemo-door:53
{
"protocol": "dokodemo-door",
"port": 53,
"tag": "dns-in",
"settings": {
"address": "114.114.114.114",
"port": 53,
"network": "udp,tcp"
}
},
// dokodemo-door:1088
{
"protocol": "dokodemo-door",
"tag": "tproxy-in",
...
}
],
"outbounds": [
// default_out
{
"tag": "default_out",
"protocol": "vmess",
"settings": {...},
},
//direct
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
// dns
{
"tag": "dns-out",
"protocol": "dns"
},
]
}
複製代碼
在讲解前有几点要留意
inbounds dokodemo dns-in 有114.114.114.114, 但 dns server同时也有 114.114.114.114, 有需要吗? 答案:有需要, 因用途不同。
在inbounds 加入 dokodemo dns in 时, 最好同时在routing加入 dns 作拦截, 原因, 下面解说.
outbounds dns 只会拦截 A 和 AAAA record
请紧记 v2ray 流悜是 inbounds -> routing -> outbounds
因透明代理除了会处理浏览器上网外,还要处理其他上网如FTP或电邮.
以下会用 ftp 作例子
(有些ftp客户可用socks/http proxy, 但以下会用直连作例)
如ftp要去 ftp.ibm.com
***因ftp是要用ip去连接,所以ftp client会先问dns取IP地址***
inbounds dns-in收到要求
routing dns 拦截dns-in 会跳到outbounds dns-out
outbounds dns-out 是不是要查A或AAAA记录? 如是就跳上 dns server
dns 域名是不是 geosite:cn 如是就用114.114.114.114
dns 如域名不付合上面条件,所以会用预设dns 即8.8.8.8查询
routing 会看8.8.8.8是不是geosite:cn
routing 再看8.8.8.8是不是geoip:cn 或 geoip:private
routing 最後在没有合适条件下离开routing
outbounds 因routing内没有付合8.8.8.8任何要求,所以outbounds会用第一设定 在例204即default_out 上网问8.8.8.8取ftp.ibm.com IP地址。
***这时ftp会收到由v2ray传回的IP地址***
inbounds tproxy-in接收要求
routing 会看 IP地址 是不是geosite:cn
routing 再看 IP地址 是不是geoip:cn 或 geoip:private
routing 最後在没有合适条件下离开routing
outbounds 因routing内没有付合 IP地址 任何要求,所以outbounds会用第一设定 在例204即default_out 上网
例204 的流程如下:
ftp client -> inbounds dns-in -> routing(1) -> dns-out -> dns server -> routing(2) -> outbounds(1)
ftp client -> inbounds tproxy-in -> routing(3) -> outbounds(2)
以下会用 电邮客户端 作例子
如电邮要寄去 @ibm.com 如电邮伺服器FQDN(即MX纪录)是 email.ibm.com
***因 电邮 是要先取得MX纪录, 所以 电邮客户端 会先问dns取MX纪录***
inbounds dns-in收到要求
routing dns 拦截dns-in 会跳到outbounds dns-out
outbounds dns-out 是不是要查A或AAAA记录? 如是就跳上 dns server
***但电邮是要先取得 MX记录 (留意不是取IP地址)
因不是查A或AAAA记录, 所以会原用dns-in 即接问114.114.114.114取MX纪录 (这时已直接离开v2ray)
***这时 电邮客户端 会收到由v2ray传回 email.ibm.com***
inbounds dns-in收到 电邮客户端 要求 email.ibm.com 的 IP地址
routing dns 拦截dns-in 会跳到outbounds dns-out
outbounds dns-out 是不是要查A或AAAA记录? 如是就跳上 dns server
dns 域名是不是 geosite:cn 如是就用114.114.114.114
dns 如域名不付合上面条件,所以会用预设dns 即8.8.8.8查询
routing 会看8.8.8.8是不是geosite:cn
routing 再看8.8.8.8是不是geoip:cn 或 geoip:private
routing 最後在没有合适条件下离开routing
outbounds 因routing内没有付合8.8.8.8任何要求,所以outbounds会用第一设定 在例204即default_out 上网问8.8.8.8取email.ibm.com IP地址。
***这时 电邮客户端 会收到由v2ray传回的IP地址***
inbounds tproxy-in接收要求
routing 会看 IP地址 是不是geosite:cn
routing 再看 IP地址 是不是geoip:cn 或 geoip:private
routing 最後在没有合适条件下离开routing
outbounds 因routing内没有付合 IP地址 任何要求,所以outbounds会用第一设定 在例204即default_out 上网
例204 的流程如下:
email client -> inbounds dns-in -> routing(1) -> dns-out
email client -> inbounds dns-in -> routing(2) -> dns server -> routing(3) -> outbounds(1)
email client -> inbounds tproxy-in -> routing(4) -> outbounds(2)
在 电邮客户端 例子第5步骤 大家都看到 outbounds dns 如何处理不是查询A或AAAA纪录的方法, 就是直接用inbounds dns-in带来的伺服器地址问非A或AAAA纪录
而dns server只会查询A或AAAA纪录
作者:
kingwilliam
時間:
2019-10-16 10:29
本帖最後由 kingwilliam 於 2019-11-3 12:52 編輯
如果你的v2ray只用socks,http/https proxy 而domainStrategy设定"AsIs". 这时dns server可不用设定, 因在例201已显示内置dns这时不参与运作。
但如果你是运行透明代理, 内置dns会是必然的选择
在02 - 内置 DNS 服务器, 有简述 延迟(Latency)是甚麽, 但跟dns有甚麽关联?
先打一个譬喻, 一架普通的私家车如想改装成可在赛车场奔驰,可以换引擎, 车身换炭化纤维去大幅曾提升马力。但如一架已是跑车,想再改装成赛车, 已不再是换甚麽,而是在没想到的地方修改,如车身流线型,架驶者体重在最细微的地方续一改善续一提升。
上面用了比较多的篇幅和代码讲解v2ray内置DNS如何参与和如何运作。
所以官网提及要外加第三方dns作埴补非A和AAAA纪录部分。
其实第三方dns部分可以用114或ISP给你的dns作应用就可以。但国内上网质素大家有目共睹,连114也有机会连不上。如要访问8.8的话 你的vps在香港还好 如在越洋西岸 ping time 140ms我相信已是快速。
综合上面情况 所以在本地加入第三方dns有助提升上网反应。对!是反应,因dns server可加入cache 功能,在TTL 有效范围内不用每次连接114或8.8 重而加快上网反应。
说了那麽多, 反应可加快多少? 直接给数据
12:08:11 : "A IN www.google.com 0.537204365s
12:08:31 : "A IN www.google.com 0.000104999s
複製代碼
在 12:08:11 第一次要求
www.google.com
A record, 经过v2ray一来一回要 0.537204365s
在 12:08:31 再要求
www.google.com
A record, 但因之前已查询过, 所以coredns直接回覆, 只需要 0.000104999s
反应快了多少? 0.537204365s / 0.000104999s 答案是 5116陪
* * * 代 续 * * *
作者:
kingwilliam
時間:
2019-10-16 10:30
* * * 備 用 * * *
作者:
kingwilliam
時間:
2019-10-16 10:30
* * * 備 用 * * *
作者:
kingwilliam
時間:
2019-10-16 10:30
* * * 備 用 * * *
作者:
kingwilliam
時間:
2019-10-16 10:31
* * * 備 用 * * *
歡迎光臨 電訊茶室 (http://telecom-cafe.com/forum/)
Powered by Discuz! 7.2