build-reject-ip-list.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // @ts-check
  2. import path from 'node:path';
  3. import { readFileIntoProcessedArray } from './lib/fetch-text-by-line';
  4. import { task } from './trace';
  5. import { SHARED_DESCRIPTION } from './constants/description';
  6. import { compareAndWriteFile } from './lib/create-file';
  7. import { OUTPUT_INTERNAL_DIR, SOURCE_DIR } from './constants/dir';
  8. import { fetchAssets } from './lib/fetch-assets';
  9. import { fastIpVersion } from './lib/misc';
  10. import { AUGUST_ASN, HUIZE_ASN } from '../Source/ip/badboy_asn';
  11. import { RulesetOutput } from './lib/rules/ruleset';
  12. const getBogusNxDomainIPsPromise: Promise<[ipv4: string[], ipv6: string[]]> = fetchAssets(
  13. 'https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list@master/bogus-nxdomain.china.conf',
  14. ['https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/bogus-nxdomain.china.conf'],
  15. true
  16. ).then((arr) => {
  17. const ipv4: string[] = [];
  18. const ipv6: string[] = [];
  19. for (let i = 0, len = arr.length; i < len; i++) {
  20. const line = arr[i];
  21. if (line.startsWith('bogus-nxdomain=')) {
  22. const ip = line.slice(15).trim();
  23. const v = fastIpVersion(ip);
  24. if (v === 4) {
  25. ipv4.push(ip);
  26. } else if (v === 6) {
  27. ipv6.push(ip);
  28. }
  29. }
  30. }
  31. return [ipv4, ipv6] as const;
  32. });
  33. const BOTNET_FILTER_URL = 'https://malware-filter.pages.dev/botnet-filter-dnscrypt-blocked-ips.txt';
  34. const BOTNET_FILTER_MIRROR_URL = [
  35. 'https://botnet-filter.pages.dev/botnet-filter-dnscrypt-blocked-ips.txt',
  36. 'https://malware-filter.gitlab.io/malware-filter/botnet-filter-dnscrypt-blocked-ips.txt',
  37. 'https://malware-filter.gitlab.io/botnet-filter/botnet-filter-dnscrypt-blocked-ips.txt'
  38. // 'https://curbengh.github.io/botnet-filter/botnet-filter-dnscrypt-blocked-ips.txt',
  39. // https://curbengh.github.io/malware-filter/botnet-filter-dnscrypt-blocked-ips.txt
  40. ];
  41. const getBotNetFilterIPsPromise: Promise<[ipv4: string[], ipv6: string[]]> = fetchAssets(BOTNET_FILTER_URL, BOTNET_FILTER_MIRROR_URL, true, true).then(arr => arr.reduce<[ipv4: string[], ipv6: string[]]>((acc, ip) => {
  42. const v = fastIpVersion(ip);
  43. if (v === 4) {
  44. acc[0].push(ip);
  45. } else if (v === 6) {
  46. acc[1].push(ip);
  47. }
  48. return acc;
  49. }, [[], []]));
  50. const readLocalRejectIpListPromise = readFileIntoProcessedArray(path.resolve(SOURCE_DIR, 'ip/reject.conf'));
  51. export const buildRejectIPList = task(require.main === module, __filename)(async (span) => {
  52. const [bogusNxDomainIPs, botNetIPs] = await Promise.all([
  53. span.traceChildPromise('get bogus nxdomain ips', getBogusNxDomainIPsPromise),
  54. span.traceChildPromise('get botnet ips', getBotNetFilterIPsPromise)
  55. ]);
  56. return Promise.all([
  57. new RulesetOutput(span, 'reject', 'ip')
  58. .withTitle('Sukka\'s Ruleset - Anti Bogus Domain')
  59. .withDescription([
  60. ...SHARED_DESCRIPTION,
  61. '',
  62. 'This file contains known addresses that are hijacking NXDOMAIN results returned by DNS servers, and botnet controller IPs.',
  63. '',
  64. 'Data from:',
  65. ' - https://github.com/felixonmars/dnsmasq-china-list',
  66. ' - https://github.com/curbengh/botnet-filter'
  67. ])
  68. .addFromRuleset(readLocalRejectIpListPromise)
  69. .bulkAddCIDR4NoResolve(bogusNxDomainIPs[0])
  70. .bulkAddCIDR6NoResolve(bogusNxDomainIPs[1])
  71. .bulkAddCIDR4NoResolve(botNetIPs[0])
  72. .bulkAddCIDR6NoResolve(botNetIPs[1])
  73. .bulkAddIPASN(AUGUST_ASN)
  74. .bulkAddIPASN(HUIZE_ASN)
  75. .write(),
  76. compareAndWriteFile(span, [AUGUST_ASN.join(' ')], path.join(OUTPUT_INTERNAL_DIR, 'august_asn.txt')),
  77. compareAndWriteFile(span, [HUIZE_ASN.join(' ')], path.join(OUTPUT_INTERNAL_DIR, 'huize_asn.txt'))
  78. ]);
  79. });