diff --git a/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts b/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts index 1d517119..1a3b6643 100644 --- a/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts +++ b/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts @@ -12,19 +12,28 @@ import { appendArrayInPlace } from './lib/append-array-in-place'; import { OUTPUT_INTERNAL_DIR, OUTPUT_MODULES_DIR, SOURCE_DIR } from './constants/dir'; import { RulesetOutput } from './lib/create-file'; +const getRule = (domain: string) => { + switch (domain[0]) { + case '+': + case '$': + return `DOMAIN-SUFFIX,${domain.slice(1)}`; + default: + return `DOMAIN-SUFFIX,${domain}`; + } +}; export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => { const domestics = await readFileIntoProcessedArray(path.join(SOURCE_DIR, 'non_ip/domestic.conf')); const directs = await readFileIntoProcessedArray(path.resolve(SOURCE_DIR, 'non_ip/direct.conf')); const lans: string[] = []; Object.entries(DOMESTICS).forEach(([, { domains }]) => { - appendArrayInPlace(domestics, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); + appendArrayInPlace(domestics, domains.map(getRule)); }); Object.entries(DIRECTS).forEach(([, { domains }]) => { - appendArrayInPlace(directs, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); + appendArrayInPlace(directs, domains.map(getRule)); }); Object.entries(LANS).forEach(([, { domains }]) => { - appendArrayInPlace(lans, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); + appendArrayInPlace(lans, domains.map(getRule)); }); return [domestics, directs, lans] as const; @@ -74,10 +83,22 @@ export const buildDomesticRuleset = task(require.main === module, __filename)(as '[Host]', ...dataset.flatMap(([, { domains, dns, hosts }]) => [ ...Object.entries(hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`), - ...domains.flatMap((domain) => [ - `${domain} = server:${dns}`, - `*.${domain} = server:${dns}` - ]) + ...domains.flatMap((domain) => { + if (domain[0] === '$') { + return [ + `${domain.slice(1)} = server:${dns}` + ]; + } + if (domain[0] === '+') { + return [ + `*.${domain.slice(1)} = server:${dns}` + ]; + } + return [ + `${domain} = server:${dns}`, + `*.${domain} = server:${dns}` + ]; + }) ]) ], path.resolve(OUTPUT_MODULES_DIR, 'sukka_local_dns_mapping.sgmodule') @@ -90,7 +111,16 @@ export const buildDomesticRuleset = task(require.main === module, __filename)(as 'nameserver-policy': dataset.reduce>( (acc, [, { domains, dns }]) => { domains.forEach((domain) => { - acc[`+.${domain}`] = dns === 'system' + let domainWildcard = domain; + if (domain[0] === '$') { + domainWildcard = domain.slice(1); + } else if (domain[0] === '+') { + domainWildcard = `*.${domain.slice(1)}`; + } else { + domainWildcard = `+.${domain}`; + } + + acc[domainWildcard] = dns === 'system' ? [ 'system://', 'system', diff --git a/Build/build-sgmodule-redirect.ts b/Build/build-sgmodule-redirect.ts index df1844ee..2c4222de 100644 --- a/Build/build-sgmodule-redirect.ts +++ b/Build/build-sgmodule-redirect.ts @@ -92,7 +92,10 @@ const REDIRECT_MIRROR_307 = [ ['google.cn/', 'https://google.com/'], ['www.google.cn/', 'https://www.google.com/'], ['g.cn/', 'https://google.com/'], - ['www.g.cn/', 'https://www.google.com/'] + ['www.g.cn/', 'https://www.google.com/'], + // avg.tv/sm114514 -> https://www.nicovideo.jp/watch/sm114514 + ['acg.tv/sm', 'https://www.nicovideo.jp/watch/sm'], + ['acg.tv/', 'https://b23.tv/'] ]; const REDIRECT_FAKEWEBSITES = [ diff --git a/Build/lib/rules/base.ts b/Build/lib/rules/base.ts index 9db86bb1..8f8ea001 100644 --- a/Build/lib/rules/base.ts +++ b/Build/lib/rules/base.ts @@ -392,8 +392,6 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath if (p) await p; } - await asyncWriteToStream(writeStream, '\n'); - writeStream.end(); }); } diff --git a/Source/non_ip/direct.ts b/Source/non_ip/direct.ts index f25ff976..f2bbd927 100644 --- a/Source/non_ip/direct.ts +++ b/Source/non_ip/direct.ts @@ -3,6 +3,13 @@ export interface DNSMapping { [domain: string]: string[] }, dns: string, + /** + * domain[0] + * + * + subdomain only + * $ domain only exact match + * [none] domain and subdomain + */ domains: string[] } @@ -35,8 +42,8 @@ export const DIRECTS = { // ZTE CPE 'zte.home', // UniFi - 'ui.direct', - 'unifi', + '+ui.direct', + '$unifi', 'amplifi.lan', // Other Router 'hiwifi.com', @@ -85,8 +92,8 @@ export const DIRECTS = { // TailScale Magic DNS 'ts.net', // AdGuard - 'injections.adguard.org', - 'local.adguard.org' + '$injections.adguard.org', + '$local.adguard.org' ] } } satisfies Record; @@ -97,7 +104,7 @@ export const LANS = { hosts: {}, domains: [ 'lan', - 'localhost', + '$localhost', 'localdomain', 'home.arpa', // AS112 diff --git a/Source/non_ip/domestic.ts b/Source/non_ip/domestic.ts index bdec85b5..f2c8cab8 100644 --- a/Source/non_ip/domestic.ts +++ b/Source/non_ip/domestic.ts @@ -10,22 +10,22 @@ export const DOMESTICS = { 'uc.cn', 'ucweb.com', 'alibaba.com', - 'alicdn.com', - 'ialicdn.com', - 'myalicdn.com', - 'alidns.com', - 'aliimg.com', + '+alicdn.com', + '+ialicdn.com', + '+myalicdn.com', + '+alidns.com', + '+aliimg.com', 'aliyun.com', - 'aliyuncs.com', - 'alikunlun.com', - 'alikunlun.net', - 'cdngslb.com', + '+aliyuncs.com', + '+alikunlun.com', + '+alikunlun.net', + '+cdngslb.com', 'alipay.com', 'alipay.cn', 'alipay.com.cn', - 'alipayobjects.com', + '+alipayobjects.com', 'alibaba-inc.com', - 'alibabausercontent.com', + '+alibabausercontent.com', 'alibabadns.com', 'alicloudccp.com', 'alipan.com', @@ -46,18 +46,18 @@ export const DOMESTICS = { 'soku.com', 'tb.cn', 'taobao.com', - 'taobaocdn.com', - 'tbcache.com', + '+taobaocdn.com', + '+tbcache.com', 'tmall.com', 'tmall.hk', 'xiami.com', 'xiami.net', - 'ykimg.com', + '+ykimg.com', 'youku.com', 'tudou.com', - 'cibntv.net', + '+cibntv.net', 'ele.me', - 'elemecdn.com', + '+elemecdn.com', 'feizhu.com', 'taopiaopiao.com', 'fliggy.com', @@ -75,10 +75,11 @@ export const DOMESTICS = { 'npmmirror.com', 'alios.cn', 'wandoujia.com', - 'aliapp.org', + '+aliapp.org', 'tanx.com', 'hellobike.com', - 'hichina.com' + '+hichina.com', + '+yunos.com' ] }, TENCENT: { @@ -91,25 +92,25 @@ export const DOMESTICS = { domains: [ 'dns.pub', 'doh.pub', - 'qcloud.com', - 'gtimg.cn', - 'gtimg.com', - 'gtimg.com.cn', - 'gdtimg.com', - 'idqqimg.com', + '+qcloud.com', + '+gtimg.cn', + '+gtimg.com', + '+gtimg.com.cn', + '+gdtimg.com', + '+idqqimg.com', 'igamecj.com', 'myapp.com', - 'myqcloud.com', + '+myqcloud.com', 'dnspod.com', - 'qpic.cn', - 'qlogo.cn', + '+qpic.cn', + '+qlogo.cn', 'qq.com', 'qq.com.cn', 'qq.wang', 'qqmail.cn', 'qqmail.com', 'qzone.com', - 'tencent-cloud.net', + '+tencent-cloud.net', 'tencent.com', 'tencent.com.cn', 'tencentmusic.com', @@ -120,60 +121,58 @@ export const DOMESTICS = { 'soso.com', 'sogo.com', 'sogou.com', - 'sogoucdn.com', + '+sogoucdn.com', 'roblox.cn', 'robloxdev.cn', 'wegame.com', 'wegame.com.cn', 'wegameplus.com', 'cdn-go.cn', - 'tencentcs.cn', - 'tencent-coud.cn', - 'qcloudimg.com', + '+tencentcs.cn', + '+qcloudimg.com', 'dnspod.cn', - 'yunos.com', 'yitao.com', 'anticheatexpert.com', - 'url.cn', - 'qlivecdn.com', - 'tcdnlive.com', - 'dnsv1.com' + '$url.cn', + '+qlivecdn.com', + '+tcdnlive.com', + '+dnsv1.com' ] }, BILIBILI_ALI: { dns: 'quic://dns.alidns.com:853', hosts: {}, domains: [ - 'upos-sz-mirrorali.bilivideo.com', - 'upos-sz-estgoss.bilivideo.com' + '$upos-sz-mirrorali.bilivideo.com', + '$upos-sz-estgoss.bilivideo.com' ] }, BILIBILI_BD: { dns: '180.76.76.76', hosts: {}, domains: [ - 'upos-sz-mirrorbd.bilivideo.com', - 'upos-sz-mirrorbos.bilivideo.com' + '$upos-sz-mirrorbd.bilivideo.com', + '$upos-sz-mirrorbos.bilivideo.com' ] }, BILIBILI: { dns: 'https://doh.pub/dns-query', hosts: {}, domains: [ - 'upos-sz-mirrorcoso1.bilivideo.com', - 'acg.tv', - 'b23.tv', - 'acgvideo.com', + '$upos-sz-mirrorcoso1.bilivideo.com', + '$acg.tv', + '$b23.tv', 'bilibili.cn', 'bilibili.com', - 'bilibili.tv', - 'bilivideo.com', - 'bilivideo.cn', - 'bilivideo.net', - 'hdslb.com', - 'biliimg.com', - 'biliapi.com', - 'biliapi.net', + // 'bilibili.tv', + '+acgvideo.com', + '+bilivideo.com', + '+bilivideo.cn', + '+bilivideo.net', + '+hdslb.com', + '+biliimg.com', + '+biliapi.com', + '+biliapi.net', 'biligame.cn', 'biligame.com', 'biligame.net', @@ -181,7 +180,7 @@ export const DOMESTICS = { 'bilicomics.com', 'bilibilipay.cn', 'bilibilipay.com', - 'bilicdn1.com' + '+bilicdn1.com' ] }, XIAOMI: { @@ -190,7 +189,7 @@ export const DOMESTICS = { domains: [ 'mi.com', 'duokan.com', - 'mi-img.com', + '+mi-img.com', 'mi-fds.com', 'mifile.cn', 'miui.com', @@ -207,44 +206,45 @@ export const DOMESTICS = { dns: '180.184.2.2', hosts: {}, domains: [ - 'bytecdn.cn', - 'toutiaoimg.com', - 'toutiaoimg.cn', - 'toutiaostatic.com', - 'toutiaovod.com', - 'toutiaocloud.com', + '+bytecdn.cn', + '+toutiaoimg.com', + '+toutiaoimg.cn', + '+toutiaostatic.com', + '+toutiaovod.com', + '+toutiaocloud.com', 'toutiaopage.com', 'feiliao.com', 'iesdouyin.com', - 'pstatp.com', + '+pstatp.com', 'snssdk.com', - 'bytegoofy.com', + '+bytegoofy.com', 'toutiao.com', 'feishu.cn', 'feishu.net', - 'feishucdn.com', - 'feishupkg.com', + '+feishucdn.com', + '+feishupkg.com', 'douyin.com', - 'douyinpic.com', - 'douyinstatic.com', - 'douyincdn.com', - 'douyinliving.com', - 'douyinvod.com', + '+douyinpic.com', + '+douyinstatic.com', + '+douyincdn.com', + '+douyinliving.com', + '+douyinvod.com', 'huoshan.com', - 'huoshanstatic.com', + '+huoshanstatic.com', 'huoshanzhibo.com', 'ixigua.com', - 'ixiguavideo.com', - 'ixgvideo.com', - 'volccdn.com', - 'byted-static.com', + '+ixiguavideo.com', + '+ixgvideo.com', + '+volccdn.com', + '+byted-static.com', 'volces.com', 'baike.com', - 'zjcdn.com', - 'zijieapi.com', + '+zjcdn.com', + '+zijieapi.com', 'feelgood.cn', - 'bytetcc.com', // Use hichina.com as NS - 'bytednsdoc.com' // Uses alidns.com as NS + '+bytetcc.com', // Use hichina.com as NS + '+bytednsdoc.com', // Uses alidns.com as NS + '+byteimg.com' // Uses alidns.com as NS ] }, BAIDU: { @@ -256,25 +256,25 @@ export const DOMESTICS = { 'baidu.cn', 'baidu.com', 'iqiyi.com', - 'iqiyipic.com', - 'baidubce.com', - 'bcelive.com', - 'baiducontent.com', - 'baidustatic.com', - 'bdstatic.com', - 'bdimg.com', - 'bcebos.com', - 'baidupcs.com', - 'baidubcr.com', - 'yunjiasu-cdn.net', + '+iqiyipic.com', + '+baidubce.com', + '+bcelive.com', + '+baiducontent.com', + '+baidustatic.com', + '+bdstatic.com', + '+bdimg.com', + '+bcebos.com', + '+baidupcs.com', + '+baidubcr.com', + '+yunjiasu-cdn.net', 'tieba.com', 'xiaodutv.com', 'shifen.com', - 'jomodns.com', - 'bdydns.com', - 'jomoxc.com', - 'duapp.com', - 'antpcdn.com' // Baidu PCDN + '+jomodns.com', + '+bdydns.com', + '+jomoxc.com', + '+duapp.com', + '+antpcdn.com' // Baidu PCDN ] }, QIHOO360: { @@ -288,40 +288,40 @@ export const DOMESTICS = { }, dns: 'https://dns.360.net/dns-query', domains: [ - 'qhimg.com', - 'qhimgs0.com', - 'qhimgs1.com', - 'qhimgs2.com', - 'qhimgs3.com', - 'qhimgs4.com', - 'qhimgs5.com', - 'qhimgs6.com', - 'qhres.com', - 'qhres0.com', - 'qhres1.com', - 'qhres2.com', - 'qhres3.com', - 'qhres4.com', - 'qhres5.com', - 'qhres6.com', - 'qhmsg.com', - 'qhstatic.com', - 'qhupdate.com', - 'qihucdn.com', + '+qhimg.com', + '+qhimgs0.com', + '+qhimgs1.com', + '+qhimgs2.com', + '+qhimgs3.com', + '+qhimgs4.com', + '+qhimgs5.com', + '+qhimgs6.com', + '+qhres.com', + '+qhres0.com', + '+qhres1.com', + '+qhres2.com', + '+qhres3.com', + '+qhres4.com', + '+qhres5.com', + '+qhres6.com', + '+qhmsg.com', + '+qhstatic.com', + '+qhupdate.com', + '+qihucdn.com', '360.com', '360.cn', '360.net', '360safe.com', - '360tpcdn.com', + '+360tpcdn.com', '360os.com', - '360webcache.com', + '+360webcache.com', '360kuai.com', 'so.com', 'haosou.com', 'yunpan.cn', 'yunpan.com', 'yunpan.com.cn', - 'qh-cdn.com', + '+qh-cdn.com', 'baomitu.com' ] }