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

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

Estou tentando criarIP MACregras de emparelhamento emtabelas de débito. Existem poucos tutoriais e questões relacionadas [1] disponíveis, mas tenho uma configuração específica.

AMBIENTE: Eu tenhomuitos hosts físicos. Cada host possui poucas placas Ethernet, unidas em vínculo e usadas como escravos para ponte. Existem muitas máquinas virtuais em cada host (kvm, qemu, libvirt). Cada máquina virtual está 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 receber ping, e 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 esta solução é aplicável quando apenas um host é usado. Permite todo o tráfego e se houver um pacote de IP com outro MAC que não o permitido, o pacote é descartado. Se houver mais de um host, será necessário que todos os pares IP-MAC existentes sejam registrados em todos os hosts. Há necessidade de uma solução de política reversa.

SOLUÇÃO CRIADA:Eu 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 núcleo 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 determinado host. No entanto, essas soluções não funcionam.

PERGUNTA:Como permitir o 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 qualquer resposta.

Responder1

Finalmente consegui criar uma solução funcional.

  1. A solução usa ebtables e pares IP-MAC.
  2. A única tabela necessária é a tabela de 'filtro' padrão.
  3. Não há necessidade de adicionar nenhuma regra ou política à cadeia INPUT, pois a cadeia INPUT NÃO está relacionada à execução de máquinas virtuais. A 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 para pacotes IP, é necessário enfatizar isso nas regras para não bloquear frames ARP e outros tráfegos vitais.

Então, no início, não existem regras de qualquer tipo 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 cadeia é adicionada. Esta cadeia contém todos os pares IP-MAC permitidos. É chamado de VMS.

# ebtables -N VMS

Agora, a parte importante. Para cada quadro contendo pacote IP (ou suas partes) que passa pela ponte da porta vnet[0-9]+, aplique a política de cadeia e as regras do VMS de 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 em cadeia deve ser DROP. Dessa forma, todo pacote IP proveniente de qualquer máquina virtual é descartado por padrão. Posteriormente, são adicionadas exceções de pares IP-MAC permitidos. A política padrão DROP faz com que todo o tráfego de qualquer máquina virtual com par IP-MAC desconhecido seja descartado de uma só vez, impossibilitando a falsificação de IP.

# ebtables -P VMS DROP

O filtro da tabela agora fica assim. Além disso, fica assim quando não há máquinas virtuais em execução (permitido).

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á interrompido e o destino ficará inacessível. Este é o resultado desejado, pois o 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 é evitada.

Esta solução pode não ser perfeita e se você tiver algum comentário ou melhoria, terei prazer em ouvi-lo.

informação relacionada