Kill Switch(断网保护)
拦截所有不经过 Throne 的流量(即使没有配置档运行时也是如此),并在断网保护把你锁在网络之外时恢复连接。
自 1.4.0 起,Throne 提供断网保护(kill switch)。开启后,你的电脑只能通过 Throne 发送流量:通过 TUN 模式、通过本地代理端口,或者作为 Throne 自身的连接。其他所有流量都会被拦截,即使没有配置档运行时也是如此。如果代理停止或连接中断,应用也无法退回到你的普通连接。
它的作用
只要 Throne 在运行,无论是否有配置档运行,断网保护都会生效:
| 情况 | 哪些流量能通过 |
|---|---|
| 配置档以 TUN 模式运行 | 全部流量,因为所有流量都经过 TUN 网卡。 |
| 配置档仅以系统代理运行 | 使用代理的应用。忽略代理的应用会被拦截。 |
| 没有配置档运行 | 几乎没有:只有本地网络和下文列出的例外。 |
Throne 自身不受影响:它的核心始终可以连接你的服务器,并发送被你的规则设为 direct 的流量。完整列表请参见始终允许的流量。
Throne 退出时,断网保护随之结束。Throne 崩溃时它也会结束,因此崩溃不会让你断网,但此后它也不再保护你。请将 TUN 模式与断网保护配合使用:这样在配置档运行期间,所有应用都能正常工作。
开启断网保护
- 打开
设置(Settings)→基本设置(Basic Settings)→安全(Security)。 - 勾选
Kill Switch。 - 点击
确定(OK)。
断网保护需要与 TUN 模式相同的权限;参见要求。在 Linux 和 macOS 上,开启它会重启 Throne 的核心,正在运行的配置档也会随之重启。断网保护启动期间,Throne 会等它启动完成后再启动配置档。
检查它是否生效:
- 日志显示“[Kill switch] On: only traffic through Throne can leave this device.”([Kill switch] 已开启:只有经过 Throne 的流量才能离开此设备。)
- 窗口标题和托盘提示显示
[Kill switch]。 - 启动按钮上有一个小锁。它的提示文字会说明断网保护当前的状态:
| 锁 | 提示文字 | 含义 |
|---|---|---|
| 灰色 | “Kill switch: starting…” | 断网保护正在启动。 |
| 绿色 | “Kill switch: on — traffic only flows through Throne's Tun” | 配置档正以 TUN 模式运行。 |
| 琥珀色 | “Kill switch: Tun is not running, so most traffic is blocked” | 没有配置档运行,或者 TUN 模式已关闭。 |
| 红色 | “Kill switch is not active”或“Kill switch is blocking traffic” | 断网保护出现了问题;参见无法工作时。 |
该设置会被保存。每次 Throne 启动时,断网保护都会再次启动。
始终允许的流量
- Throne 的核心(
ThroneCore):到你服务器的连接、被你的规则设为direct的流量、URL 测试,以及 Throne 自身 DNS 服务器的 DNS 查询。额外核心(Extra Core)配置档的程序也会被放行。 - TUN 网卡。 所有进入 Throne TUN 网卡的流量。
- 环回地址(
127.0.0.1、::1)。应用通过它访问本地代理端口。 - 本地网络,除非在
设置(Settings)→Tun 设置(Tun Settings)中关闭了私有地址范围绕过(Private Range Bypass)。以下范围算作本地:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16、224.0.0.0/4、255.255.255.255、fc00::/7、fe80::/10和ff00::/8。你对私有地址范围绕过列表所做的修改不会改变这份列表。 - 网络基础协议: DHCP 和 DHCPv6、IPv6 邻居发现和路由器发现,以及组播组消息(IGMP 和 MLD)。你的电脑会保留它的网络地址。
- Throne API。 当 Throne API 在某个网络地址上监听时,它对客户端的回复可以通过。
即使允许了本地网络,其他程序发往本地地址的 DNS 查询(端口 53 和 853)仍会被拦截。路由器中的 DNS 服务器会把这些查询转发到隧道之外。在 Linux 上,如果 /etc/resolv.conf 中指定了这样的服务器,Throne 会发出警告:“the system DNS server … is on the local network and the kill switch blocks DNS to it”(系统 DNS 服务器 … 位于本地网络中,断网保护会拦截发往它的 DNS)。在 TUN 模式下,请使用 systemd-resolved(Throne 会把它指向隧道),或者使用本地网络之外的 DNS 服务器。
其他所有流量都会被拦截,例如:
- Throne 自身的请求,例如订阅更新、更新检查和 WARP 注册。它们只有在 TUN 模式下,或者在配置档运行且开启了
设置(Settings)→基本设置(Basic Settings)→杂项(Miscellaneous)→使用代理(Use proxy)或系统代理(System Proxy)时才能工作。 - 这台电脑为其他设备、容器或虚拟机转发的流量,除非它经过 TUN 网卡或留在本地网络内。
- 其他 VPN 应用的流量。
在 macOS 上,断网保护启动时已打开的连接会被断开一次。应用会重新连接。
工作原理
Throne 会启动一个单独的守卫进程 ThroneCore --guard。它会添加防火墙规则,每 5 秒检查一次这些规则是否仍然存在,并在 Throne 停止它、Throne 退出或 Throne 崩溃时移除这些规则。
- Linux: 一个名为
throne-guard-…的 nftables 表。守卫进程结束时,内核会删除它。Throne 的核心通过其所属的组来识别:核心会切换到组 ID 1950896719,额外核心程序也以这个组运行。 - macOS: 一个名为
com.apple/000.throne-guard.…的 pf 锚点(anchor)。守卫进程会在需要期间开启 pf。核心通过与 Linux 上相同的组 ID 来识别。如果某个守卫进程结束时没有移除它的规则,Throne 会在下次核心启动时移除它们。 - Windows: 名为“Throne kill switch”的 Windows 筛选平台(WFP)筛选器。守卫进程结束时,Windows 会删除它们。
ThroneCore.exe和额外核心配置档的程序通过路径来识别。当你启动额外核心配置档时,Throne 会先把它的程序添加到断网保护中(“[Kill switch] Allowing the extra core …”)。
如果其他程序移除了这些规则或关闭了防火墙,Throne 会重新启动断网保护,最多每 30 秒一次。
要求
| 系统 | 断网保护需要什么 |
|---|---|
| Windows | Throne 以管理员身份运行,并且 Windows 服务 Base Filtering Engine 正在运行。 |
| Linux | 核心通过 SUID 位以 root 身份运行。这正是 Throne 为 TUN 模式所做的设置。只具有能力(setcap)的核心是不够的。需要 Linux 5.12 或更高版本,并支持 nftables 和 conntrack 标签(CONFIG_NFT_CT 和 CONFIG_NF_CONNTRACK_LABELS)。 |
| macOS | 核心通过 SUID 位以 root 身份运行,与 TUN 模式相同。/etc/pf.conf 必须加载 com.apple 锚点,默认情况下就是如此。 |
Throne 如何设置这些权限,请参见 TUN 模式的权限。
无法工作时
当断网保护已开启但无法启动,或者停止工作时,Throne 会显示“Kill switch is not active”(断网保护未生效)及其原因。窗口标题显示 [Kill switch: not active]。可用的按钮:
Restart as Administrator(Windows)或Grant Privileges(Linux 和 macOS),在缺少权限时显示。它们的作用与 TUN 模式中的相同。Retry,用于其他问题。Disable Kill Switch,关闭该设置。
断网保护已开启但未生效时,不会拦截任何流量,Throne 也不会启动配置档。日志显示“[Kill switch] Not starting …: the kill switch is not active.”([Kill switch] 未启动 …:断网保护未生效。)这样可以避免你在实际未受保护时,误以为自己受到保护而使用配置档。请解决问题,或者关闭断网保护。
原因带有一个代码。它会出现在日志中(“[Kill switch] Not active: …”),也会作为 Throne API 中的 kill_switch_error 出现:
| 代码 | 含义 |
|---|---|
privilege |
缺少权限:Throne 没有以管理员身份运行(Windows),或者核心没有 root 权限(Linux、macOS)。 |
unsupported |
这个系统无法运行断网保护:例如没有 nftables、版本低于 5.12 或不支持 conntrack 标签的 Linux,使用能力而不是 root 的 Linux 核心,没有 com.apple 锚点的 pf 配置,或者已停止的 Base Filtering Engine 服务。 |
config |
断网保护拒绝了它的设置,例如无效的 TUN 地址。 |
tampered |
其他程序移除了规则或关闭了防火墙,并且重新启动也无济于事。 |
crash、timeout、internal |
守卫进程已停止,或者未能在 15 秒内就绪。Retry 通常有效。 |
overridden |
仅限无界面 Throne:它是以 --no-kill-switch 启动的。 |
Kill Switch 正在阻断流量
在 Linux 上,核心必须切换到断网保护的组。如果无法切换,例如在没有 CAP_SETGID 的容器或用户命名空间中,断网保护会继续拦截流量,但 Throne 会拒绝启动配置档。窗口标题和托盘提示显示 [Kill Switch 正在阻断流量],警告中只提供 Disable Kill Switch。此时你的电脑无法访问互联网,直到你关闭断网保护为止。
关闭断网保护
使用以下任一方式:
- 取消勾选
设置(Settings)→基本设置(Basic Settings)→安全(Security)→Kill Switch,然后点击确定(OK)。 - 右键点击启动按钮 →
Disable Kill Switch。Throne 会询问“Turn off the kill switch? Traffic that does not go through Throne will no longer be blocked.”(要关闭断网保护吗?不经过 Throne 的流量将不再被拦截。)点击Disable Kill Switch。 - 在断网保护的警告中点击
Disable Kill Switch。
日志显示“[Kill switch] Off.”([Kill switch] 已关闭。)你的应用可以再次使用普通连接。
被锁在网络之外时
Throne 的设置无需互联网连接即可使用。打开设置,按上述方法关闭断网保护。
如果 Throne 没有响应:
- 退出 Throne,或者在任务管理器中结束它。守卫进程会察觉到这一点,并在几秒内移除它的规则。
- 如果流量仍被拦截,请自行结束守卫进程:
- Windows: 在任务管理器 →
详细信息(Details)中,结束所有ThroneCore.exe。Windows 会随进程一起移除筛选器。重启 Windows 也会移除它们。 - Linux: 运行
sudo pkill -f 'ThroneCore --guard'。内核会随进程一起移除该表。 - macOS: 运行
sudo pkill -f 'ThroneCore --guard'。如果规则仍然存在,请再次启动 Throne:它的核心会移除这些规则。或者用sudo pfctl -a com.apple -s Anchors列出锚点,再用sudo pfctl -a 'com.apple/000.throne-guard.…' -F all清除以000.throne-guard.开头的那个锚点。重启 macOS 也会移除它们。
- Windows: 在任务管理器 →
- 启动 Throne,并在做其他任何事情之前先关闭断网保护。在你关闭它之前,它每次都会随 Throne 一起启动。
Android 版
Throne for Android 没有断网保护。Android 自带这项功能:将 Throne 设为始终开启的 VPN,并开启“屏蔽未使用 VPN 的所有连接”(Block connections without VPN)。参见始终开启的 VPN。
无界面 Throne
无界面 Throne 具有相同的断网保护。用 thronectl settings set kill_switch=true 开启它。不同之处如下:
- 所需的权限取决于你的安装方式。在 Linux 上,断网保护需要一个以 root 身份运行的单元(unit),或者一个带有 SUID 位的核心;只有能力会得到
unsupported。参见 Linux 上的权限。 - 当断网保护无法工作时,无界面 Throne 会在日志中记录原因,拒绝配置档(
kill_switch_inactive),并报告kill_switch_failed。 - 如果断网保护让你无法访问这台电脑,请用
--no-kill-switch启动 Throne 一次。参见恢复访问。