Das Präferenz-Attribut in bird

mk16.de

Im bird Routing Dämon gibt es ein verstecktes Attribut: das Präferenz-Attribut preference. “Versteckt”, da es recht schlecht dokumentiert ist. In der Dokumentation wird es zwar erwähnt, jedoch wird weder ausführlich auf die Verwendung eingegangen noch, was die Standardwerte dieses Attributes sind. Je nachdem wie gut man sich die Dokumentation durchgelesen hat, kann das Auslesen dieses Attributs auch etwas versteckt sein.

Was ist das Präferenz-Attribut und wofür wird es verwendet?

Das Präferenz-Attribut wird zur Routen-Auswahl verwendet. Es wird noch vor den Protokollspezifischen-Kriterien (beispielsweise Metrik bei Babel, AS-Pfad Länge und BGP Local Pref bei BGP) ausgewertet. Die Route mit der höchsten Präferenz wird bevorzugt. Wenn es zwei Routen mit der gleichen Präferenz gibt, wird entsprechend das protokollspezifische Auswahlverfahren verwendet.

Was ist der Standardwert?

Um nun Routen mit dieser Präferenzen manipulieren zu können, ist es sinnvoll deren Standardwerte zu kennen, jedoch steht dazu aktuell nichts in der Dokumentation. Im Quellcode kann man die Präferenzen jedoch schnell finden. Diese befindet sich in Zeile 748 bis Zeile 755 in der Datei nest/route.h.

Folgendes sind die Standardwerte:

Protokoll Präferenz Hinweis
Direct 240 Routen, von Interfaces, welche direkt verbunden sind
Static 200 Statische konfigurierte Routen
OSPF 150 IGP; für OSPF intra-area, inter-area und Type 1 externe Routen
Babel 130 IGP
RIP 120 IGP
BGP 100 EGP
RPKI 100 -
“Ererbt” 10 Routen, welche von anderen Routing Dämonen vererbt worden sind

Wie kann man es auslesen?

Sofern man das Präferenz-Attribut nicht im Import-Filter bearbeitet hat, kann man dies in der detaillierten Protokollansicht sehen:

$ birdc show protocol all kioubit
BIRD 2.0.12 ready.
Name       Proto      Table      State  Since         Info
kioubit    BGP        ---        up     2023-06-11    Established   
  BGP state:          Established
[...]
    Local capabilities
      Multiprotocol
        AF announced: ipv6
[...]
    Neighbor capabilities
      Multiprotocol
        AF announced: ipv4 ipv6
[...]
  Channel ipv6
    State:          UP
    Table:          dn42
    Preference:     100
    Input filter:   (unnamed)
    Output filter:  (unnamed)
[...]

Mit der Zeile Preference: 100 sieht man, dass alle importierten IPv6 Routen aus diesem Protokoll (wenn nicht im Filter manipuliert) eine Präferenz von 100 bekommen.

Sollte man die Präferenz nicht für ein Protokoll, sondern für eine bestimmte Route auslesen wollen, kann man dies ganz einfach tun, in dem man den Wert in Runden Klammern ausliest:

$ birdc show route protocol kioubit | head
BIRD 2.0.12 ready.
Table dn42:
fda7:3ae7:e04d::/48  unicast [kioubit 2023-06-11] (100) [AS4242422596i]
    via fe80::ade0 on kioubit
fd23:0:0:f00d::/64   unicast [kioubit 2023-06-11] (100) [AS4242422037i]
    via fe80::ade0 on kioubit
fd66:dca7:46f3::/48  unicast [kioubit 01:32:34.600] (100) [AS4242423772i]
    via fe80::ade0 on kioubit
fd5b:d2c1:2ecc::/48  unicast [kioubit 2023-06-11] (100) [AS4242421832i]
    via fe80::ade0 on kioubit

Hier sieht man beispielsweise, dass alle vier Routen eine Präferenz von 100 haben.

Wann sollte man das Präferenz-Attribut verändern?

Die eigentlichen Präferenz-Attribute sind recht gut gewählt, wenn man jedoch Spezialfälle hat wie zum Beispiel das Mischen der Protokolle, kann es sinnvoll sein, die Präferenz zu verändern - möchte man beispielsweise mit einigen Personen BGP und mit anderen Babel als EGP sprechen und hat auch ein Babel für IGP selber, sollen die EGP Babel Routen natürlich die gleiche Präferenz haben wie die BGP Routen und nur die IGP Babel Routen sollten bevorzugt werden.

Wie verändert man das Präferenz-Attribut?

Dies ist recht einfach, indem man die Präferenz im Import-Filter entsprechend setzt:

filter egp_babel_import {
    preference = 100;
}

Dieser Code orientiert sich am obigen Beispiel.

Dazu sollte man sagen, dass man Babel und BGP nicht einfach als EGP benutzen und mischen sollte, ohne sich vorab entsprechend zu informieren. Dies ist allerdings ein reales Beispiel aus der CRXN/dn42 Interconnection.

Weiteres

Da auch für mich das Thema etwas undurchsichtig ist, habe ich den Blog Eintrag nach neuen Informationen aus der Mailingliste noch einmal neugeschrieben. Die Nachfrage an der Mailingliste kann man im Archiv sehen.