Wir sind ein Managed Service Provider, der ein kleines Netzwerk in einem einzigen Rechenzentrum in Sydney betreibt. Wir haben kürzlich einen neuen POP-Inter-State in Melbourne eingesetzt (beide befinden sich an der Ostküste Australiens), und zum ersten Mal muss ich mich realen Herausforderungen in Bezug auf die Verkehrstechnik stellen. Ich hoffe, dass ich hier eine Anleitung bekommen kann, wie ich ein gewisses Maß an Kontrolle über meine iBGP-Pfade erlangen kann.
Ich werde wahrscheinlich einige miteinander zusammenhängende Fragen stellen, aber in diesem Fall bin ich speziell besorgt über die interne Verkehrstechnik. Ich finde es überraschend schwierig herauszufinden, wie iBGP optimale Routing-Entscheidungen treffen kann.
Das Hauptziel für mich ist es, einen Weg zu finden, um iBGP ein Konzept für eine Grenze und einen Abstand pro POP zu geben. Ich kann also zwischen einem POP in derselben Stadt und einem zwischenstaatlichen POP und einem POP zwischen Ost- und Westküste unterscheiden. Optimieren Sie dann das eingehende / ausgehende Routing auf dieser Grundlage.
Ich weiß, dass es viele Fall-zu-Fall-Szenarien geben wird, aber ich hoffe, dass ich eine iBGP-Routing-Strategie entwickeln kann, die vielleicht 80% der Zeit funktioniert, und den Rest müsste ich mich mit speziellen Randfällen in den USA befassen config.
Kontext
- Wir haben gerade 4x ASR 1001-X gekauft, um als Edge-Geräte an jedem POP zu fungieren (2x pro POP, aber aufgrund von Hardwarebeschränkungen konzentriere ich mich derzeit nur auf die Bereitstellung von 1 Edge-Gerät in Melbourne).
- Wir verwenden Juniper auch zum Wechseln der Hardware. EX4500 als unsere "Core Switches" und EX4200s auf der Zugriffsebene.
- Wir haben jetzt 2x Transitanbieter. Wir verbinden uns nur mit jedem Anbieter in jeweils einem Bundesstaat.
- AS 1000 ist ein Aggregator und verwendet AS 4000 als einen seiner primären Upstreams in Sydney.
- Dies ist eine Herausforderung, da alle von AS 1000 empfangenen Pfade in der Regel um 1 länger sind als die von AS 4000.
- Ich verwende Ansible, um IOS-Konfigurationen mit Jinja2-Vorlagen zu generieren. Es ist also kein Problem, eine Menge pro iBGP-Peer-Route-Map-Logik zu generieren, um die Dinge zu erledigen.
Meine Ziele
Im Wesentlichen möchte ich in der Lage sein, ein optimales Routing zwischen POPs zu erreichen, wenn wir sie bereitstellen. Aber im Moment kann ich keine Kontrolle darüber erlangen, wie iBGP seine Pfade auswählt.
Mein aktuelles Design
- Ich habe derzeit 2x ASR1Ks als Edge-Router mit vollen Tischen in Sydney und einen in Melbourne.
- Beide POPs verwenden unterschiedliche Transitanbieter.
- Wir haben eine Punkt-zu-Punkt-Schaltung zwischen den beiden POPs, die auf beiden Seiten von den Edge-Geräten auf dot1q-Subschnittstellen abgeschlossen wird.
- Wir führen OSPF über diese Verbindung zwischen allen Edge-Geräten aus, und die Kosten für die Verbindung werden erhöht, sodass dies der OSPF-Pfad mit der niedrigsten Präferenz ist.
- Wir haben einen einzelnen OSPF-Bereich 0 über beide POPs.
- Die Edge-Geräte sind eher ein konvergierter Core / Edge - unsere Core-Switches leisten nicht viel L3, da sie keine vollständige Tabelle verarbeiten können.
- In jedem POP fungieren die ASR1Ks als Routenreflektoren für die anderen BGP-Geräte in diesem POP - Firewalls, Core-Switches, LNSes usw.
- Jeder hat seine eigene Cluster-ID - nicht pro POP. Suchen Sie nach einer Änderung in per-POP.
- Jeder ASR1K erstellt eine Standardroute zu Routenreflektor-Clients über BGP.
- Alle ASR1Ks befinden sich in einem iBGP-Netz.
- Alle Transits haben an allen Standorten die gleiche lokale Präferenz.
Beispiel für suboptimales Routing
- Wenn meine Transits in Melbourne und Sydney alle online sind, funktioniert das ausgehende Routing einwandfrei. Der Verkehr in Sydney erfolgt über Sydney und Melbourne über Melbourne.
- Das Problem ist, dass nur durch die Deaktivierung meines primären Sydney-Transits durch den Administrator mein Melbourne-Transit jetzt automatisch bevorzugt wird. Anstelle meines sekundären Sydney-Transits über den BDR02-Router in Sydney.
- Ich habe also oft ein Szenario, in dem der Verkehr über unseren Backhaul nach Melbourne abprallt, in Melbourne abfährt und dann zurück nach Sydney fährt. Der Pfad, der <1 ms war, ist jetzt ungefähr 30 ms.
Um die Sache noch schlimmer zu machen, kann ich in diesem speziellen Szenario nicht herausfinden, warum Melbourne bevorzugt wird.
- Das Gewicht ist identisch
- Lokale Präferenz ist identisch
- AS-Pfad ist gleich lang
- Keiner der Pfade ist selbst entstanden.
- Beide haben IGP als Ursprung.
- Beide haben eine Metrik (MED?) Von 0.
- Beide sind aus Sicht dieses Routers iBGP-Pfade.
- Ich hätte gedacht, dass die IGP-Metrik mit den OSPF-Verbindungskosten korreliert, da wir OSPF als IGP verwenden.
- Ich habe bestätigt, dass die 100G-Referenzbandbreite für alle OSPF-Geräte eingestellt ist.
EDIT: 30/01: Ich denke, dass ich falsch liege, wie die IGP-Kosten berechnet werden, und vielleicht sind sie derzeit gleich? Alle meine OSPF-Routen sind vom Typ E2. Wenn die IGP-Kosten gleich sind, ist es wahrscheinlich sinnvoll, die beste Pfadauswahl basierend auf dem RID zu treffen. In diesem Fall wäre der RID des MEL-BDR niedriger als der SYD.
Ich habe die OSPF-Verbindungskosten zwischen Sydney auf 15.000 festgelegt, die viel höher als die Standardkosten sind. Ich habe dies so berechnet, dass es mit unserer 100-Gbit / s-Referenzbandbreite zuverlässig funktioniert.
In Bezug auf die OSPF-Verbindungskosten - dies sind die OSPF-Präferenzen für jeden nächsten Hop der BGP-Routen:
bdr-01-syd#sh ip route x.x.201.73 (AS 4000 next hop)
Routing entry for x.x.201.72/30
Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 15000
Last update from x.x.13.51 on Port-channel1.1125, 14:57:17 ago
Routing Descriptor Blocks:
* x.x.13.51, from x.x.13.66, 14:57:17 ago, via Port-channel1.1125
Route metric is 20, traffic share count is 1
bdr-01-syd#
bdr-01-syd#sh ip route x.x.31.5 (AS 1000 next hop)
Routing entry for x.x.31.4/30
Known via "ospf 1", distance 110, metric 20, type extern 2, forward metric 5
Last update from x.x.216.67 on Port-channel1.36, 1d00h ago
Routing Descriptor Blocks:
* x.x.216.67, from x.x.216.163, 1d12h ago, via Port-channel1.36
Route metric is 20, traffic share count is 1
bdr-01-syd#
x.x.201.73 is the next hop to 139.130.4.4 via the Melbourne path.
x.x.13.51 is the other end of the inter-state Point to Point. x.x.13.66 is BDR-01-MEL.
x.x.31.5 is the next hop to 139.130.4.4 via the Secondary Sydney transit in the same POP as the primary transit - via BDR-02-SYD.
x.x.216.67 is the local OSPF VLAN for the Sydney POP that both BDR01 and BDR02 are in.
x.x.216.163 is the BDR-02-SYD router.
In Bezug auf diese OSPF-Auswahlmöglichkeiten kann ich sehen, dass die kürzere OSPF-Vorwärtsmetrik erfasst wird. Ich hätte gedacht, dass BGP auf dieser Grundlage den Weg nach Sydney wählen sollte.
Sie können dieser Spur entnehmen, dass wir sofort über Backhaul nach Melbourne springen, da der erste Sprung 13 ms beträgt: (139.130.4.4 ist anycasted und hat Pfade in beiden Staaten).
bdr-01-syd#traceroute 139.130.4.4
Type escape sequence to abort.
Tracing the route to 139.130.4.4
VRF info: (vrf in name/id, vrf out name/id)
1 x.x.13.51 13 msec 13 msec 13 msec
2 x.x.201.73 14 msec 14 msec 14 msec
3 x.x.196.54 [AS 4000] [MPLS: Label 25049 Exp 0] 14 msec 14 msec 14 msec
4 x.x.196.51 [AS 4000] 14 msec 14 msec 14 msec
5 139.130.110.29 [AS 1221] 14 msec 15 msec 14 msec
6 203.50.11.113 [AS 1221] 16 msec 14 msec 16 msec
7 139.130.4.4 [AS 1221] 13 msec 14 msec 14 msec
bdr-01-syd#
bdr-01-syd#sh ip route 139.130.4.4
Routing entry for 139.130.0.0/16
Known via "bgp 5000", distance 200, metric 0
Tag 4000, type internal
Last update from x.x.201.73 06:06:14 ago
Routing Descriptor Blocks:
* x.x.201.73, from x.x.13.66, 06:06:14 ago
Route metric is 0, traffic share count is 1
AS Hops 2
Route tag 4000
MPLS label: none
bdr-01-syd#
bdr-01-syd#sh ip bgp regexp ^1000 1221$
BGP table version is 11307146, local router ID is x.x.216.161
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
...
* i 139.130.0.0 x.x.31.5 0 100 0 1000 1221 i
...
Versus the path via AS 4000:
bdr-01-syd#sh ip bgp regexp ^4000 1221$
*>i 138.130.0.0 x.x.201.73 0 100 0 4000 1221 i
bdr-01-syd#
In dieser Ausgabe ist sowohl der sekundäre Sydney-Transit ein gültiger Pfad als auch der Melbourne-Transit. Melbourne wird als das Beste ausgewählt.
bdr-01-syd#sh ip bgp 139.130.4.4
BGP routing table entry for 139.130.0.0/16, version 10794227
Paths: (2 available, best #2, table default)
Advertised to update-groups:
66
Refresh Epoch 1
1000 1221, (received & used)
x.x.31.5 (metric 20) from x.x.216.163 (x.x.216.163)
Origin IGP, metric 0, localpref 100, valid, internal
Community: 1000:65110 5000:1000 5000:1001 5000:1002
rx pathid: 0, tx pathid: 0
Refresh Epoch 2
4000 1221, (received & used)
x.x.201.73 (metric 20) from x.x.13.66 (x.x.13.66)
Origin IGP, metric 0, localpref 100, valid, internal, best
Community: 4000:5307 4000:6100 4000:53073 5000:1000 5000:1030 5000:1031
rx pathid: 0, tx pathid: 0x0
bdr-01-syd#
Was ich versucht habe
Ich habe versucht, OSPF-Verbindungskosten von 15.000 hinzuzufügen, die ich als sichere Zahl berechnet habe, basierend auf meiner Ref-Bandbreite von 100 Gbit / s, da dies immer die am wenigsten bevorzugten OSPF-Kosten sind. Ich dachte, dies würde als "IGP-Kosten" gelten, und dennoch bevorzugt BGP aus irgendeinem Grund immer noch den Weg nach Melbourne.
Nachdem dies keine Auswirkungen zu haben schien, bestand mein Hauptplan darin, AS PATH vor iBGP zu verwenden. Der Plan war, dass ich Peer-Gruppen pro POP haben würde. Und in meinen Vorlagen würde ich festlegen, wie viele Vorbereitungen zu treffen sind, basierend darauf, wie weit die beiden POPs voneinander entfernt waren. Ich hatte gedacht, dass dies eine ziemlich häufige Art von Ziel sein würde.
Zum Beispiel:
- 0 steht vor Intra-POP
- 1 voranstellen, wenn Intra-State-POP
- 2 steht vor, wenn zwischenstaatliche POP
- 3 steht vor, wenn Ost-West-Küste POP
Ich dachte, das würde ziemlich perfekt funktionieren, eine ziemlich elegante Lösung sein und ist genau die Art von Lösung, auf die ich hoffe. Ich schrieb die Konfigurationen in ein paar Stunden auf und setzte sie ein. Aber ich kratzte mir am Kopf, bis mir klar wurde, dass iBGP das Voranstellen von AS-Pfaden nicht unterstützt.
- https://routerjockey.com/2011/02/28/bgp-essentials-the-art-of-path-manipulation/
- https://lists.gt.net/nsp/juniper/3870
- http://blog.ipspace.net/2008/02/bgp-essentials-as-path-prepending.html
Selbst wenn ich das zum Laufen bringen könnte, scheint es, als wäre es niemals eine unterstützte Lösung.
Was ich überlege
- In diesem letzten Link @ ipspace.net wird erwähnt, dass Sie local-pref verwenden können, da es in einem AS bestehen bleibt. Aber ich habe bereits eine Local-Pref-Richtlinie ausgearbeitet, um nachgelagerte Kundenrouten zu bevorzugen, IXes, die üblichen ... Es scheint, als würde die Verwendung von localpref dafür nicht gut passen. Und Ivan schlägt es nicht vor!
- Ich habe überlegt, BGP-Konföderationen zu verwenden - aber dies scheint eine Menge zusätzlicher Arbeit für unser kleines Netzwerk zu sein. Und ich habe auch gelesen, dass es sowieso keine AS-Pfad-Hops zwischen konföderierten ASes hinzufügt. Also würde ich wahrscheinlich an der gleichen Stelle landen.
- Ich würde die Verwendung von MPLS in Betracht ziehen (ich denke MPLS TE?), Aber ich bin sehr grün, wenn es um MPLS geht, und habe bereits viele Herausforderungen vor mir. Daher möchte ich die zusätzliche Komplexität vermeiden, es sei denn, dies ist eine gute Lösung für mein Problem.
Ich werde morgen weitere Details hinzufügen. Im Moment ist hier ein Diagramm, das unser aktuelles Setup zeigt.