clash科学上网手册
![clash科学上网手册](https://www.0419af.com/wp-content/uploads/2023/02/6a3fd7d81ec94e0af2615afd9365fe17.png)
点击注册订购clash/ssr/v2ray小火箭等机场节点。69折优惠码:XN2023
本文主要介绍Clash是什么、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为例,它的默认配置文件是这样的:
123456789101112131415mixed-port: 7890external-controller: 127.0.0.1:9090allow-lan: falsemode: rulelog-level: warningproxies:proxy-providers:proxy-groups:rule-providers:rules:
机场提供给你的订阅文件中最重要的就是proxies这个字段了,其中是一个包含节点地址的列表。所以机场通常会要求用户对订阅地址严格保密,因为如果订阅地址泄漏了,机场的服务器节点就面临被GFW封禁或者被其他人攻击的风险,影响到整个机场的运作。
一般机场提供的订阅链接,不仅包含了基本的proxies节点,也提供了一些默认的规则。规则指的是对某个HTTP连接,应该如何处理,例如,某个规则可以要求domain suffix为google.com的连接,走某个节点服务器,可以要求domain suffix为baidu.com的连接,走DIRECT直连。这组规则使得clash内核可以正确代理整台机器上的HTTP请求,让应该绕路走国外服务器的请求发送到对应节点,让可以直连的请求直接发送,避免绕路产生的延迟和消耗不必要的订阅流量。
你可以满足于单个机场提供给你的订阅配置,这个配置可以满足绝大多数人的需求。但是,如果有更进一步的需求,就需要自己手动配置。
Clash在Golang项目里的规则分流
举个例子,最近在用Golang写一个Switch游戏Splatoon 2的小工具,主要的功能就是把任天堂服务器上的战绩数据发送到第三方网站stat.ink上。在stat.ink上,可以看到更丰富的数据分析。
请求地址涉及到三个方面的域名:
accounts.nintendo.com – 处理账户登陆splatoon2.nintendo.net – REST接口请求战绩数据stat.ink – 上传战绩数据
代码完成后测试了一段时间,发现依赖网络情况,有时候会出现请求时间过长或者超时的问题,鉴于任天堂在国内没有任何游戏服务(splatoon 2本身的线上联机也是要走游戏加速器的),这是十分正常不过的。这时候科学上网就派上用场了,我需要配置clash的分流规则让任天堂相关的网络流量走我的机场线路。
生成的规则请移步章节。
添加分流规则,匹配请求地址的域名后缀即可。然后刷新clash的配置文件,把Switch策略组设置为Japan。在Go代码里需要配置http.Client使用Clash的代理端口,地址默认是127.0.0.1:7890,否则Go的网络请求不会被clash代理。
修改成功后,运行Go程序,在Clash控制台的连接页面确认向nintendo.net的请求被匹配到日本节点。不出所料,网络超时的问题被很好地解决了。
订阅转换
通常情况下,机场提供给你所有的节点信息,和最基本的分流规则,这些规则会不太全面。使用一段时间后,很有可能会发现没有覆盖到的需求。
比如一个最简单的痛点,对于TAG这样节点数比较多的机场(164个国际节点),有时候从里面翻到需要的国家是一件费劲的是。而且我绝对不会经常用到所有的这164个节点,每个人通常使用的就是那么几个国家。所以,按国家把节点分为proxy-groups,那么用起来一定十分方便。网络上不乏一些很流行的“订阅转换”网站,这些工具的作用是把一个格式的订阅信息转换为另一个格式,在节点名添加emoji等等。
我用Go写了一个自己用的订阅转换+规则生产的工具,提供了两个接口:文件转换和MITM代理
Edit 20211026:移除了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的路径(可以是相对路径)
1234#app.yamlruntime: go116main: ./proxy/serverapp_engine_apis: true
然后安装gcloud命令行工具包。GAE需要Google Cloud Platform的付费账号,需要绑定信用卡并且刷1美元(会返还)。gcloud登录账号,在GAE的控制台网页创建项目
1gcloud app create –project=[YOUR_PROJECT_ID]
关联app ID到本地,然后
1gcloud app deploy
代码就上线了。
Go 1.2以上的版本,参考GAE文档。
GAE项目的默认部署地址appspot.com在前些年已经被GFW墙了。所以在无代理的情况下是访问不了订阅转换的。需要直连服务的可以考虑阿里云租用服务器或者Amazon、Azure等未被墙的应用托管平台。
使用订阅转换服务器,在Clash客户端配置订阅(圈X安装了parser之后也可以使用Clash订阅)
https://gofin-329802.de.r.appspot.com?sub=
是机场提供的原始订阅,其中含有特殊字符所以注意URL转义,转换地址。
DNS服务
Clash Premium内核可以选择提供一个DNS服务,指定上游服务器(如8.8.8.8),把本机的DNS服务设置为127.0.0.1,Clash会在53端口监听DNS解析请求,以减少GFW中的DNS污染带来的不便。
1234567891011# config.yamldns: enable: true enhanced-mode: redir-host fake-ip-range: 198.19.0.1/16 listen: 0.0.0.0:53 nameserver: – 223.5.5.5 – 8.8.8.8 – 114.114.114.114 ipv6: true
这里指定了阿里云和谷歌的公共DNS 223.5.5.5和8.8.8.8作为上游服务器,你可以选择自己喜欢的公共DNS。
Clash拥有两种DNS模式fake-ip和redir-host.fake-ip模式下,所有DNS寻址都会返回一个在fake-ip-range网段内的虚假IP,在经过代理的时候,Clash再把fake IP转换为真实IP。
A “fake IP” address is used as a key to look up the corresponding “FQDN” information.
详见RFC 3089。
设置enhanced-mode为”fake-ip”,
123456❯ nslookup google.comServer: 127.0.0.1Address: 127.0.0.1#53Name: google.comAddress: 198.19.0.4
返回的IP是在网段198.19.0.1/16里的一个假IP。
设置为”redir-host”
123456❯ nslookup google.comServer: 127.0.0.1Address: 127.0.0.1#53Name: google.comAddress: 46.82.174.69
查询到的是目标服务器的真实IP。
在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连接明显更加稳定了,基本不会出现断连。
clash-tracing监控
用Docker部署clash-tracing项目,该项目由Clash的开发者编写,利用Clash的websocket tracing API收集数据,时序数据库influxdb作持久化存储,grafana作可视化,实时监控clash的运行状况,是一个很实用的工具。Clash的tracing API是一个比较新的、还在实验中的功能。
最方便的部署方法是使用Docker,作者已经提供了docker-compose.yml定义了三个docker容器服务,分别对应上面提到的golang收集器、influxdb数据库和grafana服务。最终我们访问grafana从镜像中暴露的3000端口就可以查看数据监控了。
influxdb的alpine镜像还没有为arm64架构编译,所以在m1芯片上运行时,在docker-compose.yml里替换为非alpine镜像版本,如influxdb:1.8。注意2.x版本的influxdb无法被grafana正确读取,在grafana里import panels之后,query语句无法正确加载,建议使用1.8版本的influxdb。
cURL查询IP地理地址
结合curl命令可以很方便的查询代理IP的地理位置。注意你的查询网站不要被Clash的规则匹配到直连了,那样你会看到自己的真实地理位置
不带任何flag
12# 被直连匹配curl cip.cc123456789IP : 114.84.196.74地址 : 中国 上海运营商 : 电信数据二 : 上海市 | 电信数据三 : 中国上海上海 | 电信URL : http://www.cip.cc/114.84.196.74
换一个境外地址
1curl ipinfo.io
加入我把Clash挂在德国,看到的结果是JSON格式的数据
1234567891011{ “ip”: “185.101.94.91”, “city”: “Düsseldorf”, “region”: “North Rhine-Westphalia”, “country”: “DE”, “loc”: “51.2217,6.7762”, “org”: “AS204035 Tristan Fischer trading as oneCorp Systems”, “postal”: “40210”, “timezone”: “Europe/Berlin”, “readme”: “https://ipinfo.io/missingauth”}