优化请求模式设置
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
"timeout": 5000,
|
||||
"statsFile": "data/stats.json",
|
||||
"saveInterval": 300,
|
||||
"cacheTTL": 30,
|
||||
"cacheTTL": 10,
|
||||
"enableDNSSEC": true,
|
||||
"queryMode": "parallel"
|
||||
},
|
||||
|
||||
3
data/hosts.txt
Normal file
3
data/hosts.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
# Hosts文件
|
||||
# 格式:IP 域名
|
||||
# 例如:127.0.0.1 localhost
|
||||
140002
data/querylog.json
Normal file
140002
data/querylog.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,734 @@
|
||||
!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/
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
/ciceknoktasi/
|
||||
File diff suppressed because it is too large
Load Diff
1
data/rules.txt
Normal file
1
data/rules.txt
Normal file
@@ -0,0 +1 @@
|
||||
@@||dns.weixin.qq.com.cn
|
||||
5
data/shield_stats.json
Normal file
5
data/shield_stats.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"blockedDomainsCount": {},
|
||||
"resolvedDomainsCount": {},
|
||||
"lastSaved": "2025-12-17T22:42:07.53406126+08:00"
|
||||
}
|
||||
9676
data/stats.json
Normal file
9676
data/stats.json
Normal file
File diff suppressed because it is too large
Load Diff
3
data/test_hosts.txt
Normal file
3
data/test_hosts.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
# Hosts文件
|
||||
# 格式:IP 域名
|
||||
# 例如:127.0.0.1 localhost
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
3
data/test_rules.txt
Normal file
3
data/test_rules.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
# 本地规则文件
|
||||
# 格式:域名
|
||||
# 例如:example.com
|
||||
5
data/test_shield_stats.json
Normal file
5
data/test_shield_stats.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"blockedDomainsCount": {},
|
||||
"resolvedDomainsCount": {},
|
||||
"lastSaved": "2025-12-16T00:38:44.046867267+08:00"
|
||||
}
|
||||
37
data/test_stats.json
Normal file
37
data/test_stats.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"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
dns-server
BIN
dns-server
Binary file not shown.
430
dns/server.go
430
dns/server.go
@@ -73,6 +73,15 @@ type StatsData struct {
|
||||
LastSaved time.Time `json:"lastSaved"`
|
||||
}
|
||||
|
||||
// ServerStats 服务器统计信息
|
||||
type ServerStats struct {
|
||||
SuccessCount int64 // 成功查询次数
|
||||
FailureCount int64 // 失败查询次数
|
||||
LastResponse time.Time // 最后响应时间
|
||||
ResponseTime time.Duration // 平均响应时间
|
||||
ConnectionSpeed time.Duration // TCP连接速度
|
||||
}
|
||||
|
||||
// Server DNS服务器
|
||||
type Server struct {
|
||||
config *config.DNSConfig
|
||||
@@ -116,6 +125,10 @@ type Server struct {
|
||||
|
||||
// 域名DNSSEC状态映射表
|
||||
domainDNSSECStatus map[string]bool // 域名到DNSSEC状态的映射
|
||||
|
||||
// 上游服务器状态跟踪
|
||||
serverStats map[string]*ServerStats // 服务器地址到状态的映射
|
||||
serverStatsMutex sync.RWMutex // 保护服务器状态的互斥锁
|
||||
}
|
||||
|
||||
// Stats DNS服务器统计信息
|
||||
@@ -187,6 +200,8 @@ func NewServer(config *config.DNSConfig, shieldConfig *config.ShieldConfig, shie
|
||||
dnsCache: NewDNSCache(cacheTTL),
|
||||
// 初始化域名DNSSEC状态映射表
|
||||
domainDNSSECStatus: make(map[string]bool),
|
||||
// 初始化服务器状态跟踪
|
||||
serverStats: make(map[string]*ServerStats),
|
||||
}
|
||||
|
||||
// 加载已保存的统计数据
|
||||
@@ -690,21 +705,35 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
// 根据查询模式处理请求
|
||||
switch s.config.QueryMode {
|
||||
case "parallel":
|
||||
// 并行请求模式
|
||||
// 并行请求模式 - 优化版:添加超时处理和快速响应返回
|
||||
responses := make(chan serverResponse, len(s.config.UpstreamDNS))
|
||||
var wg sync.WaitGroup
|
||||
|
||||
// 超时上下文
|
||||
timeoutCtx, cancel := context.WithTimeout(s.ctx, time.Duration(s.config.Timeout)*time.Millisecond)
|
||||
defer cancel()
|
||||
|
||||
// 向所有上游服务器并行发送请求
|
||||
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}
|
||||
|
||||
select {
|
||||
case responses <- serverResponse{response, rtt, server, err}:
|
||||
// 成功发送响应
|
||||
case <-timeoutCtx.Done():
|
||||
// 超时,忽略此响应
|
||||
logger.Debug("并行请求超时", "server", server, "domain", domain)
|
||||
return
|
||||
}
|
||||
}(upstream)
|
||||
}
|
||||
|
||||
// 等待所有请求完成
|
||||
// 等待所有请求完成或超时
|
||||
go func() {
|
||||
wg.Wait()
|
||||
close(responses)
|
||||
@@ -713,6 +742,9 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
// 处理所有响应
|
||||
for resp := range responses {
|
||||
if resp.error == nil && resp.response != nil {
|
||||
// 更新服务器统计信息
|
||||
s.updateServerStats(resp.server, true, resp.rtt)
|
||||
|
||||
// 设置递归可用标志
|
||||
resp.response.RecursionAvailable = true
|
||||
|
||||
@@ -765,14 +797,22 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
hasBackup = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 更新服务器统计信息(失败)
|
||||
s.updateServerStats(resp.server, false, 0)
|
||||
}
|
||||
}
|
||||
|
||||
case "loadbalance":
|
||||
// 负载均衡模式 - 目前使用简单的轮询,后续可以扩展为更复杂的算法
|
||||
for _, upstream := range s.config.UpstreamDNS {
|
||||
response, rtt, err := s.resolver.Exchange(r, upstream)
|
||||
// 负载均衡模式 - 使用加权随机选择算法
|
||||
// 1. 选择一个加权随机服务器
|
||||
selectedServer := s.selectWeightedRandomServer(s.config.UpstreamDNS)
|
||||
if selectedServer != "" {
|
||||
response, rtt, err := s.resolver.Exchange(r, selectedServer)
|
||||
if err == nil && response != nil {
|
||||
// 更新服务器统计信息
|
||||
s.updateServerStats(selectedServer, true, rtt)
|
||||
|
||||
// 设置递归可用标志
|
||||
response.RecursionAvailable = true
|
||||
|
||||
@@ -810,14 +850,13 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
bestRtt = rtt
|
||||
hasBestResponse = true
|
||||
hasDNSSECResponse = true
|
||||
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||
break // 找到带DNSSEC的响应,立即返回
|
||||
} else if !hasBestResponse {
|
||||
// 没有带DNSSEC的响应时,保存第一个成功响应
|
||||
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", selectedServer, "rtt", rtt)
|
||||
} else {
|
||||
// 没有带DNSSEC的响应时,保存成功响应
|
||||
bestResponse = response
|
||||
bestRtt = rtt
|
||||
hasBestResponse = true
|
||||
logger.Debug("找到最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||
logger.Debug("找到最佳响应", "domain", domain, "server", selectedServer, "rtt", rtt)
|
||||
}
|
||||
// 保存为备选响应
|
||||
if !hasBackup {
|
||||
@@ -826,14 +865,22 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
hasBackup = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 更新服务器统计信息(失败)
|
||||
s.updateServerStats(selectedServer, false, 0)
|
||||
}
|
||||
}
|
||||
|
||||
case "fastest-ip":
|
||||
// 最快的IP地址模式 - 目前使用简单的顺序请求,后续可以扩展为测量TCP连接速度
|
||||
for _, upstream := range s.config.UpstreamDNS {
|
||||
response, rtt, err := s.resolver.Exchange(r, upstream)
|
||||
// 最快的IP地址模式 - 使用TCP连接速度测量选择最快服务器
|
||||
// 1. 选择最快的服务器
|
||||
fastestServer := s.selectFastestServer(s.config.UpstreamDNS)
|
||||
if fastestServer != "" {
|
||||
response, rtt, err := s.resolver.Exchange(r, fastestServer)
|
||||
if err == nil && response != nil {
|
||||
// 更新服务器统计信息
|
||||
s.updateServerStats(fastestServer, true, rtt)
|
||||
|
||||
// 设置递归可用标志
|
||||
response.RecursionAvailable = true
|
||||
|
||||
@@ -871,15 +918,13 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
bestRtt = rtt
|
||||
hasBestResponse = true
|
||||
hasDNSSECResponse = true
|
||||
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||
break // 找到带DNSSEC的响应,立即返回
|
||||
} else if !hasBestResponse {
|
||||
// 没有带DNSSEC的响应时,保存第一个成功响应
|
||||
logger.Debug("找到带DNSSEC的最佳响应", "domain", domain, "server", fastestServer, "rtt", rtt)
|
||||
} else {
|
||||
// 没有带DNSSEC的响应时,保存成功响应
|
||||
bestResponse = response
|
||||
bestRtt = rtt
|
||||
hasBestResponse = true
|
||||
logger.Debug("找到最佳响应", "domain", domain, "server", upstream, "rtt", rtt)
|
||||
break // 找到响应,立即返回
|
||||
logger.Debug("找到最佳响应", "domain", domain, "server", fastestServer, "rtt", rtt)
|
||||
}
|
||||
// 保存为备选响应
|
||||
if !hasBackup {
|
||||
@@ -888,6 +933,9 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
hasBackup = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 更新服务器统计信息(失败)
|
||||
s.updateServerStats(fastestServer, false, 0)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -983,21 +1031,35 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
// 根据查询模式处理DNSSEC服务器请求
|
||||
switch s.config.QueryMode {
|
||||
case "parallel":
|
||||
// 并行请求模式
|
||||
// 并行请求模式 - 优化版:添加超时处理和服务器统计
|
||||
responses := make(chan serverResponse, len(dnssecServers))
|
||||
var wg sync.WaitGroup
|
||||
|
||||
// 超时上下文
|
||||
timeoutCtx, cancel := context.WithTimeout(s.ctx, time.Duration(s.config.Timeout)*time.Millisecond)
|
||||
defer cancel()
|
||||
|
||||
// 向所有DNSSEC服务器并行发送请求
|
||||
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}
|
||||
|
||||
select {
|
||||
case responses <- serverResponse{response, rtt, server, err}:
|
||||
// 成功发送响应
|
||||
case <-timeoutCtx.Done():
|
||||
// 超时,忽略此响应
|
||||
logger.Debug("DNSSEC并行请求超时", "server", server, "domain", domain)
|
||||
return
|
||||
}
|
||||
}(dnssecServer)
|
||||
}
|
||||
|
||||
// 等待所有请求完成
|
||||
// 等待所有请求完成或超时
|
||||
go func() {
|
||||
wg.Wait()
|
||||
close(responses)
|
||||
@@ -1006,6 +1068,9 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
// 处理所有响应
|
||||
for resp := range responses {
|
||||
if resp.error == nil && resp.response != nil {
|
||||
// 更新服务器统计信息
|
||||
s.updateServerStats(resp.server, true, resp.rtt)
|
||||
|
||||
// 设置递归可用标志
|
||||
resp.response.RecursionAvailable = true
|
||||
|
||||
@@ -1051,6 +1116,131 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
hasBackup = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 更新服务器统计信息(失败)
|
||||
s.updateServerStats(resp.server, false, 0)
|
||||
}
|
||||
}
|
||||
|
||||
case "loadbalance":
|
||||
// 负载均衡模式 - 使用加权随机选择算法
|
||||
// 1. 选择一个加权随机DNSSEC服务器
|
||||
selectedServer := s.selectWeightedRandomServer(dnssecServers)
|
||||
if selectedServer != "" {
|
||||
response, rtt, err := s.resolver.Exchange(r, selectedServer)
|
||||
if err == nil && response != nil {
|
||||
// 更新服务器统计信息
|
||||
s.updateServerStats(selectedServer, true, rtt)
|
||||
|
||||
// 设置递归可用标志
|
||||
response.RecursionAvailable = true
|
||||
|
||||
// 检查是否包含DNSSEC记录
|
||||
containsDNSSEC := s.hasDNSSECRecords(response)
|
||||
|
||||
if response.Rcode == dns.RcodeSuccess {
|
||||
// 验证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", selectedServer, "rtt", rtt)
|
||||
}
|
||||
// 注意:如果DNSSEC专用服务器返回的响应不包含DNSSEC记录,
|
||||
// 我们不会覆盖之前从upstreamDNS获取的响应,
|
||||
// 这符合"本地解析指的是直接使用上游服务器upstreamDNS进行解析, 而不是dnssecUpstreamDNS"的要求
|
||||
|
||||
// 更新备选响应
|
||||
if !hasBackup {
|
||||
backupResponse = response
|
||||
backupRtt = rtt
|
||||
hasBackup = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 更新服务器统计信息(失败)
|
||||
s.updateServerStats(selectedServer, false, 0)
|
||||
}
|
||||
}
|
||||
|
||||
case "fastest-ip":
|
||||
// 最快的IP地址模式 - 使用TCP连接速度测量选择最快DNSSEC服务器
|
||||
// 1. 选择最快的DNSSEC服务器
|
||||
fastestServer := s.selectFastestServer(dnssecServers)
|
||||
if fastestServer != "" {
|
||||
response, rtt, err := s.resolver.Exchange(r, fastestServer)
|
||||
if err == nil && response != nil {
|
||||
// 更新服务器统计信息
|
||||
s.updateServerStats(fastestServer, true, rtt)
|
||||
|
||||
// 设置递归可用标志
|
||||
response.RecursionAvailable = true
|
||||
|
||||
// 检查是否包含DNSSEC记录
|
||||
containsDNSSEC := s.hasDNSSECRecords(response)
|
||||
|
||||
if response.Rcode == dns.RcodeSuccess {
|
||||
// 验证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", fastestServer, "rtt", rtt)
|
||||
}
|
||||
// 注意:如果DNSSEC专用服务器返回的响应不包含DNSSEC记录,
|
||||
// 我们不会覆盖之前从upstreamDNS获取的响应,
|
||||
// 这符合"本地解析指的是直接使用上游服务器upstreamDNS进行解析, 而不是dnssecUpstreamDNS"的要求
|
||||
|
||||
// 更新备选响应
|
||||
if !hasBackup {
|
||||
backupResponse = response
|
||||
backupRtt = rtt
|
||||
hasBackup = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 更新服务器统计信息(失败)
|
||||
s.updateServerStats(fastestServer, false, 0)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1059,6 +1249,9 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
for _, dnssecServer := range dnssecServers {
|
||||
response, rtt, err := s.resolver.Exchange(r, dnssecServer)
|
||||
if err == nil && response != nil {
|
||||
// 更新服务器统计信息
|
||||
s.updateServerStats(dnssecServer, true, rtt)
|
||||
|
||||
// 设置递归可用标志
|
||||
response.RecursionAvailable = true
|
||||
|
||||
@@ -1105,6 +1298,9 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
||||
hasBackup = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 更新服务器统计信息(失败)
|
||||
s.updateServerStats(dnssecServer, false, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1397,6 +1593,194 @@ func (s *Server) updateResolvedDomainStats(domain string) {
|
||||
}
|
||||
}
|
||||
|
||||
// getServerStats 获取服务器统计信息,如果不存在则创建
|
||||
func (s *Server) getServerStats(server string) *ServerStats {
|
||||
s.serverStatsMutex.RLock()
|
||||
stats, exists := s.serverStats[server]
|
||||
s.serverStatsMutex.RUnlock()
|
||||
|
||||
if !exists {
|
||||
// 创建新的服务器统计信息
|
||||
stats = &ServerStats{
|
||||
SuccessCount: 0,
|
||||
FailureCount: 0,
|
||||
LastResponse: time.Now(),
|
||||
ResponseTime: 0,
|
||||
ConnectionSpeed: 0,
|
||||
}
|
||||
|
||||
// 加锁更新服务器统计信息
|
||||
s.serverStatsMutex.Lock()
|
||||
s.serverStats[server] = stats
|
||||
s.serverStatsMutex.Unlock()
|
||||
}
|
||||
|
||||
return stats
|
||||
}
|
||||
|
||||
// updateServerStats 更新服务器统计信息
|
||||
func (s *Server) updateServerStats(server string, success bool, rtt time.Duration) {
|
||||
stats := s.getServerStats(server)
|
||||
|
||||
s.serverStatsMutex.Lock()
|
||||
defer s.serverStatsMutex.Unlock()
|
||||
|
||||
// 更新统计信息
|
||||
stats.LastResponse = time.Now()
|
||||
|
||||
if success {
|
||||
stats.SuccessCount++
|
||||
// 更新平均响应时间(简单移动平均)
|
||||
// 将所有值转换为纳秒进行计算,然后再转换回Duration
|
||||
if stats.SuccessCount == 1 {
|
||||
// 第一次成功,直接使用当前响应时间
|
||||
stats.ResponseTime = rtt
|
||||
} else {
|
||||
// 使用纳秒进行计算以避免类型不匹配
|
||||
prevTotal := stats.ResponseTime.Nanoseconds() * (stats.SuccessCount - 1)
|
||||
newTotal := prevTotal + rtt.Nanoseconds()
|
||||
stats.ResponseTime = time.Duration(newTotal / stats.SuccessCount)
|
||||
}
|
||||
} else {
|
||||
stats.FailureCount++
|
||||
}
|
||||
}
|
||||
|
||||
// selectWeightedRandomServer 加权随机选择服务器
|
||||
func (s *Server) selectWeightedRandomServer(servers []string) string {
|
||||
if len(servers) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
if len(servers) == 1 {
|
||||
return servers[0]
|
||||
}
|
||||
|
||||
// 计算每个服务器的权重
|
||||
type serverWeight struct {
|
||||
server string
|
||||
weight int64
|
||||
}
|
||||
|
||||
var totalWeight int64
|
||||
weights := make([]serverWeight, 0, len(servers))
|
||||
|
||||
for _, server := range servers {
|
||||
stats := s.getServerStats(server)
|
||||
|
||||
// 计算权重:成功次数 - 失败次数 * 2(失败权重更高)
|
||||
// 确保权重至少为1
|
||||
weight := stats.SuccessCount - stats.FailureCount*2
|
||||
if weight < 1 {
|
||||
weight = 1
|
||||
}
|
||||
|
||||
weights = append(weights, serverWeight{server, weight})
|
||||
totalWeight += weight
|
||||
}
|
||||
|
||||
// 随机选择一个权重
|
||||
random := time.Now().UnixNano() % totalWeight
|
||||
if random < 0 {
|
||||
random += totalWeight
|
||||
}
|
||||
|
||||
// 选择对应的服务器
|
||||
var currentWeight int64
|
||||
for _, sw := range weights {
|
||||
currentWeight += sw.weight
|
||||
if random < currentWeight {
|
||||
return sw.server
|
||||
}
|
||||
}
|
||||
|
||||
// 兜底返回第一个服务器
|
||||
return servers[0]
|
||||
}
|
||||
|
||||
// measureServerSpeed 测量服务器TCP连接速度
|
||||
func (s *Server) measureServerSpeed(server string) time.Duration {
|
||||
// 提取服务器地址和端口
|
||||
addr := server
|
||||
if !strings.Contains(server, ":") {
|
||||
addr = server + ":53"
|
||||
}
|
||||
|
||||
// 测量TCP连接时间
|
||||
startTime := time.Now()
|
||||
conn, err := net.DialTimeout("tcp", addr, 2*time.Second)
|
||||
if err != nil {
|
||||
// 连接失败,返回最大持续时间
|
||||
return 2 * time.Second
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
// 计算连接建立时间
|
||||
connTime := time.Since(startTime)
|
||||
|
||||
// 更新服务器连接速度
|
||||
stats := s.getServerStats(server)
|
||||
s.serverStatsMutex.Lock()
|
||||
// 使用指数移动平均更新连接速度
|
||||
stats.ConnectionSpeed = (stats.ConnectionSpeed*3 + connTime) / 4
|
||||
s.serverStatsMutex.Unlock()
|
||||
|
||||
return connTime
|
||||
}
|
||||
|
||||
// selectFastestServer 选择连接速度最快的服务器
|
||||
func (s *Server) selectFastestServer(servers []string) string {
|
||||
if len(servers) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
if len(servers) == 1 {
|
||||
return servers[0]
|
||||
}
|
||||
|
||||
// 并行测量所有服务器的速度
|
||||
type speedResult struct {
|
||||
server string
|
||||
speed time.Duration
|
||||
}
|
||||
|
||||
results := make(chan speedResult, len(servers))
|
||||
var wg sync.WaitGroup
|
||||
|
||||
for _, server := range servers {
|
||||
wg.Add(1)
|
||||
go func(srv string) {
|
||||
defer wg.Done()
|
||||
speed := s.measureServerSpeed(srv)
|
||||
results <- speedResult{srv, speed}
|
||||
}(server)
|
||||
}
|
||||
|
||||
// 等待所有测量完成
|
||||
go func() {
|
||||
wg.Wait()
|
||||
close(results)
|
||||
}()
|
||||
|
||||
// 找出最快的服务器
|
||||
var fastestServer string
|
||||
var fastestSpeed time.Duration = 2 * time.Second
|
||||
|
||||
for result := range results {
|
||||
if result.speed < fastestSpeed {
|
||||
fastestSpeed = result.speed
|
||||
fastestServer = result.server
|
||||
}
|
||||
}
|
||||
|
||||
// 如果没有找到最快服务器(理论上不会发生),返回第一个服务器
|
||||
if fastestServer == "" {
|
||||
fastestServer = servers[0]
|
||||
}
|
||||
|
||||
return fastestServer
|
||||
}
|
||||
|
||||
// updateStats 更新统计信息
|
||||
func (s *Server) updateStats(update func(*Stats)) {
|
||||
s.statsMutex.Lock()
|
||||
|
||||
90842
logs/dns-server.log
Normal file
90842
logs/dns-server.log
Normal file
File diff suppressed because it is too large
Load Diff
28
logs/test_dns-server.log
Normal file
28
logs/test_dns-server.log
Normal file
@@ -0,0 +1,28 @@
|
||||
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="日志系统已关闭"
|
||||
Reference in New Issue
Block a user