Anycast beschreibt ein Adressierungsschema in Netzwerken. Mit Anycast können eine große Anzahl Server global verteilt die gleiche IP-Adresse besitzen.
Dies ermöglicht eine Reduzierung der Antwortzeiten für Anfragen aus dem Internet, da idealerweise der geografisch nächstgelegene Server angesprochen wird.
Um nun Anycast zu ermöglichen, ist es wichtig, dass die Anycast IP-Adresse an dem jeweiligen Standort nur verwendet wird, wenn der zugrunde liegende Service auch verfügbar ist.
Sollte dem nicht so sein, würde der Traffic zwar in Richtung des Servers fließen aber nicht beantwortet werden, dass würde einen – wenn auch regional begrenzten – Ausfall bedeuten.
Hier kommt nun ExaBGP zum Einsatz.
Durch einbaubare Checkscripte wird sichergestellt, dass die Anycast IP-Adresse des Service Hosts nur zum Router propagiert wird, wenn der Service auch verfügbar ist. Sollte dem nicht so sein, gibt es im internen Routerverbund Netzwerkpfade, die weiterhin sicherstellen, dass die Anfrage beantwortet wird. In diesem Fall erhöht sich jedoch die Latenz.
Code-Beispiel für einen DNS check
#!/usr/bin/env bash STATE="down" while true; do DIG_STATE=$(dig adacor.com @ns1.adacor.net 2> /dev/null | grep 195.137.170.149 | awk '{print $5}') if [[ $DIG_STATE == '195.137.170.149' ]]; then if [[ "$STATE" != "up" ]]; then echo $STATE echo "announce route 198.51.100.11 next-hop 192.0.2.11" STATE="up" fi else if [[ "$STATE" != "down" ]]; then echo $STATE echo "withdraw route 198.51.100.11 next-hop 192.0.2.11" STATE="down" fi fi sleep 2 done
Mithilfe dieses kleinen Bash Scriptes (exabgp kann auch perl, python …) wird geprüft, ob der auf diesem Server laufende DNS Daemon die richtige IP an diesem STandort terminiert.
Wenn dem so ist, wird via BGP die IP Adresse 198.51.100.11 an die Router dieses Standortes propagiert. Damit ist sichergestellt, dass der gesamte Traffic für diese IP an diesem Standort terminiert.
Sollte das Bash Script nicht den Wert „195.137.170.149“ aus der DNS-Abfrage lesen können, wird die Route verworfen und der Traffic wird innerhalb des Provider-Netzwerks an einen anderen Standort weitergeleitet.