Kleine Anleitung, wie man von he.net/tunnelbroker.net eine BGP-Sitzung auf CentOS 7 mit bird 1.4+ einrichtet.
Interessant für jeden, der IPv6 mit eigenen Adressen sprechen möchte, aber keine Chance hat, an IPv6-Transit zu kommen.
Bei tunnelbroker.net kann man nicht nur einen standardmäßigen IPv6-Tunnel aufsetzen, sondern auch eine BGP-Sitzung über diesen Tunnel aufsetzen. Dafür braucht man allerdings sein eigenes AS und ein IPv6-Netz (mind. /48). Beides bekommt man bei einer LIR.
Hat man nun beides, kann man loslegen.
Wichtig ist, dass man weiterhin Zugriff auf die Whois-Einträge hat oder anderweitig beweisen kann, dass man auch Gewalt über den gewünschten Adressbereich hat.
Schritt 1: Bei tunnelbroker.net anmelden
Dieser Schritt braucht bei BGP-Tunnel-Sitzungen bis zu zwei Tage. Man meldet sich an, klickt auf „Create BGP Tunnel“ und füllt nun seine Daten aus.
Hinweis: Wenn man ein Aggregate hat (also nicht nur ein /48er Präfix, sondern z.B. ein /44), wäre es sinnvoll das unter „Prefixes announced“ anzugeben. he.net erlaubt grundsätzlich von /44 bis einschließlich /48.
Schritt 2: Tunnel einrichten
Dieser Schritt ist relativ trivial, aber bei CentOS ist es wichtig, dass man ip-tunnel.ttl auf 64 einstellt. Ansonsten wird die BGP-Session mit he.net immer auf OpenConfirm hängen bleiben.
Nun nimmt man die passenden Werte aus tunnelbroker.net (Endpunkt-IP, IPv6-Adresse für den Tunnel) und baut sich einen nmcli-Befehl zusammen:
nmcli connection add \ type ip-tunnel \ ifname henet_tunnel \ mode sit remote 216.66.84.54 local 192.0.2.34 \ ipv4.method disabled \ ipv6.method manual \ ipv6.address 2001:470:XX:YY::2/64 \ ip-tunnel.ttl 64
Ein BGP-Tunnel bekommt auch ein /64er zugewiesen, da darüber die BGP-Sitzung später aufgebaut wird.
Schritt 3: Bird konfigurieren
Von allen BGP-Daemons kann ich Bird am ehesten empfehlen. Bird ist nicht nur ein BGP-Daemon, sondern ein Routing-Multitalent. Es kann zum Beispiel im System konfigurierte Routen erkennen und diese dann über BGP exportieren. Man kann auch OSPF, RIR und sogar Babel mit Bird sprechen. Allerdings beschränke ich mich hier nur auf reines BGP und Routen über Bird managen.
Die Konfigurationsdatei für bird6 befindet sich unter /etc/bird6.conf.
router id 192.0.2.34; # (1) define OWN_AS = 4242421234; # (2) function is_our_network() { # (3) return net ~ [ 2001:db8:1000::/44{44,48}, 2001:db8:2000::/44{44,48} ]; } protocol direct { interface "*"; }; protocol kernel { persist; import none; export filter { krt_prefsrc = 2001:db8:1009::1; # (4) accept; }; kernel table 10; # (5) device routes; } protocol device { scan time 10; } protocol static { route 2001:db8:1009::/48 blackhole; # (6) import all; export none; } protocol bgp henet_tunnel { neighbor 2001:470:XX:YY::1 as 6939; # (7) local as OWN_AS; direct; allow local as 5; # (8) export filter { if is_our_network() then { accept; } reject; }; import all; }
Es gibt acht Stellschrauben in der Konfiguration, die man anfassen muss:
- Bei Router ID kommt in der Regel die IPv4 des Hosts rein.
- Der Einfachheit halber wird die eigene ASN als Konstante definiert.
- is_our_network ist eine Funktion, die nach den eigenen Netzwerken filtert. Sie ist für den Export-Filter wichtig. Hier sollten alle eigenen Netze rein.
- Über krt_prefsrc kann man die Absender-Adresse für z.B. ICMP-Nachrichten konfigurieren. Es ist sinnvoll hier die für den Host konfigurierte IPv6 zu wählen. Falls der Tunnel der einzige IPv6-Uplink ist, kann man diese Zeile auch löschen.
- Bei Bedarf kann man auch in einer separaten Routing-Tabelle arbeiten. Im Normalfall kann man diese Zeile löschen. Dann wird alles in die Haupt-Tabelle geladen.
- Über protocol static kann man alle statische Routen bequem über Bird konfigurieren. Diese werden, falls sie den is_our_network-Test bestehen, auch über BGP weitergereicht.
- neighbor konfiguriert die Adresse und den ASN des Nachbarn. Hier: he.net. Bitte auf ::2 und ::1 achten. Auf ::1 liegt der he.net-Router.
- Diese Einstellung ist wichtig, damit man Bird erlauben kann, AS-Pfade, wo die eigene ASN wieder vorkommt, auch zu importieren. Dies ist wichtig, wenn man mehrere PoPs mit gleicher ASN betreibt und keine direkte Anbindung dorthin hat und über den Tunnel auf Transit angewiesen ist.
Schritt 4: Bird (auto-)starten
systemctl enable --now bird6
Wichtig ist, dass man nicht nur bird6 startet, sondern auch für den Autostart markiert.
Wenn bird6 nun gestartet ist, kann man mit birdc6 Bird kontrollieren.
# birdc6 show proto BIRD 1.6.4 ready. name proto table state since info direct1 Direct master up 2018-10-01 kernel1 Kernel master up 2018-10-01 device1 Device master up 2018-10-01 static1 Static master up 2018-10-01 henet_tunnel BGP master up 2018-10-05 Established
Mit show protocols lässt man sich alle konfigurierten Protokolle und auch BGP-Sitzungen anzeigen.
# birdc6 show route export henet_tunnel BIRD 1.6.4 ready. 2001:db8:1009::/48 blackhole [static1 2018-10-01] * (200)
Wichtig ist, dass man weiß, was man welchem Protokoll exportiert. In der Regel filtern Upstreams, aber das ist nicht immer der Fall. BGP kann Wilder Westen sein.
# birdc6 show route protocol henet_tunnel BIRD 1.6.4 ready, … 2607:de00::/32 via 2001:470:XX:YY::1 on henet_tunnel [henet_tunnel 2018-10-05] * (100) [AS23498i] 2400:cb00:111::/48 via 2001:470:XX:YY::1 on henet_tunnel [henet_tunnel 2018-10-05] * (100) [AS13335i] 2403:ec00:34::/48 via 2001:470:XX:YY::1 on henet_tunnel [henet_tunnel 12:21:48] * (100) [AS17806i] 2402:2700:fe::/48 via 2001:470:XX:YY::1 on henet_tunnel [henet_tunnel 2018-10-06] * (100) [AS132061i] 2406:d500:8::/48 via 2001:470:XX:YY::1 on henet_tunnel [henet_tunnel 2018-10-05] * (100) [AS45177i] …
Man kann sich auch anzeigen lassen, welche Routen man aus welchem Protokoll lernt. Das können einige sein. Stand Oktober 2018 knapp 57k.