AdGuard+MosDNS+OpenClash 套娃代理组合

105 天前
 efsg

重发一遍,完善配置文件,把坑都踩了一遍,教程经验总结

自行安装 3 个插件,luci-app-openclash luci-app-mosdns luci-app-adguardhome

OpenClash 配置:

插件设置 - 模式设置 - 运行模式: 切换到 Fake-IP (增强)模式

插件设置 - DNS 设置 - 本地 DNS 劫持 选择 禁用

插件设置 - 流量控制 - 绕过中国大陆 IP 取消勾选

插件设置 - 流量控制 - 仅允许内网 开启

插件设置 - IPv6 设置 这页的选项全都关闭就行了

覆写设置 - 常规设置 这里都不用改,只需要记住 DNS 监听,后面配置 mosdns 要用

覆写设置 - DNS 设置 - 自定义上游 DNS 服务器 勾选

覆写设置 - DNS 设置 - 追加上游 DNS 勾选

覆写设置 - DNS 设置 - 追加默认 DNS 勾选

覆写设置 - DNS 设置 - Fake-IP 持久化 勾选

覆写设置 - DNS 设置 页面下方 NameServer ,FallBack ,Default-NameServer 里的 DNS 服务器全都取消勾选,我们只用运营商提供的 DNS 服务器就够了,一般运营商 DNS 都是最快的,也是 CDN 最优化的。

插件设置 - GEO 数据库订阅 把 GeoIP Dat 和 GeoSite 这两个库的自动更新打开,都选 Loyalsoldier 的版本,这个是用来给 mosdns 用的。

插件设置 - 开发者选项,添加防火墙规则

# This script is called by /etc/init.d/openclash
# Add your custom firewall rules here, they will be added after the end of the OpenClash iptables rules

en_mode=$(uci -q get openclash.config.en_mode)
proxy_port=$(uci -q get openclash.config.proxy_port)

if [ "$en_mode" == "fake-ip" ]; then
	LOG_OUT "limit route to only fake ips with proxy port $proxy_port"
	iptables -t nat -D openclash -p tcp -j REDIRECT --to-ports $proxy_port
	sleep 1

	LOG_OUT "update telegram ipset"
	/etc/mosdns/rule/geoip2ipset.sh /etc/openclash/GeoIP.dat telegram
	iptables -t nat -A openclash -m set --match-set telegram dst -p tcp -j REDIRECT --to-ports $proxy_port
	sleep 1

	LOG_OUT "update netflix ipset"
	/etc/mosdns/rule/geoip2ipset.sh /etc/openclash/GeoIP.dat netflix
	iptables -t nat -A openclash -m set --match-set netflix dst -p tcp -j REDIRECT --to-ports $proxy_port
	sleep 1
fi

#  停止 AdguradHome
LOG_OUT "stop adguardhome"
/etc/init.d/AdGuardHome stop
sleep 1

#  开启 AdguradHome
LOG_OUT "start adguardhome"
/etc/init.d/AdGuardHome start
sleep 1

# 停止 Mosdns
LOG_OUT "stop mosdns"
/etc/init.d/mosdns stop
sleep 1

# 开启 Mosdns
LOG_OUT "start mosdns"
/etc/init.d/mosdns start
sleep 1

# 重载 Mosdns
LOG_OUT "reload mosdns"
/etc/init.d/mosdns reload
sleep 1

exit 0

SSH 登录路由器,添加脚本 vi 和 nano 或者 winscp 都行,脚本路径 /etc/mosdns/rule/geoip2ipset.sh

#!/bin/bash

geoipfile="$1"
tag="$2"
tmpdir="/tmp/v2dat"
FW4=$(command -v fw4)

cd $(cd $(dirname $BASH_SOURCE) && pwd)

mkdir -p "$tmpdir"
filename=$(basename -- "$geoipfile")
filename="${filename%.*}"
filename="$tmpdir/${filename}_$tag.txt"

if [ "$tag" == "telegram" ]; then
    wget -4 --timeout 5 -O "$filename" 'https://mirror.ghproxy.com/https://raw.githubusercontent.com/fernvenue/telegram-cidr-list/master/CIDR.txt'
    if [ "$?" != "0" ]; then
         /usr/bin/v2dat unpack geoip -o "$tmpdir" -f "$tag" "$geoipfile"
    fi
else
    /usr/bin/v2dat unpack geoip -o "$tmpdir" -f "$tag" "$geoipfile"
fi

if test -f "$filename"; then
    if [ -n "$FW4" ]; then
        nft add set inet fw4 "$tag" { type ipv4_addr\; flags interval\;  auto-merge\; }
        nft add set inet fw4 "${tag}6" { type ipv6_addr\; flags interval\;  auto-merge\; }
        nft flush set inet fw4 "$tag"
        nft flush set inet fw4 "${tag}6"
    fi
    ipset create "$tag" hash:net -!
    ipset create "${tag}6" hash:net family inet6 -!
    ipset flush "$tag"
    ipset flush "${tag}6"
    while read p; do
        if ! grep -q ":" <<< "$p"; then
            if [ -n "$FW4" ]; then
                nft add element inet fw4 "$tag" { "$p" }
            fi
            ipset add "$tag" "$p"
        else
            if [ -n "$FW4" ]; then
                nft add element inet fw4 "${tag}6" { "$p" }
            fi
            ipset add "${tag}6" "$p"
        fi
    done <"$filename"
else
    echo "$filename missing."
fi

rm -rf "$tmpdir"

添加脚本执行权限

chmod a+x /etc/mosdns/rule/geoip2ipset.sh

MosDNS 配置:

MosDNS - 配置文件 - 自定义

DNS 转发 - 取消勾选

GeoData 数据导出 添加标签:

GeoSite: cn apple-cn category-games@cn geolocation-!cn GeoIP: cn

自定义配置文件:

log:
  level: info
  file: "/tmp/mosdns.log"

plugins:
  # 缓存插件
  - tag: cache
    type: cache
    args:
      size: 20480
      lazy_cache_ttl: 86400
      
  # 国内域名
  - tag: geosite_cn
    type: domain_set
    args:
      exps:
        - "lan"
        - "local"
        - "arpa"
      files:
        - "/etc/mosdns/rule/whitelist.txt"
        - "/var/mosdns/geosite_cn.txt"
        - "/var/mosdns/geosite_apple-cn.txt"
        - "/var/mosdns/geosite_category-games@cn.txt"

  # 国内 IP
  - tag: geoip_cn
    type: ip_set
    args:
      files:
        - "/var/mosdns/geoip_cn.txt"
        
  # 国外域名
  - tag: geosite_no_cn
    type: domain_set
    args:
      files:
        - "/etc/mosdns/rule/greylist.txt"
        - "/var/mosdns/geosite_geolocation-!cn.txt"
        
  # 国内 DNS
  - tag: forward_local
    type: forward
    args:
      upstreams:
        - addr: "quic://223.5.5.5"      
        - addr: "tls://1.12.12.12"
          enable_pipeline: true      
        - addr: "tls://120.53.53.53"
          enable_pipeline: true
   
  # 国外 DNS
  # 自己查找低延迟 DNS
  - tag: forward_remote
    type: forward
    args:
      upstreams:
        # 101DNS
        - addr: "tls://101.101.101.101"
          enable_pipeline: true
        # NextDNS HK 节点
        - addr: "https://45.11.104.186"
          insecure_skip_verify: true
        # OpenDNS SANDNOX
        - addr: "tls://208.67.222.2"
          enable_pipeline: true
        # OpenDNS 
        - addr: "tls://208.67.222.222"
          enable_pipeline: true                    

  # 私人分流 dns         
  - tag: forward_private
    type: forward
    args:
      upstreams: 
        - addr: "https://doh.apad.pro/dns-query"
          bootstrap: "223.5.5.5" 

          
  # 国内解析
  - tag: local_sequence
    type: sequence
    args:
      - exec: $forward_local
        
  # 国外解析
  - tag: remote_sequence
    type: sequence
    args:
      - exec: prefer_ipv4
      - exec: $forward_remote
      
  # 分流解析    
  - tag: private_sequence
    type: sequence
    args:
      - exec: $forward_private
      
  # clash 解析
  - tag: clash_sequence
    type: sequence
    args:
      - exec: forward 127.0.0.1:7874
      - exec: ttl 0

  # 有响应终止返回
  - tag: has_resp_sequence
    type: sequence
    args:
      - matches: has_resp
        exec: accept

  # fallback 用分流 sequence
  # 返回国外 IP 则用 clash 解析得出 fakeip
  - tag: fallback_sequence
    type: sequence
    args:
      - exec: $private_sequence
      - matches: "!resp_ip $geoip_cn"
        exec: goto clash_sequence
      - exec: accept
      
  # 国外 sequence
  - tag: fallback2_sequence
    type: sequence
    args:
      - exec: $remote_sequence
      - matches: "resp_ip $geoip_cn"
        exec: goto local_sequence
      - exec: goto clash_sequence      

  # fallback 用分流 DNS ,超时后用国外 DNS 解析    
  - tag: fallback
    type: fallback
    args:
      primary: fallback_sequence
      secondary: fallback2_sequence
      threshold: 2000
      always_standby: true

  # 主要的运行逻辑插件
  # sequence 插件中调用的插件 tag 必须在 sequence 前定义,
  # 否则 sequence 找不到对应插件。
  - tag: main_sequence
    type: sequence
    args:
      # drop https query type
      - matches:
        - qtype 65
        exec: reject 3

      # handle local ptr
      - matches:
        - qtype 12
        exec: $local_sequence
      - exec: jump has_resp_sequence

      #FakeIP 不缓存
      - matches:
        - qname $geosite_no_cn
        exec: $clash_sequence
      - exec: jump has_resp_sequence
      
      # 缓存
      - exec: $cache
      - exec: jump has_resp_sequence

      - matches:
        - qname $geosite_cn
        exec: $local_sequence
      - exec: jump has_resp_sequence

      - exec: $fallback

  - tag: udp_server
    type: udp_server
    args:
      entry: main_sequence
      listen: ":5335" #mosdns 监听端口

网络 - 防火墙 - 自定义规则,添加规则,重启防火墙

#5333 是 AdGuardHome 的 DNS 监听端口,两个端口必须一致
iptables -t nat -A PREROUTING -d 198.18.0.0/16 -p tcp -j REDIRECT --to-ports 7892
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5333
ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5333

AdGuardHome 配置:

AdGuardHome - 6060 重定向 - 重定向 53 端口到 AdGuardHome 如果使用上面的 iptables 防火墙规则就忽略这步

更新并且启动 AdGuardHome ,在 Web 管理页面上,设置 - DNS 设置中,上游 DNS 服务器内只填写一个 mosdns 的地址 127.0.0.1:5335 ,私人反向 DNS 服务器写上 127.0.0.1 。DNS 缓存配置里面,缓存大小看你内存大小填写,乐观缓存勾上。

对于不想走代理的设备,可以在设置 - 客户端设置中添加,并且把上游 DNS 服务器设置成 127.0.0.1

查询日志文件 /usr/bin/AdGuardHome/data/querylog.json 会把路由器闪存写满 解决方法:ADG - 常规设置 - 日志配置,取消勾选启用日志,或者将查询日志保留时间改为 6 小时,记得保存

解决谷歌 Play 商店不能更新:

ADG - 过滤器 - 添加 DNS 重写,services.googleapis.cn 198.18.1.50

如果无法使用游戏加速器:OpenClash - 插件设置 - 模式设置,取消勾选 UDP 流量转发

参考教程: https://blog.openwrtcn.eu.org/dnsling-wu-ran/ https://github.com/IrineSistiana/mosdns/discussions/796

3425 次点击
所在节点    宽带症候群
41 条回复
efsg
103 天前
@Earsum 正常情况下 nameserver 填国内 DNS ,然后 nameserver-policy 用 geo 国内外 DNS 分流,偏偏我就是会遇到各种莫名其妙的问题,前两天跟隔壁群群友折腾半天死活解决不了,最后换回这套前置 DNS 套娃 fake-ip 方案才行
Earsum
103 天前
@efsg #20 geosite 分流无效倒是挺奇怪的,是不是格式有问题导致覆写失败了?我贴一下我的 nameserver policy 配置吧。这个配置没有兜底规则。所以我在设置自定义上游 DNS 服务器的 nameserver 中设置了 1.1.1.1 和 8.8.8.8 ,并且进入编辑中将这两个 dns 的指定策略组选择了香港节点。这样配置下来一般没有 dns 泄露,并且解析到的 IP 也是离节点最近的,不会莫名其妙飞到其他国家去。

"+.cbjq.com":
- "127.0.0.1:10053"
"+.steamcommunity.com":
- "tls://1.1.1.1:853#\U0001F1ED\U0001F1F0 香港节点"
- "tls://8.8.8.8:853#\U0001F1ED\U0001F1F0 香港节点"
"+.steamcommunity-a.akamaihd.net":
- "tls://1.1.1.1:853#\U0001F1ED\U0001F1F0 香港节点"
- "tls://8.8.8.8:853#\U0001F1ED\U0001F1F0 香港节点"
"+.community.akamai.steamstatic.com":
- "tls://1.1.1.1:853#\U0001F1ED\U0001F1F0 香港节点"
- "tls://8.8.8.8:853#\U0001F1ED\U0001F1F0 香港节点"
"geosite:youtube":
- "tls://1.1.1.1:853#\U0001F4F9 油管视频"
- "tls://8.8.8.8:853#\U0001F4F9 油管视频"
"geosite:openai":
- "tls://1.1.1.1:853#\U0001F4AC OpenAi"
- "tls://8.8.8.8:853#\U0001F4AC OpenAi"
"geosite:pikpak":
- "tls://1.1.1.1:853#\U0001F1ED\U0001F1F0 香港节点"
- "tls://8.8.8.8:853#\U0001F1ED\U0001F1F0 香港节点"
"geosite:cn,apple,private,steam":
- "127.0.0.1:10053"

pikpak 的问题我也遇到过,经过观察发现需要添加以下的规则,其实只要添加 access.pikpak.me 相关的域名规则应该也可以( https://github.com/blackmatrix7/ios_rule_script/issues/1328
- IP-CIDR,161.117.181.246/32,🇭🇰 香港节点
- DOMAIN-KEYWORD,pikpak,🇭🇰 香港节点
lzzh0520
103 天前
按流程设置下来,很遗憾,失败了。不知道是不是因为防火墙是 fw4 的问题。回归 adguardhome 与 ssr+的配合,先用着吧。
Earsum
103 天前
@Earsum #22 自定义上游 DNS 服务器的 default nameserver 我也勾选了,填写的是运营商 dns ,但是因为我没有填写 doh ,所以这个的唯一的作用就是解析各个节点的域名,一般而言节点域名是不会被污染的。
frankilla
103 天前
noisay
102 天前
@username1919810 #14 对的,就是这个问题,op 有多个 issue 也提及了这个问题,但一直都没有很好的解决方法~
mac100
102 天前
这个设置 adg 好奇怪,测试 上游 5335 端口 是不通的 但有效果的。还有一个问题开了 IPV6 ,adg 客户端全是 v6 链路地址
vitoegg
102 天前
geoip2ipset.sh 里面 Telegram 要下载是为什么?是避免第一次启动的时候本地没有 GEOIP 文件吗
vitoegg
102 天前
再请教一下,想了解下 AdGuard 和 MosDNS 都开启了缓存是出于什么考虑呢,我理解有一边开启有效果了
efsg
102 天前
@vitoegg #28 TG 和 Netflix 都是纯 IP 链接的,DNS 解析器还做不到嗅探 IP 连接,这种的解决方法是这些 IPCIDR 固化走 Clash 的 Fake-IP ,所以你也会看到 ipset 规则是转发到 Clash 的透明端口 7892
efsg
102 天前
vitoegg
102 天前
@efsg 嗯嗯,这个我理解。我想问下是 GEOIP 已经下载在本地了/etc/openclash/GeoIP.dat ,TG 为什么还要每次先下载一次,我看 Netflix 就没有这个环节。想看看是不是有什么特别考虑。
efsg
102 天前
@vitoegg 可以改一下脚本,加检测跳过这个环节
efsg
102 天前
@vitoegg 才发现他的脚本压根就没写 netflix 的部分🤣
MYDB
101 天前
对于 udp 场景和连回家的需求,仍不完善
efsg
101 天前
@MYDB 回家就用 Wireguard 之类的异地组网吧,我用的是 Shadowsocks ,在 Clash 加一个策略组就行
vitoegg
101 天前
@vitoegg 我又顺了一下,怎么感觉 AdguardHome 不应该开启缓存,如果开启的话会缓存下来 Fake-IP ,时间久了可能会和 OpenClash 里面的结果对应不上导致连接失败。
b1t
96 天前
这套按照流程配置折腾了好几遍,每次都是 adg 设置 mosdns 为上游,测试上游联不通,实测也确实不通,不知道该从哪开始排查问题
b1t
96 天前
@b1t 对了,把 openclash 关了,反而通了,不知道 openclash 哪里出了问题
875127234
93 天前
clash 感觉有点烂到家了,上个网的问题搞那么多配置。
出了问题根本不好调试。
应该重新设计一下,翻墙工具到底应该设置哪些参数。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1060338

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX