O roteador que nunca pode transportar um pacote
Três protocolos de estado de enlace, três formas diferentes de entrar numa rede e ser inútil para ela de propósito
Michel Wijnberg
O artigo dois argumentou que o Osprey não toca na sua rede. Esta série é o nível abaixo daquela afirmação: como cada protocolo é de fato acessado, o que cada um se recusa a entregar, e onde ser um convidado bem-educado acaba sendo mais difícil do que parece.
Comece pelo requisito mais duro, porque todo o resto decorre dele.
Para ler uma base de dados de estado de enlace é preciso estar dentro dela. Não ao lado, não consultando: uma adjacência real, trocando LSAs reais, aparecendo na base de todo mundo como um roteador. Não existe modo observador em OSPF nem em IS-IS. Ou você entra ou não obtém nada.
E no instante em que você entra, cada roteador da área roda caminho mais curto sobre um grafo que agora contém você. Ninguém perguntou se você queria o tráfego.
Então o requisito é:
Seja um roteador plenamente conforme. Nunca seja selecionado como caminho.
Os dois estão em tensão por projeto, e os três protocolos resolvem isso de forma diferente.
OSPFv2: o custo máximo
A RFC 2328 exige que um roteador OSPFv2 origine um Router-LSA para cada área em que participa. Não há adjacência apenas-observador de reserva: participar significa ser descrito. Então o gravador origina um, anunciando seu único enlace ponto a ponto com custo 65535, o máximo que uma métrica de 16 bits comporta.
Todos os outros roteadores da área rodam Dijkstra incluindo devidamente aquele enlace, e qualquer caminho alternativo vence. O gravador está no grafo, visível, conforme, e nunca num caminho mais curto a menos que a rede realmente não tenha mais nada, e nesse caso você tem problemas maiores que o seu monitoramento.
Esse é todo o mecanismo em OSPFv2, e vale notar o que ele não é. Não é uma flag dizendo “não me usem”. É uma métrica comum ajustada tão alto que a resposta cai sozinha do algoritmo normal. Roteadores conformes não precisam de tratamento especial, porque nada de especial está acontecendo.
Há uma segunda metade que custou uma queda para ser aprendida, e é a mais interessante. O gravador anuncia o enlace ponto a ponto e nada mais, em particular não a rede stub da sub-rede interna do próprio túnel GRE. Anunciar isso, mesmo a custo máximo, faz com que todos os outros roteadores instalem uma rota para o prefixo do túnel. Essa rota pode então dirigir os próprios pacotes externos do túnel, o que mata a adjacência que carregava a observação. O monitoramento quebra justamente aquilo de que precisa para monitorar. O artigo sete conta a versão dessa história em que eu descobri do jeito difícil.
Custo máximo mantém você fora do caminho mais curto. Não mantém você fora da tabela de rotas, e esses são problemas diferentes.
OSPFv3: o mesmo, mais um bit que diz isso abertamente
OSPFv3 herda o truque da métrica e então acrescenta algo para o qual OSPFv2 não tem equivalente.
OSPFv3 carrega um bit R nas opções do Router-LSA (RFC 5340). Quando o bit está zerado, o roteador anunciante não é considerado capaz de encaminhar tráfego de trânsito. Ele continua participando da distribuição de topologia; simplesmente não é elegível como nó de trânsito.
Isso não é uma métrica. É uma declaração, então o gravador deixa o bit R zerado, e um roteador OSPFv3 conforme o exclui inteiramente do cálculo de trânsito em vez de apenas colocá-lo em último.
A diferença importa mais do que parece. Uma métrica máxima é uma afirmação sobre preferência que por acaso é decisiva. Um bit R zerado é uma afirmação sobre capacidade, e não pode ser derrubada por uma topologia em que todos os outros caminhos são piores.
Isso também fecha um ciclo do lado da leitura. O próprio SPF do Osprey honra esse mesmo bit por meio de uma flag de não-trânsito por área, de modo que um gravador é excluído do trânsito pelos roteadores conformes e pelo próprio cálculo de caminhos do Osprey, pela mesma razão declarada. Duas implementações, um bit, nenhum caso especial em nenhuma delas.
OSPFv2 simplesmente não tem onde pôr essa frase. O campo de opções não tem equivalente, então v2 fica com a métrica e só com a métrica, e a assimetria é uma propriedade dos protocolos e não do esforço gasto neles.
IS-IS: duas portas e um ferrolho
IS-IS tem o mecanismo isolado mais forte e, nesta implementação, a maior redundância em volta.
O LSP autooriginado ativa o bit de sobrecarga. A ISO 10589 é inequívoca sobre o que isso significa: outros roteadores podem alcançar este sistema, mas não devem calcular caminhos através dele. É a mesma classe de afirmação que o bit R do OSPFv3, e o antecede por muito.
Depois mais dois, e não são a mesma coisa:
| Campo | Valor | O que impede |
|---|---|---|
| Bit OL | ativado | ser calculado como nó de trânsito |
| Bits ATT | 0000 | ser instalado como gateway padrão |
| Métrica do TLV 22 | 0xFFFFFF | qualquer coisa que trate o bit de sobrecarga como sugestão |
A linha do ATT merece seu lugar porque fecha uma porta diferente. O bit de sobrecarga é sobre cálculo de caminhos. O bit attached é sobre roteamento padrão: um roteador L1L2 o ativa para dizer aos roteadores de nível 1 que consegue alcançar fora da área, e esses roteadores então apontam uma rota padrão para ele. Isso não é um caminho sendo calculado através do gravador, é cada pacote sem melhor correspondência sendo enviado a ele, o que é pior e chega por uma via que o primeiro mecanismo não cobre.
A linha da métrica é pura defesa. Uma métrica de 24 bits de 16.777.215 faz o truque do OSPFv2 debaixo de um mecanismo que já deveria torná-lo desnecessário, na suposição de que em algum lugar existe uma implementação tratando o bit de sobrecarga como sugestão.
(O LSP também zera o bit de reparo de partição, o que é genuinamente menor e mencionado apenas para que ninguém precise se perguntar por que ele está ali.)
É o argumento inteiro numa tabela. Os gravadores estão dentro da base de dados, com os seus próprios LSA e os seus próprios números de sequência, tal como qualquer outro router. Uma ligação cada um, sem marcas, nada para redistribuir. O modelo de segurança não é o que os mantém de fora; é o que torna inofensivo estar dentro.
O que o título não afirma
Vale separar antes de seguir, porque o título exagera se você o ler como afirmação sobre a máquina.
Nada acima torna o host fisicamente incapaz de encaminhar. No gravador do laboratório
acontece de ele ser incapaz, porque net.ipv4.ip_forward é 0 e o equivalente IPv6
também. Mas isso é uma configuração de host. Alguém pode mudar em um comando, e nada na
camada de protocolo notaria.
Então o requisito não é “esta caixa não consegue encaminhar um pacote”. É:
Nenhum cálculo de roteamento em lugar algum da rede pode selecionar esta caixa como nó de trânsito.
A diferença está em onde a garantia mora. Se a inocuidade do gravador dependesse de um
sysctl, então todo operador que implantasse um estaria a um sysctl -w de colocar um host
de monitoramento no caminho de encaminhamento, e a rede não faria ideia. Como ela depende
da topologia, o próprio cálculo de caminho mais curto da rede se recusa a rotear pelo
gravador, tivesse o kernel encaminhado ou não.
O sysctl é um bom cinto. É só a coisa mais fraca deste artigo, e a próxima seção é exatamente sobre esse gradiente.
Aquele que é um padrão e não um invariante
Os três gravadores também rodam com prioridade de eleição de DR igual a zero, então nunca podem se tornar roteador designado de um segmento. Um gravador que vencesse uma eleição de DR viraria aquilo de que todos os outros roteadores do segmento dependem para inundação, o que é o oposto de toda a premissa.
Prioridade zero é o padrão, e quero ser preciso sobre que tipo de proteção isso é: é um campo de configuração. Nada no código recusa um valor mais alto. Ajuste-o e o gravador disputará a eleição como qualquer outro roteador.
Vale separar isso do resto do artigo, porque tudo acima é uma constante em código. O bit de
sobrecarga é OLBit: true no ponto de originação, sem jeito de desligá-lo por
configuração. A métrica OSPFv2 é 65535 no construtor de LSA. O bit R nunca é ativado.
Esses são invariantes. A prioridade de DR é um padrão, e padrões são a classe de segurança
que sobrevive exatamente enquanto ninguém editar um arquivo YAML.
Tornar o erro indisponível
O que me leva à parte com que eu de fato me importo.
Impedir trânsito é um problema de preferência. Impedir injeção é um problema de correção, e é muito pior, porque o modo de falha não é um caminho subótimo. É uma rota na tabela de outra pessoa que não corresponde a nada.
O LSP IS-IS autooriginado, portanto, não carrega alcançabilidade IP alguma. Nenhum TLV 128, 130, 135 ou 236. Nenhum TLV 134 de router-id de engenharia de tráfego, que colocaria o gravador na base TE. Nenhum TLV 222, nenhum TLV 242.
A forma como isso é imposto é o ponto. A rotina de originação toma sua entrada de uma pequena struct de configuração contendo um nível, um identificador de sistema, um endereço de área, um identificador de sistema do par, um número de sequência, um endereço de interface e um autenticador opcional. Não há nela campo algum capaz de conter um prefixo. Quem chama não consegue passar uma rota, porque não há onde passar uma.
Quero ser exato sobre o limite disso, porque é tentador afirmar mais. O LSP em construção guarda uma lista genérica de TLVs, e a rotina acrescenta a ela. Alguém editando essa rotina poderia acrescentar um TLV de alcançabilidade; o sistema de tipos não faria objeção. O que o projeto remove não é a possibilidade, é o acidente: nenhuma configuração, nenhum chamador e nenhuma combinação de ajustes consegue introduzir uma rota. Injetar uma exige editar uma função cujo bloco de documentação lista os invariantes para os quais ela existe.
Essa distinção é toda a diferença entre as duas metades deste artigo, e a esta altura há quatro degraus em jogo. Uma configuração de host é algo que um operador pode mudar sem jamais saber o que ela protegia. Uma verificação em tempo de execução é algo que você pode esquecer de escrever. Um padrão é algo que você pode sobrescrever sem perceber. Uma superfície de entrada sem lugar onde pôr o erro é algo que você tem de se esforçar para derrotar, e esse esforço é visível num diff.
Nenhum deles é absoluto. São apenas quantidades muito diferentes de acidental, e a engenharia que vale a pena é mover uma garantia para baixo nessa lista em vez de acrescentar mais uma verificação no topo.
O ponto
Três protocolos, três mecanismos, um requisito, e os mecanismos não são intercambiáveis. OSPFv2 só consegue expressar “caro”. OSPFv3 e IS-IS conseguem expressar “não sou um roteador de trânsito”, que é algo mais forte e mais honesto de dizer, e o expressam em bits que antecedem tudo isso em décadas.
A engenharia interessante não foi escrever a drenagem. Foi notar que custo máximo não mantém você fora de uma tabela de rotas, que um padrão não é um invariante, e que o lugar mais seguro para uma regra é onde a regra não pode ser expressa errado.
A seguir: partir. Um gravador que reinicia encontra a rede ainda segurando seu eu anterior com um número de sequência mais alto, e a mensagem que conserta isso é a que ele envia enquanto desliga. O LSA que você não pode retirar.