pymumu / smartdns

A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT。
https://pymumu.github.io/smartdns/
GNU General Public License v3.0
8.29k stars 1.06k forks source link

请教如何配置分流中国大陆及中国大陆以外的域名查询 #1313

Open zsbstephen opened 1 year ago

zsbstephen commented 1 year ago

如题,目前设置第一组DNS是国内DNS,第二组是国外DNS,请问如何配置中国大陆的域名分流用第一组DNS查询,而中国大陆以外的DNS通过第二组DNS查询呢?

另外,如果是通过 域名列表文件 查询分流的话,列表格式要求如何?是否支持下面这个geosite:cn列表? https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf

不胜感谢~!

devioa commented 1 year ago

我的部分配置,可供参考,本地查询走tcp6053端口,海外域名查询走5335端口 把科学插件的DNS 解析方式设置为使用本机端口为 5335 的 DNS 服务即可 如果单纯只是为了防污染,可以用gfwlist2dnsmasq把gfwlist处理为dnsmasq格式 然后再用sed替换为smartdns可识别的格式,可以再配合crontab定期更新

server-name smartdns #服务名
bind-tcp :6053 #绑定TCP 6053端口,因为我docker有其他容器需要依赖dns服务,所以需要绑定tcp端口以便检测dns服务是否上线,一般默认udp就可以
bind :5335 -group gfwlist -no-speed-check -force-aaaa-soa #绑定UDP 5335端口,通过gfwlist组查询,禁用测速、停用IPV6解析

proxy-server socks5://127.0.0.1:1080 -name ssrp #设置本地代理服务器,别名ssrp

#默认查询组
server 114.114.114.114
server 114.114.115.115
server 180.76.76.76
server 210.2.4.8
server 2001:da8::666 -group china
server 2001:da8:208:10::6 -group china
server 2001:da8:202:10::36 -group china
server 2001:da8:8000:1:202:120:2:100 -group china

#禁用以下上游DNS服务器通过IPV6通信,因为走代理不支持IPV6
address /doh.dns.sb/#6
address /dns.google/#6
address /doh.opendns.com/#6
address /cloudflare-dns.com/#6

#Bootstrap 用于解析上游DoH IP地址
nameserver /doh.pub/bootstrap
nameserver /doh.360.cn/bootstrap
nameserver /dns.alidns.com/bootstrap
nameserver /dns.ipv6dns.com/bootstrap
nameserver /cn-south.iqiqzz.com/bootstrap
nameserver /doh.dns.sb/bootstrap
nameserver /dns.google/bootstrap
nameserver /doh.opendns.com/bootstrap
nameserver /cloudflare-dns.com/bootstrap
server 202.98.96.68 -group bootstrap
server 218.6.200.139 -group bootstrap

#国内查询组
server-https https://doh.pub/dns-query -group china
server-https https://doh.360.cn/dns-query -group china
server-https https://dns.alidns.com/dns-query -group china
server-https https://dns.ipv6dns.com/dns-query -group china
server-https https://cn-south.iqiqzz.com/dns-query -group china

#海外查询组,排除出默认查询组并通过ssrp代理查询
server-https https://doh.dns.sb/dns-query -group gfwlist -exclude-default-group -proxy ssrp
server-https https://dns.google/dns-query -group gfwlist -exclude-default-group -proxy ssrp
server-https https://doh.opendns.com/dns-query -group gfwlist -exclude-default-group -proxy ssrp
server-https https://cloudflare-dns.com/dns-query -group gfwlist -exclude-default-group -proxy ssrp

conf-file /etc/smartdns/gcnlist.conf #加载常用国内域名,指定走china查询组,独立的config file方便维护
devioa commented 1 year ago

可能是我审题没审对,如果你是想仅中国大陆的域名走第一服务器查询,而不是GFWList走第二服务器查询 其实思路差不多,我看了你发的那个列表,也是可以用sed命令替换为smartdns可识别的格式 把server=替换为nameserver,后面的114DNS替换为你国内查询组就可以了

lintaozi commented 1 year ago

用 domain-set + nameserver 就完事了

jxph1123 commented 1 year ago

我是这样的,只有默认组和第二组,默认组6053,第二组5335走科学,科学设置跳过大陆IP,默认组留一个IP形式的DNS作为bootstrap解析其他域名形式DNS,就这样简单用着也没啥问题。

log-level info
log-size 512k
speed-check-mode tcp:443,tcp:80,ping

#默认组
server-https https://223.6.6.6/dns-query
server-https https://dns.alidns.com/dns-query
server-tls dns.alidns.com
server-https https://doh.pub/dns-query
server-tls dot.pub
server-https https://doh.360.cn/dns-query
server-tls dot.360.cn

#第二组
server-https https://1.0.0.1/dns-query -group word -exclude-default-group
server-tls 1.0.0.1 -group word -exclude-default-group
server-https https://cloudflare-dns.com/dns-query -group word -exclude-default-group
server-tls 1dot1dot1dot1.cloudflare-dns.com -group word -exclude-default-group
server-https https://dns.google/dns-query -group word -exclude-default-group
server-tls dns.google -group word -exclude-default-group
server-https https://dns.quad9.net/dns-query -group word -exclude-default-group
server-tls dns.quad9.net -group word -exclude-default-group
server-https https://doh.opendns.com/dns-query -group word -exclude-default-group
zxlhhyccc commented 1 year ago

@devioa @jxph1123 测试了一下,你们两个的自定义配置貌似不能使用53端口,否则ssrp的检测连通谷歌显示不通。。。。

devioa commented 1 year ago

@devioa @jxph1123 测试了一下,你们两个的自定义配置貌似不能使用53端口,否则ssrp的检测连通谷歌显示不通。。。。

都说了是自用配置😅你要用肯定要根据你自己的环境修改一些个性化参数的

jxph1123 commented 1 year ago

我后面用的passwall,没有用53端口,用的6053,占了53端口好像passwall有问题

lifei6671 commented 1 year ago

用41版的,就不用第二个dns了,一个搞定,只要分流配置好,pw只要指向53端口就行,具体解析交给smartdns。

duanwt1983 commented 1 year ago

我提供一个解决方案,经过验证,满足你的要求:国内走一组DNS查询,国外走一组DNS查询,且国外的DNS查询是从离你的代理服务器最近的地方,这样国外的查询才有意义,我的方案是(passwall+chinadns-ng+smartdns+dnsmasq): 解析流程如下:

客户端请求 ----> dnsmasq(udp:53) ---> chinadns-ng(udp:15353) ---> smartdns ---> 国内(CN,UDP:6053) -->上游DNS
国外(US,UDP:7053) -->上游DNS passwall 这个就不用多讲了,同时也会生成 国内与国外的域名地址列表,这个列表用天chinadns-ng做分流的(chinadns-ng指定两台dns服务器,一台解析国内,一台解析国外,这个整个逻辑,具体配置如下(smartdns版本1.2023.41-1,太旧的版本可能我说的某些功能LUCI上没有):

  1. passwall 代理配置,这个网上大把的,这里就不说了,配置完后,在 “规则管理” 中 “手动更新” 会生成我们需要的分流列表文件(/usr/share/passwall/rules 目录中)

  2. chinadns-ng配置: 基本设置 ---> 监听端口:15353 ,国内DNS服务器地址:127.0.0.1#6053 ,可信DNS服务器地址:127.0.0.1#7053 ,国内路由表优先 选中 ,点 保存 路由表设置 ---> 域名黑名单,写下 /usr/share/passwall/rules/gfwlist 覆盖上面的默认值 ,自定义墙外路由表 ,清空 , 域名白名单 /usr/share/passwall/rules/chnlist,覆盖默认值,自定义墙内路由表 清空 , 配置完成后,在 基本设置 启用 打勾,最后 保存&应用 ,启动服务

  3. smartdns 配置: 基本设置 ---> 本地端口 10053 ,这个端口随意,只要不冲突就可以,这个其实没有用到 高级设置 ---> TCP服务器 取消,其它选项可参看官方文档 https://pymumu.github.io/smartdns/faq/#smartdns-dnsmasq 代理服务器设置 ---> socks5://127.0.0.1:1070 ,这个端口号是passwall配置中的 “基本设置 --> 主要 --> TCP 节点 Socks 监听端口” (版本过低是没有这一项内容的) 自定义设置 ---> 增加内容(一行一条数据,不能写成一行,不然报错): bind :6053 -group CN
    bind :7053 -group US
    第二DNS服务器 ---> 不启用,即保持默认状态即可 上游服务器,根据实际情况自行增加,要点(这也是分流的关键):国内服务器组名设置为 CN ,国外 US 每台服务器选中 “从默认服务器组排除” ,其中 US 组的服务器再选中 “使用代理”,我贴我自己的分组数据如下: server-tls 223.5.5.5 -group CN -exclude-default-group
    server-tls 120.53.53.53 -group CN -exclude-default-group server-tls 8.8.8.8 -group US -exclude-default-group -proxy default-proxy server-tls 1.1.1.1 -group US -exclude-default-group -proxy default-proxy 说明: 两组国内服务器CN,两组国外服务器US,在“自定义设置”中指定了CN走6053端口,US走7053端口,必须选中“从默认服务器组排除”,不然就没有分流效果了,同时国外的服务器选中“使用代理”的意图是,让他解析离你代理服务器最快的IP地址而不是离你的网关服务器最快,这样用国外解析才有意义

  4. 配置dnsmasq --网络--DHCP/DNS ---> 基本设置 :DNS转发 127.0.0.1#15353 (此端口为chinadns-ng监听端口) 高极设置:取消 --> 禁止解析 IPv6 DNS 记录、禁止解析 IPv4 DNS 记录 DNS 查询缓存的大小 0 DNS 服务器端口 53 (默认就是53)

至此,全部配置完成,如何验证成功与否: 1 . 找一台电脑,打开cmd ,输入 nslookup www.baidu.com 192.168.6.1 (这个改成你openwrt地址),可以解析说明国内OK,nslookup www.github.com 192.168.6.1 ,可以解析,说明国外OK

  1. 确定是否真的分流,openwrt上把国内的服务器取消,再解析下 nslookup www.qq.com 192.168.6.1 ,如果解析不了,说明分流成功,同理再测试国外的分流
  2. 如果不成功,肯定上面的步骤中有些小细节没处理好,多检查几遍试下
lifei6671 commented 1 year ago

今天研究了下41版本的smartdns,发现不需要这么复杂的配置。根据最新版本的流程,解析应该如下:

客户端解析 ----> smartdns(udup:53)   ---->  smartdns适配分流规则(gfwlist域名列表)   ---->  上游分流DNS解析(国外DNS)   ---->  将解析结果写入gfwlist  

在GFW模式下,passwall能够科学上网,主要依赖与几个ipset:

根据打印出来的iptables规则可知,只要ip在名为gfwlist的ipset里存在,就可以上网。 测试发现,只要将分流规则中的ipset设置为gfwlist,就可以不依赖dnsmasq和ChinaDNS-NG也不用配置第二个SmartDNS服务器。

我这边只在SmartDNS中配置了passwall_proxy组的DNS列表,并配置了gfwlist的域名规则使用passwall_proxy组解析,就能正常科学上网。

我的配置是这样的:

server-name smartdns
speed-check-mode ping,tcp:80,tcp:443
prefetch-domain yes
serve-expired yes
cache-size 300000
ipset-no-speed smartdns-speed-fail
rr-ttl 200
rr-ttl-min 15
rr-ttl-max 600
rr-ttl-reply-max 10
log-size 64K
log-num 1
log-level error
cache-persist yes
cache-file /etc/smartdns/smartdns.cache
proxy-server socks5://127.0.0.1:1070 -name default-proxy
force-qtype-SOA  28
resolv-file /tmp/resolv.conf.d/resolv.conf.auto
bind [::]:53@br-lan 
bind [::]:53@lo 
bind-tcp [::]:53@br-lan 
bind-tcp [::]:53@lo 
server 114.114.114.114  
server-tls 120.53.53.53:853  
server-https https://120.53.53.53/dns-query  
server-https https://doh.360.cn/dns-query  
server-https https://dns.alidns.com/dns-query  
server-tls tls://dns.alidns.com  
#这里配置了分流DNS组
server-https https://dns.google/dns-query  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tls tls://dns.google  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tcp 8.8.8.8:53  -group passwall_proxy -proxy default-proxy 
server-tls 1.1.1.1:853  -group passwall_proxy -exclude-default-group -proxy default-proxy 
#这里配置了分流解析规则
domain-set -name domain-forwarding-file -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-forwarding-file/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-forwarding-list -file /etc/smartdns/domain-forwarding.list
domain-rules /domain-set:domain-forwarding-list/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-block-list -file /etc/smartdns/domain-block.list
domain-rules /domain-set:domain-block-list/ --address #
domain-set -name domain-rule-list-cfg12524b -file '/etc/smartdns/domain-set/gfwlist_domain.txt'
#这里要将分流解析出的IP写入gfwlist,因为passwall依赖这个组的ip列表进行科学上网
domain-rules /domain-set:domain-rule-list-cfg12524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist
domain-set -name domain-rule-list-cfg14524b -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-rule-list-cfg14524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist
zmjjack commented 1 year ago

今天研究了下41版本的smartdns,发现不需要这么复杂的配置。根据最新版本的流程,解析应该如下:

客户端解析 ----> smartdns(udup:53)   ---->  smartdns适配分流规则(gfwlist域名列表)   ---->  上游分流DNS解析(国外DNS)   ---->  将解析结果写入gfwlist  

在GFW模式下,passwall能够科学上网,主要依赖与几个ipset:

  • shuntlist 未知
  • blacklist 黑名单
  • gfwlist 科学上网名单
  • laniplist 内网名单
  • vpsiplist 代理名单
  • whitelist 白名单
  • blocklist 广告过滤?

根据打印出来的iptables规则可知,只要ip在名为gfwlist的ipset里存在,就可以上网。 测试发现,只要将分流规则中的ipset设置为gfwlist,就可以不依赖dnsmasq和ChinaDNS-NG也不用配置第二个SmartDNS服务器。

我这边只在SmartDNS中配置了passwall_proxy组的DNS列表,并配置了gfwlist的域名规则使用passwall_proxy组解析,就能正常科学上网。

我的配置是这样的:

server-name smartdns
speed-check-mode ping,tcp:80,tcp:443
prefetch-domain yes
serve-expired yes
cache-size 300000
ipset-no-speed smartdns-speed-fail
rr-ttl 200
rr-ttl-min 15
rr-ttl-max 600
rr-ttl-reply-max 10
log-size 64K
log-num 1
log-level error
cache-persist yes
cache-file /etc/smartdns/smartdns.cache
proxy-server socks5://127.0.0.1:1070 -name default-proxy
force-qtype-SOA  28
resolv-file /tmp/resolv.conf.d/resolv.conf.auto
bind [::]:53@br-lan 
bind [::]:53@lo 
bind-tcp [::]:53@br-lan 
bind-tcp [::]:53@lo 
server 114.114.114.114  
server-tls 120.53.53.53:853  
server-https https://120.53.53.53/dns-query  
server-https https://doh.360.cn/dns-query  
server-https https://dns.alidns.com/dns-query  
server-tls tls://dns.alidns.com  
#这里配置了分流DNS组
server-https https://dns.google/dns-query  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tls tls://dns.google  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tcp 8.8.8.8:53  -group passwall_proxy -proxy default-proxy 
server-tls 1.1.1.1:853  -group passwall_proxy -exclude-default-group -proxy default-proxy 
#这里配置了分流解析规则
domain-set -name domain-forwarding-file -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-forwarding-file/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-forwarding-list -file /etc/smartdns/domain-forwarding.list
domain-rules /domain-set:domain-forwarding-list/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-block-list -file /etc/smartdns/domain-block.list
domain-rules /domain-set:domain-block-list/ --address #
domain-set -name domain-rule-list-cfg12524b -file '/etc/smartdns/domain-set/gfwlist_domain.txt'
#这里要将分流解析出的IP写入gfwlist,因为passwall依赖这个组的ip列表进行科学上网
domain-rules /domain-set:domain-rule-list-cfg12524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist
domain-set -name domain-rule-list-cfg14524b -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-rule-list-cfg14524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist

这个配置可以直接照搬么☺️,本人小白一枚😅

lifei6671 commented 1 year ago

今天研究了下41版本的smartdns,发现不需要这么复杂的配置。根据最新版本的流程,解析应该如下:

客户端解析 ----> smartdns(udup:53)   ---->  smartdns适配分流规则(gfwlist域名列表)   ---->  上游分流DNS解析(国外DNS)   ---->  将解析结果写入gfwlist  

在GFW模式下,passwall能够科学上网,主要依赖与几个ipset:

  • shuntlist 未知
  • blacklist 黑名单
  • gfwlist 科学上网名单
  • laniplist 内网名单
  • vpsiplist 代理名单
  • whitelist 白名单
  • blocklist 广告过滤?

根据打印出来的iptables规则可知,只要ip在名为gfwlist的ipset里存在,就可以上网。 测试发现,只要将分流规则中的ipset设置为gfwlist,就可以不依赖dnsmasq和ChinaDNS-NG也不用配置第二个SmartDNS服务器。 我这边只在SmartDNS中配置了passwall_proxy组的DNS列表,并配置了gfwlist的域名规则使用passwall_proxy组解析,就能正常科学上网。 我的配置是这样的:

server-name smartdns
speed-check-mode ping,tcp:80,tcp:443
prefetch-domain yes
serve-expired yes
cache-size 300000
ipset-no-speed smartdns-speed-fail
rr-ttl 200
rr-ttl-min 15
rr-ttl-max 600
rr-ttl-reply-max 10
log-size 64K
log-num 1
log-level error
cache-persist yes
cache-file /etc/smartdns/smartdns.cache
proxy-server socks5://127.0.0.1:1070 -name default-proxy
force-qtype-SOA  28
resolv-file /tmp/resolv.conf.d/resolv.conf.auto
bind [::]:53@br-lan 
bind [::]:53@lo 
bind-tcp [::]:53@br-lan 
bind-tcp [::]:53@lo 
server 114.114.114.114  
server-tls 120.53.53.53:853  
server-https https://120.53.53.53/dns-query  
server-https https://doh.360.cn/dns-query  
server-https https://dns.alidns.com/dns-query  
server-tls tls://dns.alidns.com  
#这里配置了分流DNS组
server-https https://dns.google/dns-query  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tls tls://dns.google  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tcp 8.8.8.8:53  -group passwall_proxy -proxy default-proxy 
server-tls 1.1.1.1:853  -group passwall_proxy -exclude-default-group -proxy default-proxy 
#这里配置了分流解析规则
domain-set -name domain-forwarding-file -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-forwarding-file/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-forwarding-list -file /etc/smartdns/domain-forwarding.list
domain-rules /domain-set:domain-forwarding-list/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-block-list -file /etc/smartdns/domain-block.list
domain-rules /domain-set:domain-block-list/ --address #
domain-set -name domain-rule-list-cfg12524b -file '/etc/smartdns/domain-set/gfwlist_domain.txt'
#这里要将分流解析出的IP写入gfwlist,因为passwall依赖这个组的ip列表进行科学上网
domain-rules /domain-set:domain-rule-list-cfg12524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist
domain-set -name domain-rule-list-cfg14524b -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-rule-list-cfg14524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist

这个配置可以直接照搬么☺️,本人小白一枚😅

可以。passwall那边DNS直连smartdns,在smartdns分流配置中要配置GFW的分流规则,这个分流规则网上有可以下载的。

zsbstephen commented 1 year ago

@devioa @duanwt1983 @lifei6671 非常感谢几位~!发了issue之后都忘了今天才想起来。本意是给某驻点软路由部署,让一些被DNS污染但没有被封IP封域名的网站能上(考虑到安全和流量原因没有部署passwall xray节点,gfwlist就不让他们上了)。因此需要其实很简单,就将cn域名用墙内公共DNS解析,!cn域名一概用墙外DNS解析即可。目前smartdns只开了第一组墙内DNS,解析墙内域名和拦截广告域名还是好使的。

Hotwill commented 1 year ago

今天研究了下41版本的smartdns,发现不需要这么复杂的配置。根据最新版本的流程,解析应该如下:

客户端解析 ----> smartdns(udup:53)   ---->  smartdns适配分流规则(gfwlist域名列表)   ---->  上游分流DNS解析(国外DNS)   ---->  将解析结果写入gfwlist  

在GFW模式下,passwall能够科学上网,主要依赖与几个ipset:

  • shuntlist 未知
  • blacklist 黑名单
  • gfwlist 科学上网名单
  • laniplist 内网名单
  • vpsiplist 代理名单
  • whitelist 白名单
  • blocklist 广告过滤?

根据打印出来的iptables规则可知,只要ip在名为gfwlist的ipset里存在,就可以上网。 测试发现,只要将分流规则中的ipset设置为gfwlist,就可以不依赖dnsmasq和ChinaDNS-NG也不用配置第二个SmartDNS服务器。

我这边只在SmartDNS中配置了passwall_proxy组的DNS列表,并配置了gfwlist的域名规则使用passwall_proxy组解析,就能正常科学上网。

我的配置是这样的:

server-name smartdns
speed-check-mode ping,tcp:80,tcp:443
prefetch-domain yes
serve-expired yes
cache-size 300000
ipset-no-speed smartdns-speed-fail
rr-ttl 200
rr-ttl-min 15
rr-ttl-max 600
rr-ttl-reply-max 10
log-size 64K
log-num 1
log-level error
cache-persist yes
cache-file /etc/smartdns/smartdns.cache
proxy-server socks5://127.0.0.1:1070 -name default-proxy
force-qtype-SOA  28
resolv-file /tmp/resolv.conf.d/resolv.conf.auto
bind [::]:53@br-lan 
bind [::]:53@lo 
bind-tcp [::]:53@br-lan 
bind-tcp [::]:53@lo 
server 114.114.114.114  
server-tls 120.53.53.53:853  
server-https https://120.53.53.53/dns-query  
server-https https://doh.360.cn/dns-query  
server-https https://dns.alidns.com/dns-query  
server-tls tls://dns.alidns.com  
#这里配置了分流DNS组
server-https https://dns.google/dns-query  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tls tls://dns.google  -group passwall_proxy -exclude-default-group -proxy default-proxy 
server-tcp 8.8.8.8:53  -group passwall_proxy -proxy default-proxy 
server-tls 1.1.1.1:853  -group passwall_proxy -exclude-default-group -proxy default-proxy 
#这里配置了分流解析规则
domain-set -name domain-forwarding-file -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-forwarding-file/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-forwarding-list -file /etc/smartdns/domain-forwarding.list
domain-rules /domain-set:domain-forwarding-list/  -nameserver passwall_proxy -speed-check-mode none -address #6 -ipset gfwlist
domain-set -name domain-block-list -file /etc/smartdns/domain-block.list
domain-rules /domain-set:domain-block-list/ --address #
domain-set -name domain-rule-list-cfg12524b -file '/etc/smartdns/domain-set/gfwlist_domain.txt'
#这里要将分流解析出的IP写入gfwlist,因为passwall依赖这个组的ip列表进行科学上网
domain-rules /domain-set:domain-rule-list-cfg12524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist
domain-set -name domain-rule-list-cfg14524b -file '/etc/smartdns/domain-set/gfw.txt'
domain-rules /domain-set:domain-rule-list-cfg14524b/  -nameserver passwall_proxy -speed-check-mode none -dualstack-ip-selection no -address #6 -ipset gfwlist

@lifei6671 大佬能否发一下配置中几个域名列表的更新网址?

SeaRat commented 1 month ago

我提供一个解决方案,经过验证,满足你的要求:国内走一组DNS查询,国外走一组DNS查询,且国外的DNS查询是从离你的代理服务器最近的地方,这样国外的查询才有意义,我的方案是(passwall+chinadns-ng+smartdns+dnsmasq): 解析流程如下:

客户端请求 ----> dnsmasq(udp:53) ---> chinadns-ng(udp:15353) ---> smartdns ---> 国内(CN,UDP:6053) -->上游DNS 国外(US,UDP:7053) -->上游DNS passwall 这个就不用多讲了,同时也会生成 国内与国外的域名地址列表,这个列表用天chinadns-ng做分流的(chinadns-ng指定两台dns服务器,一台解析国内,一台解析国外,这个整个逻辑,具体配置如下(smartdns版本1.2023.41-1,太旧的版本可能我说的某些功能LUCI上没有):

  1. passwall 代理配置,这个网上大把的,这里就不说了,配置完后,在 “规则管理” 中 “手动更新” 会生成我们需要的分流列表文件(/usr/share/passwall/rules 目录中)
  2. chinadns-ng配置: 基本设置 ---> 监听端口:15353 ,国内DNS服务器地址:127.0.0.1#6053 ,可信DNS服务器地址:127.0.0.1#7053 ,国内路由表优先 选中 ,点 保存 路由表设置 ---> 域名黑名单,写下 /usr/share/passwall/rules/gfwlist 覆盖上面的默认值 ,自定义墙外路由表 ,清空 , 域名白名单 /usr/share/passwall/rules/chnlist,覆盖默认值,自定义墙内路由表 清空 , 配置完成后,在 基本设置 启用 打勾,最后 保存&应用 ,启动服务
  3. smartdns 配置: 基本设置 ---> 本地端口 10053 ,这个端口随意,只要不冲突就可以,这个其实没有用到 高级设置 ---> TCP服务器 取消,其它选项可参看官方文档 https://pymumu.github.io/smartdns/faq/#smartdns-dnsmasq 代理服务器设置 ---> socks5://127.0.0.1:1070 ,这个端口号是passwall配置中的 “基本设置 --> 主要 --> TCP 节点 Socks 监听端口” (版本过低是没有这一项内容的) 自定义设置 ---> 增加内容(一行一条数据,不能写成一行,不然报错): bind :6053 -group CN bind :7053 -group US 第二DNS服务器 ---> 不启用,即保持默认状态即可 上游服务器,根据实际情况自行增加,要点(这也是分流的关键):国内服务器组名设置为 CN ,国外 US 每台服务器选中 “从默认服务器组排除” ,其中 US 组的服务器再选中 “使用代理”,我贴我自己的分组数据如下: server-tls 223.5.5.5 -group CN -exclude-default-group server-tls 120.53.53.53 -group CN -exclude-default-group server-tls 8.8.8.8 -group US -exclude-default-group -proxy default-proxy server-tls 1.1.1.1 -group US -exclude-default-group -proxy default-proxy 说明: 两组国内服务器CN,两组国外服务器US,在“自定义设置”中指定了CN走6053端口,US走7053端口,必须选中“从默认服务器组排除”,不然就没有分流效果了,同时国外的服务器选中“使用代理”的意图是,让他解析离你代理服务器最快的IP地址而不是离你的网关服务器最快,这样用国外解析才有意义
  4. 配置dnsmasq --网络--DHCP/DNS ---> 基本设置 :DNS转发 127.0.0.1#15353 (此端口为chinadns-ng监听端口) 高极设置:取消 --> 禁止解析 IPv6 DNS 记录、禁止解析 IPv4 DNS 记录 DNS 查询缓存的大小 0 DNS 服务器端口 53 (默认就是53)

至此,全部配置完成,如何验证成功与否: 1 . 找一台电脑,打开cmd ,输入 nslookup www.baidu.com 192.168.6.1 (这个改成你openwrt地址),可以解析说明国内OK,nslookup www.github.com 192.168.6.1 ,可以解析,说明国外OK 2. 确定是否真的分流,openwrt上把国内的服务器取消,再解析下 nslookup www.qq.com 192.168.6.1 ,如果解析不了,说明分流成功,同理再测试国外的分流 3. 如果不成功,肯定上面的步骤中有些小细节没处理好,多检查几遍试下

我提供一个解决方案,经过验证,满足你的要求:国内走一组DNS查询,国外走一组DNS查询,且国外的DNS查询是从离你的代理服务器最近的地方,这样国外的查询才有意义,我的方案是(passwall+chinadns-ng+smartdns+dnsmasq): 解析流程如下:

客户端请求 ----> dnsmasq(udp:53) ---> chinadns-ng(udp:15353) ---> smartdns ---> 国内(CN,UDP:6053) -->上游DNS 国外(US,UDP:7053) -->上游DNS passwall 这个就不用多讲了,同时也会生成 国内与国外的域名地址列表,这个列表用天chinadns-ng做分流的(chinadns-ng指定两台dns服务器,一台解析国内,一台解析国外,这个整个逻辑,具体配置如下(smartdns版本1.2023.41-1,太旧的版本可能我说的某些功能LUCI上没有):

  1. passwall 代理配置,这个网上大把的,这里就不说了,配置完后,在 “规则管理” 中 “手动更新” 会生成我们需要的分流列表文件(/usr/share/passwall/rules 目录中)
  2. chinadns-ng配置: 基本设置 ---> 监听端口:15353 ,国内DNS服务器地址:127.0.0.1#6053 ,可信DNS服务器地址:127.0.0.1#7053 ,国内路由表优先 选中 ,点 保存 路由表设置 ---> 域名黑名单,写下 /usr/share/passwall/rules/gfwlist 覆盖上面的默认值 ,自定义墙外路由表 ,清空 , 域名白名单 /usr/share/passwall/rules/chnlist,覆盖默认值,自定义墙内路由表 清空 , 配置完成后,在 基本设置 启用 打勾,最后 保存&应用 ,启动服务
  3. smartdns 配置: 基本设置 ---> 本地端口 10053 ,这个端口随意,只要不冲突就可以,这个其实没有用到 高级设置 ---> TCP服务器 取消,其它选项可参看官方文档 https://pymumu.github.io/smartdns/faq/#smartdns-dnsmasq 代理服务器设置 ---> socks5://127.0.0.1:1070 ,这个端口号是passwall配置中的 “基本设置 --> 主要 --> TCP 节点 Socks 监听端口” (版本过低是没有这一项内容的) 自定义设置 ---> 增加内容(一行一条数据,不能写成一行,不然报错): bind :6053 -group CN bind :7053 -group US 第二DNS服务器 ---> 不启用,即保持默认状态即可 上游服务器,根据实际情况自行增加,要点(这也是分流的关键):国内服务器组名设置为 CN ,国外 US 每台服务器选中 “从默认服务器组排除” ,其中 US 组的服务器再选中 “使用代理”,我贴我自己的分组数据如下: server-tls 223.5.5.5 -group CN -exclude-default-group server-tls 120.53.53.53 -group CN -exclude-default-group server-tls 8.8.8.8 -group US -exclude-default-group -proxy default-proxy server-tls 1.1.1.1 -group US -exclude-default-group -proxy default-proxy 说明: 两组国内服务器CN,两组国外服务器US,在“自定义设置”中指定了CN走6053端口,US走7053端口,必须选中“从默认服务器组排除”,不然就没有分流效果了,同时国外的服务器选中“使用代理”的意图是,让他解析离你代理服务器最快的IP地址而不是离你的网关服务器最快,这样用国外解析才有意义
  4. 配置dnsmasq --网络--DHCP/DNS ---> 基本设置 :DNS转发 127.0.0.1#15353 (此端口为chinadns-ng监听端口) 高极设置:取消 --> 禁止解析 IPv6 DNS 记录、禁止解析 IPv4 DNS 记录 DNS 查询缓存的大小 0 DNS 服务器端口 53 (默认就是53)

至此,全部配置完成,如何验证成功与否: 1 . 找一台电脑,打开cmd ,输入 nslookup www.baidu.com 192.168.6.1 (这个改成你openwrt地址),可以解析说明国内OK,nslookup www.github.com 192.168.6.1 ,可以解析,说明国外OK 2. 确定是否真的分流,openwrt上把国内的服务器取消,再解析下 nslookup www.qq.com 192.168.6.1 ,如果解析不了,说明分流成功,同理再测试国外的分流 3. 如果不成功,肯定上面的步骤中有些小细节没处理好,多检查几遍试下

看了一圈下来你的方案是最清晰的。其实那一层dnsmasq啥用没有,可以直接优化掉。具体做法是把dnsmasq的端口改成其他的,把chinadns-ng的端口改成53,这样就少一层dns。这应该是最完美的方案了

ltanme commented 1 month ago

@SeaRat 我看官网文 档,不建议修改为默认的53端口,smartdns 核心不是替代默认的53端口,本地多一层dns转发,性能几乎可以忽略

SeaRat commented 1 month ago

@SeaRat 我看官网文 档,不建议修改为默认的53端口,smartdns 核心不是替代默认的53端口,本地多一层dns转发,性能几乎可以忽略

改不改都可,反正我改了。多一层dns结构会变复杂,需要的设置项也多,所以我改了

zmjjack commented 1 month ago

@SeaRat 我看官网文 档,不建议修改为默认的53端口,smartdns 核心不是替代默认的53端口,本地多一层dns转发,性能几乎可以忽略

改不改都可,反正我改了。多一层dns结构会变复杂,需要的设置项也多,所以我改了 你所用的chinadns-ng是单独的插件?还是集成于passwall中的?