前言
我们继续趁热打铁,将UnblockNeteaseMusic也一起部署了,因为它也要用到 nftables
来实现。
下载与安装
unblockneteasemusic
这个名称太长了,我们把它更名为 unblocknem
。我默认你已经按照 前文(二) 安装好了必要的软件了。以下为root用户运行的命令。
|
|
创建服务
unblocknem.service
创建工作目录/var/lib/unblocknem
。
|
|
创建文件 /etc/systemd/system/unblocknem.service
,内容如下。这时 clash
的配置文件为 /var/lib/unblocknem/unblocknem.env
。
|
|
如果你比较讲究Linux哲学,可以把 EnvironmentFile
改成下面这样,这时 unblocknem
的配置文件为 /etc/default/unblocknem
。
|
|
如果不想以root用户运行 unblocknem
,可以自行创建用户 unblocknem
和用户组 unblocknem
,然后在 /etc/systemd/system/unblocknem.service
的 [Service]
单元下增加下面两行,同时修改 /var/lib/unblocknem
及其子文件为该普通用户所有。(后续的脚本都是以root用户为运行用户进行的,如果要把 unblocknem
服务调整为普通用户运行,请自行修改脚本)。
|
|
安装依赖
在 前文(二) 我们已经安装了UnblockNeteaseMusic的一个依赖项: yt-dlp,在实际运行中,部分情况下还需要另外一个依赖:phantomjs。这个软件已经多年没有更新过了。
|
|
unblocknem 的配置文件
没有配置文件, unblocknem
也是可以以默认配置启动的。如有需要,可以新建 /var/lib/unblocknem/unblocknem.env
或 /etc/default/unblocknem
,内容如下,请注意按照注释修改。全部环境变量详见 官方README。
|
|
生成自己的证书
|
|
脚本会在 /var/lib/unblocknem
目录下生成这些文件。如果你不以root用户来启动 unblocknem
,则请注意修改它们的所有者。
|
|
调整 nftables 规则
在 前文(四) 中我们为 clash
创建了一些 nftables
规则,现在我们多了 unblocknem
,它也需要,所以我们要调整一下 前文(四) 中的 /usr/local/bin/mynftables.nft
,调整为下面这个样子。
|
|
注意到我们在第51行多引用了一个文件 /var/lib/clash/nem_address.nft
(可先下载这个并非最新的文件到指定位置来将就一下:nem_address.nft,我们将在 本系列第(七)篇 用定时任务来自动更新这个文件),在第63-67行多形成了一个集合 nem_address_set
,在第85行插入了一行规则 ip daddr @nem_address_set goto clash_tproxy
,这条规则插入在 ip daddr @geoip4_cn_set accept
之前,表示虽然网易云音乐IP是中国大陆IP,但要在直接接收前转到透明代理并停止后续规则。现在的 prerouting
链内容有点多,其实可以一拆为三。
|
|
一拆为三后,新的 divert
链的优先级为 mangle
(-150),新的neteasemusic
链的优先级为 dstnat
(-100),而新的 prerouting
链则仍是 filter
(0),数值越小,优先级越高,所以 ip daddr @nem_address_set goto clash_tproxy
这条规则仍然早于 ip daddr @geoip4_cn_set accept
执行。这样也可以让网易云音乐IP在被直接接收前就转到透明代理去。
unblocknem
工作在应用层,clash
转给它后,它出来的流量会经由 output
链中的 ip daddr @geoip4_cn_set accept
直接出去,不会形成环路(output
链并没有再劫持这部分流量)。这也就意味着上述规则只能代理局域网中除旁路由以外其他设备(以旁路由为网关的)的网易云音乐流量,不能代理旁路由自己的网易云音乐流量。
调整 clash 配置文件
我们后续将在 本系列第(七)篇 用定时任务来自动在 clash
的配置中自动插入下面这些内容。
在 clash
的配置文件中 proxies:
部分新增:
|
|
proxy-groups:
部分新增:
|
|
rules:
部分新增(各地IP可能是不一样的,我们将在 本系列第(七)篇 用定时任务来自动生成它,将其刷新为你本地的解析IP):
|
|
网易云音乐IP只允许解析IPv4
因为我们的透明代理只代理 IPv4
流量,所以我们不能让网易云音乐客户端解析出 IPv6
地址。有好几种方式可以实现,既可以在 mosdns
中实现,也可以在 adguardhome
中实现,但后者有 webui
要方便些,并且 adguardhome
是第一级,它有可能会切换到后备服务器而不向 mosdns
发起请求,所以我们就选后者吧。
在 adguardhome
中实现也有两种方式,其一是将 “设置 -> DNS设置 -> 上游DNS服务器” 设置为下面这样(这种方式不会计入“被拦截域名”中,但是如若 adguardhome
在 clash
遇到故障会切换到后备,对后备是不生效的),直接将网易云音乐的解析发到 clash
去解析,因为我们关闭了 clash
的DNS模块的 IPv6
解析。
|
|
其二是在 “过滤器 -> 自定义过滤规则” 中添加规则如下(这种方式会计入“被拦截域名”中,但是对包括后备在内的全部上游DNS服务器都有效)。
|
|
只能保证目前有效。上述两种方式,都由于 CNAME
域名的存在,光处理 music.163.com
和 music.163.com.163jiasu.com
不行,还要处理它们背后的 CNAME
域名。可能有望在未来得以改进,详见 Hosts-Blocklists#dnstype。
启用服务
完全配置好以后,我们可以设置 /etc/systemd/system/unblocknem.service
为开启自动启动,并立即启动起来。如果这个时候 clash
还没有启动起来,那么 unblocknem
服务就还不可用。都启动好后,unblocknem
将会监听在 8080
和 8081
端口上。
|
|
后续如想查看日志,我们直接使用Debian自带的工具来查看:
|
|
如果想要重启:
|
|
客户端
安卓系统不支持。
Windows
安装网易云音乐客户端后,创建一个快捷方式,然后在该快捷方式的属性中的“目标”增加 --ignore-certificate-errors
,注意有个空格。
ArchLinux系
将刚刚生成的 /var/lib/unblocknem/ca.crt
下载下来,然后运行:
|
|
在启动命令行后面添加 --ignore-certificate-errors
,然后启动即可。
Debian系
将刚刚生成的 /var/lib/unblocknem/ca.crt
下载下来,放在 /usr/local/share/ca-certificates
下,然后运行:
|
|
在启动命令行后面添加 --ignore-certificate-errors
,然后启动即可。
最后
打开 clash
的 webui
:http://10.0.0.2:9090/ui/xd/#/proxies ,选择 网易音乐
为 网易代理
;你再打开网易云音乐客户端后,在 http://10.0.0.2:9090/ui/xd/#/conns 就能看到许多连接都接管到 UnblockNeteaseMusic
了。
从 unblocknem.service
的日志中也能看到它的作用,这些灰色歌曲都被接管了。