eBGP über GRE mit Linux

Nachdem der Freifunk Rheinland Backbone vergangenes Wochenende in Betrieb gegangen ist haben wir nun versucht erste Communitys an selbigen anzubinden. Wir bevorzugen hierzu das Generic Routing Encapuslation Protocol (GRE). Nachdem wir einen GRE-Tunnel zwischen einem Berliner Router und einer Supernode in Amsterdam aufgebaut hatten und die Konnektivität per Ping überprüft versuchten wir eine eBGP Session zwischen AS201701 und AS65057 aufzubauen.

Der TCP Handshake lief problemlos durch. Dennoch wollte die BGP Session nicht in den Status Established wechseln.
Ein Mitlesen der Pakete per tcpdump zeigte dass einige Pakete in beide Richtungen nicht durch den Tunnel kamen.
Ein Test mittels iperf hingegen verlief problemlos. Nach einigen Stunden und x fachem prüfen aller Parameter und komplettem abreißen von Tunneln und Peerings kam ich auf die Idee in Quagga den Parameter ebgp-multihop auf 64 zu setzen.

Seit dem ist die BGP Session im Status Established. Wie kommt das zu stande? BGP verwendet für eBGP (also Peering zwischen zwei verschiedenen ASen) eine TTL von 1. Das sollte eigentlich kein Problem sein, da die beiden Teilnehmer durch den Tunnel ja nur einen Hop voneinander entfernt sind.

Ich vermute aktuell, dass der GRE Tunnelendpunkt (Kernel) von der TTL eines im GRE Tunnel empfangenen IP Pakets die Differenz der TTL des GRE Pakets von 255 (konifugrierte TTL für den Tunnel) ermittelt und abzieht. Das würde dann z.B. wenn der GRE Tunnel 5 Hops hat eine TTL von 0 ergeben: 1 - (255 - 250) = -4. Damit wird das Paket verworfen.

Also merken: Wenn ihr eBGP über einen GRE (das selbe sollte auch für IPIP, IPIP6, IP6IP6 gelten) Tunnel verwendet, dann setzt unbedingt ebgp-multihop auf einen hinreichend großen Wert!

5 Likes