前言
前期的准备工作已经基本上完成了,接下来就是翻越长城,世界那么美好,为啥不出去看看呢!本篇将利用近几年比较热门的V2Ray配合iptables实现自动翻墙,实现方式和openwrt上是一样的,只不过本文使用的是普通的Linux发行版而已。
构成
V2Ray V2Ray是Project V项目的核心组成,它是由一群爱好自由的有志之士共同开发的,至今已经发展出多种方案来应对GFW对翻墙的封锁,这也是在SS和SSR流量有嫌疑被精确识别的前提下最好的翻墙方案 (当然,这只是个人的观点,不同地区GFW对不同工具会有不同的侧重)
iptables Linux上的防火墙配置工具就无需过多介绍了吧,前期用来配置路由就是靠它,接下来在科学上网中它也将担任重要的角色
原理
本例中使用了V2Ray自身支持的一个功能协议,名字是 dokodemo-door(任意门) 官方的说明文档已经把每个参数都进行了说明,如果配置成功的话,基本上透明代理的效果会很好(前提你自己有一个比较高速的梯子,或者机场也行,最近支持V2Ray的机场好像变多了)
当然对于大部分人来说这样的说明肯定一头雾水,让人无从下手,还好官网直接提供了两个白话文教程,白话文教程、新白话文教程(社区版),社区版可能会更加容易让人接受一点
那它是怎么实现科学上网的呢?图不高兴画了,就直接用文字来表述一下吧,具体的过程主要包括如下几个部分:
发起访问
假设你想访问被墙的网站,你会对路由器发起一次通讯请求,此时浏览器会对默认的网关发送一些数据包,这些数据包包含了来源地址,域名信息等必要的信息;
数据接收部分
到达网关之后,此处就是我的软路由,数据包首先会被 iptables(实际上并不是它,而是内核中的Netfilter,此处只是为了方便说明而已,使用 iptables 这个防火墙配置工具代指Linux系统的防火墙部分)接收到,此时 iptables 就会基于预先设置的规则对数据包进行匹配;
路由判断
iptables 会根据数据包中所携带的目标域名或IP判断它的走向,首先是判断是否是本机或者本地局域网的地址,如果是的话就发送过去,如果不是的话就会基于设置的防火墙规则转发给 V2Ray 的透明代理端口—— dokodemo-door 协议入口;
V2Ray 处理数据
如果是此时 V2ray接收到了数据,它内置了一套路由系统,也会对数据包进行分析,如果数据包目标地址是国内的地址,那 V2Ray 不会对数据包进行处理,直接就按照原来的目标地址发送过去,而国外的地址,就会通过预先配置好的梯子通道转发出去,这样就实现了科学上网,当然 V2Ray 的功能不止于此,迫于篇幅,本篇就不详细展开了。
开始配置
1.给系统配置代理
基本上没有把科学上网配置好之前,这一步都是必须的,此处需要说一句 感谢伟大的防火墙
1 | export http_proxy=http://172.16.1.10:1081 |
此处主要使用的是http代理,可以通过 ss 或者 V2Ray 提供
2.使用V2Ray官方一键安装脚本进行安装
V2Ray 项目直接提供了官方的一键安装脚本,由于是使用GO语言编写的,除非自己喜欢折腾,基本上都不需要进行编译安装,一键脚本会自动从github上下载最新的编译好的二进制版本进行安装,同时它也会自动配置好自启动,由于国内访问 github 的速度实在是不理想,所以我在第一步的时候就配置好了代理以提高一键脚本的执行速度,直接执行 bash <(curl -L -s https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
执行完成之后会自动随机生成端口和UUID,并配置好自启动,此处使用的是 debian,一键脚本基本上可以把大部分配置操作都搞定
3.V2Ray配置文件说明
V2Ray的默认配置文件是/etc/v2ray/config.json
,如果使用的是一键脚本的话,默认安装的是服务端配置,此处我打算建立一个本地的科学上网软路由,那么就需要将其修改为客户端模式,不过在这之前首先要对V2Ray的配置文件格式做一下简单介绍,打开配置文件vi /etc/v2ray/config.json
,如下图所示:
1 | { |
根据官方教程,整个配置文件应该由如下几个部分构成,但这些部分都是可以精简的,但有几个部分是必须的,如果是服务端的话,inbounds、outbounds、routing这三个部分是必要的;而如果是客户端的话,一般会多一个dns模块提供域名解析的支持,当然如果你对配置文件比较熟悉的话,可以通过增加更多的模块实现更多的功能,完整的结构如下:
inbounds这个部分作为主机的接收端,会监听进入系统的一些连接,一般情况下监听本机端口的都是对外提供服务的,此处也不例外,不管是服务端还是客户端,都是在inbounds处提供服务,它相当于是V2Ray的入口
outbounds进行对外连接,如果是在服务端,那么就是客户端流量的访问出口,同时也能对一些流量进行屏蔽,而在客户端,主要会提供与服务端进行对接的服务
routing可以说是V2Ray上最有用的一个部分,Linux可以通过防火墙配置相关的策略对数据流量走向进行调整,而此处的这个功能也可以对inbounds和outboounds处的数据流量进行调整,好像除了NAT功能它不能实现,其它的部分都可以,当然此处没有考虑到系统资源开销的问题
相对而言,这个配置文件还是比较复杂的,如果要深入讲的话受限于篇幅,好像不现实,本篇还是以实现透明代理为主吧。
4.修改配置文件开启透明代理
客户端部分的主体结构是这样的:
1 | { |
为了方便理解,我会将每个部分分别配置一个实例
配置透明代理监听在10000端口
此处参照两个白话文教程:白话文教程、新白话文教程(社区版)
作为客户端的话,inbounds部分将监听本地的一个或者多个端口,我会创建一个透明代理和一个socks5代理,socks5代理主要用于测试科学上网是否成功,废话不多说,直接开始吧。
1 | "inbounds": { |
inbounds部分就结束了,此处主要是对局域网和本机提供服务,被动的对局域网内或者本机的连接进行响应;
与远程服务器建立连接(与梯子建立连接)
V2Ray对外连接的配置主要集中在outbounds部分,此处集中了梯子的连接,可以是一个或者多个,默认情况下如果没有在routing部分进行指定,系统都会使用由上至下第一个对外出口作为默认出口使用,所以排在第一个的具有举足轻重的地位,以下将会放上我自己的配置:
1 | "outbounds": { |
outbounds的配置大致上就是这样的,此处配置了三个出口
DNS服务器配置
如果没有添加DNS服务器的配置的话,V2Ray会自动使用系统配置好的地址,由于我已经解决了DNS污染,所以我完全可以在此处进行省略,但考虑到方案并不是只有一种,多一条路多一种选择,还是稍微举个例子吧!
1 | "dns": { |
此处直接使用了最简单的配置,使用这样的配置的话,当用户使用socks5代理进行上网时,会优先使用谷歌和IBM的服务器进行域名解析,如果上述的服务器都挂了,那么就使用系统自带的DNS服务器进行解析,v2ray的内置DNS功能还是很强大的,受限于篇幅,此处就不展开了
强大的路由功能
一般的科学上网工具除了提供分流外基本上不会再有别的功能了,而V2Ray可通过routing这个功能模块提供类似于Linux防火墙一样的功能,根据配置好的规则选择对外出口,负载均衡,识别连接,屏蔽广告,基于端口匹配等等,当然这些功能对于初学者而言简直就是天书,本次也不会详细去说明,但大家只需要知道一点,那就是善用routing模块
1 | "routing": { |
以上的配置屏蔽了一些常用的广告域名,同时不代理内网IP、中国区IP、中国区域名、常见的没被墙的域名,而没有手动指定的流量会使用默认的一条规则,这个默认规则不需要进行手动设置,默认是**inbounds**中配置的第一条出口
;这个模块下的匹配规则和Linux防火墙类似,逐条依次进行匹配,需要屏蔽的放在上面,之后的规则会依次匹配,V2Ray的规则匹配也是这样的顺序,由上至下,哪个在上面哪个先匹配,一旦匹配到就跳出规则,所以在配置路由的时候需要好好规划好顺序
完整配置文件
1 | { |
在上述的配置文件中我增加了一个log模块,主要是为了进行故障分析,在/var/log/v2ray
目录下生成两个日志文件,方便遇到问题之后进行分析,整个配置文件除了科学上网部分没有配置外,其它都能实际使用,这个部分是可以当作模板进行使用的
当然使用vim进行文本编辑的话对于普通用户而言实在是太痛苦了,那不妨把它拷贝下来在本地计算机上面进行编辑,我使用的是windows平台上最好的文本编辑器之一的vscode,首先先把配置文件下载到本地:
如果你使用的是xshell这个ssh工具的话,直接安装lrzsz这个工具即可,安装完之后执行sz /etc/v2ray/config.json
,然后选择保存的位置就能将配置文件下载到本地了
如果没有使用上述工具的话,使用winscp也是可以的,或者如果是windows 10操作系统的话,直接使用内置的scp命令也是可以将文件下载到本地的,打开powershell或者cmd,执行scp root@172.16.1.50:/etc/v2ray/config.json d:\desktop\config.json.v2
,这样就复制到我的桌面了
之后就用vscode进行编辑,由于我下载下来的时候修改了文件名,在后面加上了一个v2后缀(这一步并不是必须的,如果直接下载下了json后缀的,就不需要以下步骤)
修改好配置文件之后就可以上传到服务器了,使用scp的话顺序改一下就好
cat /etc/v2ray/config.json.v2 > /etc/v2ray/config.json
即可
当把配置文件修改好之后,记得检测一下文件格式是否有问题,执行命令/usr/bin/v2ray/v2ray --test /etc/v2ray/config.json
如果没问题,直接保存退出(如果使用vscode进行编辑的话,基本上不会有多少问题),之后执行systemctl restart v2ray
重启服务即可
5.配置防火墙规则
刚刚配置好的V2Ray只能提够一个透明代理的入口,它还没有那么强大控制数据流量走向,接下来的事情就交给防火墙吧,至于是什么原理,小孩子知道那么多干啥,照着做就是了
1 | 直接对tcp动手(不知道tcp是啥玩意的也不用在意,照着做就是了) |
请忽略中间发生的输入错误
此处我只配置了TCP流量部分,UDP部分我觉得普通用户暂时用不到,一般游戏用户会比较需要,但v2ray对游戏的支持并不是很好,如果有兴趣的话我会在下一篇文章中进行说明
执行上述命令之后呢,墙基本上已经不能锁住你了
配置完验证一下
验证对外的梯子是否通了
我在入口部分除了建立了透明代理,同时也配置了一个socks5代理,此处就用这个来验证一下对外的连接是否正常
curl -x socks5://127.0.0.1:1080 google.com
这个命令执行之后如果能出现如下的界面就说明对外的梯子出口是连接成功的,V2Ray可以提供科学上网的功能,此处没问题的话即可进行下一步
如果有问题的话进行下述的排查:
服务器和客户端之间的时间差不能超过一分钟
查看两者之间的时间差,如果超过了一分钟就无法正确的建立连接,可以通过自动同步时间解决
查看配置文件中的域名,uuid,端口号等有没有存在差异
仔细对比服务端和客户端之间的配置项目,常见的错误主要是uuid和端口号不对应
透明代理测试
要测试其实很简单,打开一台电脑,通过自建的软路由上网,看看能不能科学上网就可以判断出来了
此处我依然使用我一直使用的manjrao进行测试,打开火狐,打开谷歌等不存在的网站,看看能否正常打开,然后再放个YOUTUBE看是否可以正常播放,如果没问题的话那就说明你配置成功了,接下来该干嘛干嘛了,世界离你就差延时那点距离了
打开ip111.cn确认一下是否能够正常访问外网,只要后面两个显示的是你vps地址就说明是正常了
规则的自动加载
防火墙规则过去在网卡的开关过程中就能自动进行保存和加载,如果怕防火墙规则丢失的话,建议手动保存一下防火墙规则
iptables-save > /root/iptables.rule
就可以了,这样开机就会自动加载了,当然你如果搞错了防火墙的输入顺序就有可能会出问题了
总结
本篇内容中涉及到了比较多的V2Ray配置文件实例,虽然看上去很多,但并没有深入去分析每一个语句的作用,大家看看就好,直接使用最后的实例即可,如果想要深入的了解的话,我会在下篇做出比较详细的分析,先劝个退,不认真学习的话真的会搞不懂的哦,越看越迷糊都有可能哦!
对比两年前初次使用V2Ray,感觉官方文档完善了好多,但依然有很多坑需要去解决,下期预告,对于配置文件的详细分析(希望自己的拖延症不会像这次这样严重)!
历史
- 2019.09.16 初稿
- 2019.09.25 根据测试结构完善大纲
- 2019.10.18 磨磨蹭蹭的把坑填上,应该是可以上线了
- 2020.02.23 修正部分错误