[OpenWrt]使用OpenClash科学上网

OpenClash几乎支持了所有协议,并且配置也很全面。

下载

首先手动下载.ipk包文件。截止这篇文章,最新版本为v0.46.011-beta

1
wget -O luci-app-openclash.ipk https://github.com/vernesong/OpenClash/releases/download/v0.46.011-beta/luci-app-openclash_0.46.011-beta_all.ipk

如果在 OpenWrt 中无法下载,那么可在宿主机通过代理下载后再拷贝上去。

1
scp ./luci-app-openclash.ipk [email protected]:/root/

再下载一个v1.11.0-7-g5497ada 版本的 Dev 内核备用。

1
wget -O https://github.com/vernesong/OpenClash/releases/download/Clash/clash-linux-amd64.tar.gz clash-linux-amd64.tar.gz

安装

注意要先安装依赖

luci-app-openclash.ipk中并没有包含全部依赖,如果缺少依赖会导致各种问题,比如 OpenClash 自身无法使用代理上网。

1
2
3
4
opkg update
opkg remove dnsmasq
opkg install luci-compat
opkg install ./luci-app-openclash.ipk

openclash 使用了 dnsmasq-full,为了避免冲突,需要先卸载 dnsmasq。
同时,openclash 也依赖 luci 的 cbi 模块,需要先安装 luci-compat。

配置

内核

OpenClash 使用的 dev 内核是已经跑路的Clash 项目,会自动定期编译

1
GOARCH=amd64 GOOS=linux CGO_ENABLED=0 go build -trimpath -ldflags '-X "github.com/Dreamacro/clash/constant.Version=v1.17.0-5-ge1ec0d2" -X "github.com/Dreamacro/clash/constant.BuildTime=Sat Jul 29 19:08:17 UTC 2023" -w -s -buildid=' -o bin/clash

编译好的内核文件没有放在ipk包中,初次使用时需要根据 Openwrt 系统自助下载内核。
如果是 arm 路由器比如使用 aarch64_cortex-a53 的EasyPi ARS2,则需要编译对应的版本,比如 AUK9527 做的iStore 扩展插件包

内核的下载地址是 github 仓库,github 会间歇性的抽风,当抽风时无法在控制台下载。

1
2
3
4
2022-07-25 07:26:34 【Dev】版本内核更新失败,请确认设备闪存空间足够后再试!
2022-07-25 07:26:34 【Dev】版本内核下载成功,开始更新...
2022-07-25 07:26:04 【Dev】版本内核正在下载,如下载失败请尝试手动下载并上传...
2022-07-25 07:23:56 警告:OpenClash 目前处于未启用状态,请从插件页面启动本插件,脚本退出...

不要被日志中的请确认设备闪存空间足够后再试骗了,其实是网络错误而不是闪存空间不足。

这时需要像下载ipk那样,手动下载再上传到 OpenWrt 上。

1
2
wget -O clash-linux-amd64.tar.gz https://github.com/vernesong/OpenClash/releases/download/Clash/clash-linux-amd64.tar.gz
scp clash-linux-amd64.tar.gz [email protected]:/etc/openclash/core

内核下载地址

注意:

新的内核只支持 fake-ip,如果使用了在线订阅模板,最好使用老的内核。
否则会出现invalid mode: redir-host的错误,可参见这个issue

上传到 OpenWrt/etc/openclash/core下的对应位置。

  • Dev 内核: clash
  • Tun 内核: clash_tun
  • Meta 内核: clash_meta
1
2
3
cd /etc/openclash/core
tar -zxvf clash-linux-amd64.tar.gz
rm clash-linux-amd64.tar.gz

clash内核的权限应该为nobody:nogroup,可以手动修改权限,也可以让 openclash 自行修改。

1
chown nobody:nogroup /etc/openclash/core/* 2>/dev/null

下载 Dev 内核并应用后,就可以配置好代理,之后使用控制台来更新内核了。

UDP

如果要玩游戏,需要 UDP 连接,必须切换至 TUN 或混合模式。

比如原神就需要 UDP 连接,如果使用增强模式会进入游戏后会白屏然后连接超时,需要切换到 TUN 或混合模式以支持 UDP 连接。

订阅

如果使用的是justmysocks机场的订阅链接,必须使用订阅转换服务,否则将不能识别订阅配置。使用默认的api.dler.io(默认)即可。

有时候订阅服务器会出问题,可以试着使用其它备用订阅转换网站的转换网址。

如果使用的是飞鸟机场,也必须使用订阅转换服务,否则在 redir-host 模式下无法解析域名,只能使用 Fake-IP 模式。
可能是因为没有 dns 段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dns:
enable: true
ipv6: false
listen: 0.0.0.0:7874
enhanced-mode: fake-ip
default-nameserver:
- 119.29.29.29
- 119.28.28.28
- 1.0.0.1
- 208.67.222.222
- 1.2.4.8
nameserver:
- https://dns.alidns.com/dns-query
- https://1.1.1.1/dns-query
- tls://dns.adguard.com:853
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "+.*"

仪表盘

如果订阅链接没有问题,此时应该一切正常。

可以打开Dashboard控制面板去仪表盘进行策略配置了。

Fake IP 模式

OpenClash 支持 Redir-Host 和 Fake-IP 两种模式,默认为 Redir-Host 模式。

Fake IP 出自RFC3089,这个 RFC 定义了一种新的将 TCP 连接封装成 SOCKS 协议的方法。这里有篇文章介绍的比较详细。

它与 Redir-Host 模式的最主要区别是:

  1. 客户端发出的 DNS 解析请求会被代理端捕获,然后立即从 Fake IP 池子里取一个 IP 建立映射返回。
  2. 客户端发起对这个 Fake IP 的 TCP 连接,又被代理端截获,再返查出域名。
  3. 代理端使用 SOCKS 协议封装 TCP 连接和域名。
    整个过程都无需解析 DNS,因此速度会更快。

但它也有几个问题:

  • 无法 ping 域名,解析得到的会是内网的 Fake IP
  • windows 会认为没有连接到互联网,需要将\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet下的几个域名添加至覆写设置->DNS 设置->Fake-IP-Filter。
  • windows 时间同步的 NTP(Network Time Protocol)域名:time.windows.com

如果对性能不是有很强的要求,还是建议使用 Redir-Host 模式。

偶尔有部分网址无法连接

偶尔有百度无法连接的情况,此时可将代理模式切换至 Global 模式,再切回 Rule,通常药到病除。只是重启 OpenClash 不行。

可参看这个Issue

自定义规则集

规则集英文是Rule Provider,它可以在config.yml之外补充一些规则。

比如最近大陆把微软 OneDrive 墙了,那么我们可以在配置文件管理中,新增一个类型为 classic 的本地规则:

1
2
3
payload:
# > OneDrive
- DOMAIN-SUFFIX,onedrive.live.com

然后在规则集与策略组管理中的自定义规则集与策略组管理中使用它:

这样当访问后缀为onedrive.live.com的网站时,就会使用代理了。

geo 数据库订阅

如果在更新 geo 数据库时出错,可能会导致 geo 文件缺乏,openclash 无法启动。此时需要手动下载并上传 geo 数据库的文件。

geo 数据库的文件有好几个,Country.mmdbGeoSite.datGeoIP.dat都在/etc/openclash/下。

我们可以在/usr/share/openclash/目录下找到对应的更新脚本:openclash_ipdb.shopenclash_geosite.shopenclash_geoip.sh

再在更新脚本中找到下载地址:https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/lite/Country.mmdbhttps://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dathttps://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat

在本地下载后,再上传至 openwrt 的/etc/openclash/

路由器自身使用代理

如果路由器自身不能翻墙,很多更新都会失败。

如果出现路由器自身不能翻墙的问题,多半是依赖没有安装。可去到插件设置->调试日志中生成日志。查看是否有依赖未安装。
安装完依赖后,重启 OpenClash 应该就能正常使用了。

比如下面这个日志,就缺少iptables相关依赖导致 openwrt 自身无法使用代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#===================== 依赖检查 =====================#

dnsmasq-full: 已安装
coreutils: 已安装
coreutils-nohup: 已安装
bash: 已安装
curl: 已安装
ca-certificates: 已安装
ipset: 已安装
ip-full: 已安装
libcap: 已安装
libcap-bin: 已安装
ruby: 已安装
ruby-yaml: 已安装
ruby-psych: 已安装
ruby-pstore: 已安装
kmod-tun(TUN模式): 已安装
luci-compat(Luci >= 19.07): 已安装
kmod-inet-diag(PROCESS-NAME): 未安装
unzip: 已安装
iptables-mod-tproxy: 未安装
kmod-ipt-tproxy: 未安装
iptables-mod-extra: 未安装
kmod-ipt-extra: 未安装
kmod-ipt-nat: 已安装

关于 Clash 作为透明代理,在clash 项目中有过讨论

BT/PT

为了防止BT、P2P下载流量经过代理,可选中覆写设置 -> 规则设备 -> 仅代理命中规则流量

选中后将会在配置文件未尾添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- PROCESS-NAME,aria2c,DIRECT
- PROCESS-NAME,BitComet,DIRECT
- PROCESS-NAME,fdm,DIRECT
- PROCESS-NAME,NetTransport,DIRECT
- PROCESS-NAME,qbittorrent,DIRECT
- PROCESS-NAME,Thunder,DIRECT
- PROCESS-NAME,transmission-daemon,DIRECT
- PROCESS-NAME,transmission-qt,DIRECT
- PROCESS-NAME,uTorrent,DIRECT
- PROCESS-NAME,WebTorrent,DIRECT
- PROCESS-NAME,Folx,DIRECT
- PROCESS-NAME,Transmission,DIRECT
- PROCESS-NAME,WebTorrent Helper,DIRECT
- PROCESS-NAME,v2ray,DIRECT
- PROCESS-NAME,ss-local,DIRECT
- PROCESS-NAME,ssr-local,DIRECT
- PROCESS-NAME,ss-redir,DIRECT
- PROCESS-NAME,ssr-redir,DIRECT
- PROCESS-NAME,ss-server,DIRECT
- PROCESS-NAME,trojan-go,DIRECT
- PROCESS-NAME,xray,DIRECT
- PROCESS-NAME,hysteria,DIRECT
- PROCESS-NAME,singbox,DIRECT
- PROCESS-NAME,UUBooster,DIRECT
- PROCESS-NAME,uugamebooster,DIRECT
- "DST-PORT,80,\U0001F41F 漏网之鱼"
- "DST-PORT,443,\U0001F41F 漏网之鱼"
- "DST-PORT,22,\U0001F41F 漏网之鱼"
- MATCH,DIRECT

对于漏网之鱼只代理22、80、443端口的流量,其它则直连。