Estou tentando criar regras de emparelhamento IP-MAC no ebtables . Existem alguns tutoriais e perguntas relacionadas [1] disponíveis, mas eu tenho um tipo de configuração específica.
AMBIENTE: Eu tenho muitos hosts físicos . Cada host possui poucas placas Ethernet, unidas em vínculo e usadas como escravo para bridge. Existem muitas máquinas virtuais em cada host (kvm, qemu, libvirt). Cada máquina virtual é conectada a uma ponte de seu host físico por meio de uma nova porta chamada vnet [0-9] +. Não há NAT. A rede funciona bem, todos os hosts físicos podem ser sibilados, todas as máquinas virtuais também. Cada máquina virtual possui seu próprio endereço IP e endereço MAC.
PROBLEMA: dentro de uma máquina virtual, o endereço IP pode ser alterado para outro.
SOLUÇÃO ENCONTRADA: Existe uma solução conhecida no site ebtables [2], mas essa solução é aplicável quando apenas um host é usado. Ele permite todo o tráfego e, se houver um pacote do IP com outro MAC além do permitido, o pacote será descartado. Se houver mais de um host, será necessário registrar todos os pares IP-MAC existentes em todos os hosts. Há necessidade de solução de política reversa.
SOLUÇÃO ARTESANAL: Tentei usar ebtables de maneira invertida. Aqui está um exemplo do que eu tentei.
EXEMPLO 1
Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
EXEMPLO 2
Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
O principal do que eu quero é ter a política padrão DROP e permitir apenas o tráfego de máquinas virtuais com o par IP-MAC correto implantado em um determinado host. No entanto, essas soluções não funcionam.
PERGUNTA: Como permitir tráfego na ponte apenas para pares IP-MAC especificados de máquinas virtuais em execução e eliminar todos os pares IP-MAC desconhecidos provenientes das portas vnet [0-9] +?
Muito obrigado por todas as respostas.
Respostas:
Finalmente consegui criar uma solução funcional.
Portanto, no início, não há regras e todas as políticas são configuradas para ACEITAR. Não há cadeias definidas pelo usuário. A tabela de filtros fica assim:
Uma nova corrente é adicionada. Essa cadeia contém todos os pares IP-MAC permitidos. É chamado de VMS.
Agora, a parte importante. Para cada quadro que contém pacotes IP (ou suas partes) que atravessam a ponte da porta vnet [0-9] +, aplique a política de cadeia e as regras do VMS em cadeia. Em outras palavras, para cada pacote IP proveniente de qualquer máquina virtual, aplique a cadeia VMS.
A política padrão do VMS da cadeia deve ser DROP. Dessa forma, todos os pacotes IP provenientes de qualquer máquina virtual são descartados por padrão. Mais tarde, exceções de pares IP-MAC permitidas são adicionadas. A política padrão DROP causa que todo o tráfego de qualquer máquina virtual com par IP-MAC desconhecido seja eliminado de uma só vez, impossibilitando a falsificação de IP.
O filtro da tabela parece agora desta maneira. Além disso, parece que não há máquinas virtuais em execução (permitidas).
Suponha que haja duas máquinas em execução. Se tentarmos fazer ping de / para eles, o tráfego será descartado e o destino inacessível. Esse é o resultado desejado, pois esse tráfego ainda não foi permitido. Apenas um comando é suficiente para permitir o tráfego de cada máquina virtual.
Agora, o tráfego das máquinas virtuais permitidas está fluindo bem e a falsificação de IP é impedida.
Esta solução pode não ser perfeita e, se você tiver quaisquer comentários ou melhorias, terei prazer em ouvi-los.
fonte