当使用Docker Compose运行Clash和subconverter时,Clash配置中使用Docker Compose的服务名称访问subconverter,会遇到无法更新订阅的情况。
查看日志,伴随着subconverter的转换链接,会发现类似下面这种错误信息:
ip not found
该错误是由Clash的DNS服务引起的,关闭DNS服务可以解决此问题。
不关闭Clash DNS服务的解决方案——修改DNS配置
添加fake-ip-filter(当使用fake-ip模式时)
将subconverter服务的hostname添加到fake-ip-filter:
fake-ip-filter:
- subconverter
添加nameserver
在nameserver中添加Docker embedded DNS server(127.0.0.11):
nameserver:
- 127.0.0.11
完成以上操作重启Clash服务即可。
为什么会出现这个问题?
Docker Compose创建的容器的默认DNS(Docker embedded DNS server, 127.0.0.11),是一个由Docker Compose管理的DNS服务器,用于映射服务的IP与hostname。当我们启用Clash的DNS服务时,Clash会使用该DNS服务代替容器默认的DNS。因此在Clash启用DNS服务时,默认无法查询到Docker Compose映射的hostname。
Clash DNS的工作流程是向nameserver中配置的所有DNS服务器查询,取第一个得到的结果,但我们配置的其它公共DNS(如1.1.1.1)必然不会正确返回Docker Compose映射的结果,所以需要在nameserver中添加上Docker embedded DNS server,让Clash DNS通过Docker embedded DNS server查询Docker Compose的映射关系。
发表回复