Mittels FlowSpec RFC5575 ist es möglich, IP-Routen so zu manipulieren, dass diese als Trafficfilter analog zu Access Control Lists fungieren.
Wie die Manipulation von IP-Routen funktioniert, zeige ich euch anhand eines kleinen Beispiels.
In diesem Beispiel nutzen wir wieder Exabgp, da wir hier eine komplette Unterstützung aller bereits standardisierten FlowSpec-Features haben.
Nach Etablierung von BGP-Sessions zwischen dem oder den Router(n) an dem die Pakete eintreffen, die wir manipulieren wollen, können wir nun Flowspec Routen setzen.
Diese Routen landen nicht in der „normalen“ Routing Tabelle des Routers, sondern in einer für FlowSpec reservierten Tabelle.
In unserem Scenario kommt JunOS von Juniper Networks zum Einsatz, daher heißt die Routing Tabelle inetflow.0.
Ablauf einer simplen exabgp Konfiguration
group examplerouters {
local-as 65500;
peer-as 65500;
router-id 192.0.2.1;
local-address 192.0.2.1;
hold-time 10;
flow {
route example-1 {
match {
source 198.51.100.0/24;
destination 203.0.113.0/30;
destination-port =80;
protocol tcp;
}
then {
discard;
}
}
}
neighbor 192.0.2.2 {
description „examplerouter01“;
graceful-restart 5;
family {
inet4 flow;
}
}
neighbor 192.0.2.3 {
description „examplerouter02“;
graceful-restart 5;
family {
inet4 flow;
}
}
process tcp-server{
run /etc/exabgp/tcp-server;
}
Die Gruppe „examplerouters“ beinhaltet zwei Router (examplerouter 01/02) und tauscht Flow Routen untereinander aus (family inet4 flow).
In dem durch Klammern inkludierten Teil von „flow“ setzen wir nun unseren Filter example-1. Dieser matched auf verschiedene Parameter:
Wenn Quell IP Adressen von 198.51.100.0-255 auf die Zieladressen von 203.113.0-3 via TCP auf Port 80 zugreifen möchten, dann soll der Router dieses Paket verwerfen.
Als Ergebnis hat man auf dem Router dann folgenden Eintrag in der Routingtabelle inetflow.0:
203.0.113.0/30,198.51.100.0/24,proto=6,dstport=80/term:2 (1 entry, 1 announced)
*BGP Preference: 170/-101
Next hop type: Fictitious
Address: 0x8e6f244
Next-hop reference count: 2
State: <Active Int Ext>
Local AS: 65500 Peer AS: 65550
Age: 3d 8:06:19
Task: BGP_65500.192.0.2.1+47940
Announcement bits (1): 0-Flow
AS path: I
AS path: Recorded
Communities: traffic-rate:0:0
Accepted
Localpref: 100
Router ID: 192.0.2.1
Um nun während eines Angriffes zu verifizieren, dass der Filter auch greift schauen wir uns die vom Router geführte Statistik dazu an:
show firewall filter __flowspec_default_inet__
Filter: __flowspec_default_inet__
Counters:
Name Bytes Packets
203.0.113.0/30,198.51.100.0/24,proto=6,dstport=80 60673 1216
Wir haben in diesem Beispiel bereits 1.216 Pakete mit 60.673 Bytes gefiltert.
Dasselbe gilt für unterschiedliche ICMP Pakettypen, Pakete mit bestimmten DSCP Feldern etc…
Durch die im Artikel „Anycast Leichtgemacht“ genannten Checkscripte kann man selbstverständlich auch automatisiert auf Angriffe reagieren. Natürlich nur, wenn man so einen Automatismus möchte.
Hierzu muss ein entsprechender Sensor mitbekommen, dass ein Angriff läuft. Dieser Sensor misst die Art des Angriffs und von welchen Quell-IPs auf welche Ziel-IPs der Angriff stattfindet. Mit diesen Information kann man nun der API von ExaBGP mitteilen, entsprechende FlowSpec Rules zu senden.