Karakeep 踩坑日记(二):AdGuard 与 Mihomo 的 DNS 冲突

日期:2026-09-04

今天继续处理 Karakeep 的网络问题。

之前导入书签后,Karakeep 抓取部分网页时报错:

Refusing to access disallowed resolved address 198.18.3.50

排查发现并不是网站本身有问题,而是服务器开启 Mihomo 后,DNS 被 Fake-IP 接管了。

执行:

nslookup www.fnnas.com

返回:

198.18.x.x

关闭 Mihomo 后重新解析,就恢复成正常公网 IP。

原因是 Mihomo 原来的 TUN 配置开启了:

dns-hijack:
  - any:53
  - tcp://any:53

同时 DNS 使用:

enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16

Karakeep 本身带有 SSRF 防护,因此看到 198.18.x.x 这种特殊地址后会直接拒绝访问。


调整 AdGuard Home

AdGuard Home 原来使用 Docker 端口映射,今天改成了 Host 网络:

services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf

DNS 直接监听:

192.168.5.100:53

管理页面:

http://192.168.5.100:3001

同时继续保留内部域名解析:

rewrites:
  - domain: '*.home.52huahua.cn'
    answer: 192.168.5.100
    enabled: true

现在局域网、宿主机和 Docker 的 DNS 都统一交给 AdGuard。


Mihomo 的问题

测试 Google:

curl -I https://www.google.com --max-time 10

开始会出现:

TLS connect error
unexpected eof while reading

但显式通过 Mihomo:

curl -I -x http://192.168.5.100:7890 https://www.google.com --max-time 10

可以正常返回:

HTTP/2 200

说明代理节点没问题,问题出在透明代理。

最后给 Mihomo 增加:

sniffer:
  enable: true
  sniff:
    HTTP:
      ports:
        - 80
        - 8080-8880
      override-destination: true

    TLS:
      ports:
        - 443
        - 8443

    QUIC:
      ports:
        - 443
        - 8443

TUN 增加:

auto-redirect: true

并删除:

dns-hijack:
  - any:53
  - tcp://any:53

最终 TUN:

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-redirect: true
  auto-detect-interface: true
  strict-route: true

  route-exclude-address:
    - 127.0.0.0/8
    - 10.0.0.0/8
    - 100.64.0.0/10
    - 172.16.0.0/12
    - 192.168.0.0/16
    - 169.254.0.0/16

Mihomo 自己的 DNS 只监听本机:

dns:
  enable: true
  ipv6: false
  listen: 127.0.0.1:1053

不再参与整个局域网的 DNS。


最终效果

重启 Mihomo:

mihomoctl restart

直接测试:

curl -I https://www.google.com --max-time 10

成功:

HTTP/2 200

也就是说现在的结构变成了:

AdGuard
→ 负责 DNS

Mihomo TUN
→ 负责接管流量

Sniffer
→ 从 HTTP / TLS / QUIC 中识别域名

Rules
→ 决定 DIRECT / PROXY

最重要的是 AdGuard 不再依赖 Mihomo。

以后即使:

mihomoctl stop

局域网 DNS、内部域名和国内网络依然可以正常使用,只是 Google、YouTube 等需要代理的网站无法访问。

这才是我想要的结构:

AdGuard = 基础 DNS 服务
Mihomo  = 可随时开关的代理增强层

另外 Karakeep 这种带 SSRF 防护的程序不适合直接使用 Fake-IP,后续继续让它使用 AdGuard 的真实 DNS,需要代理时再单独走 Mihomo。