Roteamento dinâmico avançado com programa externo

5

Eu preciso construir um sistema no qual eu seja capaz de rotear pacotes com base em vários parâmetros, como porta / protocolo etc, que são de alguma forma "normais", mas também em outros aspectos, como tamanho da fila, e outros fatores externos. Meu roteador é composto de duas interfaces internas (802.11) e duas interfaces externas (uma ADSL, uma LTE). Então gostaria de examinar cada pacote através de um programa externo e decidir em qual interface ele deveria ser roteado.

Eu dei uma olhada no iproute2, mas não encontrei nenhum método para passar cada pacote para um programa externo, ou de alguma forma escolha dinamicamente a rota para cada pacote.

Então, a pergunta: qual é a melhor maneira de fazer isso? Já existem ferramentas que vão nessa direção, ou eu devo confiar em algo feito por mim mesmo, e passar o pacote através de ferramentas padrão do Linux?

    
por lbedogni 12.02.2015 / 10:31

3 respostas

7

O Netfilter (iptables) tem módulo de fila para enviar quadros para um programa de espaço do usuário. Bibliotecas para diferentes idiomas ( c , python , perl, etc ...) estão disponíveis para examinar pacotes. Depois de processar um quadro, você retornará um veredicto ACCEPT ou DROP, o quadro original ou modificado e uma opção para definir uma marca.

Meu palpite é que você pode usar a marca para manipular esse pacote de maneira diferente no restante da cadeia do netfilter e alterar uma marca de roteamento para escolher uma tabela de roteamento específica.

Essa seria uma solução mais elegante do que o manuseio de dispositivo de nível muito baixo, mas pode ser um problema de desempenho, dependendo da escolha da implementação do espaço do usuário.

Eu usei isso em outro projeto para modificar quadros DHCP recebidos de um cliente quebrado, mas nunca usei a marca.

    
por 18.02.2015 / 13:30
6

O roteamento do espaço do usuário pode ser obtido apontando uma rota padrão em um dispositivo tun e fazendo com que um programa de espaço do usuário examine cada pacote recebido. É uma abordagem ineficiente e frágil, mas foi feita para funcionar - houve uma implementação do AODVv2 que funcionou dessa maneira, devido a Henning Rogge.

A outra opção, é claro, é implementar seu protocolo de roteamento dentro do kernel - a maioria das implementações do AODV / DYMO / AODVv2 funciona dessa maneira.

Antes de embarcar nesse tipo de tarefa, eu recomendaria considerar cuidadosamente se você precisa tomar decisões de roteamento para cada pacote individual; se possível, uma abordagem melhor é manipular as tabelas de roteamento dinamicamente, deixando o encaminhamento real para o kernel. Um exemplo do que pode ser alcançado usando essa abordagem é dado no presente rascunho . (Disclaimer: Eu sou um co-autor.)

    
por 15.02.2015 / 19:24
0

Que tipo de hardware você está usando? Parece que você pode estar trabalhando em um dispositivo embutido, caso em que você provavelmente deve ir com a opção netfilter. Mas se você tiver mais recursos à sua disposição, você deve considerar o uso de OVS ( link ), que é o padrão de código aberto para software definido networking.

A rede definida por software tem o conceito de "plano de dados" versus "plano de controle". Os pacotes viajam entre switches físicos / virtuais no plano de dados. No plano de controle, seu software envia instruções aos switches sobre como encaminhar pacotes através do plano de dados.

Você pode configurar o OVS em um contêiner e tratá-lo como um comutador ToR (parte superior do roteador) do sistema. Encaminhe todos os pacotes recebidos para o OVS e deixe que ele decida o que fazer com eles. Seu software envia instruções de fluxo aberto para o switch.

Aqui estão alguns recursos para você começar:

  • Blog sobre containers / ovs, de um colaborador chefe da LXC:
  • Tutorial para pox, uma API python para programação openflow:
  • Tutorial para configurar um laboratório de teste usando mininet e regras simples de fluxo aberto:

Boa sorte!

    
por 20.02.2015 / 17:02