本文主要介绍Clash是什么、Clash的用法、如何配置和自动化生产适合自己的Clash配置
众所周知,科学上网,又称代理加速/番茄/爬梯子,是当下青年的必备技能。科学上网,有两个必要条件:
服务商(机场)有很多,价格、节点、带宽和稳定性都丰俭由人,我现在的主要机场是TAG,没有注册的朋友可以点击链接注册体验。在机场购买了套餐之后,服务商通常会提供给你多种格式的订阅地址,如Clash或者SSR格式的链接,链接提供了一个配置文件,定义了机场提供给你的不同国家的节点服务器,连接上这些代理服务器中的一个后,你就可以自由地访问互联网了。
本篇文章我们主要聊聊clash格式的订阅组织形式。clash本身是一个网络连接的代理内核,通过预先定义的规则,对网络连接进行转发。clash内核规定了配置文件config.yaml的格式,所以机场会提供一个clash格式的订阅地址给用户,包含了一个clash格式的配置文件。使用clash内核的客户端中,比较流行的有Clash for Windows, Clash X和Clash X Pro,核心功能区别不大,只有一些实用功能的上的区别。以macOS端的Clash X为例,它的默认配置文件是这样的:
机场提供给你的订阅文件中最重要的就是proxies这个字段了,其中是一个包含节点地址的列表。所以机场通常会要求用户对订阅地址严格保密,因为如果订阅地址泄漏了,机场的服务器节点就面临被GFW封禁或者被其他人攻击的风险,影响到整个机场的运作。
一般机场提供的订阅链接,不仅包含了基本的proxies节点,也提供了一些默认的规则。规则指的是对某个HTTP连接,应该如何处理,例如,某个规则可以要求domain suffix为连接,走某个节点服务器,可以要求domain suffix为的连接,走DIRECT直连。这组规则使得clash内核可以正确代理整台机器上的HTTP请求,让应该绕路走国外服务器的请求发送到对应节点,让可以直连的请求直接发送,避免绕路产生的延迟和消耗不必要的订阅流量。
你可以满足于单个机场提供给你的订阅配置,这个配置可以满足绝大多数人的需求。但是,如果有更进一步的需求,就需要自己手动配置。
举个例子,最近在用Golang写一个Switch游戏Splatoon 2的小工具,主要的功能就是把任天堂服务器上的战绩数据发送到第三方网站上。在stat.ink上,可以看到更丰富的数据分析。
代码完成后测试了一段时间,发现依赖网络情况,有时候会出现请求时间过长或者超时的问题,鉴于任天堂在国内没有任何游戏服务(splatoon 2本身的线上联机也是要走游戏加速器的),这是十分正常不过的。这时候科学上网就派上用场了,我需要配置clash的分流规则让任天堂相关的网络流量走我的机场线路。
添加分流规则,匹配请求地址的域名后缀即可clashxapp下载。然后刷新clash的配置文件clashxapp下载闲鱼clash100,把Switch策略组设置为Japan。在Go代码里需要配置http.Client使用Clash的代理端口,地址默认是127.0.0.1:7890,否则Go的网络请求不会被clash代理。
修改成功后,运行Go程序,在Clash控制台的连接页面确认向nintendo.net的请求被匹配到日本节点。不出所料,网络超时的问题被很好地解决了。
通常情况下,机场提供给你所有的节点信息闲鱼clash100,和最基本的分流规则,这些规则会不太全面。使用一段时间后,很有可能会发现没有覆盖到的需求。
比如一个最简单的痛点,对于TAG这样节点数比较多的机场(164个国际节点),有时候从里面翻到需要的国家是一件费劲的是。而且我绝对不会经常用到所有的这164个节点,每个人通常使用的就是那么几个国家。所以,按国家把节点分为proxy-groups,那么用起来一定十分方便。网络上不乏一些很流行的“订阅转换”网站,这些工具的作用是把一个格式的订阅信息转换为另一个格式,在节点名添加emoji等等。
我用Go写了一个自己用的订阅转换+规则生产的工具,提供了两个接口:文件转换和MITM代理
用Go写了一个服务器部署在Google App Engine上,服务以URL参数的形式接受原始订阅(Clash 格式),拉取订阅节点,丢弃机场的其他配置,按照我自己的要求生成规则。这个思路类似proxy-provider。
按照节点名正则生产我需要的国家分组,国家分组都设置成url-test自动测速选择最快的节点 在节点名前添加emoji国旗,简写“2倍率”为“2x”,移除节点名内的大洲 增加Telgram, Apple, Github, Microsoft等实用分组 按需导入Loyalsoldier,ACL4SSR和Semporia的规则 增加一个“漏网之鱼分组”,匹配未命中的流量
在Google App Engine部署Golang项目还是相当简洁容易的,毕竟是谷歌自家的产品。在Go项目里需要一个package main,main函数不能接受任何参数(笔者暂时没找到怎么在启动命令提供参数),但你可以读取环境变量。在app.yaml里设置生产需要的环境变量,这应该也是推荐的做法。
GAE只需要在项目目录里有一个描述文件app.yaml即可,内容指定Go环境的版本,入口package的路径(可以是相对路径)
然后安装gcloud命令行工具包clashxapp下载!。GAE需要Google Cloud Platform的付费账号,需要绑定信用卡并且刷1美元(会返还)。gcloud登录账号,在GAE的控制台网页创建项目
GAE项目的默认部署地址appspot.com在前些年已经被GFW墙了。所以在无代理的情况下是访问不了订阅转换的。需要直连服务的可以考虑阿里云租用服务器或者Amazon、Azure等未被墙的应用托管平台clashxapp下载。
使用订阅转换服务器,在Clash客户端配置订阅(圈X安装了parser之后也可以使用Clash订阅)
Clash Premium内核可以选择提供一个DNS服务,指定上游服务器(如8.8.8.8),把本机的DNS服务设置为127.0.0.1,Clash会在53端口监听DNS解析请求,以减少GFW中的DNS污染带来的不便。
这里指定了阿里云和谷歌的公共DNS 223.5.5.5和8.8.8.8作为上游服务器,你可以选择自己喜欢的公共DNS。
在Mac上配置DNS,点击任务栏里的WIFI图标,网络偏好设置,选择WIFI>
高级,转到DNS分页,移除所有已经存在的DNS记录,然后点”+”,增加”127.0.0.1”,保存。注意在这里是没有端口的选择的,所以clash配置的dns:listen必须是0.0.0.0:53,监听53端口(DNS端口),确保在53端口上没有其他程序占用。
以前用系统的默认DNS,总是出现过几个小时Binance websocket莫名其妙断开的问题;使用Clash的内置DNS之后,明显注意到一个好处是和Binance服务器的websocket连接明显更加稳定了,基本不会出现断连。
最方便的部署方法是使用Docker,作者已经提供了docker-compose.yml定义了三个docker容器服务,分别对应上面提到的golang收集器、influxdb数据库和grafana服务。最终我们访问grafana从镜像中暴露的3000端口就可以查看数据监控了。
结合curl命令可以很方便的查询代理IP的地理位置。注意你的查询网站不要被Clash的规则匹配到直连了,那样你会看到自己的真实地理位置