Skip to content

[Bug] 特定情况下,会屏蔽路由器所有外部请求 #864

@jiesou

Description

@jiesou

Verify steps

  • 我已经在 Issue Tracker 中找过我要提出的问题 I have searched on the issue tracker for a related issue.
  • 我已经使用公测版本测试过,问题依旧存在 I have tested using the test mod, and the issue still exists.
  • 我已经仔细看过 常见问题 并无法自行解决问题

Description

screenshot

如图,启用 DNS 劫持、IPv6 透明代理的情况下,ShellCrash 会在 prerouting_dns 以及 prerouting 链中添加规则,屏蔽所有外部请求。这个设计是不合理的

它会在 prerouting 阶段就拒绝掉所有不是自己网段的请求。而 openwrt 防火墙通信规则改的是 input_wan 链。即使用户 自己在通信规则里放行 特定端口,也会被 shellcrash 在 prerouting 阶段就拦截下来

如果是处于安全考虑,防止 clash 的 dns 被投到公网上的话,那也它应该只拒绝掉 clash 监听的 dns(udp 1053 端口)。而且 openwrt 的防火墙默认就会在 input 链中拒绝掉除用户规则外的所有入站请求,这部分其实不用 ShellCrash 来做(绝大多数系统的防火墙都是这样)

可以在 ShellCrash 运行的情况下,把路由器 22 端口转发到 wan,然后公网连路由器 SSH 来直接复现

观察到以下几段相关代码(iptables 和 nftables,以及局域网黑白名单的模式都有):

nft add rule inet shellcrash "$1"_dns ip saddr != {$HOST_IP} return #屏蔽外部请求

[ "$1" = 'ip6tables' ] && { #屏蔽外部请求

nft add rule inet shellcrash $1 ip saddr {$FL_IP} return

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions