diff --git a/Build/build-domestic-ruleset.ts b/Build/build-domestic-ruleset.ts index 9f68ef1f..6bf33075 100644 --- a/Build/build-domestic-ruleset.ts +++ b/Build/build-domestic-ruleset.ts @@ -1,45 +1,59 @@ // @ts-check import path from 'path'; import { DOMESTICS } from '../Source/non_ip/domestic'; +import { DIRECTS } from '../Source/non_ip/direct'; import { readFileIntoProcessedArray } from './lib/fetch-text-by-line'; import { compareAndWriteFile, createRuleset } from './lib/create-file'; import { task } from './trace'; import { SHARED_DESCRIPTION } from './lib/constants'; import { createMemoizedPromise } from './lib/memo-promise'; -export const getDomesticDomainsRulesetPromise = createMemoizedPromise(async () => { - const results = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/domestic.conf')); +export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => { + const domestics = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/domestic.conf')); + const directs = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/direct.conf')); - results.push( - ...Object.entries(DOMESTICS).reduce((acc, [key, { domains }]) => { - if (key === 'SYSTEM') return acc; - return [...acc, ...domains]; - }, []).map((domain) => `DOMAIN-SUFFIX,${domain}`) - ); + Object.entries(DOMESTICS).forEach(([, { domains }]) => { + domestics.push(...domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); + }); + Object.entries(DIRECTS).forEach(([, { domains }]) => { + directs.push(...domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); + }); - return results; + return [domestics, directs] as const; }); export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(async (span) => { - const rulesetDescription = [ - ...SHARED_DESCRIPTION, - '', - 'This file contains known addresses that are avaliable in the Mainland China.' - ]; - - const res = await getDomesticDomainsRulesetPromise(); + const res = await getDomesticAndDirectDomainsRulesetPromise(); return Promise.all([ createRuleset( span, 'Sukka\'s Ruleset - Domestic Domains', - rulesetDescription, + [ + ...SHARED_DESCRIPTION, + '', + 'This file contains known addresses that are avaliable in the Mainland China.' + ], new Date(), - res, + res[0], 'ruleset', path.resolve(import.meta.dir, '../List/non_ip/domestic.conf'), path.resolve(import.meta.dir, '../Clash/non_ip/domestic.txt') ), + createRuleset( + span, + 'Sukka\'s Ruleset - Direct Rules', + [ + ...SHARED_DESCRIPTION, + '', + 'This file contains domains and process that should not be proxied.' + ], + new Date(), + res[1], + 'ruleset', + path.resolve(import.meta.dir, '../List/non_ip/direct.conf'), + path.resolve(import.meta.dir, '../Clash/non_ip/direct.txt') + ), compareAndWriteFile( span, [ @@ -47,20 +61,18 @@ export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(asy `#!desc=Last Updated: ${new Date().toISOString()}`, '', '[Host]', - ...Object.entries(DOMESTICS) - .flatMap( - ([, { domains, dns, ...rest }]) => [ - ...( - 'hosts' in rest - ? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`) - : [] - ), - ...domains.flatMap((domain) => [ - `${domain} = server:${dns}`, - `*.${domain} = server:${dns}` - ]) - ] - ) + ...([...Object.entries(DOMESTICS), ...Object.entries(DIRECTS)]) + .flatMap(([, { domains, dns, ...rest }]) => [ + ...( + 'hosts' in rest + ? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`) + : [] + ), + ...domains.flatMap((domain) => [ + `${domain} = server:${dns}`, + `*.${domain} = server:${dns}` + ]) + ]) ], path.resolve(import.meta.dir, '../Modules/sukka_local_dns_mapping.sgmodule') ) diff --git a/Build/build-sgmodule-always-realip.ts b/Build/build-sgmodule-always-realip.ts index 8e4ad7be..52bbbae6 100644 --- a/Build/build-sgmodule-always-realip.ts +++ b/Build/build-sgmodule-always-realip.ts @@ -1,13 +1,11 @@ import path from 'path'; import { task } from './trace'; import { compareAndWriteFile } from './lib/create-file'; +import { DIRECTS } from '../Source/non_ip/direct'; const HOSTNAMES = [ - // Intranet - '*.lan', - '*.localdomain', - '*.localhost', - '*.home.arpa', + // Intranet, Router Setup, and mant more + ...(Object.entries(DIRECTS)).flatMap(([, { domains }]) => domains.flatMap((domain) => [`*.${domain}`, domain])), // Network Detection, Captive Portal 'msftncsi.com', 'msftconnecttest.com', @@ -27,14 +25,10 @@ const HOSTNAMES = [ 'stun.twilio.com', '*.stun.twilio.com', 'stun.syncthing.net', - 'stun.*.*', - 'stun.*.*.*', + 'stun.*', 'controlplane.tailscale.com', // NTP - 'time.*.com', 'time.*.gov, time.*.edu.cn, time.*.apple.com', 'time1.*.com', 'time2.*.com', 'time3.*.com', 'time4.*.com', 'time5.*.com', 'time6.*.com', 'time7.*.com', 'time8.*.com', 'time9.*.com, ntp.*.com, ntp1.*.com, ntp2.*.com, ntp3.*.com, ntp4.*.com, ntp5.*.com, ntp6.*.com, ntp7.*.com', 'time1.*.com', 'time2.*.com', 'time3.*.com', 'time4.*.com', 'time5.*.com', 'time6.*.com', 'time7.*.com', 'time8.*.com', 'ti me9.*.com', '*.time.edu.cn', '*.ntp.org.cn', '*.pool.ntp.org', 'time1.cloud.tencent.com', - // AdGuard - 'local.adguard.org', - 'injections.adguard.org', + 'time.*.com', 'time.*.gov, time.*.edu.cn, time.*.apple.com', 'time?.*.com', 'ntp.*.com', 'ntp?.*.com', '*.time.edu.cn', '*.ntp.org.cn', '*.pool.ntp.org', 'time*.cloud.tencent.com', // QQ Login 'localhost.ptlogin2.qq.com', 'localhost.sec.qq.com', diff --git a/Build/build-sspanel-appprofile.ts b/Build/build-sspanel-appprofile.ts index 7279fd20..56e9289e 100644 --- a/Build/build-sspanel-appprofile.ts +++ b/Build/build-sspanel-appprofile.ts @@ -1,5 +1,5 @@ import { getAppleCdnDomainsPromise } from './build-apple-cdn'; -import { getDomesticDomainsRulesetPromise } from './build-domestic-ruleset'; +import { getDomesticAndDirectDomainsRulesetPromise } from './build-domestic-ruleset'; import { surgeRulesetToClashClassicalTextRuleset, surgeDomainsetToClashRuleset } from './lib/clash'; import { readFileIntoProcessedArray } from './lib/fetch-text-by-line'; import { task } from './trace'; @@ -46,7 +46,8 @@ export const buildSSPanelUIMAppProfile = task(import.meta.main, import.meta.path lanCidrs ] = await Promise.all([ // domestic - domains - getDomesticDomainsRulesetPromise().then(surgeRulesetToClashClassicalTextRuleset), + getDomesticAndDirectDomainsRulesetPromise() + .then(data => data.flatMap(surgeRulesetToClashClassicalTextRuleset)), getAppleCdnDomainsPromise().then(domains => domains.map(domain => `DOMAIN-SUFFIX,${domain}`)), getMicrosoftCdnRulesetPromise().then(surgeRulesetToClashClassicalTextRuleset), readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/apple_cn.conf')), diff --git a/Source/domainset/cdn.conf b/Source/domainset/cdn.conf index 1e9db7d3..290be7a6 100644 --- a/Source/domainset/cdn.conf +++ b/Source/domainset/cdn.conf @@ -2039,6 +2039,7 @@ net-fe-static-assets.network-controller.svc.ui.com images.svc.ui.com static.ui.com img.community.ui.com +cdn.pkg.svc.ui.com # SoftSonic .sftcdn.net # apponic diff --git a/Source/non_ip/direct.conf b/Source/non_ip/direct.conf index 1ddb6f2d..0a0da5af 100644 --- a/Source/non_ip/direct.conf +++ b/Source/non_ip/direct.conf @@ -1,9 +1,5 @@ # $ meta_title Sukka's Ruleset - Direct Rules -# $ meta_description This file contains domains and process that should not be proxied. - -# >> AdGuard -DOMAIN,injections.adguard.org -DOMAIN,local.adguard.org +# $ custom_build_script # >> Proxy PROCESS-NAME,v2ray diff --git a/Source/non_ip/direct.ts b/Source/non_ip/direct.ts new file mode 100644 index 00000000..4c31fb78 --- /dev/null +++ b/Source/non_ip/direct.ts @@ -0,0 +1,111 @@ +export const DIRECTS = { + ROUTER: { + dns: 'system', + domains: [ + // Aruba Router + 'instant.arubanetworks.com', + 'setmeup.arubanetworks.com', + // ASUS router + 'router.asus.com', + 'repeater.asus.com', + 'asusrouter.com', + // NetGear + 'routerlogin.net', + // Tenda WiFi + 'tendawifi.com', + // TP-Link Router + 'tplinkwifi.net', + 'tplogin.cn', + 'tplinkap.net', + 'tplinkeap.net', + 'tplinkmodem.net', + 'tplinkplclogin.net', + 'tplinkrepeater.net', + // Xiaomi Router + 'miwifi.com', + // ZTE CPE + 'zte.home', + // UniFi + 'ui.direct', + 'unifi', + 'amplifi.lan', + // Other Router + 'hiwifi.com', + 'huaweimobilewifi.com', + 'my.router', + 'phicomm.me', + 'router.ctc', + 'peiluyou.com', + 'airbox.home', + 'arcor.easybox', + 'aterm.me', + 'bthub.home', + 'bthomehub.home', + 'congstar.box', + 'connect.box', + 'console.gl-inet.com', + 'easy.box', + 'etxr', + 'fritz.box', + 'fritz.nas', + 'fritz.repeater', + 'giga.cube', + 'hi.link', + 'hitronhub.home', + 'homerouter.cpe', + 'myfritz.box', + 'mobile.hotspot', + 'ntt.setup', + 'pi.hole', + 'plex.direct', + 'app.plex.tv', + 'routerlogin.com', + 'samsung.router', + 'speedport.ip', + 'steamloopback.host', + 'web.setup', + 'web.setup.home' + ] + }, + SYSTEM: { + dns: 'system', + domains: [ + '_hotspot_.m2m', + 'hotspot.cslwifi.com', + // TailScale Magic DNS + 'ts.net', + // AdGuard + 'injections.adguard.org', + 'local.adguard.org' + ] + }, + LAN: { + dns: 'system', + domains: [ + 'lan', + 'localhost', + 'localdomain', + 'home.arpa', + // AS112 + '10.in-addr.arpa', + '16.172.in-addr.arpa', + '17.172.in-addr.arpa', + '18.172.in-addr.arpa', + '19.172.in-addr.arpa', + '20.172.in-addr.arpa', + '21.172.in-addr.arpa', + '22.172.in-addr.arpa', + '23.172.in-addr.arpa', + '24.172.in-addr.arpa', + '25.172.in-addr.arpa', + '26.172.in-addr.arpa', + '27.172.in-addr.arpa', + '28.172.in-addr.arpa', + '29.172.in-addr.arpa', + '30.172.in-addr.arpa', + '31.172.in-addr.arpa', + '168.192.in-addr.arpa', + '254.169.in-addr.arpa' + ] + } +} as const; diff --git a/Source/non_ip/domestic.ts b/Source/non_ip/domestic.ts index f4ece230..26c4f5bf 100644 --- a/Source/non_ip/domestic.ts +++ b/Source/non_ip/domestic.ts @@ -1,4 +1,3 @@ -// @ts-check export const DOMESTICS = { ALIBABA: { hosts: { @@ -307,97 +306,5 @@ export const DOMESTICS = { 'qh-cdn.com', 'baomitu.com' ] - }, - SYSTEM: { - dns: 'system', - domains: [ - '_hotspot_.m2m', - 'hotspot.cslwifi.com', - 'amplifi.lan', - '*.lan', - 'home.arpa', - // TailScale Magic DNS - 'ts.net', - // Aruba Router - 'instant.arubanetworks.com', - 'setmeup.arubanetworks.com', - // ASUS router - 'router.asus.com', - 'repeater.asus.com', - 'asusrouter.com', - // NetGear - 'routerlogin.net', - // Tenda WiFi - 'tendawifi.com', - // TP-Link Router - 'tplinkwifi.net', - 'tplogin.cn', - 'tplinkap.net', - 'tplinkeap.net', - 'tplinkmodem.net', - 'tplinkplclogin.net', - 'tplinkrepeater.net', - // Xiaomi Router - 'miwifi.com', - // ZTE CPE - 'zte.home', - // Other Router - 'ui.direct', - 'hiwifi.com', - 'huaweimobilewifi.com', - 'my.router', - 'phicomm.me', - 'router.ctc', - 'peiluyou.com', - 'airbox.home', - 'arcor.easybox', - 'aterm.me', - 'bthub.home', - 'bthomehub.home', - 'congstar.box', - 'connect.box', - 'console.gl-inet.com', - 'easy.box', - 'etxr', - 'fritz.box', - 'fritz.nas', - 'fritz.repeater', - 'giga.cube', - 'hi.link', - 'hitronhub.home', - 'homerouter.cpe', - 'myfritz.box', - 'mobile.hotspot', - 'ntt.setup', - 'pi.hole', - 'plex.direct', - 'app.plex.tv', - 'routerlogin.com', - 'samsung.router', - 'speedport.ip', - 'steamloopback.host', - 'web.setup', - 'web.setup.home', - // AS112 - '10.in-addr.arpa', - '16.172.in-addr.arpa', - '17.172.in-addr.arpa', - '18.172.in-addr.arpa', - '19.172.in-addr.arpa', - '20.172.in-addr.arpa', - '21.172.in-addr.arpa', - '22.172.in-addr.arpa', - '23.172.in-addr.arpa', - '24.172.in-addr.arpa', - '25.172.in-addr.arpa', - '26.172.in-addr.arpa', - '27.172.in-addr.arpa', - '28.172.in-addr.arpa', - '29.172.in-addr.arpa', - '30.172.in-addr.arpa', - '31.172.in-addr.arpa', - '168.192.in-addr.arpa', - '254.169.in-addr.arpa' - ] } } as const;