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.