Clash 相关
写在前面
现在是 2024 年 4 月 17 日,Clash 源码(包括内核和 Clash for Windows,即 CFW)已经没了,clash.wiki 仍然能访问,并且里面有一些下载资源。虽然 Clash 现在不支持新协议了,也不继续维护了,但是它的一系列客户端实在是太好用了……
以下配置都是按照 Clash for Windows 说明,不讨论其他 Clash 变体。
使用 IPv6 上网
去年有一段时间和现在,实验室出现了一种非常诡异的现象:不打开 Clash 时能够正常上网(国内),打开 Clash 的系统代理之后不能正常上网,无论是国内国外都无法访问!最近发现是实验室无法使用 IPv4 访问校外网络。验证方法:ping IPv4 和 IPv6 的公共 DNS 服务器(Google 的可以,阿里云的也可以),发现 IPv4 不通,但是 IPv6 通。
附上 Google 的公共 DNS 服务器地址:
8.8.8.8
8.8.4.4
2001:4860:4860::8888
2001:4860:4860::8844
根据同学描述,打开 CFW 时,微信能正常上网,其他网页不能。我第一反应是 DNS 有问题,因为我觉得微信可能会自己去解析域名,然后通过 IP 直接访问服务,以提高速度或者防止 DNS 劫持。因此我尝试了设置公共 DNS 服务器,但是仍然无法访问网络。后来不知道怎么的脑袋灵光了,去 ping 了一下 DNS 服务器才发现了问题。
总的来说,我的配置有两个问题:1. 没有开启 IPv6 支持;2. 我的机场不支持 IPv6。微信默认不走系统代理,所以不会受到 CFW 的限制,能够正常访问网络。
在首页打开 IPv6 功能(对应于配置中的 ipv6: true
)。
如果你自定义了 DNS,要确保开启 DNS 的 ipv6(dns.ipv6
),并且提供支持 ipv6 的 DNS 服务器。我在 mixin 写的 content.dns = undefined
(保证校园网能够正常解析校内服务),因此跳过这个设置。
然后在 Settings > System Proxy > Static Host 中,将默认的 127.0.0.1 改成 localhost。这样 localhost 还能被解析成 ::1。
现在测试一下在打开 Clash 的情况下,访问国内网站是否有问题(经过 Clash 代理,但是不使用海外的代理服务器)。测试成功之后更换支持 IPv6 的机场即可。
如何防止别人盗用自己的 LAN 代理?
以下每一点分别代表一种不同的思路,不是同一思路的不同步骤。
1. 设置 inbound
(推荐)
https://github.com/Dreamacro/clash/pull/2818
Mixin 算作是配置的补充,发生在 Clash Core 启动完成之后。inbound
必须在 Clash Core 启动时添加。点击主页面的 Home Directory,然后打开文件夹中的 config.yaml
,修改 inbound
属性。参考:
mixed-port: xxxx # 这个是 http 和 socks4 的代理端口
allow-lan: true
# external-controller: 略
# secret: 略
ipv6: false
inbounds:
- type: http
bind-address: "172.23.80.1:xxxx"
# 除了表示成对象,也可以表示成字符串,比如 "http://172.23.80.1:xxxx"
2. bind *
,但在 Windows 中设置防火墙
很复杂,没操作明白。
3. 填写 bind 地址(无法解决问题)
点击 Allow LAN 右边的按钮,可以看到本机上常用的网卡。这里可以把 WSL 的网关 ip 填上。缺点:由于只能填写一个 bind 地址,如果 bind 了 WSL,本机就无法代理了! 重启 CFW 之后也会发现 Port 变成了随机的;虽然系统代理是打开了,但是 CFW 拒绝了 Windows 应用的连接。
4. 在配置中添加 authentication(可以一定程度解决问题,但是不完全)
使用认证后系统代理无法工作!!网上建议添加 Windows 凭据:
或者打开 CFW 系统代理,再进入设置中的网络代理页面,也会提示输入凭据:
但即便是这样设置也有问题,比如 OneDrive 无法连接。
为所有配置添加额外规则
以下每一点分别代表一种不同的思路,不是同一思路的不同步骤。
1. Mixin (js)
Note
注意,通过 mixin 只能修改分流和 dns 等规则。还有很多选项需要通过 config 或其他方式修改后重启生效。比如 bypass
就有专门的设置。
module.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => {
const prependingRules = [
// KDE connect
'IP-CIDR,172.20.0.0/16,DIRECT',
// microsoft store
'DOMAIN,login.live.com,DIRECT',
'DOMAIN,login.windows.net,DIRECT',
'DOMAIN,account.live.com,DIRECT',
'DOMAIN,clientconfig.passport.net,DIRECT',
'DOMAIN,windowsphone.com,DIRECT',
'DOMAIN,www.msftconnecttest.com,DIRECT',
'DOMAIN-SUFFIX,wns.windows.com,DIRECT',
'DOMAIN-SUFFIX,microsoft.com,DIRECT',
'DOMAIN-SUFFIX,s-microsoft.com,DIRECT',
]
const rules = content['rules'] ?? []
// Javascript Set keeps insertion order
content['rules'] = Array.from(new Set([...prependingRules, ...rules]))
return content
}
2. Parser
Parser 是每次更新订阅完成之后,对订阅得到的内容进行修改的一种机制,需要更新订阅才能生效,而且不同的订阅可以有不同的 parsers。