OpenClash Kill Switch 配置
iStoreOS 上基于 nftables 的 Kill Switch 防泄漏:代理断开时自动断网,大陆直连放行,附验证与卸载恢复。
较新的 iStoreOS 及 OpenWrt 系统已全面升级至 Firewall4 (nftables) 架构,彻底淘汰了旧版的 iptables / ipset。因此,我们将直接使用 nftables 原生语法 操作底层防火墙。
运行逻辑:OpenClash 存活时,脚本会在底层主转发链顶部强制挂载一条规则:只要目标 IP 属于 @china_ip_route (大陆 IP 表),立刻放行直连;一旦 OpenClash 关闭或崩溃,系统防火墙重载,这条绿色通道瞬间销毁。最后通过防火墙的“通信规则”实现特定设备的例外通行与全局防泄露阻断。
必须确保 OpenClash 的底层直连开关已开启,以便系统底层生成大陆 IP 地址集供防火墙调用。
保存后在 SSH 里验证大陆 IP 集合确实生成了(有输出才算成功,没有输出说明没生效,先别往下做):
nft list set inet fw4 china_ip_route | head -5
我们让 OpenClash 每次启动时,自动向底层 fw4 防火墙注入绿灯通行规则。请打开你的 SSH 终端,完整复制并执行以下代码(代码内置了智能去重机制):
# 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
# 写入自检脚本:规则丢了就重新注入 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 条规则。请务必保证从左至右的添加顺序(因为防火墙匹配优先级是从上往下,接受规则必须在拒绝规则上方):
名称: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)
完成所有操作后,请进入 OpenClash 运行状态 页面,点击 重启 OpenClash,让所有放行脚本正式接管网络。
✅ 测试 B(灾难防漏演练):在后台手动关闭 OpenClash 插件。此时放行脚本失效,所有非白名单终端将立刻断网,完美实现无死角的 Kill Switch 安全防泄漏。
如果未来你需要彻底清除这个断网保护策略,将网络恢复到最初没有限制的状态,请依次执行以下三个步骤:
我们需要把之前在防火墙里建立的拦截和放行规则全部删掉,解除对局域网流量的强行管控。
2. 找到之前创建的规则(“PVE直连通行”、“VPS直连通行”、“旁路由防泄漏”、“直连防泄漏”)。
3. 依次点击它们右侧红色的 “删除” 按钮。
4. 点击页面右下角的 保存并应用。
清理掉 OpenClash 每次启动时自动注入到底层防火墙的绿灯放行脚本。
# 在终端(SSH)中执行以下命令,直接删除该自定义脚本文件: rm -f /etc/openclash/custom/openclash_custom_firewall_rules.sh
最后,检查并确保防火墙的主体转发策略为默认状态。
2. 在下方的“区域 (Zones)”列表中,找到源区域为 lan、目标区域为 wan 的那一行(lan ⇒ wan)。
3. 确认该行的 转发 (Forward) 为 “接受 (Accept)”(本教程没有动过这里,正常就应该是接受;如果显示“拒绝/丢弃”,说明被其他操作改过,改回接受即可)。
4. 点击右下角的 保存并应用,然后重启 OpenClash 即可彻底恢复原状。