Automatiser la protection d'un réseau du déni de service avec RTBH, NetFlow, goBGP et FastNetMon
Sommaire
Dans cet article, je vous propose de découvrir Remotely-Triggered Black Hole (RTBH), une technologie reposant sur le protocle de routage Border Gateway Protocol (BGP) et visant à fournir une capacité de bloquer un trafic réseau indésirable afin de se prémunir d’attaques par déni de service distribué ou Distributed Denial of Service (DDoS). L’objectif est de vous partager un exemple d’utilisation de RTBH de manière automatisée dans un environnement constitué de routeurs Cisco et de la solution de sécurité FastNetMon appuyée par le logiciel GoBGP et le protocole NetFlow.
Introduction
Dans les réseaux informatiques, il existe de nombreuses technologies pour permettre des télécommunications rapidement et efficacement. Le routage, visant à déterminer le meilleur chemin qu’un paquet de données doit prendre depuis une source pour arriver à sa destination, en est un des éléménts clés. Malheureusement, il permet aussi aux attaquants de propager des attaques puissantes pour nuire notamment à la disponibilité des données et des services. En revanche, des technologies permettent également de détecter et propager des réponses de la même manière afin de bloquer les attaques au plus proche de leurs émetteurs.
D’abord, nous verrons ce que sont les attaques par dénis de services, qui sont parmis les plus courantes. Puis, nous verrons ce qu’est le protocole de routage BGP et ce qu’est la technologie RTBH qui s’appuie sur BGP et permet de bloquer les dénis de service sur le réseau. Enfin, nous démontrerons dans un environnement de test comment mettre en place RTBH en s’aidant des outils FastNetMon, GoBGP et du protocole NetFlow.
Attaques de déni de service
Afin d’atteindre à la disponibilité des données sur un système d’information, les attaques de déni de service ou Denial of Service (DoS) visent à rendre inopérant un hôte ou un réseau. Pour ce faire, elles peuvent viser directement la cible en lui envoyant un ou plusieurs paquets de données malveillants visant à exploiter une vulnérabilité sur le système cible ou bien le surcharger de requêtes afin d’épuiser ses ressources. Cette surcharge peut aussi se propager sur les liens du réseau d’un opérateur ou de l’organisation ciblée. Afin de rendre l’attaque encore plus efficace, plusieurs sources émettrices de paquets malveillants sont souvent utilisées et on dit alors que le déni de service est distribué ou Distributed DoS (DDoS). Il convient alors pour les organisations de trouver des moyens efficaces afin de détecter et stopper ces attaques dès leur entrée dans l’infrastructure des réseaux.
BGP
Border Gateway Protocol (BGP) est un protocole de routage dynamique consistant à échanger des informations de routage entre ou au sein de systèmes autonomes ou Autonomous Systems (AS : entité administrative contrôlant des préfixes de routage) sur Internet. Dans le cas où BGP est utilisé au sein d’un AS, on parle de Interior BGP (IBGP), et dans le cas où il est utilisé entre AS, on parle d’Exterior BGP (EBGP). BGP est un des protocoles les plus répandus et est un des piliers d’Internet.
BGP permet de déterminer des décisions de routage en établissant des sessions entre voisins / pairs ou neighbors / peers via le protocole de transport Transmission Control Protocol (TCP). Dans ces sessions sont échangées des annonces de routages (plus précisement des préfixes de réseaux et leurs caractéristiques) comprenant les passerelles ou next hop de chaque route. A chaque route est associée un ensemble d’attributs (poids ou weight, valeur de préférence locale ou local preference, si le réseau est d’origine locale ou originate, chemin d’AS ou AS path, origine de la route ou origin, la passerelle ou next hop, etc.) qui permettent, selon un ordre de préférence, de sélectionner le meilleur chemin pour une destination donnée. Un attribut appelé communauté ou community, codé sur 4 octets, est utilisé pour ajouter des informations complémentaires sur un préfixe annoncé et ainsi prendre des décisions supplémentaires sur le traitement des annonces BGP.
Les routes sont échangées via des messages de type UPDATE contenant un champ Network Layer Reachability Information (NLRI) incluant les préfixes.

Exemple de topologie réseau BGP simplifiée
En outre, un des nombreux avantages de BGP est de pouvoir définir une passerelle ou next hop donnée dans une annonce de route. En effet, cela permet d’envoyer du trafic vers une fausse passerell qu’on appelle trou noir ou black hole.
RTBH
Principe
Remotely-Triggered Black Hole (RTBH) est une technique utilisée avec BGP pour bloquer du trafic malveillant. Elle est généralement mis en place par des fournisseurs d’accès Internet ou Internet Service Providers (ISP) afin de protéger leurs clients d’attaques par déni de service. Un élément déclencheur ou trigger permet alors d’envoyer un trafic décrit dans un black hole via une annonce de routage dédiée. La description peut se faire sur la destination (cible), on parle alors de Destination-based RTBH ; ou bien sur la source du trafic, on parle de Source-based RTBH.
Le composant activant le trigger doit d’abord détecter que le trafic est malveillant. Par exemple, il peut détecter une quantité de trafic soudainement supérieure à un seuil prédéfini d’usage normal. Ce composant peut-être localisé sur l’infrastructure de routage ou bien sur un hôte dédié qui échange avec l’infrastructure de routage. En outre, il peut faire partie du réseau de l’ISP ou du client.
Le next-hop utilisé dans l’annonce de routage RTBH est généralement fixé à une adresse Internet Protocol (IP) dans le sous-réseau 192.0.2.0/24. L’adresse utilisée dans le cadre des anti-DDoS est 192.0.2.1. Le next hop de la route vers 192.0.2.1 est alors fixé vers une interface inexistante appelée discard ou null. Cette route est ainsi pré-installée.
Les annonces RTBH ne sont pas exportées vers d’autres AS afin de ne pas impacter d’autres organisations, grâce à l’utilisation de la communauté NO_EXPORT
. En plus, une communauté spécifique pour le black hole doit être ajoutée dans ces annonces. Elle doit avoir pour valeur décimale 666 sur ses 2 derniers octets.

Exemple d'utilisation de RTBH simplifiée
Automatiser RTBH
Le concept de RTBH semble puissant pour propager des réponses afin de bloquer des attaques DDoS via BGP. Cependant, dans un environnement à grande échelle, ce processus peut être amélioré en le menant à bien de manière automatique. Pour ce faire, il y a deux mécanismes nécessaires à automatiser : analyser le trafic pour détecter l’attaque en cours et envoyer une réponse RTBH pour la bloquer.
Le premier mécanisme peut être implémenté à partir de captures et copies de paquets ou packet capture et traffic mirroring tel SwitchPort ANalyzer (SPAN : copier le traffic d’une interface vers un autre) qui se décline en Local SPAN (LSPAN : lorsque la copie se réalise au sein du même équipement), Remote SPAN (RSPAN : inclut de multiples interfaces, sous-réseaux virtuels et équipements) ou Encapsulated RSPAN (ERSPAN : propriétaire de Cisco, où le trafic capturé est encapsulé afin d’être transporté intacte à travers plusieurs réseaux). Cela dit, la capture et copie de trafic est consommatrice de ressources et moins adaptée pour détecter des motifs d’attaques reposant principalement sur la volumétrie seulement, comme DDoS. On préfèrera l’utiliser pour analyser des paquets en profondeur.

Capture de trafic avec SPAN
Par ailleurs, le mécanisme d’analyse de trafic peut aussi être mis en œuvre en envoyant des échantillons du trafic observé, on parle alors de flux ou flow. Un flow est la description d’un trafic réseau (ensemble de paquets) défini par plusieurs champs (interface d’entrée, protocole, port source, port destination, adresse IP source, adresse IP destination, le champ Type of Service de l’en-tête IP). Les technologies d’échantillonage par flow les plus répandues sont Netflow (propriétaire Cisco), sample flow (sFlow) et Internet Protocol Flow Information Export (IPFIX). Elles sont plus adaptées pour détecter des attaques DDoS dans un environnement de production.

Collecte d'information de trafic avec flow
Une fois l’attaque détectée sur les flow, la réponse est propagée via le mécanisme RTBH avec des annonces BGP. Particulièrement, il est alors intéressant de pouvoir caractériser un trafic avec une spécification de flux ou Flow Specification (FlowSpec) qui est un ensemble de critères de correspondance pour un trafic réseau. Cela est associé à des règles de filtrage contenant aussi des actions à prendre sur le trafic. Par exemple, on peut envisager de bloquer le trafic, appliquer des limites aux taux de trafic ou traffic rate, effectuer du marquage de paquets pour mettre en place de la Qualité de Service ou Quality of Service (QoS). Ces actions sont définies par des communautés BGP spécifiques. Ces critères sont alors encodés dans le champ NLRI des messages BGP. Cela permet concrètement de rapidement et efficacement réagir pour contrôler le trafic sur un réseau.
Implémentation de RTBH avec Cisco, NetFlow GoBGP et FastNetMon
Je vous propose maintenant une utilisation de RTBH dans un environnement de routeurs Cisco et avec une sonde FastNetMon utilisant en plus la solution GoBGP (une implémentation open source de BGP écrite en langage Go). L’objectif est de démontrer comment une attaque de déni de service simple peut être détectée via une collecte NetFlow et une analyse sur FastNetMon puis rémédiée automatiquement par utilisation de RTBH via GoBGP. L’environnement a été émulé sur l’outil Packet Network Emulator Tool Lab (PNETLab) et certaines machines ont été préparées par un de mes collègues grâce à la procédure décrite dans cet excellent article.
Topologie
La topologie du réseau mis en place dans l’environnement de test est composée de plusieurs éléments :
- Une machine Attacker tournant sur le système Linux Debian et qui simule un attaquant ;
- Un routeur ProviderEdge1 tournant sur le système Cisco IOS-XE et qui simule un routeur d’AS d’un ISP ;
- Un routeur ProviderEdge2 tournant sur le système Cisco IOS-XE et qui simule un routeur d’AS d’un ISP ;
- Un routeur CustomerEdge1 tournant sur le système Cisco IOS-XE et qui simule un routeur d’AS d’un client ;
- Une machine Target tournant sur le système Linux Debian et qui simule une cible ;
- Une machine FastNetMon tournant sur le système Linux Debian et faisant tourner FastNetMon et GoBGP.

Topologie de l'environnement de test
Configuration de BGP et RTBH
Voici les lignes de configuration des routeurs et de la machine FastNetMon pour effectuer du BGP et RTBH.
Configuration de ProviderEdge1 :
router bgp 65000
neighbor 10.10.2.2 remote-as 65000
neighbor 10.10.2.2 activate
neighbor 10.10.2.2 send-community
neighbor 10.10.2.2 route-map RTBH in
network 10.10.1.0 mask 255.255.255.0
ip bgp-community new-format
ip community-list expanded RTBH permit 65000:666
ip route 192.0.2.1 255.255.255.255 Null0
route-map RTBH permit 10
match community RTBH
set community no-export
set ip next-hop 192.0.2.1
route-map RTBH permit 20
ip icmp rate-limit unreachable
- On active BGP sur l’AS 65000 en annonçant le réseau local 10.10.1.0/24, en déclarant le voisin ProviderEdge2 en IBGP et en autorisant l’échange d’informations BGP dont l’inclusion de l’attribut communauté.
- On décrit la communauté “RTBH” avec la valeur 65000:666.
- On créé une route-map spécifique qui s’active lorsque la communauté “RTBH” est reçue dans les annonces BGP. Cette route-map fixe la passerelle ou next-hop à 192.0.2.1 et n’autorise la propagation de ces annonces qu’en IBGP.
- Une route statique pré-installée envoie le trafic vers 192.0.2.1 dans une interface inexistante appelée Null0.
- En plus, on configure la fréquence maximale d’envoi de réponses Internet Control Message Protocol (ICMP) Destination Unreachable (envoyées notamment lorsque le trafic n’est pas routé) à 10ms. Ceci est optionnel mais nous sera utile pour avoir plus de visibilité lors des tests que nous verrons plus bas.
Configuration de ProviderEdge2 :
router bgp 65000
neighbor 10.10.2.1 remote-as 65000
neighbor 10.10.2.1 activate
neighbor 10.10.2.1 send-community
neighbor 10.10.2.1 next-hop-self
neighbor 10.10.3.2 remote-as 65001
neighbor 10.10.3.2 ebgp-multihop 255
neighbor 10.10.3.2 activate
neighbor 10.10.3.2 send-community
neighbor 10.10.3.2 route-map RTBH in
ip bgp-community new-format
ip community-list expanded RTBH permit 65000:666
ip route 192.0.2.1 255.255.255.255 Null0
route-map RTBH permit 10
match community RTBH
set ip next-hop 192.0.2.1
route-map RTBH permit 20
- On active BGP sur l’AS 65000 en déclarant le voisin ProviderEdge1 en IBGP et le voisin CustomerEdge1 en EBGP ainsi qu’en autorisant l’échange d’informations BGP dont l’inclusion de l’attribut communauté. Le next-hop des routes apprises en EBGP grâce à CustomerEdge1 est remplacé par le routeur ProviderEdge2 lui-même.
- On décrit la communauté “RTBH” avec la valeur 65000:666.
- On créé une route-map spécifique qui s’active lorsque la communauté “RTBH” est reçue avec un préfixe. Cette route-map fixe la passerelle ou next-hop à 192.0.2.1 et n’autorise la propagation de ces annonces qu’en IBGP.
- Une route statique pré-installée envoie le trafic vers 192.0.2.1 dans une interface inexistante appelée Null0.
Configuration de CustomerEdge1 :
router bgp 65001
neighbor 10.10.3.1 remote-as 65000
neighbor 10.10.3.1 activate
neighbor 10.10.3.1 send-community
network 10.10.4.0 mask 255.255.255.0
redistribute static route-map RTBH
neighbor 192.168.10.10 remote-as 65001
neighbor 192.168.10.10 activate
ip bgp-community new-format
ip community-list expanded RTBH permit 65000:666
route-map RTBH permit 10
match tag 666
match community RTBH
set community 65000:666
route-map RTBH permit 20
- On active BGP sur l’AS 65001 en annonçant le réseau local 10.10.4.0/24, en déclarant d’une part le voisin ProviderEdge2 en EBGP et en autorisant l’échange d’informations BGP dont l’inclusion de l’attribut communauté ; et en déclarant d’autre part le voisin FastNetMon en IBGP.
- On décrit la communauté “RTBH” avec la valeur 65000:666.
- On créé une route-map spécifique qui s’active lorsque le tag 666 (qu’on utilise pour des tests en local) ou la communauté “RTBH” sont reçus avec un préfixe. Cette route-map fixe la passerelle ou next-hop à 192.0.2.1 et n’autorise la propagation de ces annonces qu’en IBGP. Cette route-map fixe aussi la communauté à 65000:666 (dans le cas où seul un tag a été reçu et reconnu).
- On redistribue via BGP les routes statiques associées à cette route-map.
Configuration de GoBGP sur la machine FastNetMon :
$ vi /etc/systemd/system/multi-user.target.wants/gobgpd.service
[Unit]
Description=GoBGP Routing Daemon
Documentation=file:/usr/share/doc/gobgpd/getting-started.md
After=network.target syslog.service
ConditionPathExists=/etc/gobgpd.conf
[Service]
Type=notify
ExecStartPre=/opt/fastnetmon-community/libraries/gobgp_3_12_0/gobgpd -f /etc/gobgpd.conf -d
ExecStart=/opt/fastnetmon-community/libraries/gobgp_3_12_0/gobgpd -f /etc/gobgpd.conf --sdnotify --disable-stdlog --syslog yes $GOBGPD_OPTIONS
ExecReload=/opt/fastnetmon-community/libraries/gobgp_3_12_0/gobgpd -r
DynamicUser=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
$ systemctl daemon-reload
$ systemctl enable gobgpd.service
$ ln -s /opt/fastnetmon-community/libraries/gobgp_3_12_0/gobgp /usr/local/bin/.
$ cat /etc/gobgpd.conf
[global.config]
as = 65001
router-id = "192.168.10.10"
[[neighbors]]
[neighbors.config]
neighbor-address = "192.168.10.1"
peer-as = 65001
$ systemctl start gobgpd.service
- On créé un démon pour GoBGP qui charge le fichier de configuration de GoBGP au démarrage ainsi qu’un lien symbolique pour simplifier l’utilisation du binaire GoBGP.
- On active le démon.
- On définit la configuration BGP sur l’AS 65001 en déclarant le voisin ProviderEdge2 en IBGP.
- On démarre le démon GoBGP.
Configuration de NetFlow
Configuration de CustomerEdge1 :
flow record FLOW-RECORD
match ipv4 protocol
match ipv4 destination address
match ipv4 source address
collect counter bytes
collect counter packets
flow exporter FLOW-EXPORTER
destination 192.168.10.10
source GigabitEthernet3
transport udp 2055
flow monitor FLOW-MONITOR
exporter FLOW-EXPORTER
cache timeout active 1
cache timeout inactive 1
record netflow ipv4 original-input
interface GigabitEthernet2
ip flow monitor FLOW-MONITOR input
ip flow monitor FLOW-MONITOR output
- On définit un flow record qui permet de définir la collecte de flow (avec notamment le nombre d’octets et de paquets par flux) sur le trafic IP.
- On définit un flow exporter qui permet de définir la cible pour l’envoi des flow, ici la machine FastNetMon sur le protocole de transport User Datagram Protocol (UDP) via le port 2055.
- On définit un flow monitor avec des valeurs de cache faibles volontairement, utilisant le flow exporter et appliqué sur l’interface connectée au routeur ProviderEdge2 (plus précisemment, sur l’entrée et la sortie de l’interface d’où peuvent provenir les attaques).
Configuration de FastNetMon
Sur la machine FastNetMon, on configure l’outil en éditant certaines lignes du fichier de configuration /etc/fastnetmon.conf
:
# Logging level, can be info or debug
logging_level = info
# enable this option if you want to send logs to local syslog facility
logging_local_syslog_logging = on
# Enable/Disable any actions in case of attack
enable_ban = on
# How long (in seconds) we should keep an IP in blocked state
# If you set 0 here it completely disables unban capability
ban_time = 10
# Check if the attack is still active, before triggering an unban callback with this option
# If the attack is still active, check each run of the unban watchdog
unban_only_if_attack_finished = off
# list of all your networks in CIDR format
networks_list_path = /etc/networks_list
# Different approaches to attack detection
ban_for_pps = on
# Limits for Dos/DDoS attacks
threshold_pps = 5
threshold_icmp_pps = 5
ban_for_icmp_pps = on
# Netflow capture method with v5, v9 and IPFIX support
netflow = on
# Configuration for Netmap, mirror, pcap, AF_XDP modes
# For pcap we could specify "any"
# For Netmap we could specify multiple interfaces separated by comma
interfaces = ens3
# We use average values for traffic speed to certain IP and we calculate average over this time periond (seconds)
average_calculation_time = 2
# Delay between traffic recalculation attempts
speed_calculation_delay = 1
# it's possible to specify multiple ports here, using commas as delimiter
netflow_port = 2055
netflow_sampling_ratio = 1
# GoBGP integration
gobgp = on
# Configuration for IPv4 announces
gobgp_next_hop = 0.0.0.0
gobgp_announce_host = on
gobgp_announce_whole_subnet = off
gobgp_community_host = 65000:666
- On active la journalisation ou logging localement.
- On active la fonction de blocage pour une durée de 10s lorsque le nombre de paquets par seconde observé est supérieur ou égal à 5. Le calcul des statistiques de trafic est effectué sur 2s toute les 1s. Notez que cette valeur est basse car nous sommes dans un environnement de test et cela ne convient pas à un environnement de production.
- On écoute le trafic sur l’interface connectée au routeur CustomerEdge1.
- On active le support de NetFlow sur le port UDP 2055 avec un échantillonage de 1 pour 1.
- On active GoBGP avec la possibilité de faire des annonces RTBH pour des hôtes et en utilisant la valeur de communauté 65000:666.
Ensuite, dans le fichier /etc/networks_list
, on spécifie le réseau cible à surveiller :
$ cat /etc/networks_list
10.10.4.0/24
Enfin, on démarre le service :
$ systemctl start fastnetmon
Scénario de test
Pour les tests, on réalise une attaque de type DoS ICMP Flooding en envoyant depuis la machine Attacker des messages ICMP Echo Request vers la machine Target avec un intervalle de 100ms grâce à l’utilitaire ping
. Ceci nous permet d’envoyer effectivement 10 paquets par seconde. Ce n’est bien sûr pas représentatif d’une attaque réelle mais c’est suffisant pour vous démontrer le fonctionnement de RTBH automatisé.
$ ping 10.10.4.10 -i 0.1
PING 10.10.4.10 (10.10.4.10) 56(84) bytes of data.
64 bytes from 10.10.4.10: icmp_seq=1 ttl=61 time=1.44 ms
64 bytes from 10.10.4.10: icmp_seq=2 ttl=61 time=1.60 ms
64 bytes from 10.10.4.10: icmp_seq=3 ttl=61 time=1.67 ms
64 bytes from 10.10.4.10: icmp_seq=4 ttl=61 time=1.73 ms
64 bytes from 10.10.4.10: icmp_seq=5 ttl=61 time=1.62 ms
64 bytes from 10.10.4.10: icmp_seq=6 ttl=61 time=1.69 ms
64 bytes from 10.10.4.10: icmp_seq=7 ttl=61 time=1.83 ms
64 bytes from 10.10.4.10: icmp_seq=8 ttl=61 time=1.52 ms
64 bytes from 10.10.4.10: icmp_seq=9 ttl=61 time=1.69 ms
64 bytes from 10.10.4.10: icmp_seq=10 ttl=61 time=1.47 ms
64 bytes from 10.10.4.10: icmp_seq=11 ttl=61 time=1.41 ms
64 bytes from 10.10.4.10: icmp_seq=12 ttl=61 time=1.48 ms
64 bytes from 10.10.4.10: icmp_seq=13 ttl=61 time=1.50 ms
64 bytes from 10.10.4.10: icmp_seq=14 ttl=61 time=1.67 ms
64 bytes from 10.10.4.10: icmp_seq=15 ttl=61 time=1.55 ms
64 bytes from 10.10.4.10: icmp_seq=16 ttl=61 time=1.59 ms
64 bytes from 10.10.4.10: icmp_seq=17 ttl=61 time=1.61 ms
64 bytes from 10.10.4.10: icmp_seq=18 ttl=61 time=1.60 ms
64 bytes from 10.10.4.10: icmp_seq=19 ttl=61 time=1.65 ms
64 bytes from 10.10.4.10: icmp_seq=20 ttl=61 time=1.49 ms
64 bytes from 10.10.4.10: icmp_seq=21 ttl=61 time=1.49 ms
64 bytes from 10.10.4.10: icmp_seq=22 ttl=61 time=1.58 ms
64 bytes from 10.10.4.10: icmp_seq=23 ttl=61 time=1.59 ms
64 bytes from 10.10.4.10: icmp_seq=24 ttl=61 time=1.44 ms
64 bytes from 10.10.4.10: icmp_seq=25 ttl=61 time=1.61 ms
64 bytes from 10.10.4.10: icmp_seq=26 ttl=61 time=1.60 ms
64 bytes from 10.10.4.10: icmp_seq=27 ttl=61 time=1.72 ms
64 bytes from 10.10.4.10: icmp_seq=28 ttl=61 time=1.62 ms
64 bytes from 10.10.4.10: icmp_seq=29 ttl=61 time=1.68 ms
64 bytes from 10.10.4.10: icmp_seq=30 ttl=61 time=1.61 ms
64 bytes from 10.10.4.10: icmp_seq=31 ttl=61 time=1.59 ms
64 bytes from 10.10.4.10: icmp_seq=32 ttl=61 time=1.74 ms
64 bytes from 10.10.4.10: icmp_seq=33 ttl=61 time=1.70 ms
64 bytes from 10.10.4.10: icmp_seq=34 ttl=61 time=1.54 ms
64 bytes from 10.10.4.10: icmp_seq=35 ttl=61 time=1.80 ms
64 bytes from 10.10.4.10: icmp_seq=36 ttl=61 time=1.50 ms
From 10.10.1.1 icmp_seq=37 Destination Host Unreachable
From 10.10.1.1 icmp_seq=38 Destination Host Unreachable
From 10.10.1.1 icmp_seq=39 Destination Host Unreachable
From 10.10.1.1 icmp_seq=40 Destination Host Unreachable
From 10.10.1.1 icmp_seq=41 Destination Host Unreachable
From 10.10.1.1 icmp_seq=42 Destination Host Unreachable
From 10.10.1.1 icmp_seq=43 Destination Host Unreachable
From 10.10.1.1 icmp_seq=44 Destination Host Unreachable
From 10.10.1.1 icmp_seq=45 Destination Host Unreachable
From 10.10.1.1 icmp_seq=46 Destination Host Unreachable
From 10.10.1.1 icmp_seq=47 Destination Host Unreachable
From 10.10.1.1 icmp_seq=48 Destination Host Unreachable
From 10.10.1.1 icmp_seq=49 Destination Host Unreachable
From 10.10.1.1 icmp_seq=50 Destination Host Unreachable
From 10.10.1.1 icmp_seq=51 Destination Host Unreachable
From 10.10.1.1 icmp_seq=52 Destination Host Unreachable
From 10.10.1.1 icmp_seq=53 Destination Host Unreachable
From 10.10.1.1 icmp_seq=54 Destination Host Unreachable
From 10.10.1.1 icmp_seq=55 Destination Host Unreachable
From 10.10.1.1 icmp_seq=56 Destination Host Unreachable
From 10.10.1.1 icmp_seq=57 Destination Host Unreachable
From 10.10.1.1 icmp_seq=58 Destination Host Unreachable
From 10.10.1.1 icmp_seq=59 Destination Host Unreachable
From 10.10.1.1 icmp_seq=60 Destination Host Unreachable
From 10.10.1.1 icmp_seq=61 Destination Host Unreachable
From 10.10.1.1 icmp_seq=62 Destination Host Unreachable
From 10.10.1.1 icmp_seq=63 Destination Host Unreachable
From 10.10.1.1 icmp_seq=64 Destination Host Unreachable
From 10.10.1.1 icmp_seq=65 Destination Host Unreachable
From 10.10.1.1 icmp_seq=66 Destination Host Unreachable
From 10.10.1.1 icmp_seq=67 Destination Host Unreachable
From 10.10.1.1 icmp_seq=68 Destination Host Unreachable
From 10.10.1.1 icmp_seq=69 Destination Host Unreachable
From 10.10.1.1 icmp_seq=70 Destination Host Unreachable
From 10.10.1.1 icmp_seq=71 Destination Host Unreachable
From 10.10.1.1 icmp_seq=72 Destination Host Unreachable
From 10.10.1.1 icmp_seq=73 Destination Host Unreachable
From 10.10.1.1 icmp_seq=74 Destination Host Unreachable
From 10.10.1.1 icmp_seq=75 Destination Host Unreachable
From 10.10.1.1 icmp_seq=76 Destination Host Unreachable
From 10.10.1.1 icmp_seq=77 Destination Host Unreachable
From 10.10.1.1 icmp_seq=78 Destination Host Unreachable
From 10.10.1.1 icmp_seq=79 Destination Host Unreachable
From 10.10.1.1 icmp_seq=80 Destination Host Unreachable
From 10.10.1.1 icmp_seq=81 Destination Host Unreachable
From 10.10.1.1 icmp_seq=82 Destination Host Unreachable
From 10.10.1.1 icmp_seq=83 Destination Host Unreachable
From 10.10.1.1 icmp_seq=84 Destination Host Unreachable
From 10.10.1.1 icmp_seq=85 Destination Host Unreachable
From 10.10.1.1 icmp_seq=86 Destination Host Unreachable
From 10.10.1.1 icmp_seq=87 Destination Host Unreachable
From 10.10.1.1 icmp_seq=88 Destination Host Unreachable
From 10.10.1.1 icmp_seq=89 Destination Host Unreachable
From 10.10.1.1 icmp_seq=90 Destination Host Unreachable
From 10.10.1.1 icmp_seq=91 Destination Host Unreachable
From 10.10.1.1 icmp_seq=92 Destination Host Unreachable
From 10.10.1.1 icmp_seq=93 Destination Host Unreachable
From 10.10.1.1 icmp_seq=94 Destination Host Unreachable
From 10.10.1.1 icmp_seq=95 Destination Host Unreachable
From 10.10.1.1 icmp_seq=96 Destination Host Unreachable
From 10.10.1.1 icmp_seq=97 Destination Host Unreachable
From 10.10.1.1 icmp_seq=98 Destination Host Unreachable
From 10.10.1.1 icmp_seq=99 Destination Host Unreachable
From 10.10.1.1 icmp_seq=100 Destination Host Unreachable
From 10.10.1.1 icmp_seq=101 Destination Host Unreachable
From 10.10.1.1 icmp_seq=102 Destination Host Unreachable
From 10.10.1.1 icmp_seq=103 Destination Host Unreachable
From 10.10.1.1 icmp_seq=104 Destination Host Unreachable
From 10.10.1.1 icmp_seq=105 Destination Host Unreachable
From 10.10.1.1 icmp_seq=106 Destination Host Unreachable
From 10.10.1.1 icmp_seq=107 Destination Host Unreachable
From 10.10.1.1 icmp_seq=108 Destination Host Unreachable
From 10.10.1.1 icmp_seq=109 Destination Host Unreachable
From 10.10.1.1 icmp_seq=110 Destination Host Unreachable
From 10.10.1.1 icmp_seq=111 Destination Host Unreachable
From 10.10.1.1 icmp_seq=112 Destination Host Unreachable
From 10.10.1.1 icmp_seq=113 Destination Host Unreachable
From 10.10.1.1 icmp_seq=114 Destination Host Unreachable
From 10.10.1.1 icmp_seq=115 Destination Host Unreachable
From 10.10.1.1 icmp_seq=116 Destination Host Unreachable
From 10.10.1.1 icmp_seq=117 Destination Host Unreachable
From 10.10.1.1 icmp_seq=118 Destination Host Unreachable
From 10.10.1.1 icmp_seq=119 Destination Host Unreachable
From 10.10.1.1 icmp_seq=120 Destination Host Unreachable
From 10.10.1.1 icmp_seq=121 Destination Host Unreachable
From 10.10.1.1 icmp_seq=122 Destination Host Unreachable
From 10.10.1.1 icmp_seq=123 Destination Host Unreachable
From 10.10.1.1 icmp_seq=124 Destination Host Unreachable
From 10.10.1.1 icmp_seq=125 Destination Host Unreachable
From 10.10.1.1 icmp_seq=126 Destination Host Unreachable
From 10.10.1.1 icmp_seq=127 Destination Host Unreachable
From 10.10.1.1 icmp_seq=128 Destination Host Unreachable
From 10.10.1.1 icmp_seq=129 Destination Host Unreachable
From 10.10.1.1 icmp_seq=130 Destination Host Unreachable
From 10.10.1.1 icmp_seq=131 Destination Host Unreachable
From 10.10.1.1 icmp_seq=132 Destination Host Unreachable
From 10.10.1.1 icmp_seq=133 Destination Host Unreachable
From 10.10.1.1 icmp_seq=134 Destination Host Unreachable
From 10.10.1.1 icmp_seq=135 Destination Host Unreachable
From 10.10.1.1 icmp_seq=137 Destination Host Unreachable
From 10.10.1.1 icmp_seq=138 Destination Host Unreachable
From 10.10.1.1 icmp_seq=139 Destination Host Unreachable
From 10.10.1.1 icmp_seq=140 Destination Host Unreachable
From 10.10.1.1 icmp_seq=141 Destination Host Unreachable
From 10.10.1.1 icmp_seq=142 Destination Host Unreachable
From 10.10.1.1 icmp_seq=143 Destination Host Unreachable
From 10.10.1.1 icmp_seq=144 Destination Host Unreachable
From 10.10.1.1 icmp_seq=145 Destination Host Unreachable
From 10.10.1.1 icmp_seq=146 Destination Host Unreachable
From 10.10.1.1 icmp_seq=147 Destination Host Unreachable
From 10.10.1.1 icmp_seq=148 Destination Host Unreachable
From 10.10.1.1 icmp_seq=149 Destination Host Unreachable
From 10.10.1.1 icmp_seq=150 Destination Host Unreachable
From 10.10.1.1 icmp_seq=151 Destination Host Unreachable
From 10.10.1.1 icmp_seq=152 Destination Host Unreachable
From 10.10.1.1 icmp_seq=153 Destination Host Unreachable
From 10.10.1.1 icmp_seq=154 Destination Host Unreachable
From 10.10.1.1 icmp_seq=155 Destination Host Unreachable
From 10.10.1.1 icmp_seq=156 Destination Host Unreachable
From 10.10.1.1 icmp_seq=157 Destination Host Unreachable
From 10.10.1.1 icmp_seq=158 Destination Host Unreachable
From 10.10.1.1 icmp_seq=159 Destination Host Unreachable
From 10.10.1.1 icmp_seq=160 Destination Host Unreachable
From 10.10.1.1 icmp_seq=161 Destination Host Unreachable
From 10.10.1.1 icmp_seq=162 Destination Host Unreachable
From 10.10.1.1 icmp_seq=163 Destination Host Unreachable
From 10.10.1.1 icmp_seq=164 Destination Host Unreachable
From 10.10.1.1 icmp_seq=165 Destination Host Unreachable
From 10.10.1.1 icmp_seq=166 Destination Host Unreachable
From 10.10.1.1 icmp_seq=167 Destination Host Unreachable
From 10.10.1.1 icmp_seq=168 Destination Host Unreachable
From 10.10.1.1 icmp_seq=169 Destination Host Unreachable
From 10.10.1.1 icmp_seq=170 Destination Host Unreachable
From 10.10.1.1 icmp_seq=171 Destination Host Unreachable
From 10.10.1.1 icmp_seq=172 Destination Host Unreachable
From 10.10.1.1 icmp_seq=173 Destination Host Unreachable
From 10.10.1.1 icmp_seq=174 Destination Host Unreachable
From 10.10.1.1 icmp_seq=175 Destination Host Unreachable
From 10.10.1.1 icmp_seq=176 Destination Host Unreachable
From 10.10.1.1 icmp_seq=177 Destination Host Unreachable
From 10.10.1.1 icmp_seq=178 Destination Host Unreachable
From 10.10.1.1 icmp_seq=179 Destination Host Unreachable
From 10.10.1.1 icmp_seq=180 Destination Host Unreachable
From 10.10.1.1 icmp_seq=181 Destination Host Unreachable
From 10.10.1.1 icmp_seq=182 Destination Host Unreachable
From 10.10.1.1 icmp_seq=183 Destination Host Unreachable
From 10.10.1.1 icmp_seq=184 Destination Host Unreachable
From 10.10.1.1 icmp_seq=185 Destination Host Unreachable
From 10.10.1.1 icmp_seq=186 Destination Host Unreachable
From 10.10.1.1 icmp_seq=187 Destination Host Unreachable
From 10.10.1.1 icmp_seq=188 Destination Host Unreachable
From 10.10.1.1 icmp_seq=189 Destination Host Unreachable
From 10.10.1.1 icmp_seq=190 Destination Host Unreachable
From 10.10.1.1 icmp_seq=191 Destination Host Unreachable
From 10.10.1.1 icmp_seq=192 Destination Host Unreachable
From 10.10.1.1 icmp_seq=193 Destination Host Unreachable
From 10.10.1.1 icmp_seq=194 Destination Host Unreachable
From 10.10.1.1 icmp_seq=195 Destination Host Unreachable
From 10.10.1.1 icmp_seq=196 Destination Host Unreachable
From 10.10.1.1 icmp_seq=197 Destination Host Unreachable
From 10.10.1.1 icmp_seq=198 Destination Host Unreachable
From 10.10.1.1 icmp_seq=199 Destination Host Unreachable
From 10.10.1.1 icmp_seq=200 Destination Host Unreachable
From 10.10.1.1 icmp_seq=201 Destination Host Unreachable
From 10.10.1.1 icmp_seq=202 Destination Host Unreachable
From 10.10.1.1 icmp_seq=203 Destination Host Unreachable
From 10.10.1.1 icmp_seq=204 Destination Host Unreachable
From 10.10.1.1 icmp_seq=205 Destination Host Unreachable
From 10.10.1.1 icmp_seq=206 Destination Host Unreachable
From 10.10.1.1 icmp_seq=207 Destination Host Unreachable
From 10.10.1.1 icmp_seq=208 Destination Host Unreachable
From 10.10.1.1 icmp_seq=209 Destination Host Unreachable
From 10.10.1.1 icmp_seq=210 Destination Host Unreachable
From 10.10.1.1 icmp_seq=211 Destination Host Unreachable
From 10.10.1.1 icmp_seq=212 Destination Host Unreachable
From 10.10.1.1 icmp_seq=213 Destination Host Unreachable
From 10.10.1.1 icmp_seq=214 Destination Host Unreachable
From 10.10.1.1 icmp_seq=215 Destination Host Unreachable
From 10.10.1.1 icmp_seq=216 Destination Host Unreachable
From 10.10.1.1 icmp_seq=217 Destination Host Unreachable
From 10.10.1.1 icmp_seq=218 Destination Host Unreachable
From 10.10.1.1 icmp_seq=219 Destination Host Unreachable
From 10.10.1.1 icmp_seq=220 Destination Host Unreachable
From 10.10.1.1 icmp_seq=221 Destination Host Unreachable
From 10.10.1.1 icmp_seq=222 Destination Host Unreachable
From 10.10.1.1 icmp_seq=223 Destination Host Unreachable
From 10.10.1.1 icmp_seq=224 Destination Host Unreachable
From 10.10.1.1 icmp_seq=225 Destination Host Unreachable
From 10.10.1.1 icmp_seq=226 Destination Host Unreachable
From 10.10.1.1 icmp_seq=227 Destination Host Unreachable
From 10.10.1.1 icmp_seq=228 Destination Host Unreachable
From 10.10.1.1 icmp_seq=229 Destination Host Unreachable
From 10.10.1.1 icmp_seq=230 Destination Host Unreachable
From 10.10.1.1 icmp_seq=231 Destination Host Unreachable
From 10.10.1.1 icmp_seq=232 Destination Host Unreachable
From 10.10.1.1 icmp_seq=233 Destination Host Unreachable
From 10.10.1.1 icmp_seq=234 Destination Host Unreachable
From 10.10.1.1 icmp_seq=235 Destination Host Unreachable
From 10.10.1.1 icmp_seq=236 Destination Host Unreachable
From 10.10.1.1 icmp_seq=237 Destination Host Unreachable
From 10.10.1.1 icmp_seq=238 Destination Host Unreachable
From 10.10.1.1 icmp_seq=239 Destination Host Unreachable
From 10.10.1.1 icmp_seq=240 Destination Host Unreachable
From 10.10.1.1 icmp_seq=241 Destination Host Unreachable
From 10.10.1.1 icmp_seq=242 Destination Host Unreachable
From 10.10.1.1 icmp_seq=243 Destination Host Unreachable
From 10.10.1.1 icmp_seq=244 Destination Host Unreachable
From 10.10.1.1 icmp_seq=245 Destination Host Unreachable
From 10.10.1.1 icmp_seq=246 Destination Host Unreachable
From 10.10.1.1 icmp_seq=247 Destination Host Unreachable
From 10.10.1.1 icmp_seq=248 Destination Host Unreachable
From 10.10.1.1 icmp_seq=249 Destination Host Unreachable
From 10.10.1.1 icmp_seq=250 Destination Host Unreachable
From 10.10.1.1 icmp_seq=251 Destination Host Unreachable
From 10.10.1.1 icmp_seq=252 Destination Host Unreachable
From 10.10.1.1 icmp_seq=253 Destination Host Unreachable
From 10.10.1.1 icmp_seq=254 Destination Host Unreachable
From 10.10.1.1 icmp_seq=255 Destination Host Unreachable
From 10.10.1.1 icmp_seq=256 Destination Host Unreachable
From 10.10.1.1 icmp_seq=257 Destination Host Unreachable
From 10.10.1.1 icmp_seq=258 Destination Host Unreachable
From 10.10.1.1 icmp_seq=259 Destination Host Unreachable
From 10.10.1.1 icmp_seq=260 Destination Host Unreachable
From 10.10.1.1 icmp_seq=261 Destination Host Unreachable
From 10.10.1.1 icmp_seq=262 Destination Host Unreachable
From 10.10.1.1 icmp_seq=263 Destination Host Unreachable
From 10.10.1.1 icmp_seq=264 Destination Host Unreachable
From 10.10.1.1 icmp_seq=265 Destination Host Unreachable
From 10.10.1.1 icmp_seq=266 Destination Host Unreachable
From 10.10.1.1 icmp_seq=267 Destination Host Unreachable
From 10.10.1.1 icmp_seq=268 Destination Host Unreachable
From 10.10.1.1 icmp_seq=269 Destination Host Unreachable
From 10.10.1.1 icmp_seq=270 Destination Host Unreachable
From 10.10.1.1 icmp_seq=271 Destination Host Unreachable
From 10.10.1.1 icmp_seq=272 Destination Host Unreachable
From 10.10.1.1 icmp_seq=273 Destination Host Unreachable
From 10.10.1.1 icmp_seq=274 Destination Host Unreachable
From 10.10.1.1 icmp_seq=275 Destination Host Unreachable
From 10.10.1.1 icmp_seq=276 Destination Host Unreachable
From 10.10.1.1 icmp_seq=277 Destination Host Unreachable
From 10.10.1.1 icmp_seq=278 Destination Host Unreachable
From 10.10.1.1 icmp_seq=279 Destination Host Unreachable
From 10.10.1.1 icmp_seq=280 Destination Host Unreachable
From 10.10.1.1 icmp_seq=281 Destination Host Unreachable
From 10.10.1.1 icmp_seq=282 Destination Host Unreachable
From 10.10.1.1 icmp_seq=283 Destination Host Unreachable
From 10.10.1.1 icmp_seq=284 Destination Host Unreachable
From 10.10.1.1 icmp_seq=285 Destination Host Unreachable
From 10.10.1.1 icmp_seq=286 Destination Host Unreachable
From 10.10.1.1 icmp_seq=287 Destination Host Unreachable
From 10.10.1.1 icmp_seq=288 Destination Host Unreachable
From 10.10.1.1 icmp_seq=289 Destination Host Unreachable
From 10.10.1.1 icmp_seq=290 Destination Host Unreachable
From 10.10.1.1 icmp_seq=291 Destination Host Unreachable
From 10.10.1.1 icmp_seq=292 Destination Host Unreachable
From 10.10.1.1 icmp_seq=293 Destination Host Unreachable
From 10.10.1.1 icmp_seq=294 Destination Host Unreachable
From 10.10.1.1 icmp_seq=295 Destination Host Unreachable
From 10.10.1.1 icmp_seq=296 Destination Host Unreachable
From 10.10.1.1 icmp_seq=297 Destination Host Unreachable
From 10.10.1.1 icmp_seq=298 Destination Host Unreachable
From 10.10.1.1 icmp_seq=299 Destination Host Unreachable
From 10.10.1.1 icmp_seq=300 Destination Host Unreachable
From 10.10.1.1 icmp_seq=301 Destination Host Unreachable
From 10.10.1.1 icmp_seq=302 Destination Host Unreachable
From 10.10.1.1 icmp_seq=303 Destination Host Unreachable
From 10.10.1.1 icmp_seq=304 Destination Host Unreachable
From 10.10.1.1 icmp_seq=305 Destination Host Unreachable
From 10.10.1.1 icmp_seq=306 Destination Host Unreachable
From 10.10.1.1 icmp_seq=307 Destination Host Unreachable
From 10.10.1.1 icmp_seq=308 Destination Host Unreachable
From 10.10.1.1 icmp_seq=309 Destination Host Unreachable
From 10.10.1.1 icmp_seq=310 Destination Host Unreachable
From 10.10.1.1 icmp_seq=311 Destination Host Unreachable
From 10.10.1.1 icmp_seq=312 Destination Host Unreachable
From 10.10.1.1 icmp_seq=313 Destination Host Unreachable
From 10.10.1.1 icmp_seq=314 Destination Host Unreachable
From 10.10.1.1 icmp_seq=315 Destination Host Unreachable
From 10.10.1.1 icmp_seq=316 Destination Host Unreachable
From 10.10.1.1 icmp_seq=317 Destination Host Unreachable
From 10.10.1.1 icmp_seq=318 Destination Host Unreachable
From 10.10.1.1 icmp_seq=319 Destination Host Unreachable
From 10.10.1.1 icmp_seq=320 Destination Host Unreachable
From 10.10.1.1 icmp_seq=321 Destination Host Unreachable
From 10.10.1.1 icmp_seq=322 Destination Host Unreachable
From 10.10.1.1 icmp_seq=323 Destination Host Unreachable
From 10.10.1.1 icmp_seq=324 Destination Host Unreachable
From 10.10.1.1 icmp_seq=325 Destination Host Unreachable
From 10.10.1.1 icmp_seq=326 Destination Host Unreachable
From 10.10.1.1 icmp_seq=327 Destination Host Unreachable
From 10.10.1.1 icmp_seq=328 Destination Host Unreachable
From 10.10.1.1 icmp_seq=329 Destination Host Unreachable
From 10.10.1.1 icmp_seq=330 Destination Host Unreachable
From 10.10.1.1 icmp_seq=331 Destination Host Unreachable
From 10.10.1.1 icmp_seq=332 Destination Host Unreachable
From 10.10.1.1 icmp_seq=333 Destination Host Unreachable
From 10.10.1.1 icmp_seq=334 Destination Host Unreachable
From 10.10.1.1 icmp_seq=335 Destination Host Unreachable
64 bytes from 10.10.4.10: icmp_seq=336 ttl=61 time=1.34 ms
64 bytes from 10.10.4.10: icmp_seq=337 ttl=61 time=1.61 ms
64 bytes from 10.10.4.10: icmp_seq=338 ttl=61 time=1.52 ms
On constate que les requêtes 1 à 36 ont reçu des réponses ICMP Echo Reply de la machine Target durant environ 3,6s, puis des réponses ICMP Destination Host Unreachable du routeur ProviderEdge1 durant environ 29,9s. Finalement, les réponses de la machine Target sont de nouveau reçues. RTBH a ainsi automatiquement bloqué la tentative d’attaque, et le schéma ci-dessous résume ce qu’il s’est passé à tous les niveaux.

Déroulement de RTBH pour l'attaque réalisée dans l'environnement de test
L’attaque a été détectée dans des délais raisonnables et attendus, et le blocage a duré près de 30s au lieu des 10s configurées sur FastNetMon. Cela est dû au temps de réactivité interne des logiciels ainsi que la durée de propagation des annonces BGP RTBH. Il est alors intéressant de vérifier ce qu’il se passe sur chacun des équipements au moment de l’attaque.
Sur FastNetMon, on peut constater la détection de l’attaque et la réaction RTBH dans les journaux situés dans le fichier /etc/fastnetmon.log
:
2024-05-16 14:39:37,431 [INFO] We run execute_ip_ban code with following params in_pps: 9 out_pps: 9 in_bps: 842 out_bps: 842 and we decide it's o
utgoing attack
2024-05-16 14:39:37,432 [INFO] Attack with direction: outgoing IP: 10.10.4.10 Power: 9
2024-05-16 14:39:37,432 [ERROR] Can't print attack details to file
2024-05-16 14:39:37,432 [INFO] Call GoBGP for ban client started: 10.10.4.10
2024-05-16 14:39:37,432 [INFO] Call to GoBGP for ban client is finished: 10.10.4.10
2024-05-16 14:39:37,433 [INFO] announce 10.10.4.10/32 to GoBGP
2024-05-16 14:39:39,483 [INFO] Attack with direction: outgoing IP: 10.10.4.10 Power: 9 traffic samples collected
2024-05-16 14:39:39,484 [ERROR] Can't print attack details to file
2024-05-16 14:39:52,934 [INFO] We will unban banned IP: 10.10.4.10 because it ban time 10 seconds is ended
2024-05-16 14:39:52,934 [INFO] Call GoBGP for unban client started: 10.10.4.10
2024-05-16 14:39:52,934 [INFO] Call to GoBGP for unban client is finished: 10.10.4.10
2024-05-16 14:39:52,934 [INFO] withdraw 10.10.4.10/32 to GoBGP
L’attaque est ici détectée à 9 paquets par seconde observés, GoBGP est appelé pour bloquer la source de l’attaque via RTBH (envoi d’une annonce BGP spécifique) et au bout d’environ une grosse dizaine de secondes, GoBGP est rappelée pour annuler le blocage (envoi d’une nouvelle annonce BGP).On peut constater que pendant l’attaque, une route a été ajoutée sur FastNetMon vers 10.10.4.10/32 avec la communauté 65000:666 dans la table de routage IBGP :
$ gobgp global rib
Network Next Hop AS_PATH Age Attrs
*> 10.10.1.0/24 10.10.3.1 65000 1d 21:33:44 [{Origin: i} {Med: 0} {LocalPref: 100}]
*> 10.10.4.0/24 192.168.10.1 1d 21:33:44 [{Origin: i} {Med: 0} {LocalPref: 100}]
*> 10.10.4.10/32 0.0.0.0 00:00:15 [{Origin: i} {Communities: 65000:666}]
Sur le routeur CustomerEdge1, on constate alors qu’un préfixe pour 10.10.4.10/32 (la machine Target) a été reçu de 192.168.10.10 (la machine FastNetMon) avec un next-hop vers la machine Target (car vue comme locale étant donné que le next-hop envoyé était 0.0.0.0) et surtout avec la communauté 65000:666.
CE1#show ip bgp 10.10.4.10
BGP routing table entry for 10.10.4.10/32, version 411
Paths: (1 available, best #1, table default)
Advertised to update-groups:
6
Refresh Epoch 1
Local
192.168.10.10 from 192.168.10.10 (192.168.10.10)
Origin IGP, localpref 100, valid, internal, best
Community: 65000:666
rx pathid: 0, tx pathid: 0x0
Updated on May 16 2024 12:39:37 UTC
Il est à noter que grâce à la configuration que nous avons mis en place, on aurait pu installer le préfixe pour 10.10.4.10/32 manuellement sur CustomerEdge1 :
CE1(config)#ip route 10.10.4.10 255.255.255.255 Null0 tag 666
Ainsi, le tag 666 serait reconnu et la communauté 65000:666 serait propagé de la même manière. Cela n’a évidemment pas un grand intérêt lorsqu’on a un système de détection et de réponse comme FastNetMon et GoBGP, mais je souhaitais vous montrer comment le faire manuellement malgré tout.
Sur le routeur ProviderEdge2, on constate alors qu’un préfixe pour 10.10.4.10/32 (la machine Target) a été reçu de 10.10.2.2 (lui-même) avec un next-hop vers 192.0.2.1 et avec la communauté 65000:666. La route vers 192.0.2.1 pointe vers une interface inexistante (Null0).
PE2#show ip bgp 10.10.4.10
BGP routing table entry for 10.10.4.10/32, version 402
Paths: (1 available, best #1, table default)
Advertised to update-groups:
6
Refresh Epoch 29
65001
192.0.2.1 from 10.10.3.2 (3.3.3.3)
Origin IGP, localpref 100, valid, external, best
Community: 65000:666
rx pathid: 0, tx pathid: 0x0
Updated on May 16 2024 12:39:36 UTC
PE2#sh ip route 192.0.2.1
Routing entry for 192.0.2.1/32
Known via "static", distance 1, metric 0 (connected)
Routing Descriptor Blocks:
* directly connected, via Null0
Route metric is 0, traffic share count is 1
Sur le routeur ProviderEdge1, on constate aussi qu’un préfixe pour 10.10.4.10/32 (la machine Target) a été reçu de 10.10.2.2 (ProviderEdge2) avec un next-hop vers 192.0.2.1. La route vers 192.0.2.1 pointe là encore vers une interface inexistante (Null0).
PE1#show ip bgp 10.10.4.10
BGP routing table entry for 10.10.4.10/32, version 224
Paths: (1 available, best #1, table default, not advertised to EBGP peer)
Not advertised to any peer
Refresh Epoch 5
65001
192.0.2.1 from 10.10.2.2 (10.10.3.1)
Origin IGP, metric 0, localpref 100, valid, internal, best
Community: no-export
rx pathid: 0, tx pathid: 0x0
Updated on May 16 2024 12:39:36 UTC
PE1#sh ip route 192.0.2.1
Routing entry for 192.0.2.1/32
Known via "static", distance 1, metric 0 (connected)
Routing Descriptor Blocks:
* directly connected, via Null0
Route metric is 0, traffic share count is 1
Le routeur ProviderEdge1 sera ainsi le premier routeur du chemin à bloquer le flux et répondre avec un paquet ICMP Destination Unreachable.
Conclusion
Les attaques de déni de service distribuées peuvent être dévastatrices pour une organization. Heureusement, des mécanismes de réponses existent comme RTBH qui utilise la puissance du protocole BGP pour propager des annonces de routage arrêtant la transmission du trafic malveillant. Lorsque cela est couplé à une solution de détection avec l’appui de collecte de flow tel NetFlow, la réponse peut être encore plus rapide et précise. Par ailleurs, je vous invite fortement à lire cet excellent article écrit par un collègue qui explore RTBH avec sFlow et FlowSpec. Je remercie au passage chaleureusement les collègues qui m’ont apporté du support technique pour la mise en place de l’environnement de test.
Sources
- IETF - RFC 4271 - A Border Gateway Protocol 4 (BGP-4) : https://datatracker.ietf.org/doc/html/rfc4271. Consulté le 17/05/2024.
- IETF - RFC 5635 - Remote Triggered Black Hole Filtering with Unicast Reverse Path Forwarding (uRPF) : https://datatracker.ietf.org/doc/html/rfc5635. Consulté le 17/05/2024.
- IETF - RFC 7999 - BLACKHOLE Community : https://datatracker.ietf.org/doc/html/rfc7999. Consulté le 17/05/2024.
- Cisco Community - Understanding SPAN,RSPAN,and ERSPAN : https://community.cisco.com/t5/networking-knowledge-base/understanding-span-rspan-and-erspan/ta-p/3144951. Consulté le 17/05/2024.
- IETF - RFC 8955 - Dissemination of Flow Specification Rules : https://datatracker.ietf.org/doc/html/rfc8955. Consulté le 17/05/2024.
- FastNetMon DDoS Detection Tool : https://fastnetmon.com. Consulté le 17/05/2024.
- PNETLab - Lab is Simple : https://pnetlab.com. Consulté le 17/05/2024.
- jmanteau - Custom Linux Image for Eve-NG Unetlab or PNETLab : https://jmanteau.fr/posts/custom-linux-image-for-eve-ng-unetlab-or-pnetlab/. Consulté le 17/05/2024.
- Satish Patel - BGP Remote Trigger Blackhole for DDoS : https://satishdotpatel.github.io/bgp-remote-trigger-blackhole-for-ddos/. Consulté le 17/05/2024.
- Satish Patel - Mitigate DDoS using FastNetMon and goBGPhttps://satishdotpatel.github.io/mitigate-ddos-using-fastnetmon-and-gobgp/. Consulté le 17/05/2024.
- NetworkLessons.com - BGP : https://networklessons.com/bgp. Consulté le 17/05/2024.
- Cisco - Cisco IOS Flexible NetFlow Command Reference : https://www.cisco.com/c/en/us/td/docs/ios/fnetflow/command/reference/fnf_book/fnf_01.html. Consulté le 17/05/2024.
- Antho’s blog - Leveraging BGP to mitigate network attacks: A comprehensive guide : https://www.anthony-balitrand.fr/2024/03/20/leveraging-bgp-to-mitigate-network-attacks-a-comprehensive-guide/. Consulté le 17/05/2024.