/tmp/openclash_last_version 下载失败: curl: (6) Could not resolve host: raw.githubusercontent.com
【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】
最近一直再研究路由器,然后发现一个问题,就是都设置完后,openclash自带的更新会出现问题,具体如下:
2023-12-28 15:28:35【/tmp/openclash_last_version】下载失败:【curl: (6) Could not resolve host: raw.githubusercontent.com】
2023-12-28 15:28:35【/tmp/openclash_last_version】下载失败:【curl: (6) Could not resolve host: raw.githubusercontent.com】
2023-12-28 15:28:35【/tmp/openclash_last_version】下载失败:【curl: (6) Could not resolve host: raw.githubusercontent.com】
2023-12-28 15:07:27【/tmp/openclash_last_version】下载失败:【curl: (6) Could not resolve host: raw.githubusercontent.com】
2023-12-28 15:07:27【/tmp/openclash_last_version】下载失败:【curl: (6) Could not resolve host: cdn.jsdelivr.net】
2023-12-28 15:07:27【/tmp/openclash_last_version】下载失败:【curl: (6) Could not resolve host: cdn.jsdelivr.net】
2023-12-28 15:04:29【/tmp/openclash_last_version】下载失败:【curl: (6) Could not resolve host: cdn.jsdelivr.net】
遇到这个问题当时一脸懵,然后开始排查各种原因,最终发现openclash当这个软件自己更新内部的规则也好,升级内核也好,都会直接走openwrt系统,并不会走代理,你怎么设置代理都是白费的。而关键点是,能出现这个错误,证明你使用的是openclash的“fake-ip”模式。
当openclash使用fake-ip”模式的时候,会修改“/tmp/resolv.conf”这个文件,把这个文件内nameserver修改为127.0.0.1,这就导致openclash更新的时候是按域名去访问内容,结果询问本机DNS的时候直接去访问127.0.0.1了,也就导致了找不到地址。解决方法就很简单了,就是修改“/tmp/resolv.conf”这个文件把这个文件内nameserver对应的127.0.0.1 更改为:223.5.5.5 然后就可以更新了。。。 后来经过我查找资料也证实了这一点,具体如下:
Describe the Feature
原因是来自这个(#2791) ,在启用了fake-ip的情况下,openclash代理路由器自身流量时依然会遭遇dns污染的情况。
root cause是路由器的/etc/resolv.conf决定了自身dns,openclash启动后这个文件里没有使用dnsmasq作为system resolver,虽然路由器下挂的客户端走fake-ip了(dnsmasq依然正常给lan提供了服务),但路由器本身没有使用dnsmasq的fake-ip。
Describe the Solution
大概推理顺序是这样的:
1.要让路由器也完整的走fake-ip,就要让/etc/resolv.conf使用nameserver 127.0.0.1(dnsmasq--openclash 127.0.0.1:7874),即dnsmsq作为system resolver。2.要让dnsmasq把自己设置为system resolver,就需要设置dnsmasq的localuse=1,localuse这个默认值是0的。
3.正常没有openclash的情况下,dnsmasq如果检测到noresolve=0(默认值),就会把localuse设置为1,并把自己作为system resolver,所以没有openclash的时候dnsmasq确实是作为system resolver的。
4.但是openclash启动的时候会好像给dnsmasq添加一个noresolv选项,这个当然是没问题的,因为要避免dnsmasq使用其他被污染的dns源。
uci -q delete dhcp.@dnsmasq[0].resolvfile uci -q set dhcp.@dnsmasq[0].noresolv=1 uci -q set openclash.config.redirect_dns=1
按照/etc/init.d/dnsmasq中的代码,这也就导致了dnsmsq不会把localuse设置为1,继而导致不会把自己接管为system resolver。
if [ "$noresolv" != "1" ]; then config_get resolvfile "$cfg" resolvfile /tmp/resolv.conf.d/resolv.conf.auto [ -n "$resolvfile" ] && [ ! -e "$resolvfile" ] && touch "$resolvfile" xappend "--resolv-file=$resolvfile" [ "$resolvfile" = "/tmp/resolv.conf.d/resolv.conf.auto" ] && localuse=1 resolvdir="$(dirname "$resolvfile")" fi
5.参考openwrt官方设置文档,我们其实是可以在启用noresolv的情况下,手工设置localuse为1的。
uci set dhcp.@dnsmasq[0].localuse="1" uci commit dhcp /etc/init.d/dnsmasq restart
7.实测这样操作之后,/etc/resolv.conf里的nameserver就是127.0.0.1了,走fake-ip后路由器自身流量也就没有dns污染的问题了。
所以我建议,如果检测到用户开启了fake-ip模式和代理路由器自身流量(或者其他需要openclash接管路由器system resolver的设置),那么openclash在启动时,除了设置一下dnsmasq的转发到7874和添加noresolv选项外,也添加一个localuse设置值,让dnsmasq作为路由器的system resolver,避免dns污染问题。
文章来源:https://github.com/vernesong/OpenClash/issues/3195
所以就这么简单。。。
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏