build-sgmodule-always-realip.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import path from 'path';
  2. import { task } from './trace';
  3. import { compareAndWriteFile } from './lib/create-file';
  4. import { DIRECTS, LANS } from '../Source/non_ip/direct';
  5. import * as yaml from 'yaml';
  6. const HOSTNAMES = [
  7. // Network Detection, Captive Portal
  8. 'msftncsi.com',
  9. 'msftconnecttest.com',
  10. '*.msftncsi.com',
  11. '*.msftconnecttest.com',
  12. 'network-test.debian.org',
  13. 'detectportal.firefox.com',
  14. 'resolver1.opendns.com',
  15. '*.ipv6.microsoft.com',
  16. // Handle SNAT conversation properly
  17. '*.srv.nintendo.net',
  18. '*.stun.playstation.net',
  19. 'xbox.*.microsoft.com',
  20. '*.xboxlive.com',
  21. 'turn.twilio.com',
  22. '*.turn.twilio.com',
  23. 'stun.twilio.com',
  24. '*.stun.twilio.com',
  25. 'stun.syncthing.net',
  26. 'stun.*',
  27. 'controlplane.tailscale.com',
  28. // NTP
  29. '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',
  30. // QQ Login
  31. 'localhost.ptlogin2.qq.com',
  32. 'localhost.sec.qq.com',
  33. 'localhost.work.weixin.qq.com',
  34. // Microsoft Auto Discovery
  35. 'PDC._msDCS.*.*',
  36. 'DC._msDCS.*.*',
  37. 'GC._msDCS.*.*',
  38. // Misc,
  39. '*.battlenet.com.cn',
  40. '*.blzstatic.cn',
  41. '*.battlenet.com'
  42. ];
  43. export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)(async (span) => {
  44. // Intranet, Router Setup, and mant more
  45. const dataset = ([Object.entries(DIRECTS), Object.entries(LANS)]);
  46. const surge = dataset.flatMap(data => data.flatMap(([, { domains }]) => domains.flatMap((domain) => [`*.${domain}`, domain])));
  47. const clash = dataset.flatMap(data => data.flatMap(([, { domains }]) => domains.map((domain) => `+.${domain}`)));
  48. return Promise.all([
  49. compareAndWriteFile(
  50. span,
  51. [
  52. '#!name=[Sukka] Always Real IP Plus',
  53. `#!desc=Last Updated: ${new Date().toISOString()}`,
  54. '',
  55. '[General]',
  56. `always-real-ip = %APPEND% ${HOSTNAMES.concat(surge).join(', ')}`
  57. ],
  58. path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule')
  59. ),
  60. Bun.write(
  61. path.resolve(import.meta.dir, '../Internal/clash_fake_ip_filter.yaml'),
  62. yaml.stringify(
  63. {
  64. dns: {
  65. 'fake-ip-filter': HOSTNAMES.concat(clash)
  66. }
  67. },
  68. { version: '1.1' }
  69. )
  70. )
  71. ]);
  72. });