
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/27Lå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.rscDä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_AWSEfter 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>:/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
