转载自:https://vlike.work/tech/clash-how-to-dns.html

问题现象说明

Clash 的 DNS 异常 (DNS 服务器不应答) 会导致内存占用不断增加,比如,我在路由器上最开始启动时 Clash 进程只占用了 60-80MB 内存资源,由于我配置了多个 DNS 服务器,其中有一个无效 (被墙或者其他原因吧)DoT 地址 (https://1.1.1.1/dns-query),然后运行了 2 个小时后内存资源占用达到了 200MB 左右,这基本上占满了路由器的内存。

解决方法

既然是 DNS 无应答导致问题,那就去掉无效的 DNS 服务器地址呗。

虽然 UDP 协议的 DNS 协议不安全,但目前来看还是不得不用,如下是我的 DNS 配置:

# 透明代理开启DNS
dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:1053
  enhanced-mode: redir-host # redir-host or fake-ip
  use-hosts: false # lookup hosts and return IP record
  nameserver:
    # - 114.114.114.114
    - https://dns.alidns.com/dns-query
  # 提供 fallback 时,如果GEOIP非 CN 中国时使用 fallback 解析
  fallback:
    - 1.1.1.1 # cloudflare DNS UDP
    - 8.8.8.8 # Google DNS UDP
    # - https://cloudflare-dns.com/dns-query # cloudflare DNS over HTTPS
    # - https://dns.google/dns-query # Google DNS over HTTPS
    # - tls://1.1.1.1:853 # cloudflare DNS over TLS
    # - tls://8.8.8.8:853 # Google DNS over TLS
  # 强制DNS解析使用`fallback`配置
  fallback-filter:
    # true: CN使用nameserver解析,非CN使用fallback
    geoip: true
    # geoip设置为false时有效: 不匹配`ipcidr`地址时会使用`nameserver`结果,匹配`ipcidr`地址时使用`fallback`结果。
    ipcidr:
      - 240.0.0.0/4

最后

通过 htoplsof 命令分析了一段时间,内存资源增长问题终于解决了 , 这个问题并不能算是 Clash 的 bug,而只能算做配置不当引起的问题,以后配置规则的标准是 需要的配置,多余的必须删掉 / 注释掉.

如果你想分析你的 Clash 是否存在这样的问题,你需要在你的路由器上安装 htoplsof 命令。

htop 命令更只管查看进程资源使用情况 (配合 htop 和 lsof 使用),lsof 命令分析进程都打开了哪些资源文件 (包括网络连接), 执行下面命令查看 SYN_SEND 状态的链接 (其中 32137 是 clash 进程 ID):

lsof -p 32137|grep SYN

如果输出中包含你的 DNS 地址,那就是 DNS 服务器无法连接了,换个公开的 DNS 服务器地址就可以了。

clash   32137 root    7u     inet 1787119      0t0     TCP 123.123.123.123:54566->169.197.142.187:https (SYN_SENT)
clash   32137 root    9u     inet 1787121      0t0     TCP 123.123.123.123:54004->38.91.102.86:https (SYN_SENT)
clash   32137 root   11u     inet 1787145      0t0     TCP 123.123.123.123:58065->1.1.1.1:853 (SYN_SENT)

看到了第三行中 1.1.1.1:853 是我配置的 DoT 类型 DNS 服务器地址,对于我的网络无法使用它,只能注释掉这个配置了。

看到这里,你是否明白 Clash 内存增长的原因了呢?如果你有这样的问题,就将无效的 DNS 配置删掉后重启试试吧。

忙活半天其实就为了能节省 100MB 左右的内存空间,没了这 100MB 的空间,路由器咔咔的没反应,以至于后来折腾出来了 利用闲置笔记本搭建软路由的教程,今天可以省掉了软路由了,华硕的路由器性能够用就好。