Begränsa våra molnleverantörer?!?!

Jaha, dags att rensa ännu mer trafik mot mina tjänster, trafik som inte har där att göra då den enbart består av portskanningar, försök att skicka på mig trafik som är skräp och/eller rent av hackning och DDoS-attacker. Bara skräp alltså! Eller mög som vi säger här i Skåne 😉

Vissa leverantörer gör det jätteenkelt med fina listor av IP-nät man använder, de jag hittills skapat filter för har informationen i Json-format men vissa gör det riktigt jobbigt genom att servera en över 27000 (tjugosjutusen) IP-nät och enskilda IP-adresser i en salig röra.

Istället för att försöka skripta allt direkt i den lite skriptbegränsade MikroTik-routern så delade jag upp det i att köra skapandet av, för MikroTik RouterOS, importerbara filer i en Raspberry Pi5:a för att sedan kopiera över dessa till Mikrotik:n vid förutbestämda tider och sedan i RouterOS köra importskript vid samma tid +10 minuter …

Det färdigknådade filinnehåll jag är ute efter är egentligen enkelt, i princip samma sak som om jag tagit rad för rad och skrivit/klistrat in informationen manuellt i ett terminalfönster i MikroTik RouterOS.

/ip firewall address-list add list=AZURE address=204.152.18.0/31
/ip firewall address-list add list=AZURE address=204.152.18.8/29
/ip firewall address-list add list=AZURE address=204.152.18.32/27
/ip firewall address-list add list=AZURE address=204.152.18.64/26
/ip firewall address-list add list=AZURE address=204.152.19.0/24
/ip firewall address-list add list=AZURE address=204.231.197.0/24
/ip firewall address-list add list=AZURE address=207.46.13.0/24
/ip firewall address-list add list=AZURE address=207.46.50.129/32
/ip firewall address-list add list=AZURE address=207.46.50.130/31
/ip firewall address-list add list=AZURE address=207.46.50.138/31
/ip firewall address-list add list=AZURE address=207.46.50.140/31
/ip firewall address-list add list=AZURE address=207.46.59.64/27
/ip firewall address-list add list=AZURE address=207.46.63.64/27
/ip firewall address-list add list=AZURE address=207.46.63.128/25
/ip firewall address-list add list=AZURE address=207.46.72.0/27

Låt oss börja med en av ”the good guys”.

Amazon Web Services, AWS

AWS tillhandahåller en officiell länk för nedladdning av de IP-nät som AWS använder för sina tjänster, allt i Json-format.

Detta är dock den största lista av de leverantörer jag arbetat med, den råa Jsonfilen är på 2.3 MByte …

I Pi5:an ser skriptet ut såhär.

rm aws.rsc

curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[].ip_prefix' | sort -u | sed 's/^/\/ip firewall address-list add list=AWS address=/' > aws.rsc

sshpass -f psw.txt ssh login@<min routers IP> "rm -f /aws.rsc"

sshpass -f psw.txt scp aws.rsc login@<min routers IP>:/

Jag hämtar alltså Jsonfilen, kör en Json query med hjälp av den lilla applikationen ”jq” och med denna hämtar jag ut de IP-prefix som finns i filen, tar dessa och adderar ”/ip firewall address-list add list=AWS address=” före respektive prefix för att sedan slutligen addera raden till aws.rsc i den mapp där skriptet exekveras.

Då aws.rsc är skapad loggar jag in min MikroTik, raderar dess lokala aws.rsc (om den finns) och kopierar dit den nyskapade filen.

I MikroTik RouterOS går jag sedan in under /System/Scripts och lägger till ett skript som göt följande.

/ip firewall address-list remove [find list="AWS"]
/import file-name=aws.rsc

Därefter är det dags att schemalägga körningen, det gör man under /System/Scheduler och kör följande vid önskad tidpunkt.

/system script run import_AWS

Efter att man gjort alla punkter första gången adderar man en regel i sin brandvägg som använder käll-IP-listan AWS, hur och var man vill blockera trafik är ju upp till dina behov. Jag valde att lägga min ”DROP” under Raw och Prerouting där jag tittar efter all inkommande trafik mot 80/tcp och 443/tcp vilket är vad jag behöver.

Detta är allt man behöver för att blockera trafik från Amazon Web Services 😉

Digital Ocean och Google

För dessa två leverantörer ser upplägget i princip likadant ut med följande skriptfiler i Pi5:an, notera att det såklart är andra filnamn som används ’,-)

Digital Ocean

rm digitalocean.rsc

curl -s "https://stat.ripe.net/data/announced-prefixes/data.json?resource=AS14061" | jq -r '.data.prefixes[].prefix' | sort -u | sed 's/^/\/ip firewall address-list add list=DIGIOCEA address=/' > digitalocean.rsc

sshpass -f psw.txt ssh login@<min routers IP> "rm -f /digitalocean.rsc"

sshpass -f psw.txt scp digitalocean.rsc login@<min routers IP>:/

Google

rm google.rsc

curl -s https://www.gstatic.com/ipranges/cloud.json | jq -r '.prefixes[] | select(.ipv4Prefix) | .ipv4Prefix' | sort -u | sed 's/^/\/ip firewall address-list add list=GOOGLE address=/' > google.rsc

sshpass -f psw.txt ssh login@<min routers IP> "rm -f /digitalocean.rsc"

sshpass -f psw.txt scp digitalocean.rsc login@<min routers IP>:/

Snyggt, enkelt och prydligt för dessa tre leverantörer, sedan kommer vi till …

Microsoft Azure

Microsoft har verkligen valt att inte göra detta enkelt, och jag är i skrivande stund inte helt säker på att länken till den Json-formaterade filen är densamma från vecka till vecka, kommer att uppdatera denna artikel så snart jag vet … eller tror att hag vet i alla fall …

När jag laddade ned den Json-formaterade filen fick jag hicka, över 4 MB stor innehållande över 27000 /tjugosjutusen) separata IP-nät och ofta också enskilda IP-adresser, vilken röra.

  • https://download.microsoft.com/download/7/1/D/71D86715-5596-4529-9B13-DA13A5DE5B63/ServiceTags_Public_20250210.json

För att kunna hantera detta på ett vettigt sätt, det fungerar såklart även med denna stora fil men istället så aggregerar jag ihop alla små IP-nät och enskilda IP-adresser till en betydligt mycket mindre fil.

aggregate_azure.py

#!/usr/bin/env python3
import json
from netaddr import IPSet, IPNetwork

with open("azure.json") as f:
    data = json.load(f)

# Läs in prefix som IPNetwork-objekt och sortera dem
prefixes = []

for v in data["values"]:
    for p in v["properties"]["addressPrefixes"]:
        if "." in p:
            prefixes.append(IPNetwork(p))

prefixes.sort()  # KRITISKT: utan detta fastnar IPSet

ips = IPSet(prefixes)

for cidr in ips.iter_cidrs():
    print(cidr)

Skriptet aggregate_azure.py använder jag sedan i skriptet jag hanterar filerna med.

rm azure.rsc

AZURE_URL="https://download.microsoft.com/download/7/1/D/71D86715-5596-4529-9B13-DA13A5DE5B63/ServiceTags_Public_20250210.json"

curl -s "$AZURE_URL" -o azure.json

jq -r '.values[].properties.addressPrefixes[] | select(test("\\."))' azure.json | sort -u | python3 aggregate_azure.py | sed 's/^/\/ip firewall address-list add list=AZURE address=/' > azure.rsc

sshpass -f psw.txt ssh anderstikadmin@192.168.101.1 "rm -f /azure.rsc"

sshpass -f psw.txt scp azure.rsc anderstikadmin@192.168.101.1:/

rm azure.json

… och vips så krympte filen från 4 MByte till drygt 100 kByte och ett par tusen rader. Tjoho …

… och så var det möjligt att få stopp på allt grottande och grävande från användare hos dessa fyra stora tjänsteleverantörer, just nu på IP-port 80/tcp och 443/tcp.

Ha det gott!
//Anders

Nordh Tech
Privacy Overview

GDPR och kakor (cookies)

Den 25 maj 2018 började dataskyddsförordningen (GDPR) att gälla i Sverige och övriga EU.

Det innebär bland annat att inget företag eller organisation får spara personuppgifter som inte behövs för att leverera det du bett om och att du har rätt att ”bli glömd” så snart du ber om det.

För din kontakt med Nordh.Tech innebär det inte så mycket.

Vi sparar en kaka (cookie) vilket innebär en liten textfil med information om vad du gjort när du surfar hos oss, vi gör det för att kunna få statistik rörande vad du gjort när du besöker oss och för att vi skall kunna ge dig nytt innehåll och inte till exempel behöva fråga dig var gång du besöker oss om du godkänner våra GDPR-villkor eller att det sparas en ”kaka” på din dator.

Vi sparar också din epostadress för att kunna skicka dig vårt nyhetsbrev eller hantera din inloggning i vårt forum, om du bett om det vill säga. Då du prenumererar på nyhetsbrevet eller begär inloggning till vårt forum anger du också ditt förnamn eller inloggningsnamn men här kan du ange vilket namn som helst. Vissa anger även efternamn men dessa raderas så att endast förnamnet kommer att användas i hälsningsfrasen i varje nyhetsbrev.

Hoppas detta gör att du kan känna dig trygg med ditt besök hos mig här på Internet.