视频教程

youtube播放地址:https://youtu.be/s84CWgKus4U
OpenClash项目地址:https://github.com/vernesong/OpenClash
clash防泄露自定义模板:https://raw.githubusercontent.com/bulianglin/demo/main/nodnsleak.ini

专线机场推荐: https://b.880805.xyz
GIA线路VPS推荐: https://bwg.880805.xyz

参考资料:
Transparent proxy support — The Linux Kernel documentation
Iptables REDIRECT vs. DNAT vs. TPROXY
TProxy 透明代理(ipv4 and ipv6) | Project X
Understanding modern Linux routing (and wg-quick)
使用 TUN 的模式- zu1k

视频文稿(忽略)

简简单单,今天咱们继续软路由,前期的铺垫已经差不多了,希望你已经看过之前的内容,接下来开始介绍科学上网插件,本期主要介绍openclash,针对很多朋友反馈我的教程看不懂,特别好入睡,所以本期教程分两部分,前半部分针对不喜欢折腾网络的朋友,你只需要跟着我操作即可,我不会解释为什么要这么做,你也不需要关心,后半部分针对进阶用户,以及部分失眠的朋友
我使用的固件是之前演示过的imm23.05,并且只安装了openclash插件,开始之前请确保你的软路由可以正常上网,并且如果你开启了其他代理插件的话要先关闭

打开刚安装的openclash,提示是否需要安装内核,点击取消,这就是openclash的主界面,目前最新版本是0.46.003,如果你和我一样用的是imm固件,可以直接在软件包里升级到最新版,来到插件设置,点击切换到fakeip模式,运行模式选择混合,如果你是旁路由结构,配置好之后出现国内网站无法上网的情况,需要勾选这里,效果相当于旁路由那期视频讲过的开启lan区域的ip动态伪装,如果没有这个问题的话就不要勾选,点击保存配置,剩下的不需要改动,全都按默认配置即可,如果你之前改动过,可以参考我的设置修改回来,来到版本更新标签页,需要在这里下载clash内核,正常情况这里会自动帮我们选择适合自己架构的内核版本,点击中间的检查并更新,下载permium版clash内核,点击之后不会有任何反应,可以在上方进入日志页面查看状态,显示内核下载失败,这是因为下载地址在有些地区被墙了,如果你和我一样出现这种情况,可以根据他的提示修改下载地址,跟着视频演示来到覆写设置,在这里随便选择一个下载地址,点击保存配置,接着重新回到版本更新,点击检查并更新,日志显示正在下载,需要耐心等待,下载成功之后,openclash会尝试启动,但我们还没有添加节点,所以启动失败,这是第二种下载内核的方法,回到版本更新,稍等片刻这里将会显示clash的版本信息,此时内核就算是安装好了,如果这种方式你也下载不了,可以先将内核下载到电脑上,再上传到路由器,首先需要确保电脑可以科学上网,比如我要下载meta内核,点击下载到本地,接着来到配置管理,上传类型选择meta内核文件,选择刚才下载的内核文件,不需要解压,但需要注意文件名不能含有括号,点击上传,提示上传成功,回到版本更新,这样也可以成功安装内核,我这里只是为了给大家演示,你可以不用安装meta内核,以节省路由器空间

来到覆写设置,这些选项保持默认,将所有dns服务器全部取消勾选,来到dns设置,勾选自定义上游dns,和追加上游dns,其他保持默认,来到开发者选项,将这一行代码前面的#号删除,点击保存配置

来到配置订阅,点击添加,在这里添加你的机场订阅,随便给个名称,把你的机场订阅地址粘贴到这里,如果没有的话可以扫码屏幕二维码购买,这是本频道长期推荐的专线机场,高速稳定,适合在路由器上使用,如果你的订阅地址是clash格式,那就直接点击保存配置即可完成,如果不是clash格式或者不清楚的话,就勾选在线订阅转换,如果你有多个机场订阅的话,使用在线订阅转换可以合并多个订阅链接,每行一条,包括节点分享链接格式,将所有节点混合在一起生成一个配置文件,就不用切换机场订阅了

另外需要注意,使用别人的订阅转换存在隐私风险,之前也爆过远程执行漏洞,建议大家参考我之前的教程使用cf的worker自己搭建一个反代订阅转换,在这里输入你的反代地址,以我搭建的为例,不建议你用我的,我可能随时关闭,注意自己添加的转换网址,后面要加上/sub,按回车键添加并选中,如果你觉得麻烦的话就用openclash内置的那几个,其他保持默认,点击保存配置,这样我们就添加了一个机场了,如果你还有其他机场,可以继续添加,如果你的机场经常变动节点,可以勾选这里定期刷新,

最后点击更新配置,回到日志页面,此时就会开始启动openclash了,现在正在下载机场订阅,你需要确保你的机场订阅或者转换网址可以正常访问才能下载成功,openclash要干的事还挺多的,我们要做的就是静静等待他执行完成,当这里显示openclash启动成功的时候,也就意味着openclahs启动没有失败,回到主界面,这里显示绿色的运行中,如果你的节点没有问题的话,现在你家所有接入该路由器的网络设备应该都能科学上网了,将电脑的代理工具关闭,直接访问谷歌,没有任何问题,对比你以前的配置,按我这样配置之后响应速度可能会有明显提升

回到主界面,点击这里可以进入网页控制面板,可以在这里切换节点等操作,用法和clash for windows类似,也可以使用这个面板,二者功能差不多,区别在于主题样式,按个人喜好选择,可以将这个网址添加到书签,下次直接访问这个网址就可以管理clash了,不需要登陆路由器后台,非常方便

最后讲一下dns泄漏,关于dns泄露的检测原理以及如何解决我已经做了好几期视频,该讲的都讲了没啥需要补充的,所以就不啰嗦了,直接讲配置方法。

对于大部分普通用户,使用刚才的配置方法就可以了,你访问谷歌youtube之类的黑名单网站不会泄漏给运营商,但如果你对个人隐私要求比较高,或者是做跨境电商,对网络环境有更高的要求,则推荐使用接下来的白名单模式,以减少平台潜在的检测因素,来到配置订阅,编辑刚才添加的机场,首先需要开启在线订阅转换,转换模版选择自定义模版,使用我给大家提供的配置模版,点击保存配置,最后更新配置,此时就会使用白名单模式,命中规则的就直连,其他全都交给节点处理,启动成功之后,控制面板也会发生改变,我给大家提供的配置模版只有手动选择和自动选择两个分组,此时可以进行dns泄漏检测,应该就不会出现国内dns服务器了,如果有的话建议回看视频检查和我的配置是否一致。

这样配置之后,大部分国内网站都是直连,但小众国内网站可能会走代理,所以建议自己维护一个规则列表,把自己常用的小众网站添加到直连即可,回到控制面板,进入连接页面,在这里可以看到网站走了代理还是直连,点击标签可以进行排序,这里有一个另类,出现了真实的ip地址,原因之前说过,clash处理udp请求的域名必须先解析成真实ip,这个域名是windows用来同步系统时间的,先将它过滤出来,可以看到这个请求是基于udp,当前我的系统时间不正确,可以点击这里进行同步,这条请求会走代理转发给节点服务器,但可以看到这里只有上传数据,没有下载数据,说明这个节点的udp不通,也就无法成功同步时间了,此时建议把这个域名添加到直连规则,进入配置管理,选择规则集文件列表,将这些默认的规则集全部删掉,新建一个文件,随便取个名字,比如windows,进入编辑,将你需要走直连的域名添加进去,每行一个,支持通配符,点击保存,来到规则附加,点击最下面的添加,如果你有多个机场都需要添加,那就选择添加到所有配置文件,类型选择file,你也可以使用http的方式,实现多端同步,规则类型选择domain,格式选择text,文件路径就选择我们刚才添加的windows,指定策略选择direct,也就是直连,点击保存配置,再点击应用配置,此时就会重新启动,启动之后可以在规则页面查看到刚才添加的规则集,有我们刚才添加的3条规则,接着再来尝试同步时间,就可以成功同步了,规则走的是直连,如果此时我还想添加其他网站,回到配置管理下的规则集列表,继续添加就行了,比如加个d.cn,点击保存配置,不需要重启openclash,直接回到控制面板,刷新一下,就会直接生效,变成4条规则了,此时访问d.cn的话,就会命中刚才的规则集走直连,手机软件里的网址也可以用这种方式添加,这样就能非常方便的控制小众网站走直连了

ok,针对小白用户的配置教程就到这里了,能满足绝大部分用户的使用需求,如果你想做出自己个性化的配置,那么看明白接下来的内容,基本上就难不倒你了。

先来创建一个最常见的家庭网络环境,你在运营商拉了一条宽带,他会给你分配一个光猫,一般来讲你会单独再买一台路由器连接光猫,路由器通过pppoe拨号获取运营商分配的公网IP2.2.2.2,同时路由器作为局域网的网关会有自己的内网ip地址,假设为192.168.2.1,家里的所有网络设备都会通过网线或者wifi连接到这台路由器,路由器通过DHCP为每一台网络设备分配一个内网ip以及默认网关、dns服务器等信息,一般情况下默认网关和dns服务器都是路由器,这是最常见的家庭网络拓扑

接着在路由器中运行openclash,假设此时我们在电脑上访问谷歌,首先需要发起dns请求来获取谷歌的ip地址,一般来讲电脑配置的dns服务器是路由器的ip地址,也就是会找路由器要谷歌的ip,会构建这么一个数据包,源端口是随机的空闲端口,目标端口为dns的默认端口53,源ip是自己的192.168.2.8,目标ip为路由器的192.168.2.1,如果你手动配置了dns为8.8.8.8之类的公网dns服务器,那目标ip就是8.8.8.8,不管目标是路由器还是公网ip,这条请求都会交给路由器,因为路由器是你通往互联网的网关

数据来到路由器内部,会先经过路由器里的防火墙,防火墙会判断这个数据包是要接收还是丢弃或者做其他特殊处理,用来配置防火墙的工具叫做iptables,一般我们会直接把iptables称之为防火墙,而我现在用的openwrt版本用nftables代替了iptables,二者的语法规则不一样,但作用是一样的,以下统称为防火墙

防火墙会在路由前prerouting,输入input、输出output、转发forward、路由后postrouting,这几个地方创建hook点,如果你玩过破解或者外挂之类的应该对hook不陌生,通过钩子函数改变程序原来的处理逻辑,简单理解就是可以拦截并篡改数据包

dns请求的数据包首先从eth1网卡进入到防火墙的路由前,顾名思义就是在路由之前要干的事,如果你的openclash配置的是dnsmasq转发,那么他会在PREROUTING链上,也就是路由前帮我们配置这条规则,意思是所有发往53号端口的UDP数据包,全都进行redirect,也就是重定向,将其重定向到路由器当前接口ip的53号端口,所以数据包的目标ip和端口变成了路由器的ip地址和53端口,并且这个行为会被连接追踪记录下来,默认情况下openwrt使用dnsmasq在53端口提供dns服务,而如果你的openclash配置的是防火墙转发,同样也是进行重定向,区别在重定向的目标端口是clash监听的7874端口,相当于绕过了dnsmasq,7874是openclash在覆写设置中配置的dns监听端口

这种修改目标ip的行为叫做dnat,所以这条规则是添加在nat表中,为了不涉及过多概念,我们不用在意他在哪个表中,只要知道他在路由前这里进行了处理即可

经过路由前的处理后,数据包才会开始进行路由,路由就是规定数据包该走哪条路,此时有两条路,走输入链或者走转发链,如果访问的目标是路由器,那么就走输入链,如果访问目标是公网ip,就走转发链,由于我们的数据包刚才经过了dnat,目标ip被重定向到路由器的ip,所以这个数据包将会走输入链进入路由器本身,并且会转发给clash监听的dns端口7874,如果你是通过dnsmasq转发,那么数据将会发给dnsmasq监听的53端口,而openclash会将dnsmasq的上游设置为clash的7874,所以这条请求最终还是会转发到clash的7874端口,兜这么一圈的原因是openclash有些功能需要依赖dnsmasq,比如绕过大陆ip

clash收到请求后,会帮我们获取谷歌的ip地址,clash处理dns的方式有redir-host模式和fake-ip模式,二者的区别之前我已经详细介绍过了,这里就不浪费时间讲解了,感兴趣的朋友可以回看,由于redir-host模式存在各种问题,clash内核已经弃用了,只剩下fakeip模式,但openclash依然保留了redir-host,用的就是我们之前讲过的+.*通配符,从fakeip模式回退到redir-host模式,但clash自己都不推荐用,所以建议使用fakeip模式,而clash.meta内核对原版clash的dns模块做了大量增强,可以解决redir-host存在的问题,使得redir-host模式在clash.meta内核中被保留,所以如果你非要用redir-host,建议使用meta内核

为了便于理解我们不引入fakeip,假设clash通过上游dns获取到了谷歌的ip为6.6.6.6,需要将结果返回给电脑,从路由器本身发出的数据包,会经过输出链和路由后,由于之前的redirect重定向行为被连接追踪记录了,数据返回的时候会将ip和端口修改回来,然后发送到电脑,注意电脑是和eth1连接,所以这个数据包会从eth1接口出去,接口能进能出,这点应该没什么疑问

电脑收到数据包之后,得到了谷歌的ip为6.6.6.6,于是向这个ip发起基于tcp的http请求获取谷歌首页内容,数据包来到路由器,和之前一样,会先来到路由前,除了刚才劫持53端口的dns请求,openclash还会在路由前帮我们配置这条防火墙规则,将所有tcp的数据包重定向到7892端口,所以数据包的目标ip和端口会被改成路由器的7892,也就是openclash中配置的流量转发端口,在clash配置文件中是redir-port,注意这个和dns的redir-host没有半毛钱关系,接着进行路由决策的时候发现目标ip是自己,于是数据包将会进入输入链,数据将会交给监听了7892端口的clash,clash收到数据后,可以通过一些手段获取到该数据包修改前的原始目标ip6.6.6.6和端口80,于是会根据分流规则帮我们进行代理,将访问谷歌的数据加密后发给接点服务器,假设节点服务器的ip是3.3.3.3,端口为8838,会构建这么一个数据包,并通过输出链和路由后将数据从wan口的eth0发出,后面节点的代理流程之前详细讲过,车轱辘话都快讲吐了就不再重复啰嗦了,总之clash会从eth0收到节点服务器返回经过加密的谷歌数据包,进来的数据包也需要经过路由前,openclash会在刚才的重定向规则之上帮我们添加这么一条规则,只要目标ip是发给本机的,就直接return返回,不继续向下处理其他规则,所以这个数据包不会执行下面的重定向操作,这些规则都是openclash启动后全都已经加好了,还有很多其他规则,我不可能把每条规则都讲一遍,所以把关键的规则挑出来讲一下,数据包来到路由,发现目标ip是自己,于是进入输入链,最终数据包将会交给clash,并通过clash解密后将谷歌数据发回给电脑,发回的步骤和刚才的dns响应是一样的,就不再啰嗦了

再来看一个情况,假设电脑的浏览器开启了强制quic访问,quic是基于udp的,访问谷歌的数据包将会使用udp发送给路由器,和之前一样,会先来到路由前,如果防火墙还是通过这条redirect的重定向规则,将udp数据的目标ip和端口改成本机clash监听的7892端口,通过目标ip将其路由到本机,clash收到数据后,不像tcp的面向连接,可以通过一些手段获取到该数据包的原始目标,udp是无连接的,无法获取到数据包原始的目标ip,所以redirect无法帮我们代理udp数据,只能处理dns劫持之类不需要访问udp目标的行为
解决方法是使用防火墙的tproxy透明代理模块,tproxy既能代理tcp,也能代理udp,对于udp的数据,openclash会在路由前帮我们添加这条规则,所有udp数据都通过tproxy模块转发给7895端口,并且给这个数据包打上一个mark,将其标记为354,其中7895就是clash监听的tproxy端口,在clash配置文件中是tproxy-port

需要注意的是tproxy并不会像redirect一样修改数据包的目标ip和目标端口,打的标记和端口保存在其他地方,数据包本身并没有发生改变,接着数据包准备开始路由,此时有两条路,如果是发给本机就走输入链,如果是发给公网ip就走转发链,很明显由于数据包的目标ip不是路由器,应该走forward转发链,再经过postrouting链到互联网,一般情况下是这么处理的,因为一般情况下路由表就是这么配的,但我们现在的情况并不一般,因为数据应该走输入链交给本机的clash处理,所以即使目标ip不是本机,我们也要想办法路由到本机,这就需要对路由表进行处理,openclash帮我们添加了一条路由规则和一条路由条目,路由规则要求打了mark 354的数据包就交给100的路由表进行路由,而100的路由表里只有openclash添加的这一条本地路由,将任何目标ip的数据包全都路由到本机

所以这个数据包不会走转发链,而是进入输入链并将其转发给clash监听的tproxy端口7895,clash的tproxy会进行特殊设置,让其能够监听任意ip地址,即使数据包不是发给自己的也能接收并处理,由于tproxy并没有改变数据包原来的目标ip和目标端口,所以clash可以很轻易的获取到需要代理的目标,从而帮我们代理udp数据,这就是为什么代理udp不能用redirect,而需要使用tproxy的原因,openclash的redir-host兼容模式和fakeip增强模式就是使用redirect代理tcp数据,用tproxy代理udp数据,前提是你在设置里开启了udp流量转发

除了代理其它设备发过来的数据包,tproxy也能代理由本机直接发起的数据包,流程要复杂一点,假设路由器要访问谷歌,由于tproxy工作在路由前这个位置,而本机发起的数据包是直接走输出链,经过路由后直接出去了

这样的话就没法交给tproxy处理,但我们可以在输出链上给数据包打mark触发重新路由,首先在这个位置,路由器已经经过了路由这一步操作,确定了目标ip是公网ip,应该从eth0发送出去,所以源ip为eth0接口的ip2.2.2.2,目标ip为谷歌的6.6.6.6,接着数据包来到输出链,openclash会在这里添加一条规则,将数据包打上mark 354,然后发送出去,防火墙会在这个位置检查是否需要重新路由,如果数据包被打了mark,或者像redirect做了dnat修改数据包目标ip之类的操作,就需要重新路由,所以会再次查看路由表,由于这次数据包被打了mark,此时就会命中之前的路由规则,将打了354标签的数据包使用100号路由表进行路由,也就是将所有目标ip的数据包发送到本机,于是通过127.0.0.1的回环口将数据重新路由到本机,数据将会来到路由前,之后的步骤就和处理局域网其他设备的数据一样了,会根据之前在路由前添加的tproxy规则将数据包重定向到7895端口,这样就实现了代理本机自己了。

另外有些教程中还会有这段配置,主要是针对已经建立了tproxy连接的socket直接打mark,不需要再进tproxy模块处理,可以提高性能

除了redirect代理tcp,tproxy代理udp的增强模式,openclash还有tun模式,这种模式可以不依赖防火墙规则,只需要配置好路由规则即可,简直是好棒棒,当开启tun模式之后,clash会创建一张虚拟网卡,首先路由器从物理网卡收到电脑访问谷歌的数据包,我们没有在路由前配置任何防火墙规则,于是直接进行路由,此时需要查看路由规则,由于clash配置了自动路由,于是会帮我们添加这4条路由规则,其他三条是系统自带的路由规则,路由规则是按优先级一条条匹配的,前面的数字就是优先级,先从0开始,这条规则的意思是所有数据包都进入local这张路由表,而这张路由表里都是本机网络接口的ip地址,由于数据并不是发给本机的,所以都不匹配,于是会继续向下匹配其他路由规则,这条的意思是任何人发来的数据包,如果目标端口不是53,那就走main路由表,但是要忽略前缀长度小于或等于0的路由条目,前缀长度在家庭网络速通那期视频讲过,由于我们的目的地址是6.6.6.6,下面这些路由条目都不匹配,而第一条default是默认路由,也就是访问任何目标都从这里走,那么访问6.6.6.6理应匹配这条路由从wan口转发出去,但这里的default就表示0.0.0.0/0,其中的/0就是前缀长度为0,根据刚才的路由规则,要忽略前缀长度小于或等于0的条目,所以这条路由被忽略了,这张表也没有匹配上,于是继续向下匹配其他路由规则,至于过滤掉53端口是因为要对本机的dns进行劫持,如果dns配置的是局域网其他设备,如果不过滤53端口的话会从这里漏出去,这条的意思是只要不是从本机发过来的数据包,就走这张100的路由表,我们的数据包是从其他电脑发过来的,并不是本机发起的,所以匹配了这条路由规则,而这张路由表里就只有一个条目,访问任何目标都通过utun接口发送,这个接口是由clash创建的虚拟网卡,所以数据将会从物理网卡,经过forward链转发到虚拟网卡utun,此时需要确保你的设备开启了ip转发,并且forward链允许数据包通过,这样数据包才能成功转发到虚拟网卡,clash可以直接从虚拟网卡里读写数据,读取到的是包含ip包头的完整数据,clash需要通过协议栈system或者gvisor对数据包进行拆包,解析出里面的数据,如果协议栈是system,那么数据会通过走一遍系统的网络协议栈来解析出里面的数据,为了数据能被路由到clash,还会进行nat处理,clash会在7777端口接收拆包后的数据,如果是gvisor,则会由clash内部基于gvisor的协议栈对数据进行解析,理论上来讲gvisor没有多余的重复拷贝性能会更好,system使用系统自带协议栈兼容性更好,但大家的应用场景和操作系统不同,代理局域网和代理本机也有区别,实际哪个效果更好很难说,

clash获取到数据包里的访问意图之后,通过物理网卡将数据加密后发送给代理节点,节点返回的加密数据会通过物理网卡发送到clash,clash对其进行解密,以system协议栈为例。clash将解密后的数据发送到虚拟网卡,以借助系统协议栈完成数据的封装,clash读取封装好的数据,进行反向nat,接着再写回虚拟网卡,再次进入路由决策,根据目标ip将数据转发给物理网卡eth1接口,这样电脑就能成功访问到谷歌了。

这就是tun的工作方式,不需要配置防火墙规则,直接通过路由规则实现透明代理,这也是之前讲过的,闲置电脑开启tun模式和ip转发之后,就能直接当旁路由了

不过openclash需要借助防火墙来支持更多的功能,所以他的tun模式还是配合防火墙打mark的方式来处理,没有开启clash的自动路由

最后还有一个混合模式,用redirect传输tcp,用tun传输udp,tun模式的tcp性能没有redirect高效,而tproxy代理udp数据有很多人会出现各种问题,所以出了个混合模式

最后简单看一下各项设置,在这里可以看到防火墙的配置,可以看到input输入链,forward转发链,output输出链,以及更多的自定义链,openclash添加的链在最下面,我这里用的是nftables,在这里看到的会被解析成方便人类阅读的格式,通过这条指令可以查看实际的样子,这些都是openclash添加的防火墙规则,每条链都有他的作用,可以看到这是一条dns劫持的规则,动作是redirect,有些朋友用的可能是iptables,可以通过这条指令查看相关规则,我的iptables没有配置任何规则,这些就是我们刚才讲过不同的链,使用ip a查看网络接口信息,这个utun接口就是clash开启的虚拟网卡接口,这个就是fakeip段,通过ip rule可以查看路由规则,openclash没有开启自动路由,所以clash没有添加路由规则,是通过打mark的方式进行路由,使用这条指令查看指定的354路由表,只有一条路由条目,全都路由到utun接口,也可以查看其他路由表,比如local,或者直接输入ip route可以查看主路由表main,tun模式代理局域网其他设备必须开启ip转发,可以通过这条指令查看,显示1就表示已开启ip转发,最后再给大家留个思考,使用redirect或者tproxy代理局域网其他设备,需要开启ip转发吗?大家可以试试

最后修改:2024 年 03 月 29 日 03 : 04 PM