CentOS 7, bird 1.4+ und tunnelbroker.net BGP-Tunnel

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:

  1. Bei Router ID kommt in der Regel die IPv4 des Hosts rein.
  2. Der Einfachheit halber wird die eigene ASN als Konstante definiert.
  3. 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.
  4. Ü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.
  5. 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.
  6. Ü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.
  7. 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.
  8. 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.