build-reject-ip-list.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // @ts-check
  2. import path from 'path';
  3. import { createRuleset } from './lib/create-file';
  4. import { fetchRemoteTextByLine, readFileIntoProcessedArray } from './lib/fetch-text-by-line';
  5. import { task } from './trace';
  6. import { SHARED_DESCRIPTION } from './lib/constants';
  7. import { isProbablyIpv4, isProbablyIpv6 } from './lib/is-fast-ip';
  8. import { TTL, deserializeArray, fsFetchCache, serializeArray } from './lib/cache-filesystem';
  9. import { fetchAssets } from './lib/fetch-assets';
  10. import { processLine } from './lib/process-line';
  11. const BOGUS_NXDOMAIN_URL = 'https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/bogus-nxdomain.china.conf';
  12. const getBogusNxDomainIPsPromise = fsFetchCache.apply(
  13. BOGUS_NXDOMAIN_URL,
  14. async () => {
  15. const result: string[] = [];
  16. for await (const line of await fetchRemoteTextByLine(BOGUS_NXDOMAIN_URL)) {
  17. if (line.startsWith('bogus-nxdomain=')) {
  18. const ip = line.slice(15).trim();
  19. if (isProbablyIpv4(ip)) {
  20. result.push(`IP-CIDR,${ip}/32,no-resolve`);
  21. } else if (isProbablyIpv6(ip)) {
  22. result.push(`IP-CIDR6,${ip}/128,no-resolve`);
  23. }
  24. }
  25. }
  26. return result;
  27. },
  28. {
  29. ttl: TTL.ONE_WEEK(),
  30. serializer: serializeArray,
  31. deserializer: deserializeArray
  32. }
  33. );
  34. const BOTNET_FILTER_URL = 'https://curbengh.github.io/botnet-filter/botnet-filter-dnscrypt-blocked-ips.txt';
  35. const BOTNET_FILTER_MIRROR_URL = [
  36. 'https://curbengh.github.io/malware-filter/botnet-filter-dnscrypt-blocked-ips.txt',
  37. 'https://malware-filter.gitlab.io/malware-filter/botnet-filter-dnscrypt-blocked-ips.txt',
  38. 'https://malware-filter.pages.dev/botnet-filter-dnscrypt-blocked-ips.txt'
  39. ];
  40. const getBotNetFilterIPsPromise = fsFetchCache.apply(
  41. BOTNET_FILTER_URL,
  42. async () => {
  43. const text = await fetchAssets(BOTNET_FILTER_URL, BOTNET_FILTER_MIRROR_URL);
  44. return text.split('\n').reduce<string[]>((acc, cur) => {
  45. const ip = processLine(cur);
  46. if (ip) {
  47. if (isProbablyIpv4(ip)) {
  48. acc.push(`IP-CIDR,${ip}/32,no-resolve`);
  49. } else if (isProbablyIpv6(ip)) {
  50. acc.push(`IP-CIDR6,${ip}/128,no-resolve`);
  51. }
  52. }
  53. return acc;
  54. }, []);
  55. },
  56. {
  57. ttl: TTL.TWLVE_HOURS(),
  58. serializer: serializeArray,
  59. deserializer: deserializeArray
  60. }
  61. );
  62. export const buildRejectIPList = task(import.meta.path, async (span) => {
  63. const result: string[] = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/ip/reject.conf'));
  64. const bogusNxDomainIPs = await span.traceChildPromise('get bogus nxdomain ips', getBogusNxDomainIPsPromise);
  65. const botNetIPs = await span.traceChildPromise('get botnet ips', getBotNetFilterIPsPromise);
  66. result.push(...bogusNxDomainIPs, ...botNetIPs);
  67. const description = [
  68. ...SHARED_DESCRIPTION,
  69. '',
  70. 'This file contains known addresses that are hijacking NXDOMAIN results returned by DNS servers, and botnet controller IPs.',
  71. '',
  72. 'Data from:',
  73. ' - https://github.com/felixonmars/dnsmasq-china-list',
  74. ' - https://github.com/curbengh/botnet-filter'
  75. ];
  76. return createRuleset(
  77. span,
  78. 'Sukka\'s Ruleset - Anti Bogus Domain',
  79. description,
  80. new Date(),
  81. result,
  82. 'ruleset',
  83. path.resolve(import.meta.dir, '../List/ip/reject.conf'),
  84. path.resolve(import.meta.dir, '../Clash/ip/reject.txt')
  85. );
  86. });
  87. if (import.meta.main) {
  88. buildRejectIPList();
  89. }