Como impedir a falsificação de IP usando MAC e ebtables?

10

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.

Martin
fonte
2
Mas, e se alguém forjar seu mac?
Zoredache
1
Bem, isso também é um problema. Mas adivinhar o par IP-MAC correto é muito difícil e oportuno excede o nível de segurança do meu serviço.
Martin Martin

Respostas:

12

Finalmente consegui criar uma solução funcional.

  1. A solução usa ebtables e pares IP-MAC.
  2. Somente a tabela necessária é a tabela 'filtro' padrão.
  3. Não há necessidade de adicionar regras ou políticas à cadeia INPUT, pois a cadeia INPUT NÃO está relacionada à execução de máquinas virtuais. Explicação do significado das cadeias INPUT, OUTPUT e FORWARD na tabela de filtros está na página de manual do ebtables.
  4. Como o ebtables funciona no nível Ethernet e o emparelhamento IP-MAC é aplicável apenas a pacotes IP, é necessário enfatizar isso nas regras para não bloquear quadros ARP e outro tráfego vital.

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:

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Uma nova corrente é adicionada. Essa cadeia contém todos os pares IP-MAC permitidos. É chamado de VMS.

# ebtables -N 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.

# ebtables -A FORWARD -p ip -i vnet+ -j 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.

# ebtables -P VMS DROP

O filtro da tabela parece agora desta maneira. Além disso, parece que não há máquinas virtuais em execução (permitidas).

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

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.

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

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.

Martin
fonte