# Anycast in OPNsense: Hochverfügbarkeit auf IP-Ebene via BGP

TL;DR / Management Summary Anycast ist eine Netzwerktechnik, bei der mehrere physische Server unter der exakt gleichen IP-Adresse erreichbar sind. Das Netzwerk leitet den User automatisch zum “nächsten” verfügbaren Knoten. In OPNsense realisieren wir Anycast durch das BGP-Protokoll (Artikel 572). Ein Senior Admin nutzt Anycast primär für hochverfügbare DNS-Cluster oder Loadbalancer-Frontends über mehrere Rechenzentren hinweg.


# 1. Einführung & Funktionsweise

One-to-Nearest.

Im Gegensatz zu Unicast (One-to-One) oder Multicast (One-to-Many) ist Anycast eine Routing-Eigenschaft.

  1. Zwei OPNsense-Instanzen an verschiedenen Standorten geben via BGP das gleiche IP-Präfix (z.B. /32 einer Loopback-IP) bekannt.
  2. Die Router im Internet/Backbone wählen den Pfad mit den geringsten BGP-Hops.
  3. Fällt ein Standort aus, zieht er sein BGP-Announcement zurück, und der Traffic fließt automatisch zum zweiten Standort.

# Architektur-Übersicht (Mermaid)

graph TD
    USER1[User in Berlin] -->|Shortest Path| FW1[OPNsense RZ-Berlin]
    USER2[User in Munich] -->|Shortest Path| FW2[OPNsense RZ-Munich]
    
    FW1 & FW2 ---|Both announce| IP[Shared Anycast IP: 1.2.3.4]
    
    subgraph "Public Internet / AS Backbone"
    IP
    end

# 2. Einrichtung in der Praxis

Loopbacks und BGP-Präfixe.

# Schritt 1: Loopback Interface anlegen

Da die Anycast-IP nicht physisch an einem Port hängt, nutzen wir ein Loopback-Interface.

  1. Interfaces -> Other Types -> Loopback.
  2. Name: ANYCAST_LB. IP: 1.2.3.4/32.

# Schritt 2: BGP Konfiguration (FRR)

Routing -> BGP.

  1. Prefix List: Erstellen Sie eine Liste, die nur Ihre Anycast-IP enthält.
  2. Route Map: Erlauben Sie den Export dieses Präfixes an Ihre Nachbarn (Neighbors).
  3. Network: Tragen Sie 1.2.3.4/32 in den BGP Network-Bereich ein.

# 3. Deep Dive: Anycast für DNS

Maximale Performance für Clients.

Das populärste Beispiel für Anycast ist DNS (z.B. Google 8.8.8.8).


# 4. Day-2 Operations: Health Checks

Den ‘toten’ Knoten vermeiden.

Anycast ist gefährlich, wenn der BGP-Prozess läuft, aber die eigentliche App (z.B. der Webserver) abgestürzt ist.


# 5. Troubleshooting & “War Stories”

Wenn die Pakete die Seite wechseln.

# Top 3 Fehlerbilder

  1. Symptom: Sessions (TCP) brechen ständig ab.

    • Ursache: “Route Flapping”. Das Internet-Routing ändert sich, und die Pakete des Users landen plötzlich beim anderen Anycast-Knoten. Da dieser die TCP-Session (State) nicht kennt, bricht die Verbindung ab.
    • Lösung: Anycast ist ideal für UDP (DNS). Für TCP benötigen Sie sehr stabile BGP-Verbindungen.
  2. Symptom: Ein Knoten bekommt 100% des Traffics, der andere 0%.

    • Ursache: BGP-Asymmetrie oder ein Provider hat eine bessere Anbindung an beide Standorte.
    • Lösung: Nutzen Sie AS-Path Prepending am bevorzugten Standort, um die Last künstlich zu verlagern.
  3. Symptom: IP wird nicht weltweit bekanntgegeben.

    • Lösung: Viele Provider akzeptieren keine /32 Präfixe. Sie müssen oft mindestens ein /24 Subnetz für Anycast im öffentlichen Internet nutzen.

# “War Story”: Das “Ghost” DNS-Problem

Ein Admin betrieb zwei DNS-Server via Anycast. Ein Server hatte eine Fehlkonfiguration in der Zonen-Datei. Das Ergebnis: Die Hälfte der Firma (nahe Standort A) konnte keine Mails senden, die andere Hälfte (nahe Standort B) schon. Da beide Server die gleiche IP hatten, war es in den Logs der Clients unmöglich zu sehen, welcher Server gerade antwortete. Lehre: Geben Sie Anycast-Servern immer eine zusätzliche Unicast-Management IP, über die Sie den Gesundheitszustand und die Version der Daten individuell prüfen können.


# 6. Monitoring & Reporting

Die Routing-Präsenz prüfen.

# BGP Neighbors Status

Routing -> Diagnostics -> BGP.


# 7. Fazit & Empfehlung

Anycast ist die “Oberklasse” des Routings.


# Anhang: Cheatsheet

Aufgabe Pfad / Befehl
Loopback erstellen Interfaces -> Other Types -> Loopback
BGP Export prüfen vtysh -c "show ip bgp neighbor <IP> advertised-routes"
Route Test Diagnostics -> Network -> Traceroute
BGP Log /var/log/frr/frr.log

# Referenzen