DocsByRcDocsByRc
OpenClash Kill Switch 配置
OpenClash · 进阶

OpenClash Kill Switch 配置

iStoreOS 上基于 nftables 的 Kill Switch 防泄漏:代理断开时自动断网,大陆直连放行,附验证与卸载恢复。

适用iStoreOS / OpenClash
难度进阶
阅读—

较新的 iStoreOS 及 OpenWrt 系统已全面升级至 Firewall4 (nftables) 架构,彻底淘汰了旧版的 iptables / ipset。因此,我们将直接使用 nftables 原生语法 操作底层防火墙。

运行逻辑:OpenClash 存活时,脚本会在底层主转发链顶部强制挂载一条规则:只要目标 IP 属于 @china_ip_route (大陆 IP 表),立刻放行直连;一旦 OpenClash 关闭或崩溃,系统防火墙重载,这条绿色通道瞬间销毁。最后通过防火墙的“通信规则”实现特定设备的例外通行与全局防泄露阻断。

必须确保 OpenClash 的底层直连开关已开启,以便系统底层生成大陆 IP 地址集供防火墙调用。

进入 OpenClash -> 模式设置,勾选 “绕过中国大陆 IP (Bypass Mainland China IP)”,然后点击页面底部的“保存配置”。

保存后在 SSH 里验证大陆 IP 集合确实生成了(有输出才算成功,没有输出说明没生效,先别往下做):

路由器命令行
nft list set inet fw4 china_ip_route | head -5

我们让 OpenClash 每次启动时,自动向底层 fw4 防火墙注入绿灯通行规则。请打开你的 SSH 终端,完整复制并执行以下代码(代码内置了智能去重机制):

BASH
# 1. 确保自定义规则目录存在
mkdir -p /etc/openclash/custom/

# 2. 一键写入针对 iStoreOS (nftables) 的放行逻辑
cat << 'EOF' > /etc/openclash/custom/openclash_custom_firewall_rules.sh
#!/bin/sh
# 专为 Firewall4 / nftables 打造的 Kill Switch 放行规则

# 前置检查:确认 OpenClash 已生成大陆 IP 集合,不存在则报错退出。
# 没有这个检查时,nft insert 会因 2>/dev/null 静默失败,用户无感知,
# 但国内流量会被底部的 REJECT 拦截,表现为"国内网站全打不开",极难排查。
nft list set inet fw4 china_ip_route >/dev/null 2>&1 || { echo "错误: 未找到 @china_ip_route,请先在 OpenClash 里开启「绕过大陆」并重启 OpenClash"; exit 1; }

# 检查并放行 IPv4 的大陆直连流量
nft list chain inet fw4 forward | grep -q "@china_ip_route accept" || nft insert rule inet fw4 forward ip daddr @china_ip_route accept 2>/dev/null

# 检查并放行 IPv6 的大陆直连流量 (存在 IPv6 环境时生效)
nft list chain inet fw4 forward | grep -q "@china_ip6_route accept" || nft insert rule inet fw4 forward ip6 daddr @china_ip6_route accept 2>/dev/null

exit 0
EOF

# 3. 赋予脚本可执行权限
chmod +x /etc/openclash/custom/openclash_custom_firewall_rules.sh
这条注入规则没有自愈能力:它只在 OpenClash 启动时注入一次。如果之后 fw4 因故重载(网口拨号重连、手动重启防火墙、装其他插件触发重载),这条放行规则会丢失,而 OpenClash 还在运行——结果是国内网站全部被底部的“直连防泄漏”拦截,且没有任何报错,非常难排查。建议加一个定时自检(每 5 分钟检查规则是否存在,丢了就重注):
路由器命令行
# 写入自检脚本:规则丢了就重新注入
cat << 'EOF' > /root/ks_rule_guard.sh
#!/bin/sh
nft list chain inet fw4 forward | grep -q "@china_ip_route accept" || \
  nft insert rule inet fw4 forward ip daddr @china_ip_route accept 2>/dev/null
EOF
chmod +x /root/ks_rule_guard.sh
# 加到 crontab,每 5 分钟跑一次
(crontab -l 2>/dev/null; echo "*/5 * * * * /root/ks_rule_guard.sh") | crontab -

为了在实现全局 Kill Switch 的同时,允许特定设备或目标节点绕过代理限制直连,我们需要在系统的“通信规则”中建立通行与拦截的优先级列表。

进入 iStoreOS 网页后台,导航至 网络 -> 防火墙 -> 通信规则,点击“添加”,依次创建以下 4 条规则。请务必保证从左至右的添加顺序(因为防火墙匹配优先级是从上往下,接受规则必须在拒绝规则上方):

下面规则里标黄的 IP(你的PVE主机IP1/2、你的VPS公网IP)是占位符,必须换成你自己的真实 IP 再填——照抄示例 IP 会导致规则不生效,白名单失效后合法流量会被底部的“直连防泄漏”拦截。
名称:PVE直连通行
协议:TCP, UDP
源区域:lan
源地址:你的PVE主机IP1 (输入后回车,再继续输入) 你的PVE主机IP2
源端口:任意
目标区域:wan
目标地址:任意
目标端口:任意
操作:接受 (Accept)
名称:VPS直连通行
协议:TCP, UDP
源区域:lan
源地址:任意
源端口:任意
目标区域:wan
目标地址:你的VPS公网IP
目标端口:任意
操作:接受 (Accept)
名称:旁路由防泄漏
协议:TCP, UDP
源区域:lan
源地址:192.168.5.0/24, 192.168.9.0/24... (输入所有需要限制的旁路由网段)
源端口:任意
目标区域:wan
目标地址:任意
目标端口:任意
操作:拒绝 (Reject)
名称:直连防泄漏
协议:TCP, UDP
源区域:lan
源地址:任意
源端口:任意
目标区域:wan
目标地址:任意
目标端口:任意
操作:拒绝 (Reject)
核心闭环逻辑:列表中最后的“直连防泄漏”规则如同切断总闸,负责截断普通局域网终端的一切非代理直连流量。只有匹配了上方特定 IP 的终端(如 PVE 或指定节点),以及 OpenClash 运行时通过底层脚本放行的大陆 IP 流量,才能顺利出站。

完成所有操作后,请进入 OpenClash 运行状态 页面,点击 重启 OpenClash,让所有放行脚本正式接管网络。

测试 A(正常运转):OpenClash 运行时,打开国内网站测试,速度快、无延迟。指定的 PVE 宿主机与 VPS 节点也能不受限制进行通信。

✅ 测试 B(灾难防漏演练):在后台手动关闭 OpenClash 插件。此时放行脚本失效,所有非白名单终端将立刻断网,完美实现无死角的 Kill Switch 安全防泄漏。

如果未来你需要彻底清除这个断网保护策略,将网络恢复到最初没有限制的状态,请依次执行以下三个步骤:

我们需要把之前在防火墙里建立的拦截和放行规则全部删掉,解除对局域网流量的强行管控。

1. 登录 iStoreOS 后台,导航至 网络 -> 防火墙 -> 通信规则。
2. 找到之前创建的规则(“PVE直连通行”、“VPS直连通行”、“旁路由防泄漏”、“直连防泄漏”)。
3. 依次点击它们右侧红色的 “删除” 按钮。
4. 点击页面右下角的 保存并应用。

清理掉 OpenClash 每次启动时自动注入到底层防火墙的绿灯放行脚本。

BASH
# 在终端(SSH)中执行以下命令,直接删除该自定义脚本文件:
rm -f /etc/openclash/custom/openclash_custom_firewall_rules.sh

最后,检查并确保防火墙的主体转发策略为默认状态。

1. 导航至 网络 -> 防火墙 -> 常规设置。
2. 在下方的“区域 (Zones)”列表中,找到源区域为 lan、目标区域为 wan 的那一行(lan ⇒ wan)。
3. 确认该行的 转发 (Forward) 为 “接受 (Accept)”(本教程没有动过这里,正常就应该是接受;如果显示“拒绝/丢弃”,说明被其他操作改过,改回接受即可)。
4. 点击右下角的 保存并应用,然后重启 OpenClash 即可彻底恢复原状。