引流

telegram @ 新記事本 - New Notepad

本文 @ 新記事本 - New Notepad


前言

当用户开启一个现代的操作系统时,系统通常都会在链接互联网后尝试访问一个 http 链接用于检测当前连接的网络是否正常连通。由于 Clash Tunnel 的策略,当你开启 TUN 后并使用 fake-ip 模式时,此时系统发送的、用于查询当前网络是否能够连通的请求也会被 Clash 接管,此时操作系统可能存在无法发送请求的情况。

当你使用 clash-for-windows 时这个情况是不需要担心的,作者 Fndroid 已经默认添加了 msftconnecttest.com 以及 msftncsi.com 在默认配置中,但是在 linux 如果我们需要自行配置 config.yaml,因此如何找到我们 OS 的用于检测网络连通性的 URI 就显得有意义了。

TL, DR

/etc/NetworkManager/conf.d/ 下新建文本文件 20-connectivity.conf,填写以下文本

[connectivity]
enabled=true
uri=http://cp.cloudflare.com/generate_204
interval=300
response=

或者一步到位:

sudo sh -c 'echo -e "[connectivity]\nenabled=true\nuri=http://cp.cloudflare.com/generate_204\ninterval=300\nresponse=" > /etc/NetworkManager/conf.d/20-connectivity.conf'

其中 uri 这里使用了 cloudflare 的连通性检查服务,其返回头中 X-NetworkManager-Status 应当值应为 online

几个常见的国内可用的同类型服务商有:

深入一步

在 Ref 1 中可以看到我们在现代的 Linux 发行版中是被推荐自己新建 /etc/NetworkManager/conf.d/20-connectivity.conf 这一个文件的,而不是直接编辑 /usr/lib/NetworkManager/conf.d/20-connectivity-intern.conf,前者具有更高的优先级,且在日后系统更新相关服务时不会被系统重新覆盖。

其中的各项参数可以自己查看 Ref 1

我可以不修改系统配置吗?

如果你不想编辑 /etc/.../20-connectivity.conf 的话,你可以查找 /usr/lib/NetworkManager/conf.d/20-connectivity-inter.conf 下的 uri,将其中的域名部分添加进你的 clash config 中 fake-ip-filter 部分,这是与 Clash-for-Windows 的解决方式一致,且可以跟随你的配置文件,以后在任意设备上都不需要单独修改,两种方式你自行选择。

cat /usr/lib/NetworkManager/conf.d/20-connectivity-*.conf | grep uri

我遇到了什么问题?

在我重装了我的 fedora-workstation 后,这一次我的修改并没有生效(需要注意的是我在 redir-host 以及 fake-ip 下都是显示没有网络连通性)。如果你在 Terminal 中输入了以下命令,与我的结果相当,则你遇到了与我相同的情况

$ NetworkManager --print-config
# NetworkManager configuration: /etc/NetworkManager/NetworkManager.conf (etc: 20-connectivity-fedora.conf, 20-connectivity.conf)

[main]
# plugins=
# rc-manager=auto
# auth-polkit=true
# dhcp=internal
# iwd-config-path=
configure-and-quit=no

[connectivity]
enabled=true
uri=http://cp.cloudflare.com/generate_204
interval=300
response=

[logging]
# backend=journal
# audit=false

[device]
# wifi.backend=wpa_supplicant

# no-auto-default file "/var/lib/NetworkManager/no-auto-default.state"

这里可以看到我的配置文件不存在问题,因此我很确信这一部分就是由于开启了 TUN 以及 fake-ip 所造成的。

你可以尝试重启你的电脑,查看重启后是否正常,但至少在我这里不生效。如果不生效,可以重启 NetworkManager

sudo systemctl restart NetworkManager.service

至此……这个困扰我两三天的问题就好了。

其他连通性网址 20240101

最近发现 Cloudflare 的连通性网址在国内并不好用,通过检索互联网上常见的连通性监测网址,汇总如下,以供参考。

服务提供商 链接 推荐度 备注
Google http://www.gstatic.com/generate_204 不推荐 /
Google http://www.google.com/generate_204 不推荐 /
Apple http://captive.apple.com 一般推荐 /
Apple http://www.apple.com/library/test/success.html 一般推荐 /
Microsoft http://www.msftconnecttest.com/connecttest.txt 较推荐 /
Cloudflare http://cp.cloudflare.com/ 较不推荐 存在偶尔断联的情况
Firefox http://detectportal.firefox.com/success.txt 一般推荐 /
Xiaomi http://connect.rom.miui.com/generate_204 推荐 非常稳定
HuaWei http://connectivitycheck.platform.hicloud.com/generate_204 推荐 非常稳定
Vivo http://wifi.vivo.com.cn/generate_204 推荐 非常稳定

另外我也在思考,当当前选用的节点不可用时,是否应当使用来自国外的联通性检测网址?如果只考虑检测当前网络不可用,当然可以参考这篇文章。

参考

Ref 1. - https://wiki.archlinux.org/title/NetworkManager#Checking_connectivity

Ref 2. - https://developer-old.gnome.org/NetworkManager/stable/NetworkManager.conf.html#connectivty_section:~:text=connectivity%20section