Skip to content

fix: 分离 fw4 IPv4/IPv6 DNS 劫持判断 - #5209

Merged
vernesong merged 1 commit into
vernesong:devfrom
eyaeya:net/fw4-ipv6-dns-hijack
Jul 8, 2026
Merged

vernesong merged 1 commit into
vernesong:devfrom
eyaeya:net/fw4-ipv6-dns-hijack

Conversation

@eyaeya

@eyaeya eyaeya commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

问题现象

fw4/nftables 环境启用 IPv6、enable_redirect_dns=1 时,IPv4 DNS 劫持规则先写入 dstnat 后,IPv6 DNS 劫持分支可能被同一个 OpenClash DNS Hijack 注释检查短路,最终 IPv6 LAN DNS 和 router-self IPv6 DNS 没有进入预期重定向路径。

根因

fw4 IPv4 和 IPv6 分支都用 nft list chain inet fw4 dstnat | grep 'OpenClash DNS Hijack' 判断是否已有 DNS 规则。IPv4 分支先执行后,IPv6 分支只看到同名注释就跳过,没有区分 IPv4/IPv6 规则特征。

修复方案

  • 新增 fw4_has_dns_hijack_rule(chain, family),按 meta nfproto ipv6 / ip6 nexthdr 区分 IPv6 DNS 规则。
  • IPv4 guard 只判断 IPv4 DNS 劫持是否已存在;IPv6 guard 只判断 IPv6 DNS 劫持是否已存在。
  • 不改实际 nft redirect 规则,不改 iptables 分支,不改 dnsmasq/UCI 逻辑。

与已有开启态 PR 的关系

OpenClash #5191/#5193/#5197/#5198/#5202、mihomo-oix #8、mihomo #10 均不触及 fw4 IPv4/IPv6 DNS guard。该修复独立于 OIX 数据面和系统 feed 下载路径。

验证

  • bash -n luci-app-openclash/root/usr/share/openclash/*.sh
  • bash -n luci-app-openclash/root/etc/init.d/openclash
  • bash -n tests/*.sh
  • bash tests/fw4_dns_hijack_guard_test.sh
  • git diff --check
  • rg '<<<<<<<|=======|>>>>>>>' luci-app-openclash/root/etc/init.d/openclash tests 无匹配

剩余风险

未做 live nft 规则验证;本地测试用 mock nft list 覆盖 IPv4-only 和 IPv6-only 两种 guard 判定。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants