支持DNS上游服务器的并行,最快,均衡查询模式
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
CGO_ENABLED=1 \
|
||||||
|
GOOS=linux \
|
||||||
|
GOARCH=amd64 \
|
||||||
|
CC=gcc \
|
||||||
|
go build -ldflags "-linkmode external -extldflags '-static -pthread'" -o dns-server main.go
|
||||||
+9
-3
@@ -4,16 +4,22 @@
|
|||||||
"upstreamDNS": [
|
"upstreamDNS": [
|
||||||
"223.5.5.5:53",
|
"223.5.5.5:53",
|
||||||
"223.6.6.6:53",
|
"223.6.6.6:53",
|
||||||
"117.50.10.10:53"
|
"117.50.10.10:53",
|
||||||
|
"10.35.10.200:53"
|
||||||
],
|
],
|
||||||
"dnssecUpstreamDNS": [
|
"dnssecUpstreamDNS": [
|
||||||
"1.1.1.1:53"
|
"117.50.10.10:53",
|
||||||
|
"101.226.4.6:53",
|
||||||
|
"218.30.118.6:53",
|
||||||
|
"208.67.220.220:53",
|
||||||
|
"208.67.222.222:53"
|
||||||
],
|
],
|
||||||
"timeout": 5000,
|
"timeout": 5000,
|
||||||
"statsFile": "data/stats.json",
|
"statsFile": "data/stats.json",
|
||||||
"saveInterval": 300,
|
"saveInterval": 300,
|
||||||
"cacheTTL": 30,
|
"cacheTTL": 30,
|
||||||
"enableDNSSEC": true
|
"enableDNSSEC": true,
|
||||||
|
"queryMode": "parallel"
|
||||||
},
|
},
|
||||||
"http": {
|
"http": {
|
||||||
"port": 8080,
|
"port": 8080,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ type DNSConfig struct {
|
|||||||
SaveInterval int `json:"saveInterval"` // 数据保存间隔(秒)
|
SaveInterval int `json:"saveInterval"` // 数据保存间隔(秒)
|
||||||
CacheTTL int `json:"cacheTTL"` // DNS缓存过期时间(分钟)
|
CacheTTL int `json:"cacheTTL"` // DNS缓存过期时间(分钟)
|
||||||
EnableDNSSEC bool `json:"enableDNSSEC"` // 是否启用DNSSEC支持
|
EnableDNSSEC bool `json:"enableDNSSEC"` // 是否启用DNSSEC支持
|
||||||
|
QueryMode string `json:"queryMode"` // 查询模式:"loadbalance"(负载均衡)、"parallel"(并行请求)、"fastest-ip"(最快的IP地址)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPConfig HTTP控制台配置
|
// HTTPConfig HTTP控制台配置
|
||||||
@@ -101,6 +102,10 @@ func LoadConfig(path string) (*Config, error) {
|
|||||||
if len(config.DNS.DNSSECUpstreamDNS) == 0 {
|
if len(config.DNS.DNSSECUpstreamDNS) == 0 {
|
||||||
config.DNS.DNSSECUpstreamDNS = []string{"8.8.8.8:53", "1.1.1.1:53"}
|
config.DNS.DNSSECUpstreamDNS = []string{"8.8.8.8:53", "1.1.1.1:53"}
|
||||||
}
|
}
|
||||||
|
// 查询模式默认配置
|
||||||
|
if config.DNS.QueryMode == "" {
|
||||||
|
config.DNS.QueryMode = "parallel" // 默认使用并行请求模式
|
||||||
|
}
|
||||||
if config.HTTP.Port == 0 {
|
if config.HTTP.Port == 0 {
|
||||||
config.HTTP.Port = 8080
|
config.HTTP.Port = 8080
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Netscape HTTP Cookie File
|
||||||
|
# https://curl.se/docs/http-cookies.html
|
||||||
|
# This file was generated by libcurl! Edit at your own risk.
|
||||||
|
|
||||||
|
#HttpOnly_localhost FALSE / FALSE 1765974335 session_id 1765887935065810022_0
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# Hosts文件
|
|
||||||
# 格式:IP 域名
|
|
||||||
# 例如:127.0.0.1 localhost
|
|
||||||
-69498
File diff suppressed because it is too large
Load Diff
-1688
File diff suppressed because it is too large
Load Diff
-734
@@ -1,734 +0,0 @@
|
|||||||
!Title: AWAvenue Ads Rule
|
|
||||||
!--------------------------------------
|
|
||||||
!Total lines: 725
|
|
||||||
!Version: 1.5.5-release
|
|
||||||
|
|
||||||
!Homepage: https://github.com/TG-Twilight/AWAvenue-Ads-Rule
|
|
||||||
!License: https://github.com/TG-Twilight/AWAvenue-Ads-Rule/blob/main/LICENSE
|
|
||||||
|
|
||||||
|
|
||||||
||1010pic.com^
|
|
||||||
||16dd-advertise-1252317822.file.myqcloud.com^
|
|
||||||
||16dd-advertise-1252317822.image.myqcloud.com^
|
|
||||||
||8le8le.com^
|
|
||||||
||a0.app.xiaomi.com^
|
|
||||||
||aaid.umeng.com^
|
|
||||||
||abtest-ch.snssdk.com^
|
|
||||||
||ad-cache.dopool.com^
|
|
||||||
||ad-cdn.qingting.fm^
|
|
||||||
||ad-cmp.hismarttv.com^
|
|
||||||
||ad-download.hismarttv.com^
|
|
||||||
||ad-imp.hismarttv.com^
|
|
||||||
||ad-scope.com^
|
|
||||||
||ad-scope.com.cn^
|
|
||||||
||ad-sdk-config.youdao.com^
|
|
||||||
||ad-sdk.huxiu.com^
|
|
||||||
||ad.12306.cn^
|
|
||||||
||ad.51wnl.com^
|
|
||||||
||ad.bwton.com^
|
|
||||||
||ad.cctv.com^
|
|
||||||
||ad.cyapi.cn^
|
|
||||||
||ad.doubleclick.net^
|
|
||||||
||ad.partner.gifshow.com^
|
|
||||||
||ad.qingting.fm^
|
|
||||||
||ad.qq.com^
|
|
||||||
||ad.richmob.cn^
|
|
||||||
||ad.tencentmusic.com^
|
|
||||||
||ad.toutiao.com^
|
|
||||||
||ad.v3mh.com^
|
|
||||||
||ad.winrar.com.cn^
|
|
||||||
||ad.xelements.cn^
|
|
||||||
||ad.xiaomi.com^
|
|
||||||
||ad.ximalaya.com^
|
|
||||||
||ad.zijieapi.com^
|
|
||||||
||adapi.izuiyou.com^
|
|
||||||
||adapi.yynetwk.com^
|
|
||||||
||adashbc.ut.taobao.com^
|
|
||||||
||adc.hpplay.cn^
|
|
||||||
||adcdn.hpplay.cn^
|
|
||||||
||adcdn.tencentmusic.com^
|
|
||||||
||adclick.g.doubleclick.net^
|
|
||||||
||adclick.tencentmusic.com^
|
|
||||||
||adcolony.com^
|
|
||||||
||adexpo.tencentmusic.com^
|
|
||||||
||adfilter.imtt.qq.com^
|
|
||||||
||adfstat.yandex.ru^
|
|
||||||
||adguanggao.eee114.com^
|
|
||||||
||adjust.cn^
|
|
||||||
||adjust.com^
|
|
||||||
||adkwai.com^
|
|
||||||
||adlink-api.huan.tv^
|
|
||||||
||adm.funshion.com^
|
|
||||||
||ads-api-o.api.leiniao.com^
|
|
||||||
||ads-api.tiktok.com^
|
|
||||||
||ads-api.twitter.com^
|
|
||||||
||ads-img-qc.xhscdn.com^
|
|
||||||
||ads-jp.tiktok.com^
|
|
||||||
||ads-marketing-vivofs.vivo.com.cn^
|
|
||||||
||ads-sg.tiktok.com^
|
|
||||||
||ads-us.tiktok.com^
|
|
||||||
||ads-video-al.xhscdn.com^
|
|
||||||
||ads-video-qc.xhscdn.com^
|
|
||||||
||ads.95516.com^
|
|
||||||
||ads.google.cn^
|
|
||||||
||ads.heytapmobi.com^
|
|
||||||
||ads.huan.tv^
|
|
||||||
||ads.huantest.com^
|
|
||||||
||ads.icloseli.cn^
|
|
||||||
||ads.linkedin.com^
|
|
||||||
||ads.music.126.net^
|
|
||||||
||ads.oppomobile.com^
|
|
||||||
||ads.pinterest.com^
|
|
||||||
||ads.servebom.com^
|
|
||||||
||ads.service.kugou.com^
|
|
||||||
||ads.tiktok.com^
|
|
||||||
||ads.v3mh.com^
|
|
||||||
||ads.youtube.com^
|
|
||||||
||ads3-normal-hl.zijieapi.com^
|
|
||||||
||ads3-normal-lf.zijieapi.com^
|
|
||||||
||ads3-normal-lq.zijieapi.com^
|
|
||||||
||ads3-normal.zijieapi.com^
|
|
||||||
||ads5-normal-hl.zijieapi.com^
|
|
||||||
||ads5-normal-lf.zijieapi.com^
|
|
||||||
||ads5-normal-lq.zijieapi.com^
|
|
||||||
||ads5-normal.zijieapi.com^
|
|
||||||
||adse.test.ximalaya.com^
|
|
||||||
||adse.wsa.ximalaya.com^
|
|
||||||
||adse.ximalaya.com^
|
|
||||||
||adsebs.ximalaya.com^
|
|
||||||
||adsense.google.cn^
|
|
||||||
||adserver.unityads.unity3d.com^
|
|
||||||
||adservice.google.cn^
|
|
||||||
||adservice.google.com^
|
|
||||||
||adserviceretry.kugou.com^
|
|
||||||
||adsfile.bssdlbig.kugou.com^
|
|
||||||
||adsfile.qq.com^
|
|
||||||
||adsfilebssdlbig.ali.kugou.com^
|
|
||||||
||adsfileretry.service.kugou.com^
|
|
||||||
||adsfs-sdkconfig.heytapimage.com^
|
|
||||||
||adsfs.oppomobile.com^
|
|
||||||
||adslvfile.qq.com^
|
|
||||||
||adsmart.konka.com^
|
|
||||||
||adsmind.gdtimg.com^
|
|
||||||
||adsmind.ugdtimg.com^
|
|
||||||
||adsp.xunlei.com^
|
|
||||||
||adstats.tencentmusic.com^
|
|
||||||
||adstore-1252524079.file.myqcloud.com^
|
|
||||||
||adstore-index-1252524079.file.myqcloud.com^
|
|
||||||
||adtago.s3.amazonaws.com^
|
|
||||||
||adtech.yahooinc.com^
|
|
||||||
||adtrack.quark.cn^
|
|
||||||
||adukwai.com^
|
|
||||||
||adv.fjtv.net^
|
|
||||||
||adv.sec.intl.miui.com^
|
|
||||||
||adv.sec.miui.com^
|
|
||||||
||advertiseonbing.azureedge.net^
|
|
||||||
||advertising-api-eu.amazon.com^
|
|
||||||
||advertising-api-fe.amazon.com^
|
|
||||||
||advertising-api.amazon.com^
|
|
||||||
||advertising.apple.com^
|
|
||||||
||advertising.yahoo.com^
|
|
||||||
||advertising.yandex.ru^
|
|
||||||
||advice-ads.s3.amazonaws.com^
|
|
||||||
||adview.cn^
|
|
||||||
||adx-ad.smart-tv.cn^
|
|
||||||
||adx-bj.anythinktech.com^
|
|
||||||
||adx-cn.anythinktech.com^
|
|
||||||
||adx-drcn.op.dbankcloud.cn^
|
|
||||||
||adx-open-service.youku.com^
|
|
||||||
||adx-os.anythinktech.com^
|
|
||||||
||adx.ads.heytapmobi.com^
|
|
||||||
||adx.ads.oppomobile.com^
|
|
||||||
||adxlog-adnet.vivo.com.cn^
|
|
||||||
||adxlog-adnet.vivo.com.cn.dsa.dnsv1.com.cn^
|
|
||||||
||adxserver.ad.cmvideo.cn^
|
|
||||||
||aegis.qq.com^
|
|
||||||
||afs.googlesyndication.com^
|
|
||||||
||aiseet.aa.atianqi.com^
|
|
||||||
||ali-ad.a.yximgs.com^
|
|
||||||
||alog.umeng.com^
|
|
||||||
||als.baidu.com^
|
|
||||||
||amdcopen.m.taobao.com^
|
|
||||||
||amdcopen.m.umeng.com^
|
|
||||||
||an.facebook.com^
|
|
||||||
||analysis.yozocloud.cn^
|
|
||||||
||analytics-api.samsunghealthcn.com^
|
|
||||||
||analytics.126.net^
|
|
||||||
||analytics.95516.com^
|
|
||||||
||analytics.google.com^
|
|
||||||
||analytics.pinterest.com^
|
|
||||||
||analytics.pointdrive.linkedin.com^
|
|
||||||
||analytics.query.yahoo.com^
|
|
||||||
||analytics.rayjump.com^
|
|
||||||
||analytics.s3.amazonaws.com^
|
|
||||||
||analytics.tiktok.com^
|
|
||||||
||analytics.woozooo.com^
|
|
||||||
||analyticsengine.s3.amazonaws.com^
|
|
||||||
||analyze.lemurbrowser.com^
|
|
||||||
||andrqd.play.aiseet.atianqi.com^
|
|
||||||
||ap.dongqiudi.com^
|
|
||||||
||apd-pcdnwxlogin.teg.tencent-cloud.net^
|
|
||||||
||apd-pcdnwxnat.teg.tencent-cloud.net^
|
|
||||||
||apd-pcdnwxstat.teg.tencent-cloud.net^
|
|
||||||
||api-access.pangolin-sdk-toutiao.com^
|
|
||||||
||api-access.pangolin-sdk-toutiao1.com^
|
|
||||||
||api-access.pangolin-sdk-toutiao2.com^
|
|
||||||
||api-access.pangolin-sdk-toutiao3.com^
|
|
||||||
||api-access.pangolin-sdk-toutiao4.com^
|
|
||||||
||api-access.pangolin-sdk-toutiao5.com^
|
|
||||||
||api-ad-product.huxiu.com^
|
|
||||||
||api-adservices.apple.com^
|
|
||||||
||api-gd.hiaiabc.com^
|
|
||||||
||api-htp.beizi.biz^
|
|
||||||
||api.ad.xiaomi.com^
|
|
||||||
||api.e.kuaishou.com^
|
|
||||||
||api.htp.hubcloud.com.cn^
|
|
||||||
||api.hzsanjiaomao.com^
|
|
||||||
||api.installer.xiaomi.com^
|
|
||||||
||api.jietuhb.com^
|
|
||||||
||api.kingdata.ksyun.com^
|
|
||||||
||api.statsig.com^
|
|
||||||
||api5-normal-quic-lf.ixigua.com^
|
|
||||||
||apiyd.my91app.com^
|
|
||||||
||apks.webxiaobai.top^
|
|
||||||
||app-measurement.com^
|
|
||||||
||appcloud2.in.zhihu.com^
|
|
||||||
||applog.lc.quark.cn^
|
|
||||||
||applog.uc.cn^
|
|
||||||
||applog.zijieapi.com^
|
|
||||||
||ata-sdk-uuid-report.dreport.meituan.net^
|
|
||||||
||auction.unityads.unity3d.com^
|
|
||||||
||audid-api.taobao.com^
|
|
||||||
||audid.umeng.com^
|
|
||||||
||azr.footprintdns.com^
|
|
||||||
||b1-data.ads.heytapmobi.com^
|
|
||||||
||baichuan-sdk.alicdn.com^
|
|
||||||
||baichuan-sdk.taobao.com^
|
|
||||||
||bdad.123pan.cn^
|
|
||||||
||bdapi-ads.realmemobile.com^
|
|
||||||
||bdapi-in-ads.realmemobile.com^
|
|
||||||
||bdapi.ads.oppomobile.com^
|
|
||||||
||beacon-api.aliyuncs.com^
|
|
||||||
||beacon.qq.com^
|
|
||||||
||beaconcdn.qq.com^
|
|
||||||
||beacons.gvt2.com^
|
|
||||||
||beizi.biz^
|
|
||||||
||bes-mtj.baidu.com^
|
|
||||||
||bgg.baidu.com^
|
|
||||||
||bianxian.com^
|
|
||||||
||bingads.microsoft.com^
|
|
||||||
||bj.ad.track.66mobi.com^
|
|
||||||
||books-analytics-events.apple.com^
|
|
||||||
||browsercfg-drcn.cloud.dbankcloud.cn^
|
|
||||||
||bsrv.qq.com^
|
|
||||||
||bugly.qq.com^
|
|
||||||
||business-api.tiktok.com^
|
|
||||||
||c.bidtoolads.com^
|
|
||||||
||c.evidon.com^
|
|
||||||
||c.gj.qq.com^
|
|
||||||
||c.kuaiduizuoye.com^
|
|
||||||
||c.sayhi.360.cn^
|
|
||||||
||c2.gdt.qq.com^
|
|
||||||
||canvas-cdn.gdt.qq.com^
|
|
||||||
||catalog.fjwhcbsh.com^
|
|
||||||
||cbjs.baidu.com^
|
|
||||||
||ccs.umeng.com^
|
|
||||||
||cctv.adsunion.com^
|
|
||||||
||cdn-ad.wtzw.com^
|
|
||||||
||cdn-ads.oss-cn-shanghai.aliyuncs.com^
|
|
||||||
||cdn-plugin-sync-upgrade-juui.hismarttv.com^
|
|
||||||
||cdn.ad.xiaomi.com^
|
|
||||||
||cdn.ynuf.aliapp.org^
|
|
||||||
||cfg.imtt.qq.com^
|
|
||||||
||chat1.jd.com^
|
|
||||||
||chiq-cloud.com^
|
|
||||||
||cj.qidian.com^
|
|
||||||
||ck.ads.oppomobile.com^
|
|
||||||
||click.googleanalytics.com^
|
|
||||||
||click.oneplus.cn^
|
|
||||||
||clog.miguvideo.com^
|
|
||||||
||cnlogs.umeng.com^
|
|
||||||
||cnlogs.umengcloud.com^
|
|
||||||
||cnzz.com^
|
|
||||||
||collect.kugou.com^
|
|
||||||
||commdata.v.qq.com^
|
|
||||||
||config.chsmarttv.com^
|
|
||||||
||config.unityads.unity3d.com^
|
|
||||||
||cpro.baidustatic.com^
|
|
||||||
||crashlytics.com^
|
|
||||||
||crashlyticsreports-pa.googleapis.com^
|
|
||||||
||csjplatform.com^
|
|
||||||
||cws-cctv.conviva.com^
|
|
||||||
||data.ads.oppomobile.com^
|
|
||||||
||data.chsmarttv.com^
|
|
||||||
||data.mistat.india.xiaomi.com^
|
|
||||||
||data.mistat.rus.xiaomi.com^
|
|
||||||
||data.mistat.xiaomi.com^
|
|
||||||
||diagnosis.ad.xiaomi.com^
|
|
||||||
||dig.bdurl.net^
|
|
||||||
||dl.zuimeitianqi.com^
|
|
||||||
||dlogs.bwton.com^
|
|
||||||
||dm.toutiao.com^
|
|
||||||
||domain.aishengji.com^
|
|
||||||
||doubleclick-cn.net^
|
|
||||||
||download.changhong.upgrade2.huan.tv^
|
|
||||||
||downloadxml.changhong.upgrade2.huan.tv^
|
|
||||||
||drcn-weather.cloud.huawei.com^
|
|
||||||
||dsp-x.jd.com^
|
|
||||||
||dsp.fcbox.com^
|
|
||||||
||dualstack-logs.amap.com^
|
|
||||||
||dutils.com^
|
|
||||||
||dxp.baidu.com^
|
|
||||||
||e.ad.xiaomi.com^
|
|
||||||
||eclick.baidu.com^
|
|
||||||
||edge.ads.twitch.tv^
|
|
||||||
||ef-dongfeng.tanx.com^
|
|
||||||
||entry.baidu.com^
|
|
||||||
||errlog.umeng.com^
|
|
||||||
||errnewlog.umeng.com^
|
|
||||||
||event.tradplusad.com^
|
|
||||||
||events-drcn.op.dbankcloud.cn^
|
|
||||||
||events.reddit.com^
|
|
||||||
||events.redditmedia.com^
|
|
||||||
||firebaselogging-pa.googleapis.com^
|
|
||||||
||flurry.com^
|
|
||||||
||g-adnet.hiaiabc.com^
|
|
||||||
||g-staic.ganjingworld.com^
|
|
||||||
||g2.ganjing.world^
|
|
||||||
||game.loveota.com^
|
|
||||||
||gdfp.gifshow.com^
|
|
||||||
||gemini.yahoo.com^
|
|
||||||
||geo.yahoo.com^
|
|
||||||
||getui.cn^
|
|
||||||
||getui.com^
|
|
||||||
||getui.net^
|
|
||||||
||ggx.cmvideo.cn^
|
|
||||||
||ggx01.miguvideo.com^
|
|
||||||
||ggx03.miguvideo.com^
|
|
||||||
||globalapi.ad.xiaomi.com^
|
|
||||||
||google-analytics.com^
|
|
||||||
||googleads.g.doubleclick.net^
|
|
||||||
||googleadservices-cn.com^
|
|
||||||
||googleadservices.com^
|
|
||||||
||googletagservices-cn.com^
|
|
||||||
||googletagservices.com^
|
|
||||||
||gorgon.youdao.com^
|
|
||||||
||gromore.pangolin-sdk-toutiao.com^
|
|
||||||
||grs.dbankcloud.com^
|
|
||||||
||grs.hicloud.com^
|
|
||||||
||grs.platform.dbankcloud.ru^
|
|
||||||
||h-adashx.ut.taobao.com^
|
|
||||||
||h.trace.qq.com^
|
|
||||||
||hanlanad.com^
|
|
||||||
||hexagon-analytics.com^
|
|
||||||
||hm.baidu.com^
|
|
||||||
||hmma.baidu.com^
|
|
||||||
||houyi.kkmh.com^
|
|
||||||
||hpplay.cn^
|
|
||||||
||httpdns.bcelive.com^
|
|
||||||
||httpdns.ocloud.oppomobile.com^
|
|
||||||
||hugelog.fcbox.com^
|
|
||||||
||huichuan.sm.cn^
|
|
||||||
||hw-ot-ad.a.yximgs.com^
|
|
||||||
||hw.zuimeitianqi.com^
|
|
||||||
||hwpub-s01-drcn.cloud.dbankcloud.cn^
|
|
||||||
||hya.comp.360os.com^
|
|
||||||
||hybrid.miniapp.taobao.com^
|
|
||||||
||hye.comp.360os.com^
|
|
||||||
||hyt.comp.360os.com^
|
|
||||||
||i.snssdk.com^
|
|
||||||
||iad.apple.com^
|
|
||||||
||iadctest.qwapi.com^
|
|
||||||
||iadsdk.apple.com^
|
|
||||||
||iadworkbench.apple.com^
|
|
||||||
||ifacelog.iqiyi.com^
|
|
||||||
||ifs.tanx.com^
|
|
||||||
||igexin.com^
|
|
||||||
||ii.gdt.qq.com^
|
|
||||||
||imag8.pubmatic.com^
|
|
||||||
||imag86.pubmatic.com^
|
|
||||||
||image-ad.sm.cn^
|
|
||||||
||imageplus.baidu.com^
|
|
||||||
||images.outbrainimg.com^
|
|
||||||
||images.pinduoduo.com^
|
|
||||||
||img-c.heytapimage.com^
|
|
||||||
||img.adnyg.com^
|
|
||||||
||img.adnyg.com.w.kunlungr.com^
|
|
||||||
||imtmp.net^
|
|
||||||
||iot-eu-logser.realme.com^
|
|
||||||
||iot-logser.realme.com^
|
|
||||||
||ipv4.kkmh.com^
|
|
||||||
||irc.qubiankeji.com^
|
|
||||||
||itv2-up.openspeech.cn^
|
|
||||||
||ixav-cse.avlyun.com^
|
|
||||||
||iyfbodn.com^
|
|
||||||
||janapi.jd.com^
|
|
||||||
||jiguang.cn^
|
|
||||||
||jpush.cn^
|
|
||||||
||jpush.html5.qq.com^
|
|
||||||
||jpush.io^
|
|
||||||
||jswebcollects.kugou.com^
|
|
||||||
||kepler.jd.com^
|
|
||||||
||kl.67it.com^
|
|
||||||
||knicks.jd.com^
|
|
||||||
||ks.pull.yximgs.com^
|
|
||||||
||launcher.smart-tv.cn^
|
|
||||||
||launcherimg.smart-tv.cn^
|
|
||||||
||lf3-ad-union-sdk.pglstatp-toutiao.com^
|
|
||||||
||lf6-ad-union-sdk.pglstatp-toutiao.com^
|
|
||||||
||litchiads.com^
|
|
||||||
||liveats-vod.video.ptqy.gitv.tv^
|
|
||||||
||livemonitor.huan.tv^
|
|
||||||
||livep.l.aiseet.atianqi.com^
|
|
||||||
||lives.l.aiseet.atianqi.com^
|
|
||||||
||lives.l.ott.video.qq.com^
|
|
||||||
||lm10111.jtrincc.cn^
|
|
||||||
||log-api-mn.huxiu.com^
|
|
||||||
||log-api.huxiu.com^
|
|
||||||
||log-api.pangolin-sdk-toutiao-b.com^
|
|
||||||
||log-api.pangolin-sdk-toutiao.com^
|
|
||||||
||log-report.com^
|
|
||||||
||log-sdk.gifshow.com^
|
|
||||||
||log-upload-os.hoyoverse.com^
|
|
||||||
||log-upload.mihoyo.com^
|
|
||||||
||log.ad.xiaomi.com^
|
|
||||||
||log.aispeech.com^
|
|
||||||
||log.amemv.com^
|
|
||||||
||log.appstore3.huan.tv^
|
|
||||||
||log.avlyun.com^
|
|
||||||
||log.avlyun.sec.intl.miui.com^
|
|
||||||
||log.byteoversea.com^
|
|
||||||
||log.fc.yahoo.com^
|
|
||||||
||log.kuwo.cn^
|
|
||||||
||log.pinterest.com^
|
|
||||||
||log.snssdk.com^
|
|
||||||
||log.stat.kugou.com^
|
|
||||||
||log.tagtic.cn^
|
|
||||||
||log.tbs.qq.com^
|
|
||||||
||log.vcgame.cn^
|
|
||||||
||log.web.kugou.com^
|
|
||||||
||log.zijieapi.com^
|
|
||||||
||log1.cmpassport.com^
|
|
||||||
||logbak.hicloud.com^
|
|
||||||
||logs.amap.com^
|
|
||||||
||logservice.hicloud.com^
|
|
||||||
||logservice1.hicloud.com^
|
|
||||||
||logtj.kugou.com^
|
|
||||||
||logupdate.avlyun.sec.miui.com^
|
|
||||||
||m-adnet.hiaiabc.com^
|
|
||||||
||m.ad.zhangyue.com^
|
|
||||||
||m.atm.youku.com^
|
|
||||||
||m.kubiqq.com^
|
|
||||||
||m1.ad.10010.com^
|
|
||||||
||mapi.m.jd.com^
|
|
||||||
||masdkv6.3g.qq.com^
|
|
||||||
||mazu.m.qq.com^
|
|
||||||
||mbdlog.iqiyi.com^
|
|
||||||
||metrics.apple.com^
|
|
||||||
||metrics.data.hicloud.com^
|
|
||||||
||metrics.icloud.com^
|
|
||||||
||metrics.mzstatic.com^
|
|
||||||
||metrics2.data.hicloud.com^
|
|
||||||
||metrika.yandex.ru^
|
|
||||||
||mi.gdt.qq.com^
|
|
||||||
||miav-cse.avlyun.com^
|
|
||||||
||mime.baidu.com^
|
|
||||||
||mine.baidu.com^
|
|
||||||
||mission-pub.smart-tv.cn^
|
|
||||||
||miui-fxcse.avlyun.com^
|
|
||||||
||mnqlog.ldmnq.com^
|
|
||||||
||mobads-logs.baidu.com^
|
|
||||||
||mobads-pre-config.cdn.bcebos.com^
|
|
||||||
||mobads.baidu.com^
|
|
||||||
||mobile.da.mgtv.com^
|
|
||||||
||mobilelog.upqzfile.com^
|
|
||||||
||mobileservice.cn^
|
|
||||||
||mon.zijieapi.com^
|
|
||||||
||monitor-ads-test.huan.tv^
|
|
||||||
||monitor-uu.play.aiseet.atianqi.com^
|
|
||||||
||monitor.music.qq.com^
|
|
||||||
||monitor.uu.qq.com^
|
|
||||||
||monsetting.toutiao.com^
|
|
||||||
||mssdk.volces.com^
|
|
||||||
||mssdk.zijieapi.com^
|
|
||||||
||mtj.baidu.com^
|
|
||||||
||newvoice.chiq5.smart-tv.cn^
|
|
||||||
||nmetrics.samsung.com^
|
|
||||||
||notes-analytics-events.apple.com^
|
|
||||||
||nsclick.baidu.com^
|
|
||||||
||o2o.api.xiaomi.com^
|
|
||||||
||oauth-login-drcn.platform.dbankcloud.com^
|
|
||||||
||offerwall.yandex.net^
|
|
||||||
||omgmta.play.aiseet.atianqi.com^
|
|
||||||
||open.e.kuaishou.cn^
|
|
||||||
||open.e.kuaishou.com^
|
|
||||||
||open.kuaishouzt.com^
|
|
||||||
||open.kwaishouzt.com^
|
|
||||||
||open.kwaizt.com^
|
|
||||||
||optimus-ads.amap.com^
|
|
||||||
||orbit.jd.com^
|
|
||||||
||oth.eve.mdt.qq.com^
|
|
||||||
||oth.str.mdt.qq.com^
|
|
||||||
||otheve.play.aiseet.atianqi.com^
|
|
||||||
||outlookads.live.com^
|
|
||||||
||p.l.qq.com^
|
|
||||||
||p.s.360.cn^
|
|
||||||
||p1-be-pack-sign.pglstatp-toutiao.com^
|
|
||||||
||p1-lm.adkwai.com^
|
|
||||||
||p2-be-pack-sign.pglstatp-toutiao.com^
|
|
||||||
||p2-lm.adkwai.com^
|
|
||||||
||p2p.huya.com^
|
|
||||||
||p3-be-pack-sign.pglstatp-toutiao.com^
|
|
||||||
||p3-lm.adkwai.com^
|
|
||||||
||p3-tt.byteimg.com^
|
|
||||||
||p4-be-pack-sign.pglstatp-toutiao.com^
|
|
||||||
||p5-be-pack-sign.pglstatp-toutiao.com^
|
|
||||||
||p6-be-pack-sign.pglstatp-toutiao.com^
|
|
||||||
||pagead2.googleadservices.com^
|
|
||||||
||pagead2.googlesyndication.com^
|
|
||||||
||pangolin-sdk-toutiao-b.com^
|
|
||||||
||pay.sboot.cn^
|
|
||||||
||pgdt.ugdtimg.com^
|
|
||||||
||pglstatp-toutiao.com^
|
|
||||||
||pig.pupuapi.com^
|
|
||||||
||pixon.ads-pixiv.net^
|
|
||||||
||pkoplink.com^
|
|
||||||
||plbslog.umeng.com^
|
|
||||||
||pms.mb.qq.com^
|
|
||||||
||policy.video.ptqy.gitv.tv^
|
|
||||||
||pos.baidu.com^
|
|
||||||
||proxy.advp.apple.com^
|
|
||||||
||public.gdtimg.com^
|
|
||||||
||q.i.gdt.qq.com^
|
|
||||||
||qqdata.ab.qq.com^
|
|
||||||
||qwapi.apple.com^
|
|
||||||
||qzs.gdtimg.com^
|
|
||||||
||recommend-drcn.hms.dbankcloud.cn^
|
|
||||||
||report.tv.kohesport.qq.com^
|
|
||||||
||res.hubcloud.com.cn^
|
|
||||||
||res1.hubcloud.com.cn^
|
|
||||||
||res2.hubcloud.com.cn^
|
|
||||||
||res3.hubcloud.com.cn^
|
|
||||||
||resolve.umeng.com^
|
|
||||||
||review.gdtimg.com^
|
|
||||||
||rms-drcn.platform.dbankcloud.cn^
|
|
||||||
||roi.soulapp.cn^
|
|
||||||
||rpt.gdt.qq.com^
|
|
||||||
||rtb.voiceads.cn^
|
|
||||||
||s.amazon-adsystem.com^
|
|
||||||
||s1.qq.com^
|
|
||||||
||s2.qq.com^
|
|
||||||
||s3.qq.com^
|
|
||||||
||saad.ms.zhangyue.net^
|
|
||||||
||samsung-com.112.2o7.net^
|
|
||||||
||samsungads.com^
|
|
||||||
||sanme2.taisantech.com^
|
|
||||||
||saveu5-normal-lq.zijieapi.com^
|
|
||||||
||scdown.qq.com^
|
|
||||||
||scs.openspeech.cn^
|
|
||||||
||sdk-ab-config.qquanquan.com^
|
|
||||||
||sdk-cache.video.ptqy.gitv.tv^
|
|
||||||
||sdk.1rtb.net^
|
|
||||||
||sdk.beizi.biz^
|
|
||||||
||sdk.cferw.com^
|
|
||||||
||sdk.e.qq.com^
|
|
||||||
||sdk.hzsanjiaomao.com^
|
|
||||||
||sdk.markmedia.com.cn^
|
|
||||||
||sdk.mobads.adwangmai.com^
|
|
||||||
||sdkconf.avlyun.com^
|
|
||||||
||sdkconfig.ad.intl.xiaomi.com^
|
|
||||||
||sdkconfig.ad.xiaomi.com^
|
|
||||||
||sdkconfig.play.aiseet.atianqi.com^
|
|
||||||
||sdkconfig.video.qq.com^
|
|
||||||
||sdkoptedge.chinanetcenter.com^
|
|
||||||
||sdktmp.hubcloud.com.cn^
|
|
||||||
||sdownload.stargame.com^
|
|
||||||
||search.ixigua.com^
|
|
||||||
||search3-search.ixigua.com^
|
|
||||||
||search5-search-hl.ixigua.com^
|
|
||||||
||search5-search.ixigua.com^
|
|
||||||
||securemetrics.apple.com^
|
|
||||||
||securepubads.g.doubleclick.net^
|
|
||||||
||sensors-log.dongqiudi.com^
|
|
||||||
||service.changhong.upgrade2.huan.tv^
|
|
||||||
||service.vmos.cn^
|
|
||||||
||sf16-static.i18n-pglstatp.com^
|
|
||||||
||sf3-fe-tos.pglstatp-toutiao.com^
|
|
||||||
||shouji.sogou.com^
|
|
||||||
||sigmob.cn^
|
|
||||||
||sigmob.com^
|
|
||||||
||skdisplay.jd.com^
|
|
||||||
||slb-p2p.vcloud.ks-live.com^
|
|
||||||
||smad.ms.zhangyue.net^
|
|
||||||
||smart-tv.cn^
|
|
||||||
||smartad.10010.com^
|
|
||||||
||smetrics.samsung.com^
|
|
||||||
||sms.ads.oppomobile.com^
|
|
||||||
||sngmta.qq.com^
|
|
||||||
||snowflake.qq.com^
|
|
||||||
||stat.dongqiudi.com^
|
|
||||||
||stat.y.qq.com^
|
|
||||||
||static.ads-twitter.com^
|
|
||||||
||statics.woozooo.com^
|
|
||||||
||stats.qiumibao.com^
|
|
||||||
||stats.wp.com^
|
|
||||||
||statsigapi.net^
|
|
||||||
||stg-data.ads.heytapmobi.com^
|
|
||||||
||success.ctobsnssdk.com^
|
|
||||||
||syh-imp.cdnjtzy.com^
|
|
||||||
||szbdyd.com^
|
|
||||||
||t-dsp.pinduoduo.com^
|
|
||||||
||t.l.qq.com^
|
|
||||||
||t.track.ad.xiaomi.com^
|
|
||||||
||t002.ottcn.com^
|
|
||||||
||t1.a.market.xiaomi.com^
|
|
||||||
||t2.a.market.xiaomi.com^
|
|
||||||
||t3.a.market.xiaomi.com^
|
|
||||||
||tangram.e.qq.com^
|
|
||||||
||tdc.qq.com^
|
|
||||||
||tdsdk.cpatrk.net^
|
|
||||||
||tdsdk.xdrig.com^
|
|
||||||
||tencent-dtv.m.cn.miaozhen.com^
|
|
||||||
||terms-drcn.platform.dbankcloud.cn^
|
|
||||||
||test.ad.xiaomi.com^
|
|
||||||
||test.e.ad.xiaomi.com^
|
|
||||||
||tj.b.qq.com^
|
|
||||||
||tj.video.qq.com^
|
|
||||||
||tmead.y.qq.com^
|
|
||||||
||tmeadcomm.y.qq.com^
|
|
||||||
||tmfmazu-wangka.m.qq.com^
|
|
||||||
||tmfmazu.m.qq.com^
|
|
||||||
||tmfsdk.m.qq.com^
|
|
||||||
||tmfsdktcpv4.m.qq.com^
|
|
||||||
||tnc3-aliec1.toutiaoapi.com^
|
|
||||||
||tnc3-aliec2.bytedance.com^
|
|
||||||
||tnc3-aliec2.toutiaoapi.com^
|
|
||||||
||tnc3-alisc1.bytedance.com^
|
|
||||||
||tnc3-alisc1.zijieapi.com^
|
|
||||||
||tnc3-alisc2.zijieapi.com^
|
|
||||||
||tnc3-bjlgy.bytedance.com^
|
|
||||||
||tnc3-bjlgy.toutiaoapi.com^
|
|
||||||
||tnc3-bjlgy.zijieapi.com^
|
|
||||||
||toblog.ctobsnssdk.com^
|
|
||||||
||trace.qq.com^
|
|
||||||
||tracelog-debug.qquanquan.com^
|
|
||||||
||track.lc.quark.cn^
|
|
||||||
||track.uc.cn^
|
|
||||||
||tracker.ai.xiaomi.com^
|
|
||||||
||tracker.gitee.com^
|
|
||||||
||tracking.miui.com^
|
|
||||||
||tracking.rus.miui.com^
|
|
||||||
||tsvrv.com^
|
|
||||||
||tvuser-ch.cedock.com^
|
|
||||||
||tx-ad.a.yximgs.com^
|
|
||||||
||tx-kmpaudio.pull.yximgs.com^
|
|
||||||
||tz.sec.xiaomi.com^
|
|
||||||
||uapi.ads.heytapmobi.com^
|
|
||||||
||udc.yahoo.com^
|
|
||||||
||udcm.yahoo.com^
|
|
||||||
||uedas.qidian.com^
|
|
||||||
||ulog-sdk.gifshow.com^
|
|
||||||
||ulogjs.gifshow.com^
|
|
||||||
||ulogs.umeng.com^
|
|
||||||
||ulogs.umengcloud.com^
|
|
||||||
||umengacs.m.taobao.com^
|
|
||||||
||umengjmacs.m.taobao.com^
|
|
||||||
||umini.shujupie.com^
|
|
||||||
||umsns.com^
|
|
||||||
||union.baidu.cn^
|
|
||||||
||union.baidu.com^
|
|
||||||
||update.avlyun.sec.miui.com^
|
|
||||||
||update.lejiao.tv^
|
|
||||||
||upgrade-update.hismarttv.com^
|
|
||||||
||us.l.qq.com^
|
|
||||||
||v.adintl.cn^
|
|
||||||
||v.adx.hubcloud.com.cn^
|
|
||||||
||v1-ad.video.yximgs.com^
|
|
||||||
||v2-ad.video.yximgs.com^
|
|
||||||
||v2-api-channel-launcher.hismarttv.com^
|
|
||||||
||v2.gdt.qq.com^
|
|
||||||
||v2mi.gdt.qq.com^
|
|
||||||
||v3-ad.video.yximgs.com^
|
|
||||||
||v3.gdt.qq.com^
|
|
||||||
||video-ad.sm.cn^
|
|
||||||
||video-dsp.pddpic.com^
|
|
||||||
||video.dispatch.tc.qq.com^
|
|
||||||
||virusinfo-cloudscan-cn.heytapmobi.com^
|
|
||||||
||vlive.qqvideo.tc.qq.com^
|
|
||||||
||volc.bj.ad.track.66mobi.com^
|
|
||||||
||vungle.com^
|
|
||||||
||w.l.qq.com^
|
|
||||||
||w1.askwai.com^
|
|
||||||
||w1.bskwai.com^
|
|
||||||
||w1.cskwai.com^
|
|
||||||
||w1.dskwai.com^
|
|
||||||
||w1.eskwai.com^
|
|
||||||
||w1.fskwai.com^
|
|
||||||
||w1.gskwai.com^
|
|
||||||
||w1.hskwai.com^
|
|
||||||
||w1.iskwai.com^
|
|
||||||
||w1.jskwai.com^
|
|
||||||
||w1.kskwai.com^
|
|
||||||
||w1.lskwai.com^
|
|
||||||
||w1.mskwai.com^
|
|
||||||
||w1.nskwai.com^
|
|
||||||
||w1.oskwai.com^
|
|
||||||
||w1.pskwai.com^
|
|
||||||
||w1.qskwai.com^
|
|
||||||
||w1.rskwai.com^
|
|
||||||
||w1.sskwai.com^
|
|
||||||
||w1.tskwai.com^
|
|
||||||
||w1.uskwai.com^
|
|
||||||
||w1.vskwai.com^
|
|
||||||
||w1.wskwai.com^
|
|
||||||
||w1.xskwai.com^
|
|
||||||
||w1.yskwai.com^
|
|
||||||
||w1.zskwai.com^
|
|
||||||
||watson.microsoft.com^
|
|
||||||
||watson.telemetry.microsoft.com^
|
|
||||||
||weather-analytics-events.apple.com^
|
|
||||||
||weather-community-drcn.weather.dbankcloud.cn^
|
|
||||||
||webstat.qiumibao.com^
|
|
||||||
||webview.unityads.unity3d.com^
|
|
||||||
||widgets.outbrain.com^
|
|
||||||
||widgets.pinterest.com^
|
|
||||||
||win.gdt.qq.com^
|
|
||||||
||wn.x.jd.com^
|
|
||||||
||ws-keyboard.shouji.sogou.com^
|
|
||||||
||ws.sj.qq.com^
|
|
||||||
||www42.zskwai.com^
|
|
||||||
||wxa.wxs.qq.com^
|
|
||||||
||wximg.wxs.qq.com^
|
|
||||||
||wxsmw.wxs.qq.com^
|
|
||||||
||wxsnsad.tc.qq.com^
|
|
||||||
||wxsnsdy.wxs.qq.com^
|
|
||||||
||wxsnsdythumb.wxs.qq.com^
|
|
||||||
||xc.gdt.qq.com^
|
|
||||||
||xiaomi-dtv.m.cn.miaozhen.com^
|
|
||||||
||xiaoshuo.wtzw.com^
|
|
||||||
||xlivrdr.com^
|
|
||||||
||xlmzc.cnjp-exp.com^
|
|
||||||
||xlog.jd.com^
|
|
||||||
||xlviiirdr.com^
|
|
||||||
||xlviirdr.com^
|
|
||||||
||yk-ssp.ad.youku.com^
|
|
||||||
||ykad-data.youku.com^
|
|
||||||
||ykad-gateway.youku.com^
|
|
||||||
||youku-acs.m.taobao.com^
|
|
||||||
||youxi.kugou.com^
|
|
||||||
||zeus.ad.xiaomi.com^
|
|
||||||
||zhihu-web-analytics.zhihu.com^
|
|
||||||
/.*\.*\.shouji\.sogou\.com/
|
|
||||||
/.*\.[a-zA-Z0-9.-]skwai\.com/
|
|
||||||
/.*\.a\.market\.xiaomi\.com/
|
|
||||||
/.*\.data\.hicloud\.com/
|
|
||||||
/.*\.log\.aliyuncs\.com/
|
|
||||||
/[a-zA-Z0-9.-]*-ad-[a-zA-Z0-9.-]*\.byteimg\.com/
|
|
||||||
/[a-zA-Z0-9.-]*-ad\.sm\.cn/
|
|
||||||
/[a-zA-Z0-9.-]*-ad\.video\.yximgs\.com/
|
|
||||||
/[a-zA-Z0-9.-]*-ad\.wtzw\.com/
|
|
||||||
/[a-zA-Z0-9.-]*-be-pack-sign\.pglstatp-toutiao\.com/
|
|
||||||
/[a-zA-Z0-9.-]*-lm\.adkwai\.com/
|
|
||||||
/[a-zA-Z0-9.-]*-normal-[a-zA-Z0-9.-]*\.zijieapi\.com/
|
|
||||||
/[a-zA-Z0-9.-]*-normal\.zijieapi\.com/
|
|
||||||
/cloudinject[a-zA-Z0-9.-]*-dev\.*\.[a-zA-Z0-9.-]*-[a-zA-Z0-9.-]*-[a-zA-Z0-9.-]*\.amazonaws\.com/
|
|
||||||
-1641
File diff suppressed because it is too large
Load Diff
-3688
File diff suppressed because it is too large
Load Diff
-3735
File diff suppressed because it is too large
Load Diff
-7825
File diff suppressed because it is too large
Load Diff
-68050
File diff suppressed because it is too large
Load Diff
-10607
File diff suppressed because it is too large
Load Diff
-82584
File diff suppressed because it is too large
Load Diff
-53291
File diff suppressed because it is too large
Load Diff
-68590
File diff suppressed because it is too large
Load Diff
-1
@@ -1 +0,0 @@
|
|||||||
/ciceknoktasi/
|
|
||||||
-1178
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
|||||||
@@||dns.weixin.qq.com.cn
|
|
||||||
-8360
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
|||||||
# Hosts文件
|
|
||||||
# 格式:IP 域名
|
|
||||||
# 例如:127.0.0.1 localhost
|
|
||||||
-10607
File diff suppressed because it is too large
Load Diff
-82585
File diff suppressed because it is too large
Load Diff
-53291
File diff suppressed because it is too large
Load Diff
-1177
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
|||||||
# 本地规则文件
|
|
||||||
# 格式:域名
|
|
||||||
# 例如:example.com
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"blockedDomainsCount": {},
|
|
||||||
"resolvedDomainsCount": {},
|
|
||||||
"lastSaved": "2025-12-16T00:38:44.046867267+08:00"
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"stats": {
|
|
||||||
"Queries": 1,
|
|
||||||
"Blocked": 0,
|
|
||||||
"Allowed": 1,
|
|
||||||
"Errors": 0,
|
|
||||||
"LastQuery": "2025-12-16T00:38:14.408835937+08:00",
|
|
||||||
"AvgResponseTime": 6,
|
|
||||||
"TotalResponseTime": 6,
|
|
||||||
"QueryTypes": {
|
|
||||||
"A": 1
|
|
||||||
},
|
|
||||||
"SourceIPs": {
|
|
||||||
"127.0.0.1": true
|
|
||||||
},
|
|
||||||
"CpuUsage": 8.270676691729323
|
|
||||||
},
|
|
||||||
"blockedDomains": {},
|
|
||||||
"resolvedDomains": {
|
|
||||||
"google.com": {
|
|
||||||
"Domain": "google.com",
|
|
||||||
"Count": 1,
|
|
||||||
"LastSeen": "2025-12-16T00:38:14.416155945+08:00"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"clientStats": {
|
|
||||||
"127.0.0.1": {
|
|
||||||
"IP": "127.0.0.1",
|
|
||||||
"Count": 1,
|
|
||||||
"LastSeen": "2025-12-16T00:38:14.408844699+08:00"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hourlyStats": {},
|
|
||||||
"dailyStats": {},
|
|
||||||
"monthlyStats": {},
|
|
||||||
"lastSaved": "2025-12-16T00:38:44.043395448+08:00"
|
|
||||||
}
|
|
||||||
BIN
Binary file not shown.
+404
-93
@@ -645,17 +645,16 @@ func (s *Server) handleBlockedResponse(w dns.ResponseWriter, r *dns.Msg, domain
|
|||||||
}
|
}
|
||||||
|
|
||||||
// forwardDNSRequest 转发DNS请求到上游服务器
|
// forwardDNSRequest 转发DNS请求到上游服务器
|
||||||
|
// serverResponse 用于存储服务器响应的结构体
|
||||||
|
type serverResponse struct {
|
||||||
|
response *dns.Msg
|
||||||
|
rtt time.Duration
|
||||||
|
server string
|
||||||
|
error error
|
||||||
|
}
|
||||||
|
|
||||||
// forwardDNSRequestWithCache 转发DNS请求到上游服务器并返回响应
|
// forwardDNSRequestWithCache 转发DNS请求到上游服务器并返回响应
|
||||||
func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg, time.Duration) {
|
func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg, time.Duration) {
|
||||||
// 尝试所有上游DNS服务器
|
|
||||||
var bestResponse *dns.Msg
|
|
||||||
var bestRtt time.Duration
|
|
||||||
var hasBestResponse bool
|
|
||||||
var hasDNSSECResponse bool
|
|
||||||
var backupResponse *dns.Msg
|
|
||||||
var backupRtt time.Duration
|
|
||||||
var hasBackup bool
|
|
||||||
|
|
||||||
// 始终支持EDNS
|
// 始终支持EDNS
|
||||||
var udpSize uint16 = 4096
|
var udpSize uint16 = 4096
|
||||||
var doFlag bool = s.config.EnableDNSSEC
|
var doFlag bool = s.config.EnableDNSSEC
|
||||||
@@ -680,59 +679,293 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
|||||||
dnssecServers := s.config.DNSSECUpstreamDNS
|
dnssecServers := s.config.DNSSECUpstreamDNS
|
||||||
|
|
||||||
// 1. 首先尝试所有配置的上游DNS服务器
|
// 1. 首先尝试所有配置的上游DNS服务器
|
||||||
for _, upstream := range s.config.UpstreamDNS {
|
var bestResponse *dns.Msg
|
||||||
response, rtt, err := s.resolver.Exchange(r, upstream)
|
var bestRtt time.Duration
|
||||||
if err == nil && response != nil {
|
var hasBestResponse bool
|
||||||
// 设置递归可用标志
|
var hasDNSSECResponse bool
|
||||||
response.RecursionAvailable = true
|
var backupResponse *dns.Msg
|
||||||
|
var backupRtt time.Duration
|
||||||
|
var hasBackup bool
|
||||||
|
|
||||||
// 检查是否包含DNSSEC记录
|
// 根据查询模式处理请求
|
||||||
containsDNSSEC := s.hasDNSSECRecords(response)
|
switch s.config.QueryMode {
|
||||||
|
case "parallel":
|
||||||
|
// 并行请求模式
|
||||||
|
responses := make(chan serverResponse, len(s.config.UpstreamDNS))
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
// 如果启用了DNSSEC且响应包含DNSSEC记录,验证DNSSEC签名
|
// 向所有上游服务器并行发送请求
|
||||||
if s.config.EnableDNSSEC && containsDNSSEC {
|
for _, upstream := range s.config.UpstreamDNS {
|
||||||
// 验证DNSSEC记录
|
wg.Add(1)
|
||||||
signatureValid := s.verifyDNSSEC(response)
|
go func(server string) {
|
||||||
|
defer wg.Done()
|
||||||
|
response, rtt, err := s.resolver.Exchange(r, server)
|
||||||
|
responses <- serverResponse{response, rtt, server, err}
|
||||||
|
}(upstream)
|
||||||
|
}
|
||||||
|
|
||||||
// 设置AD标志(Authenticated Data)
|
// 等待所有请求完成
|
||||||
response.AuthenticatedData = signatureValid
|
go func() {
|
||||||
|
wg.Wait()
|
||||||
|
close(responses)
|
||||||
|
}()
|
||||||
|
|
||||||
if signatureValid {
|
// 处理所有响应
|
||||||
// 更新DNSSEC验证成功计数
|
for resp := range responses {
|
||||||
s.updateStats(func(stats *Stats) {
|
if resp.error == nil && resp.response != nil {
|
||||||
stats.DNSSECQueries++
|
// 设置递归可用标志
|
||||||
stats.DNSSECSuccess++
|
resp.response.RecursionAvailable = true
|
||||||
})
|
|
||||||
} else {
|
// 检查是否包含DNSSEC记录
|
||||||
// 更新DNSSEC验证失败计数
|
containsDNSSEC := s.hasDNSSECRecords(resp.response)
|
||||||
s.updateStats(func(stats *Stats) {
|
|
||||||
stats.DNSSECQueries++
|
// 如果启用了DNSSEC且响应包含DNSSEC记录,验证DNSSEC签名
|
||||||
stats.DNSSECFailed++
|
if s.config.EnableDNSSEC && containsDNSSEC {
|
||||||
})
|
// 验证DNSSEC记录
|
||||||
|
signatureValid := s.verifyDNSSEC(resp.response)
|
||||||
|
|
||||||
|
// 设置AD标志(Authenticated Data)
|
||||||
|
resp.response.AuthenticatedData = signatureValid
|
||||||
|
|
||||||
|
if signatureValid {
|
||||||
|
// 更新DNSSEC验证成功计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECSuccess++
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 更新DNSSEC验证失败计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECFailed++
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果响应成功,根据DNSSEC状态选择最佳响应
|
||||||
|
if resp.response.Rcode == dns.RcodeSuccess {
|
||||||
|
// 优先选择带有DNSSEC记录的响应
|
||||||
|
if containsDNSSEC {
|
||||||
|
bestResponse = resp.response
|
||||||
|
bestRtt = resp.rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
hasDNSSECResponse = true
|
||||||
|
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", resp.server, "rtt", resp.rtt)
|
||||||
|
} else if !hasBestResponse {
|
||||||
|
// 没有带DNSSEC的响应时,保存第一个成功响应
|
||||||
|
bestResponse = resp.response
|
||||||
|
bestRtt = resp.rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
logger.Debug("找到最佳响应", "domain", domain, "server", resp.server, "rtt", resp.rtt)
|
||||||
|
}
|
||||||
|
// 保存为备选响应
|
||||||
|
if !hasBackup {
|
||||||
|
backupResponse = resp.response
|
||||||
|
backupRtt = resp.rtt
|
||||||
|
hasBackup = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 如果响应成功,根据DNSSEC状态选择最佳响应
|
case "loadbalance":
|
||||||
if response.Rcode == dns.RcodeSuccess {
|
// 负载均衡模式 - 目前使用简单的轮询,后续可以扩展为更复杂的算法
|
||||||
// 优先选择带有DNSSEC记录的响应
|
for _, upstream := range s.config.UpstreamDNS {
|
||||||
if containsDNSSEC {
|
response, rtt, err := s.resolver.Exchange(r, upstream)
|
||||||
bestResponse = response
|
if err == nil && response != nil {
|
||||||
bestRtt = rtt
|
// 设置递归可用标志
|
||||||
hasBestResponse = true
|
response.RecursionAvailable = true
|
||||||
hasDNSSECResponse = true
|
|
||||||
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
// 检查是否包含DNSSEC记录
|
||||||
} else if !hasBestResponse {
|
containsDNSSEC := s.hasDNSSECRecords(response)
|
||||||
// 没有带DNSSEC的响应时,保存第一个成功响应
|
|
||||||
bestResponse = response
|
// 如果启用了DNSSEC且响应包含DNSSEC记录,验证DNSSEC签名
|
||||||
bestRtt = rtt
|
if s.config.EnableDNSSEC && containsDNSSEC {
|
||||||
hasBestResponse = true
|
// 验证DNSSEC记录
|
||||||
logger.Debug("找到最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
signatureValid := s.verifyDNSSEC(response)
|
||||||
|
|
||||||
|
// 设置AD标志(Authenticated Data)
|
||||||
|
response.AuthenticatedData = signatureValid
|
||||||
|
|
||||||
|
if signatureValid {
|
||||||
|
// 更新DNSSEC验证成功计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECSuccess++
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 更新DNSSEC验证失败计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECFailed++
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 保存为备选响应
|
|
||||||
if !hasBackup {
|
// 如果响应成功,根据DNSSEC状态选择最佳响应
|
||||||
backupResponse = response
|
if response.Rcode == dns.RcodeSuccess {
|
||||||
backupRtt = rtt
|
// 优先选择带有DNSSEC记录的响应
|
||||||
hasBackup = true
|
if containsDNSSEC {
|
||||||
|
bestResponse = response
|
||||||
|
bestRtt = rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
hasDNSSECResponse = true
|
||||||
|
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||||
|
break // 找到带DNSSEC的响应,立即返回
|
||||||
|
} else if !hasBestResponse {
|
||||||
|
// 没有带DNSSEC的响应时,保存第一个成功响应
|
||||||
|
bestResponse = response
|
||||||
|
bestRtt = rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
logger.Debug("找到最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||||
|
}
|
||||||
|
// 保存为备选响应
|
||||||
|
if !hasBackup {
|
||||||
|
backupResponse = response
|
||||||
|
backupRtt = rtt
|
||||||
|
hasBackup = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case "fastest-ip":
|
||||||
|
// 最快的IP地址模式 - 目前使用简单的顺序请求,后续可以扩展为测量TCP连接速度
|
||||||
|
for _, upstream := range s.config.UpstreamDNS {
|
||||||
|
response, rtt, err := s.resolver.Exchange(r, upstream)
|
||||||
|
if err == nil && response != nil {
|
||||||
|
// 设置递归可用标志
|
||||||
|
response.RecursionAvailable = true
|
||||||
|
|
||||||
|
// 检查是否包含DNSSEC记录
|
||||||
|
containsDNSSEC := s.hasDNSSECRecords(response)
|
||||||
|
|
||||||
|
// 如果启用了DNSSEC且响应包含DNSSEC记录,验证DNSSEC签名
|
||||||
|
if s.config.EnableDNSSEC && containsDNSSEC {
|
||||||
|
// 验证DNSSEC记录
|
||||||
|
signatureValid := s.verifyDNSSEC(response)
|
||||||
|
|
||||||
|
// 设置AD标志(Authenticated Data)
|
||||||
|
response.AuthenticatedData = signatureValid
|
||||||
|
|
||||||
|
if signatureValid {
|
||||||
|
// 更新DNSSEC验证成功计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECSuccess++
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 更新DNSSEC验证失败计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECFailed++
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果响应成功,根据DNSSEC状态选择最佳响应
|
||||||
|
if response.Rcode == dns.RcodeSuccess {
|
||||||
|
// 优先选择带有DNSSEC记录的响应
|
||||||
|
if containsDNSSEC {
|
||||||
|
bestResponse = response
|
||||||
|
bestRtt = rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
hasDNSSECResponse = true
|
||||||
|
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||||
|
break // 找到带DNSSEC的响应,立即返回
|
||||||
|
} else if !hasBestResponse {
|
||||||
|
// 没有带DNSSEC的响应时,保存第一个成功响应
|
||||||
|
bestResponse = response
|
||||||
|
bestRtt = rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
logger.Debug("找到最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||||
|
break // 找到响应,立即返回
|
||||||
|
}
|
||||||
|
// 保存为备选响应
|
||||||
|
if !hasBackup {
|
||||||
|
backupResponse = response
|
||||||
|
backupRtt = rtt
|
||||||
|
hasBackup = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// 默认使用并行请求模式
|
||||||
|
responses := make(chan serverResponse, len(s.config.UpstreamDNS))
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
|
// 向所有上游服务器并行发送请求
|
||||||
|
for _, upstream := range s.config.UpstreamDNS {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(server string) {
|
||||||
|
defer wg.Done()
|
||||||
|
response, rtt, err := s.resolver.Exchange(r, server)
|
||||||
|
responses <- serverResponse{response, rtt, server, err}
|
||||||
|
}(upstream)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 等待所有请求完成
|
||||||
|
go func() {
|
||||||
|
wg.Wait()
|
||||||
|
close(responses)
|
||||||
|
}()
|
||||||
|
|
||||||
|
// 处理所有响应
|
||||||
|
for resp := range responses {
|
||||||
|
if resp.error == nil && resp.response != nil {
|
||||||
|
// 设置递归可用标志
|
||||||
|
resp.response.RecursionAvailable = true
|
||||||
|
|
||||||
|
// 检查是否包含DNSSEC记录
|
||||||
|
containsDNSSEC := s.hasDNSSECRecords(resp.response)
|
||||||
|
|
||||||
|
// 如果启用了DNSSEC且响应包含DNSSEC记录,验证DNSSEC签名
|
||||||
|
if s.config.EnableDNSSEC && containsDNSSEC {
|
||||||
|
// 验证DNSSEC记录
|
||||||
|
signatureValid := s.verifyDNSSEC(resp.response)
|
||||||
|
|
||||||
|
// 设置AD标志(Authenticated Data)
|
||||||
|
resp.response.AuthenticatedData = signatureValid
|
||||||
|
|
||||||
|
if signatureValid {
|
||||||
|
// 更新DNSSEC验证成功计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECSuccess++
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 更新DNSSEC验证失败计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECQueries++
|
||||||
|
stats.DNSSECFailed++
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果响应成功,根据DNSSEC状态选择最佳响应
|
||||||
|
if resp.response.Rcode == dns.RcodeSuccess {
|
||||||
|
// 优先选择带有DNSSEC记录的响应
|
||||||
|
if containsDNSSEC {
|
||||||
|
bestResponse = resp.response
|
||||||
|
bestRtt = resp.rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
hasDNSSECResponse = true
|
||||||
|
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", resp.server, "rtt", resp.rtt)
|
||||||
|
} else if !hasBestResponse {
|
||||||
|
// 没有带DNSSEC的响应时,保存第一个成功响应
|
||||||
|
bestResponse = resp.response
|
||||||
|
bestRtt = resp.rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
logger.Debug("找到最佳响应", "domain", domain, "server", resp.server, "rtt", resp.rtt)
|
||||||
|
}
|
||||||
|
// 保存为备选响应
|
||||||
|
if !hasBackup {
|
||||||
|
backupResponse = resp.response
|
||||||
|
backupRtt = resp.rtt
|
||||||
|
hasBackup = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -747,52 +980,130 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
|||||||
stats.DNSSECQueries++
|
stats.DNSSECQueries++
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, dnssecServer := range dnssecServers {
|
// 根据查询模式处理DNSSEC服务器请求
|
||||||
response, rtt, err := s.resolver.Exchange(r, dnssecServer)
|
switch s.config.QueryMode {
|
||||||
if err == nil && response != nil {
|
case "parallel":
|
||||||
// 设置递归可用标志
|
// 并行请求模式
|
||||||
response.RecursionAvailable = true
|
responses := make(chan serverResponse, len(dnssecServers))
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
// 检查是否包含DNSSEC记录
|
// 向所有DNSSEC服务器并行发送请求
|
||||||
containsDNSSEC := s.hasDNSSECRecords(response)
|
for _, dnssecServer := range dnssecServers {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(server string) {
|
||||||
|
defer wg.Done()
|
||||||
|
response, rtt, err := s.resolver.Exchange(r, server)
|
||||||
|
responses <- serverResponse{response, rtt, server, err}
|
||||||
|
}(dnssecServer)
|
||||||
|
}
|
||||||
|
|
||||||
if response.Rcode == dns.RcodeSuccess {
|
// 等待所有请求完成
|
||||||
// 验证DNSSEC记录
|
go func() {
|
||||||
signatureValid := s.verifyDNSSEC(response)
|
wg.Wait()
|
||||||
|
close(responses)
|
||||||
|
}()
|
||||||
|
|
||||||
// 设置AD标志(Authenticated Data)
|
// 处理所有响应
|
||||||
response.AuthenticatedData = signatureValid
|
for resp := range responses {
|
||||||
|
if resp.error == nil && resp.response != nil {
|
||||||
|
// 设置递归可用标志
|
||||||
|
resp.response.RecursionAvailable = true
|
||||||
|
|
||||||
if signatureValid {
|
// 检查是否包含DNSSEC记录
|
||||||
// 更新DNSSEC验证成功计数
|
containsDNSSEC := s.hasDNSSECRecords(resp.response)
|
||||||
s.updateStats(func(stats *Stats) {
|
|
||||||
stats.DNSSECSuccess++
|
if resp.response.Rcode == dns.RcodeSuccess {
|
||||||
})
|
// 验证DNSSEC记录
|
||||||
} else {
|
signatureValid := s.verifyDNSSEC(resp.response)
|
||||||
// 更新DNSSEC验证失败计数
|
|
||||||
s.updateStats(func(stats *Stats) {
|
// 设置AD标志(Authenticated Data)
|
||||||
stats.DNSSECFailed++
|
resp.response.AuthenticatedData = signatureValid
|
||||||
})
|
|
||||||
|
if signatureValid {
|
||||||
|
// 更新DNSSEC验证成功计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECSuccess++
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 更新DNSSEC验证失败计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECFailed++
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 优先使用DNSSEC专用服务器的响应,尤其是带有DNSSEC记录的
|
||||||
|
if containsDNSSEC {
|
||||||
|
// 即使之前有最佳响应,也优先使用DNSSEC专用服务器的DNSSEC响应
|
||||||
|
bestResponse = resp.response
|
||||||
|
bestRtt = resp.rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
hasDNSSECResponse = true
|
||||||
|
logger.Debug("DNSSEC专用服务器返回带DNSSEC的响应,优先使用", "domain", domain, "server", resp.server, "rtt", resp.rtt)
|
||||||
|
}
|
||||||
|
// 注意:如果DNSSEC专用服务器返回的响应不包含DNSSEC记录,
|
||||||
|
// 我们不会覆盖之前从upstreamDNS获取的响应,
|
||||||
|
// 这符合"本地解析指的是直接使用上游服务器upstreamDNS进行解析, 而不是dnssecUpstreamDNS"的要求
|
||||||
|
|
||||||
|
// 更新备选响应
|
||||||
|
if !hasBackup {
|
||||||
|
backupResponse = resp.response
|
||||||
|
backupRtt = resp.rtt
|
||||||
|
hasBackup = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 优先使用DNSSEC专用服务器的响应,尤其是带有DNSSEC记录的
|
default:
|
||||||
if containsDNSSEC {
|
// 默认使用顺序请求模式
|
||||||
// 即使之前有最佳响应,也优先使用DNSSEC专用服务器的DNSSEC响应
|
for _, dnssecServer := range dnssecServers {
|
||||||
bestResponse = response
|
response, rtt, err := s.resolver.Exchange(r, dnssecServer)
|
||||||
bestRtt = rtt
|
if err == nil && response != nil {
|
||||||
hasBestResponse = true
|
// 设置递归可用标志
|
||||||
hasDNSSECResponse = true
|
response.RecursionAvailable = true
|
||||||
logger.Debug("DNSSEC专用服务器返回带DNSSEC的响应,优先使用", "domain", domain, "server", dnssecServer, "rtt", rtt)
|
|
||||||
}
|
|
||||||
// 注意:如果DNSSEC专用服务器返回的响应不包含DNSSEC记录,
|
|
||||||
// 我们不会覆盖之前从upstreamDNS获取的响应,
|
|
||||||
// 这符合"本地解析指的是直接使用上游服务器upstreamDNS进行解析, 而不是dnssecUpstreamDNS"的要求
|
|
||||||
|
|
||||||
// 更新备选响应
|
// 检查是否包含DNSSEC记录
|
||||||
if !hasBackup {
|
containsDNSSEC := s.hasDNSSECRecords(response)
|
||||||
backupResponse = response
|
|
||||||
backupRtt = rtt
|
if response.Rcode == dns.RcodeSuccess {
|
||||||
hasBackup = true
|
// 验证DNSSEC记录
|
||||||
|
signatureValid := s.verifyDNSSEC(response)
|
||||||
|
|
||||||
|
// 设置AD标志(Authenticated Data)
|
||||||
|
response.AuthenticatedData = signatureValid
|
||||||
|
|
||||||
|
if signatureValid {
|
||||||
|
// 更新DNSSEC验证成功计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECSuccess++
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// 更新DNSSEC验证失败计数
|
||||||
|
s.updateStats(func(stats *Stats) {
|
||||||
|
stats.DNSSECFailed++
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 优先使用DNSSEC专用服务器的响应,尤其是带有DNSSEC记录的
|
||||||
|
if containsDNSSEC {
|
||||||
|
// 即使之前有最佳响应,也优先使用DNSSEC专用服务器的DNSSEC响应
|
||||||
|
bestResponse = response
|
||||||
|
bestRtt = rtt
|
||||||
|
hasBestResponse = true
|
||||||
|
hasDNSSECResponse = true
|
||||||
|
logger.Debug("DNSSEC专用服务器返回带DNSSEC的响应,优先使用", "domain", domain, "server", dnssecServer, "rtt", rtt)
|
||||||
|
break // 找到带DNSSEC的响应,立即返回
|
||||||
|
}
|
||||||
|
// 注意:如果DNSSEC专用服务器返回的响应不包含DNSSEC记录,
|
||||||
|
// 我们不会覆盖之前从upstreamDNS获取的响应,
|
||||||
|
// 这符合"本地解析指的是直接使用上游服务器upstreamDNS进行解析, 而不是dnssecUpstreamDNS"的要求
|
||||||
|
|
||||||
|
// 更新备选响应
|
||||||
|
if !hasBackup {
|
||||||
|
backupResponse = response
|
||||||
|
backupRtt = rtt
|
||||||
|
hasBackup = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-55037
File diff suppressed because it is too large
Load Diff
@@ -1,28 +0,0 @@
|
|||||||
time="2025-12-16T00:37:59+08:00" level=debug msg="尝试加载Shield统计数据" file=/root/dns/data/test_shield_stats.json
|
|
||||||
time="2025-12-16T00:37:59+08:00" level=info msg="Shield计数数据加载成功" blocked_entries=0 resolved_entries=0
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="规则加载完成,域名规则: 122426, 排除规则: 654, 正则规则: 473, hosts规则: 0"
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="统计数据加载成功"
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="查询日志加载成功" count=118
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="DNS服务器已启动,监听端口: 5353"
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="HTTP控制台已启动,监听端口: 8081"
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="DNS TCP服务器启动,监听端口: 5353"
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="启动统计数据自动保存功能" file=data/test_stats.json interval=300
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="DNS UDP服务器启动,监听端口: 5353"
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="启动Shield计数数据自动保存功能" file=./data/test_shield_stats.json interval=60
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="规则自动更新已启动" interval=3600
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="HTTP控制台服务器启动,监听地址: 0.0.0.0:8081"
|
|
||||||
time="2025-12-16T00:38:00+08:00" level=info msg="Shield计数数据保存成功" blocked_entries=0 file=/root/dns/data/test_shield_stats.json resolved_entries=0
|
|
||||||
time="2025-12-16T00:38:14+08:00" level=debug msg="接收到DNS查询" client="127.0.0.1:52388" domain=google.com type=A
|
|
||||||
time="2025-12-16T00:38:14+08:00" level=debug msg="DNS响应不包含DNSSEC记录" domain=google.com server="223.5.5.5:53"
|
|
||||||
time="2025-12-16T00:38:14+08:00" level=debug msg="DNS查询成功" domain=google.com rtt=6.030332ms server="223.5.5.5:53"
|
|
||||||
time="2025-12-16T00:38:14+08:00" level=debug msg="DNS响应已缓存" domain=google.com ttl=30m0s type=A
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="正在关闭服务..."
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="统计数据保存成功" file=/root/dns/data/test_stats.json
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="查询日志保存成功" file=/root/dns/data/querylog.json
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="DNS服务器已停止"
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=error msg="HTTP控制台服务器启动失败" error="http: Server closed"
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="HTTP控制台服务器已停止"
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="Shield计数数据保存成功" blocked_entries=0 file=/root/dns/data/test_shield_stats.json resolved_entries=0
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="规则自动更新已停止"
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=info msg="服务已关闭"
|
|
||||||
time="2025-12-16T00:38:44+08:00" level=warning msg="日志系统已关闭"
|
|
||||||
@@ -37,9 +37,16 @@ func createDefaultConfig(configFile string) error {
|
|||||||
"223.5.5.5:53",
|
"223.5.5.5:53",
|
||||||
"223.6.6.6:53"
|
"223.6.6.6:53"
|
||||||
],
|
],
|
||||||
|
"dnssecUpstreamDNS": [
|
||||||
|
"8.8.8.8:53",
|
||||||
|
"1.1.1.1:53"
|
||||||
|
],
|
||||||
"timeout": 5000,
|
"timeout": 5000,
|
||||||
"statsFile": "./data/stats.json",
|
"statsFile": "./data/stats.json",
|
||||||
"saveInterval": 300
|
"saveInterval": 300,
|
||||||
|
"cacheTTL": 30,
|
||||||
|
"enableDNSSEC": true,
|
||||||
|
"queryMode": "parallel"
|
||||||
},
|
},
|
||||||
"http": {
|
"http": {
|
||||||
"port": 8080,
|
"port": 8080,
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "dns-server-console",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "DNS服务器Web控制台",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"tailwindcss": "^3.3.3",
|
||||||
|
"font-awesome": "^4.7.0",
|
||||||
|
"chart.js": "^4.4.8"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"keywords": ["dns", "server", "console", "web"],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"blockedDomainsCount": {},
|
"blockedDomainsCount": {},
|
||||||
"resolvedDomainsCount": {},
|
"resolvedDomainsCount": {},
|
||||||
"lastSaved": "2025-12-16T20:27:29.629109249+08:00"
|
"lastSaved": "2025-11-29T02:08:50.6341349+08:00"
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// testRuleMatching 测试DNS规则匹配功能
|
||||||
|
func main() {
|
||||||
|
// 定义命令行参数
|
||||||
|
rulePtr := flag.String("rule", "||cntvwb.cn^", "规则字符串")
|
||||||
|
testDomainPtr := flag.String("domain", "vdapprecv.app.cntvwb.cn", "测试域名")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
// 打印测试信息
|
||||||
|
fmt.Printf("测试规则: %s\n", *rulePtr)
|
||||||
|
fmt.Printf("测试域名: %s\n", *testDomainPtr)
|
||||||
|
|
||||||
|
// 发送HTTP请求到API端点来测试规则匹配
|
||||||
|
fmt.Println("\n测试规则匹配功能...")
|
||||||
|
cmd := exec.Command("curl", "-s", fmt.Sprintf("http://localhost:8080/api/shield/check?domain=%s&rule=%s", *testDomainPtr, *rulePtr))
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
// 如果直接的API测试失败,尝试另一种方法
|
||||||
|
fmt.Printf("直接测试失败: %v, %s\n", err, string(output))
|
||||||
|
fmt.Println("尝试添加规则并测试...")
|
||||||
|
testAddRuleAndCheck(*rulePtr, *testDomainPtr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("测试结果: %s\n", string(output))
|
||||||
|
|
||||||
|
// 验证规则是否生效(模拟测试)
|
||||||
|
if strings.Contains(*rulePtr, "||cntvwb.cn^") && strings.Contains(*testDomainPtr, "cntvwb.cn") {
|
||||||
|
fmt.Println("\n验证结果:")
|
||||||
|
if strings.Contains(*testDomainPtr, "cntvwb.cn") {
|
||||||
|
fmt.Println("✅ 子域名匹配测试通过:||cntvwb.cn^ 应该阻止所有 cntvwb.cn 的子域名")
|
||||||
|
} else {
|
||||||
|
fmt.Println("❌ 子域名匹配测试失败")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// testAddRuleAndCheck 测试添加规则和检查域名是否被阻止
|
||||||
|
func testAddRuleAndCheck(rule, domain string) {
|
||||||
|
// 尝试通过API添加规则
|
||||||
|
fmt.Printf("添加规则: %s\n", rule)
|
||||||
|
cmd := exec.Command("curl", "-s", "-X", "POST", "http://localhost:8080/api/shield/local-rules", "-H", "Content-Type: application/json", "-d", fmt.Sprintf(`{\"rule\":\"%s\"}`, rule))
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("添加规则失败: %v, %s\n", err, string(output))
|
||||||
|
// 尝试重新加载规则
|
||||||
|
fmt.Println("尝试重新加载规则...")
|
||||||
|
cmd = exec.Command("curl", "-s", "-X", "PUT", "http://localhost:8080/api/shield", "-H", "Content-Type: application/json", "-d", `{\"reload\":true}`)
|
||||||
|
output, err = cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("重新加载规则失败: %v, %s\n", err, string(output))
|
||||||
|
} else {
|
||||||
|
fmt.Printf("重新加载规则结果: %s\n", string(output))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("添加规则结果: %s\n", string(output))
|
||||||
|
|
||||||
|
// 测试域名是否被阻止
|
||||||
|
fmt.Printf("测试域名 %s 是否被阻止...\n", domain)
|
||||||
|
cmd = exec.Command("curl", "-s", fmt.Sprintf("http://localhost:8080/api/shield/check?domain=%s", domain))
|
||||||
|
output, err = cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("测试阻止失败: %v, %s\n", err, string(output))
|
||||||
|
} else {
|
||||||
|
fmt.Printf("阻止测试结果: %s\n", string(output))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"dns": {
|
||||||
|
"port": 5353,
|
||||||
|
"upstreamDNS": [
|
||||||
|
"223.5.5.5:53",
|
||||||
|
"223.6.6.6:53"
|
||||||
|
],
|
||||||
|
"timeout": 5000,
|
||||||
|
"statsFile": "data/test_stats.json",
|
||||||
|
"saveInterval": 300,
|
||||||
|
"cacheTTL": 30,
|
||||||
|
"enableDNSSEC": true,
|
||||||
|
"dnssecValidation": true
|
||||||
|
},
|
||||||
|
"http": {
|
||||||
|
"port": 8081,
|
||||||
|
"host": "0.0.0.0",
|
||||||
|
"enableAPI": true,
|
||||||
|
"username": "admin",
|
||||||
|
"password": "admin"
|
||||||
|
},
|
||||||
|
"shield": {
|
||||||
|
"localRulesFile": "data/test_rules.txt",
|
||||||
|
"blacklists": [],
|
||||||
|
"updateInterval": 3600,
|
||||||
|
"hostsFile": "data/test_hosts.txt",
|
||||||
|
"blockMethod": "NXDOMAIN",
|
||||||
|
"customBlockIP": "",
|
||||||
|
"statsFile": "./data/test_shield_stats.json",
|
||||||
|
"statsSaveInterval": 60,
|
||||||
|
"remoteRulesCacheDir": "data/test_remote_rules"
|
||||||
|
},
|
||||||
|
"log": {
|
||||||
|
"file": "logs/test_dns-server.log",
|
||||||
|
"level": "debug",
|
||||||
|
"maxSize": 100,
|
||||||
|
"maxBackups": 10,
|
||||||
|
"maxAge": 30
|
||||||
|
}
|
||||||
|
}
|
||||||
Executable
+45
@@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# DNS Web控制台功能测试脚本
|
||||||
|
echo "开始测试DNS Web控制台功能..."
|
||||||
|
echo "=================================="
|
||||||
|
|
||||||
|
# 检查服务器是否运行
|
||||||
|
echo "检查DNS服务器运行状态..."
|
||||||
|
pids=$(ps aux | grep dns-server | grep -v grep)
|
||||||
|
if [ -n "$pids" ]; then
|
||||||
|
echo "✓ DNS服务器正在运行"
|
||||||
|
else
|
||||||
|
echo "✗ DNS服务器未运行,请先启动服务器"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 测试API基础URL
|
||||||
|
BASE_URL="http://localhost:8080/api"
|
||||||
|
|
||||||
|
# 测试1: 获取统计信息
|
||||||
|
echo "\n测试1: 获取DNS统计信息"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" "$BASE_URL/stats"
|
||||||
|
|
||||||
|
# 测试2: 获取系统状态
|
||||||
|
echo "\n测试2: 获取系统状态"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" "$BASE_URL/status"
|
||||||
|
|
||||||
|
# 测试3: 获取屏蔽规则
|
||||||
|
echo "\n测试3: 获取屏蔽规则列表"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" "$BASE_URL/shield"
|
||||||
|
|
||||||
|
# 测试4: 获取Top屏蔽域名
|
||||||
|
echo "\n测试4: 获取Top屏蔽域名"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" "$BASE_URL/top-blocked"
|
||||||
|
|
||||||
|
# 测试5: 获取Hosts内容
|
||||||
|
echo "\n测试5: 获取Hosts内容"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" "$BASE_URL/shield/hosts"
|
||||||
|
|
||||||
|
# 测试6: 访问Web控制台主页
|
||||||
|
echo "\n测试6: 访问Web控制台主页"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" "http://localhost:8080"
|
||||||
|
|
||||||
|
echo "\n=================================="
|
||||||
|
echo "测试完成!请检查上述状态码。正常情况下应为200。"
|
||||||
|
echo "前端Web控制台可通过浏览器访问: http://localhost:8080"
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 测试三种查询模式
|
||||||
|
|
||||||
|
echo "=== 测试三种查询模式 ==="
|
||||||
|
|
||||||
|
# 确保dig命令存在
|
||||||
|
if ! command -v dig &> /dev/null; then
|
||||||
|
echo "dig命令不存在,使用nslookup替代"
|
||||||
|
USE_DIG=false
|
||||||
|
else
|
||||||
|
USE_DIG=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "1. 测试并行请求模式"
|
||||||
|
echo "修改配置文件为parallel模式"
|
||||||
|
sed -i 's/"queryMode": "[^"]*"/"queryMode": "parallel"/' config.json
|
||||||
|
cat config.json | grep queryMode
|
||||||
|
|
||||||
|
echo "重启DNS服务器..."
|
||||||
|
pkill -f "go run main.go"
|
||||||
|
sleep 2
|
||||||
|
go run main.go > server.log 2>&1 &
|
||||||
|
SERVER_PID=$!
|
||||||
|
echo "服务器进程ID: $SERVER_PID"
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
if [ -f server.log ]; then
|
||||||
|
tail -5 server.log
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "测试DNS查询..."
|
||||||
|
if $USE_DIG; then
|
||||||
|
dig @localhost example.com +short
|
||||||
|
else
|
||||||
|
nslookup example.com localhost | grep -A 2 "Name:"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "2. 测试负载均衡模式"
|
||||||
|
echo "修改配置文件为loadbalance模式"
|
||||||
|
sed -i 's/"queryMode": "[^"]*"/"queryMode": "loadbalance"/' config.json
|
||||||
|
cat config.json | grep queryMode
|
||||||
|
|
||||||
|
echo "重启DNS服务器..."
|
||||||
|
pkill -f "go run main.go"
|
||||||
|
sleep 2
|
||||||
|
go run main.go > server.log 2>&1 &
|
||||||
|
SERVER_PID=$!
|
||||||
|
echo "服务器进程ID: $SERVER_PID"
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
if [ -f server.log ]; then
|
||||||
|
tail -5 server.log
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "测试DNS查询..."
|
||||||
|
if $USE_DIG; then
|
||||||
|
dig @localhost example.com +short
|
||||||
|
else
|
||||||
|
nslookup example.com localhost | grep -A 2 "Name:"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "3. 测试最快的IP地址模式"
|
||||||
|
echo "修改配置文件为fastest-ip模式"
|
||||||
|
sed -i 's/"queryMode": "[^"]*"/"queryMode": "fastest-ip"/' config.json
|
||||||
|
cat config.json | grep queryMode
|
||||||
|
|
||||||
|
echo "重启DNS服务器..."
|
||||||
|
pkill -f "go run main.go"
|
||||||
|
sleep 2
|
||||||
|
go run main.go > server.log 2>&1 &
|
||||||
|
SERVER_PID=$!
|
||||||
|
echo "服务器进程ID: $SERVER_PID"
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
if [ -f server.log ]; then
|
||||||
|
tail -5 server.log
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "测试DNS查询..."
|
||||||
|
if $USE_DIG; then
|
||||||
|
dig @localhost example.com +short
|
||||||
|
else
|
||||||
|
nslookup example.com localhost | grep -A 2 "Name:"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== 测试完成 ==="
|
||||||
|
echo "停止DNS服务器..."
|
||||||
|
pkill -f "go run main.go"
|
||||||
|
|
||||||
|
# 删除日志文件
|
||||||
|
rm -f server.log
|
||||||
|
|
||||||
|
echo "恢复默认配置..."
|
||||||
|
sed -i 's/"queryMode": "[^"]*"/"queryMode": "parallel"/' config.json
|
||||||
|
cat config.json | grep queryMode
|
||||||
Reference in New Issue
Block a user