0%

Linux路由补完计划番外篇 v2ray配置文件详解

前言


上一篇中我简单说明了一下如何使用v2ray进行软路由透明代理的方法,利用v2ray的透明代理的功能,结合iptables数据转发实现了一个效果还不错的透明代理,连接了这台软路由的设备终于可以体验无缝的科学上网了,但我并没有详细的将v2ray的配置文件进行说明,我只是对所需要用到的配置内容进行了一下说明,并没有详细的将其中的注意点提取出来进行归类讲解,v2ray的配置相比于ss等工具而言,真的会复杂很多,但相应的它所能提供的功能也会多一点,本篇将作为一个小笔记,记录我在进行v2ray配置中所遇到及所领悟到的一些心得和技巧,大家就随便看看,有不足的地方希望大家能够理解,毕竟这属于个人的理解,小白们能参考一下,大佬们也不要鄙视

v2ray配置文件主体——json文件格式


v2ray使用了json作为其配置文件的数据格式,它源自于Javascript,现在大部分编程语言都支持对json格式的数据文件进行生成和解析,ss的配置文件同样也使用json格式;能大致的了解json文件的编写方法对于后续的操作很有帮助,此处就稍微说明一下吧!

  • 并列的数据之间用逗号隔开

  • 对象和数值直接用冒号隔开,并且中间需要添加一个空格

  • 存储数据的集合(数组)时候用方括号表示

  • 大括号保存数据对象

利用vscode类似的文本编辑工具会比较容易的实现格式规范,建议初学者以windows上的图形软件为主,vi这样的工具对于普通用户而言还是太高了

v2ray核心协议


v2ray有属于自己的一款通信协议,那就是vmess,它是为了对抗墙深度包检测而研发的,是一种加密协议,v2ray服务端和客户端之间主要使用这个协议进行通信(当然shadowsocks协议也是支持的),但是现在墙已经有针对未知协议进行干扰的规则存在了,所以单纯用它你懂的

协议认证

vmess协议的认证基于时间,所以服务端和客户端之间的时间差不要超过90秒,很多用户就是忽略了这一点造成v2ray不能正常的连接,有能力的建议在服务端上使用ntp定期进行时间同步,不用在乎时区,举个例子:

假设服务器在日本,使用东九区的时间,而中国是东八区,那么两者之间时区相差1小时,不考虑时区就是不考虑这个时区的时间差,而是在时区差之外的时间差

这个差值不能超过90,如果超过了就会认证失败,如果小伙伴连接不正常可以优先考虑一下是不是时间差过大

用户ID

这个用户ID主要有两个作用,一个是用来区分用户,还有一个就类似于密码,使用的是UUID格式,很多用户会一脸蒙蔽,啥是UUID啊?我表示我也不懂,哈哈

生成UUID的方法很简单,最早官方推荐使用这个网站UUID Generator进行生成,打开就会自动生成一个新的,复制粘贴一下就可以了;现在也可以直接使用Linux命令进行生成:

cat /proc/sys/kernel/random/uuid或者/usr/bin/v2ray/v2ctl uuid (这个命令需要v2ray已经正确安装)

加密

vmess协议可以设定不同的加密方式,主要由客户端发起协商,然后服务端接收客户端的请求,然后使用要求的加密方式结合id来对vmess协议进行加密,不管是否加密,它对于墙而言都是未知流量,一样会进行操作,现在v2ray支持的加密方式有这么几种:

  • aes-128-gcm

  • chacha20-poly1305

  • auto

  • none

我个人觉得并没有必要,反正都是未知流量,如果配合tls使用的话,tls本身也会对数据流进行加密,是否进行重新加密对于翻墙效果并没有啥实质性的变化,反而会增加一点服务器开销,也不用担心vmess的安全性,本身它自己也是加密的,多重加密好像是一件吃力不讨好的事情,当然再加个密会让人心理上稍微得到点安慰吧!

针对vmess协议的扩展

酸酸乳兴起的时候,由于其支持对酸酸协议进行协议混淆收获了很多死忠粉,利用其可以模拟http和https流量的特性,让墙无能为力,但是成也萧何败也萧何,这种混淆是经不起推敲的,它只是模拟了这两种常见的网页访问流量,实际上并不是,反而因为一些信息的缺失变成了强特征协议,很容易被墙针对,vmess为了能够有效的规避这样的问题,可以做到完全实现http或者https流量访问,配合nginx和websocket等工具还能做到端口复用,vmess支持的协议主要有一下几种:

  • TCP(最原始,即使用vmess进行裸奔,很容易就会被针对)

  • mKCP(kcp协议的改进款,实际上就是一种udp协议,在udp基础上也可以实现多种场景的模拟,同时也可以拯救那些被tcp阻断的主机)

  • HTTP(不建议使用,HTTP明文传输数据)

  • TLS(使用证书加密的HTTP协议,作为上面HTTP的强化,推荐)

  • WebSocket(支持全双工通信的一种协议,支持扩展,具有较好的数据压缩效果,可以保持连接状态)

  • HTTP/2(新版本的HTTP协议,虽然协议规范上没有要求一定要加密,但基本上都会配合TLS一起使用;协议本身具有一定的争议性,但这些并不是普通用户所需要关注的)

  • QUIC(由 Google 提出的使用 UDP 进行多路并发传输的协议,注意它是谷歌推出的,那自然会被墙重点对待,结果可想而知,基本上没啥意义)

基于上述的几个协议情况,结合墙的特性,现在比较推荐的有两种方案,纯TLS或者TLS+WebSocket,本质上只有一种,那就是伪装成TLS流量,毕竟经过Google的推动,今后的大部分网络流量都将是TLS流量,“法不责众”嘛,墙还没有那么强大的性能来对所有的连接进行检测;

TLS和TLS+WebSocket通信都是TLS,前者是将V2Ray模拟成一个web服务器,独占443端口,而后者需要搭配nginx那样的web服务器使用,但支持单口复用,web服务器还能用来提供一些别的服务,一定程度上可以增强混淆能力

如果单纯的用来做科学上网的话以上两种方式个人觉得会比较好用

v2ray功能模块

v2ray以现在的功能来说已经类似于一个小型系统了,对数据的出入和路由选择都能进行调整,而这些功能的实现离不开v2ray的内置功能模块的配合,常用的几个模块的具体构成可参考下图所示:

log inbounds outbounds dns routing
loglevel socks socks hosts domain
error http http servers ip
access vmess vmess network
MTProto freedom port
shadowsocks shadowsocks inboundTag
dokodemo-door blackhole source
user
protocol
attrs

log

设置v2ray启用日志功能,如果你用不到这个的话也没有必要加上,当然启用其会比较方便的查找问题,并不是必须的

inbounds

正如其名,入站连接配置,基本上v2ray上监听配置都在这个位置进行配置,这相当于v2ray的数据入口,可以提供socks连接、透明代理、http代理等,具体可以提供哪种服务还需要考虑v2ray是作为服务端还是客户端

outbounds

出站连接配置,数据的出入取决于v2ray是作为服务端还是作为客户端,一般情况下inbounds和outbounds上的协议都是通用的,此处有几个特例,透明代理MTProto

DNS

v2ray内置的DNS模块,可以基于策略对域名进行解析,不仅可以解析,也可以进行屏蔽或者自定义解析结果,这个功能模块一定程度上可以代替本地的DNS功能,如果配置好的话可以为局域网提供一个免污染的DNS服务

routing

这个可能是v2ray中最值得折腾的部分,当然也可能是最需要花时间研究的部分

历史


  • 2019.10.19 初稿
  • 2019.11.04 协议分析