diff --git a/config.js b/config.js index 0b1ad41..bfd57e9 100644 --- a/config.js +++ b/config.js @@ -1,17 +1,13 @@ import MonitorHijack from "./monitors/monitorHijack"; +import yaml from "js-yaml"; +import fs from "fs"; -module.exports = { - bufferSize: 10, - wsParams: { - moreSpecific: false, - type: "UPDATE", - // host: "rrc21", - socketOptions: { - includeRaw: false - } - }, +const configFile = yaml.safeLoad(fs.readFileSync('./config.yml', 'utf8')); +const config = { monitors: [ MonitorHijack ] -}; \ No newline at end of file +}; + +module.exports = Object.assign(config, configFile); \ No newline at end of file diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..45a3127 --- /dev/null +++ b/config.yml @@ -0,0 +1,44 @@ +# Please, rename this file to config.yml + +testMode: true + +bufferSize: 10, + +wsParams: + moreSpecific: true + type: "UPDATE" + host: "rrc21" + socketOptions: + includeRaw: false + +# The streaming services used to have real-time data +# This is an array (use new lines and dashes!) +websocketDataService: wss://ris-live.ripe.net/v1/ws/ + +senderNotificationsEmail: me@test.net + +notifiedEmails: + - email1@test.net + - email2@test.net + +# The file containing the monitored prefixes. Please see monitored_prefixes_test.yml for an example +# This is an array (use new lines and dashes!) +monitoredPrefixesFiles: + - monitored_prefixes.base.yml + +# After how many announcements from different peers we trigger an alter? +numberPeersBeforeHijackAlert: 0 + +# After how many withdrawals from different peers we trigger an alter? +numberPeersBeforeLowVisibilityAlert: 0 + +# 10 seconds is the default +repeatAlertAfterSeconds: 1 + +# delete or 0 for never +repeatStatusHeartbeatAfterSeconds: 400 + + +# stop sending the same alert after x seconds. Default 600 +resetAfterSeconds: 4 + diff --git a/consumer.js b/consumer.js index 04443f2..5902738 100644 --- a/consumer.js +++ b/consumer.js @@ -6,10 +6,9 @@ export default class Consumer { this.monitors = config.monitors.map(monitor => new monitor()); }; - dispatch = (message) => { - console.log("ere"); + dispatch = (data) => { try { - message = JSON.parse(message); + const message = JSON.parse(data); switch (message.type) { case "ris_message": this.handleUpdate(message) } @@ -18,10 +17,48 @@ export default class Consumer { } }; - handleUpdate = (message) => { + handleUpdate = (data) => { + const messages = this.transform(data); for (let monitor of this.monitors){ - monitor.monitor(message); + for (const message of messages){ + monitor.monitor(message); + } } + }; + + transform = (message) => { + message = message.data; + const components = []; + const announcements = message["announcements"] || []; + const withdrawals = message["withdrawals"] || []; + const peer = message["peer"]; + const path = message["path"]; + + for (let announcement of announcements){ + const nextHop = announcement["next_hop"]; + const prefixes = announcement["prefixes"] || []; + + for (let prefix of prefixes){ + components.push({ + type: "announcement", + prefix, + peer, + path, + nextHop + }) + } + } + + for (let prefix of withdrawals){ + components.push({ + type: "withdrawal", + prefix, + peer + + }) + } + + return components; } } diff --git a/index.js b/index.js index 289efe4..b2a6ff5 100644 --- a/index.js +++ b/index.js @@ -2,33 +2,46 @@ import config from "./config"; import cluster from "cluster"; import WebSocket from "ws"; +import sleep from "sleep"; import Consumer from "./consumer"; - if (cluster.isMaster) { - let bufferSize = config.bufferSize; const worker = cluster.fork(); - const ws = new WebSocket("wss://ris-live.ripe.net/v1/ws/"); - ws.on('message', (message) => { - worker.send(message); - }); + if (config.testMode){ + const message = JSON.stringify({ + data: { + withdrawals: ["123.0.0.1/23"], + peer: "124.0.0.2" + }, + type: "ris_message" + }); - ws.on('open', () => { - ws.send(JSON.stringify({ - type: "ris_subscribe", - data: config.wsParams - })); - }); + while (true){ + worker.send(message); + sleep.sleep(1); + } + } else { - ws.on('close', function close() { - console.log('Disconnected'); - }); + const ws = new WebSocket("wss://ris-live.ripe.net/v1/ws/"); + ws.on('message', (message) => { + worker.send(message); + }); + ws.on('open', () => { + ws.send(JSON.stringify({ + type: "ris_subscribe", + data: config.wsParams + })); + }); + ws.on('close', function close() { + console.log('Disconnected'); + }); + } } else { new Consumer() diff --git a/monitors/monitorHijack.js b/monitors/monitorHijack.js index 3015683..24f4ef9 100644 --- a/monitors/monitorHijack.js +++ b/monitors/monitorHijack.js @@ -11,4 +11,6 @@ export default class MonitorHijack extends Monitor { }; + + } \ No newline at end of file diff --git a/package.json b/package.json index 7084988..b54a2ed 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-preset-env": "^1.7.0", "event-stream": "^4.0.1", + "js-yaml": "^3.13.1", "sleep": "^6.1.0", "websocket-stream": "^5.5.0", "ws": "^7.0.0", diff --git a/prefixes.yml b/prefixes.yml new file mode 100644 index 0000000..60db255 --- /dev/null +++ b/prefixes.yml @@ -0,0 +1,677 @@ +27.114.0.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +58.88.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +60.32.0.0/12: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.112.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.113.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.118.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.119.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.120.144.0/20: + description: subas 64600 + asn: 2914 + +61.126.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.199.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.200.80.0/20: + description: subas 64600 + asn: 2914 + +61.207.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.208.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +61.213.144.0/20: + description: subas 64600 + asn: 2914 + +61.213.160.0/19: + description: subas 64600 + asn: 2914 + +61.214.0.0/16: + description: OCN + asn: 4713 + +80.74.8.0/22: + description: subas 65316 + asn: 2914 + +83.217.224.0/23: + description: subas 65316 + asn: 2914 + +91.212.152.0/24: + description: subas 65310 + asn: 2914 + +114.144.0.0/12: + description: OCN + asn: 4713 + ignore_morespecifics: False + +114.160.0.0/11: + description: OCN + asn: 4713 + ignore_morespecifics: False + +117.103.176.0/20: + description: subas 64600 + asn: 2914 + +117.104.64.0/18: + description: subas 64600 + asn: 2914 + +117.104.128.0/19: + description: subas 64600 + asn: 2914 + +118.0.0.0/12: + description: OCN + asn: 4713 + ignore_morespecifics: False + +118.16.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +120.29.144.0/21: + description: subas 64600 + asn: 2914 + +120.88.48.0/21: + description: subas 64600 + asn: 2914 + +121.112.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +122.1.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +122.16.0.0/12: + description: OCN + asn: 4713 + ignore_morespecifics: False + +123.216.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +123.224.0.0/14: + description: OCN + asn: 4713 + ignore_morespecifics: False + +124.40.0.0/18: + description: subas 64600 + asn: 2914 + ignore_morespecifics: False + +124.40.32.0/19: + description: iboss + asn: 137922 + ignore_morespecifics: True + +124.40.56.0/24: + description: capitalonline + asn: 63199 + +124.40.57.0/24: + description: capitalonline + asn: 63199 + +124.84.0.0/14: + description: OCN + asn: 4713 + ignore_morespecifics: False + +124.96.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +125.170.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +125.172.0.0/14: + description: OCN + asn: 4713 + ignore_morespecifics: False + +125.200.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +130.94.19.0/24: + description: subas 65061 + asn: 2914 + +153.128.0.0/11: + description: OCN + asn: 4713 + +153.160.0.0/12: + description: OCN + asn: 4713 + +153.176.0.0/12: + description: OCN + asn: 4713 + ignore_morespecifics: False + +153.192.0.0/11: + description: OCN + asn: 4713 + ignore_morespecifics: False + +153.224.0.0/12: + description: OCN + asn: 4713 + ignore_morespecifics: False + +153.240.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +153.248.0.0/14: + description: OCN + asn: 4713 + ignore_morespecifics: False + +153.252.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +153.254.0.0/15: + description: subas 64600 + asn: 2914 + +180.0.0.0/10: + description: OCN + asn: 4713 + ignore_morespecifics: False + +180.12.169.0/24: + description: OCN + asn: 4713 + ignore_morespecifics: False + +180.12.168.0/24: + description: OCN + asn: 4713 + ignore_morespecifics: False + +180.12.170.0/24: + description: OCN + asn: 4713 + ignore_morespecifics: False + +180.12.171.0/24: + description: OCN + asn: 4713 + ignore_morespecifics: False + +180.12.172.0/24: + description: OCN + asn: 4713 + ignore_morespecifics: False + +180.12.173.0/24: + description: OCN + asn: 4713 + ignore_morespecifics: False + +180.210.232.0/24: + description: subas 64600 + asn: 2914 + +198.252.194.0/23: + description: subas 65017 + asn: 2914 + +199.164.210.0/24: + description: subas 65052 + asn: 2914 + +202.47.16.0/20: + description: subas 64600 + asn: 2914 + +202.234.192.0/18: + description: OCN + asn: 4713 + ignore_morespecifics: False + +203.105.64.0/19: + description: subas 64600 + asn: 2914 + +203.139.160.0/19: + description: OCN + asn: 4713 + ignore_morespecifics: False + +203.140.96.0/20: + description: OCN + asn: 4713 + ignore_morespecifics: False + +203.140.112.0/20: + description: OCN + asn: 4713 + ignore_morespecifics: False + +203.205.112.0/20: + description: subas 64600 + asn: 2914 + +206.197.81.0/24: + description: subas 65061 + asn: 2914 + +207.158.192.0/18: + description: formerly subas 65043 + asn: 2914 + +207.201.128.0/18: + description: formerly subas 65043 + asn: 2914 + +208.55.0.0/16: + description: formerly subas 65043 + asn: 2914 + +209.41.0.0/18: + description: subas 65062 + asn: 2914 + +209.130.0.0/17: + description: formerly subas 65043 + asn: 2914 + +209.207.128.0/17: + description: subas 65061 + asn: 2914 + +209.238.0.0/16: + description: subas 65062 + asn: 2914 + +210.132.0.0/18: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.145.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.154.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.160.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.161.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.162.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.163.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.164.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.170.64.0/18: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.175.160.0/19: + description: subas 64600 + asn: 2914 + +210.190.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.225.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.226.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.232.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.248.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +210.254.128.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +211.0.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +211.6.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +211.11.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +211.16.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +211.122.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +211.129.0.0/16: + description: OCN + asn: 4713 + +211.130.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +211.130.96.0/19: + description: subas 64600 + asn: 2914 + +216.167.0.0/17: + description: subas 65061 + asn: 2914 + +218.43.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +218.44.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +218.47.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +218.224.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +218.230.128.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +219.96.128.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +219.114.0.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +219.160.0.0/14: + description: OCN + asn: 4713 + ignore_morespecifics: False + +219.164.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +219.166.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.96.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.98.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.99.0.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.99.128.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.104.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.106.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.108.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.110.0.0/16: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.111.0.0/19: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.111.32.0/20: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.111.48.0/20: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.111.64.0/18: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.111.128.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +220.220.0.0/15: + description: OCN + asn: 4713 + ignore_morespecifics: False + +221.113.128.0/17: + description: OCN + asn: 4713 + ignore_morespecifics: False + +221.184.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +222.144.0.0/13: + description: OCN + asn: 4713 + ignore_morespecifics: False + +223.216.0.0/14: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +114.163.192.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +124.85.96.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.0.248.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.13.216.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.22.248.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.3.96.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.39.216.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.50.120.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.57.120.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +180.57.128.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +219.162.32.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +220.96.8.0/21: + description: OCN prefix + asn: 4713 + ignore_morespecifics: False + +124.40.52.128/26: + description: Solid Trading / Crossivity + asn: 50601 + ignore_morespecifics: False diff --git a/yarn.lock b/yarn.lock index 7e0997a..d665740 100644 --- a/yarn.lock +++ b/yarn.lock @@ -73,6 +73,13 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -1089,6 +1096,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1713,6 +1725,14 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -2520,6 +2540,11 @@ split@^1.0.1: dependencies: through "2" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"