vernesong / OpenClash

A Clash Client For OpenWrt
MIT License
17.52k stars 3.18k forks source link

[Bug] 无法关闭或取消 dns-hijack: - tcp://any:53 #3470

Closed Mosney closed 1 year ago

Mosney commented 1 year ago

Verify Steps

OpenClash Version

v0.45.129-beta

Bug on Environment

Official OpenWrt

Bug on Platform

Linux-amd64(x86-64)

To Reproduce

N/A

Describe the Bug

我在局域网内部署了另外一套DNS系统,因此不需要DNS劫持功能。所以我在luci内的 插件设置 DNS设置 中将本地DNS劫持设置为 停用 ,但openclash修改后用于启动的配置文件内还是有一条dns-hijack配置:

tun:
  enable: true
  stack: system
  auto-route: false
  auto-detect-interface: false
  dns-hijack:
  - tcp://any:53

原始配置文件中tun部分的配置如下:

tun:
  enable: true
  stack: system
  1. 我在luci挨个tab翻了两遍没找到如何关闭这个劫持项,请问开发者如何删掉这条dns-hijack?
  2. 另外auto-routeauto-detect-interface这二者是必须设置为false吗?因为我在覆写设置中同样没找到可以配置,就顺便问一下

ref #3318 中说明了UDP53通过firewall劫持,tun中的这条tcp://any:53我认为是开发者为了劫持TCP DNS而设置的,但似乎是忘记了根据luci内的设置去启用/关闭它

OpenClash Log

N/A

OpenClash Config

No response

Expected Behavior

可以配置为不进行任何DNS劫持。 或将dns-hijack:部分在luci中勾选后展示文本框供自定义,就像目前DNS设置Fake-IP-Filter Nameserver-Policy Hosts 这样的形式

Screenshots

No response

vernesong commented 1 year ago

不影响你劫持

Mosney commented 1 year ago

不影响你劫持

我不想要劫持!而不是相反🥲

ctaoist commented 1 year ago

我是想关掉内置的 dns server,作者是完全忽略这种需求

Mosney commented 1 year ago

我是想关掉内置的 dns server,作者是完全忽略这种需求

做网关代理就不应该关掉DNS server

ctaoist commented 1 year ago

我是想关掉内置的 dns server,作者是完全忽略这种需求

做网关代理就不应该关掉DNS server

我也自己搭建有另一套 dns server

Mosney commented 1 year ago

我也自己搭建有另一套 dns server

跟这个没关系,DNS必须经过clash一次,否则clash无法正确建立域名和IP的关系,进而导致分流不受domain类型的规则控制

ctaoist commented 1 year ago

我也自己搭建有另一套 dns server

跟这个没关系,DNS必须经过clash一次,否则clash无法正确建立域名和IP的关系,进而导致分流不受domain类型的规则控制

啊?我这边改lua文件关掉了dns好像也ok?再观察观察

caleee commented 9 months ago

今天查找解决方法,翻到此条,下面记录一下我的解决方法及过程以作参考

补充重要信息:此种方法相当于无视openclash自带的dns,oc的某些功能无法实现,域名相关的所有:域名分流、监控面板不显示域名等,因为oc只能拿到解析后的IP。

少了域名分流貌似失去了使用oc的必要性, 有关闭oc_dns需求的用户毕竟是极少数,作者大大不给做也无可厚非。

我的openwrt做旁路由,家人们无科学需求,有去广告需求 主路由华硕梅林,无法指定带端口的DNS地址,所以需要53端口

这里直接用mosdns v5的去广告功能,不用adhome是因为无可视化统计需求,自定义mosdns的去广告规则效果一样,而且多一个插件多一个环节也多一份开销

环境:

openwrt_23.05.2 内核_5.15.138 防火墙_Firewall4(nftables) DNS_Dnsmasq关闭(端口0) DNS_mosdns:53

OC设置:

fake-ip/tun/dns-劫持停用/dns全部指向127.0.0.1:53(mosdns)/流量控制-绕过中国大陆IP/ipv6-关闭

解决思路:

1.查看防火墙占用

连接openwrt的ssh执行命令

nft list ruleset|grep -n -C 3 "OpenClash DNS Hijack"
nft --handle --numeric list chain inet fw4 dstnat
2383-        chain dstnat {
2384-                type nat hook prerouting priority dstnat; policy accept;
2385:                udp dport 53 counter packets 40 bytes 2565 redirect to :7874 comment "OpenClash DNS Hijack"
2386:                tcp dport 53 counter packets 0 bytes 0 redirect to :7874 comment "OpenClash DNS Hijack"

发现nftables的inet fw4表的dstnat表链下有两条规则转发tcpudp53到oc_dns默认的7874端口(占用了53端口)

2.找到源码中对应的位置

结合环境情况搜索源码中的相应位置,对应oc设置

[ "$en_mode" = "fake-ip" ] && [ "$china_ip_route" = "1" ] && [ "$enable_redirect_dns" != "2" ]

关键词 "OpenClash DNS Hijack" "dstnat" "redirect" "53"

解决OC占用53端口问题:

方法1

注释掉2行代码: https://github.com/vernesong/OpenClash/blob/605973b4f67640fa0fe930b2f2a32f63e23944ff/luci-app-openclash/root/etc/init.d/openclash#L1600 https://github.com/vernesong/OpenClash/blob/605973b4f67640fa0fe930b2f2a32f63e23944ff/luci-app-openclash/root/etc/init.d/openclash#L1601

注意我的环境防火墙是Firewall4和OC设置,其他情况则寻找其他相应的代码注释

注释 /etc/init.d/openclash 的1600和1601行

#      nft insert rule inet fw4 dstnat position 0 tcp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\"
#      nft insert rule inet fw4 dstnat position 0 udp dport 53 counter redirect to "$dns_port" comment \"OpenClash DNS Hijack\"

方法2

ssh连接root用户执行:

cat << 'EOF' > /root/run_del_nft_rules.sh
#!/bin/bash
while true
do
    handle_tcp=$(nft --handle --numeric list chain inet fw4 dstnat | grep -oE 'tcp dport 53 counter packets [0-9]+ bytes [0-9]+ redirect to :7874 comment "OpenClash DNS Hijack" # handle [0-9]+' | grep -oE '[0-9]+$')
    handle_udp=$(nft --handle --numeric list chain inet fw4 dstnat | grep -oE 'udp dport 53 counter packets [0-9]+ bytes [0-9]+ redirect to :7874 comment "OpenClash DNS Hijack" # handle [0-9]+' | grep -oE '[0-9]+$')
    if [ -n "$handle_tcp" ]; then nft delete rule inet fw4 dstnat handle "$handle_tcp"; fi;
    if [ -n "$handle_udp" ]; then nft delete rule inet fw4 dstnat handle "$handle_udp"; fi;
    sleep 30;
done
EOF

grep -q "/root/run_del_nft_rules.sh" /etc/rc.local || sed -i 's/^exit 0/nohup bash \/root\/run_del_nft_rules.sh >\/dev\/null 2>\&1 \&\nexit 0/g' /etc/rc.local

解释:写一个脚本删除53端口劫持,脚本大概意思是获取tcpudp53端口的规则handle号,然后用nft delete删除

写入到开机每30秒执行

注意! 注意! 注意!openclash在fake-ip/tun模式下设置了dns劫持53端口也将无效,是否会引起其他问题未可知

还原命令:

rm -f /root/run_del_nft_rules.sh
sed -i '/\/root\/run_del_nft_rules.sh/d' /etc/rc.local

end

clacknya commented 2 months ago

终于知道怎么关闭这 sb hijack 了,直接留空就行

tun:
  enable: true
  stack: system
  auto-route: true
  auto-detect-interface: true
  dns-hijack: