Somos um provedor de serviços gerenciados executando uma rede de tamanho pequeno em um único datacenter em Sydney. Recentemente, implantamos um novo estado interestadual POP em Melbourne (ambos na costa leste da Austrália) e, pela primeira vez, estou enfrentando desafios do mundo real em termos de engenharia de tráfego. Minha esperança é que eu possa obter alguma orientação aqui sobre como obter algum nível de controle sobre meus caminhos de iBGP.
Provavelmente postarei algumas perguntas inter-relacionadas, mas, neste caso, estou especificamente preocupado com a engenharia de tráfego interno. Estou surpreendentemente difícil descobrir como fazer com que o iBGP tome as melhores decisões de roteamento.
O principal objetivo para mim é que é preciso encontrar uma maneira de fornecer ao iBGP algum conceito de limite e distância por POP. Então, eu posso distinguir entre um POP que está na mesma cidade, vs um que é interestadual, vs um que é leste versus costa oeste. Otimize o roteamento de entrada / saída com base nisso.
Sei que haverá muitos cenários caso a caso, mas espero poder desenvolver uma estratégia de roteamento iBGP que funcione talvez 80% das vezes, e o resto teria que lidar com casos especiais de borda no config.
Contexto
- Acabamos de comprar 4x ASR 1001-Xs para atuar como nossos dispositivos de borda em cada POP (2x por POP, mas devido a limitações de hardware de comutação, estou focando apenas na implantação de um dispositivo de borda em Melbourne por enquanto)
- Também utilizamos o Juniper para trocar de hardware. EX4500 como nossos "comutadores principais" e EX4200s na camada de acesso.
- Agora temos 2x provedores de transporte público. Interconectamos apenas a cada provedor em um estado cada.
- O AS 1000 é um agregador e usa o AS 4000 como uma de suas principais fontes ascendentes em Sydney.
- Isso representa um desafio, já que todos os caminhos recebidos pelo AS 1000 são tipicamente mais longos em 1 do que aqueles que obtemos do AS 4000.
- Estou usando o Ansible para gerar configurações do IOS usando modelos Jinja2. Portanto, não é um problema gerar muita lógica por mapa de rotas por iBGP para fazer as coisas.
Os meus objetivos
Essencialmente, quero conseguir um roteamento ideal entre POPs à medida que os implementamos. Mas, no momento, não sou capaz de alcançar nenhum nível de controle sobre como o iBGP está escolhendo seus caminhos.
Meu design atual
- Atualmente, tenho 2x ASR1Ks atuando como roteadores de borda com mesas completas em Sydney e uma em Melbourne.
- Ambos os POPs usam diferentes provedores de transporte público.
- Temos um circuito ponto a ponto entre os dois POPs, que é finalizado em ambos os lados pelos dispositivos de borda nas sub-interfaces dot1q.
- Executamos o OSPF nesse link entre todos os dispositivos de borda, e o custo do link é aumentado, portanto esse é o caminho OSPF de menor preferência.
- Temos uma única área OSPF 0 em ambos os POPs.
- Os dispositivos de borda são mais um núcleo / borda convergente - nossos comutadores de núcleo não fazem muito L3, pois não conseguem lidar com uma tabela completa.
- Em cada POP, os ASR1Ks atuam como refletores de rota para os outros dispositivos BGP desse POP - firewalls, comutadores principais, LNSes e assim por diante.
- Cada um tem seu próprio ID de cluster - não por POP. Procurando mudar isso para por POP.
- Cada ASR1K origina uma rota padrão para clientes de refletor de rota sobre BGP.
- Todos os ASR1Ks estão em uma malha iBGP.
- Todos os trânsitos têm o mesmo pref local em todos os sites.
Exemplo de roteamento abaixo do ideal
- Se o meu Melbourne e Sydney transitarem on-line, o roteamento de saída funcionará bem. O tráfego de Sydney sai via Sydney e Melbourne sai via Melbourne.
- O problema é que, ao desativar o administrador do meu transporte primário em Sydney, meu trânsito em Melbourne agora é automaticamente preferido. Em vez do meu trânsito secundário de Sydney pelo roteador BDR02 em Sydney.
- Então, acabo com um cenário frequentemente em que o tráfego passa para Melbourne durante nosso retorno, sai em Melbourne e depois volta para Sydney. O caminho que estava ocorrendo <1ms agora é de cerca de 30 ms.
Para piorar a situação, nesse cenário em particular, não consigo entender por que Melbourne está sendo preferida.
- O peso é idêntico
- Pref local é idêntico
- AS Path tem o mesmo comprimento
- Nenhum dos caminhos é auto-originado.
- Ambos têm IGP como origem.
- Ambos têm métrica (MED?) De 0.
- Ambos são caminhos iBGP da perspectiva deste roteador.
- Métrica IGP Eu pensaria estar correlacionada com o custo do link OSPF, pois estamos usando o OSPF como nosso IGP.
- Confirmei que a largura de banda de referência 100G está definida em todos os dispositivos OSPF.
EDIT: 30/01: Eu acho que estou errado sobre como o custo do IGP é calculado e talvez eles sejam o mesmo? Todas as minhas rotas OSPF são do tipo E2. Se os custos de IGP forem os mesmos, suponho que faça sentido que a melhor seleção de caminho ocorra com base no RID, que nesse caso o RID do MEL BDR seria menor que o SYD.
Eu configurei o custo do link OSPF entre Sydney para 15.000 muito mais alto que o padrão. Calculei que isso funcione de maneira confiável com nossa largura de banda de referência de 100 Gbps.
Em termos de custos de link OSPF - essas são as preferências de OSPFs de cada salto seguinte das rotas BGP:
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.
Em termos dessas opções de OSPF, posso ver que a "métrica de encaminhamento" OSPF mais curta é captada. Eu teria pensado que o BGP deveria escolher o caminho de Sydney com base nisso.
Você pode ver nesse rastreio que pulamos imediatamente para Melbourne via Backhaul porque o primeiro salto é 13ms: (139.130.4.4 é anycasted e possui caminhos nos dois estados).
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#
Nesta saída, o trânsito secundário de Sydney é um caminho válido, assim como o trânsito de Melbourne. Melbourne é escolhida como a melhor.
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#
O que eu tentei
Tentei adicionar um custo de link OSPF de 15.000, que calculei como uma figura segura, com base na minha largura de banda ref de 100 Gbps, sempre sendo o custo OSPF menos preferido. Eu pensei que isso contaria como "custo IGP" e, no entanto, o BGP ainda está preferindo o caminho de Melbourne por algum motivo.
Depois que isso não pareceu ter nenhum impacto, meu plano principal era usar o AS PATH que precede o iBGP. O plano era que eu tivesse grupos de pares por POP. E, em meus modelos, eu designaria quantos prefixos a serem feitos, com base na distância entre os dois POPs. Eu achava que esse seria um tipo de objetivo bastante comum.
Por exemplo:
- 0 precede se intra-POP
- 1 prefixo se POP intraestado
- 2 precede se POP entre estados
- 3 precede se POP da costa leste-oeste
Eu pensei que isso funcionaria perfeitamente, seria uma solução bastante elegante e é exatamente o tipo de solução que eu espero encontrar. Eu escrevi as configurações em algumas horas e as implantei. Mas cocei minha cabeça até perceber que o iBGP não suporta o prefixo do caminho AS.
- 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
Mesmo se eu conseguir fazer isso funcionar, parece que nunca seria uma solução suportada.
O que eu estou considerando
- Esse último link @ ipspace.net menciona que você poderia usar o prefixo local, pois ele persiste dentro de um AS. Mas eu já mapeei uma política local-pref para preferir rotas de clientes downstream, IXes, o habitual ... Parece que usar localpref para isso não combinaria bem. E Ivan não sugere!
- Eu considerei usar as Confederações BGP - mas isso parece muito trabalho extra para nossa pequena rede. E também li que ele não adiciona saltos de caminho AS entre ASes confederados de qualquer maneira. Então eu provavelmente acabaria no mesmo lugar.
- Eu consideraria usar o MPLS (acho que o MPLS TE?) Mas eu sou muito ecológico no que diz respeito ao MPLS e já tenho muitos desafios pela frente. Por isso, gostaria de evitar a complexidade adicional, a menos que seja uma boa solução para o meu problema.
Vou adicionar mais detalhes amanhã. Por enquanto, aqui está um diagrama que descreve nossa configuração atual.