¿Cómo prevenir la suplantación de IP mediante MAC y ebtables?

¿Cómo prevenir la suplantación de IP mediante MAC y ebtables?

estoy tratando de crearIP-MACreglas de emparejamiento enebtables. Hay algunos tutoriales y preguntas relacionadas [1] disponibles, pero tengo una configuración específica.

AMBIENTE: Tengomuchos anfitriones físicos. Cada host tiene algunas tarjetas Ethernet, unidas y utilizadas como esclavas para el puente. Hay muchas máquinas virtuales en cada host (kvm, qemu, libvirt). Cada máquina virtual está conectada a un puente de su host físico a través de un nuevo puerto llamado vnet[0-9]+. No hay NAT. La red funciona bien, se puede hacer ping a todos los hosts físicos, también a todas las máquinas virtuales. Cada máquina virtual tiene su propia dirección IP y dirección MAC.

PROBLEMA:Dentro de una máquina virtual, la dirección IP se puede cambiar por otra.

SOLUCIÓN ENCONTRADA:Existe una solución conocida en el sitio ebtables [2], pero esta solución es aplicable cuando solo se utiliza un host. Permite todo el tráfico y si hay un paquete de IP con otra MAC distinta a la permitida, el paquete se descarta. Si hay más de un host, es necesario que todos los pares IP-MAC existentes estén registrados en todos los hosts. Es necesaria una solución de política inversa.

SOLUCIÓN CREADA:He intentado utilizar ebtables de forma invertida. Aquí hay un ejemplo de lo que probé.

EJEMPLO 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

EJEMPLO 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

Lo principal de lo que quiero es tener la política DROP predeterminada y permitir solo el tráfico de máquinas virtuales con el par IP-MAC correcto implementado en un host determinado. Sin embargo, esas soluciones no funcionan.

PREGUNTA:¿Cómo permitir el tráfico en el puente solo para pares IP-MAC específicos de máquinas virtuales en ejecución y eliminar todos los pares IP-MAC desconocidos que provienen de los puertos vnet[0-9]+?

Muchas gracias por cualquier respuesta.

Respuesta1

Finalmente logré crear una solución que funcione.

  1. La solución utiliza ebtables y pares IP-MAC.
  2. La única tabla necesaria es la tabla de 'filtro' predeterminada.
  3. No es necesario agregar ninguna regla o política a la cadena INPUT, ya que la cadena INPUT NO está relacionada con la ejecución de máquinas virtuales. La explicación del significado de las cadenas de ENTRADA, SALIDA y ADELANTE en la tabla de filtros se encuentra en la página de manual de ebtables.
  4. Dado que ebtables funciona a nivel de Ethernet y el emparejamiento IP-MAC es aplicable sólo para paquetes IP, es necesario enfatizar esto en las reglas para no bloquear tramas ARP y otro tráfico vital.

Entonces, al principio, no hay reglas de ningún tipo y todas las políticas están configuradas para ACEPTAR. No hay cadenas definidas por el usuario. La tabla de filtros se ve así:

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

Se agrega una nueva cadena. Esta cadena contiene todos los pares IP-MAC permitidos. Se llama VMS.

# ebtables -N VMS

Ahora, la parte importante. Para cada trama que contenga un paquete IP (o sus partes) que pase por el puente desde el puerto vnet[0-9]+, aplique la política de cadena y las reglas de VMS en cadena. En otras palabras, para cada paquete IP proveniente de cualquier máquina virtual, aplique la cadena VMS.

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

La política predeterminada de VMS en cadena debe ser DROP. De esta manera, todos los paquetes IP provenientes de cualquier máquina virtual se descartan de forma predeterminada. Posteriormente, se agregan excepciones de pares IP-MAC permitidos. La política predeterminada DROP provoca que todo el tráfico de cualquier máquina virtual con un par IP-MAC desconocido se elimine de inmediato, lo que hace imposible la suplantación de IP.

# ebtables -P VMS DROP

El filtro de la tabla ahora se ve de esta manera. Además, se ve así cuando no hay máquinas virtuales en ejecución (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

Supongamos que hay dos máquinas en funcionamiento. Si intentamos hacer ping hacia/desde ellos, el tráfico se corta y el destino es inalcanzable. Este es el resultado deseado, ya que aún no se ha permitido el tráfico. Solo un comando es suficiente para permitir el tráfico 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

Ahora, el tráfico de las máquinas virtuales permitidas fluye correctamente y se evita la suplantación de IP.

Esta solución puede ser imperfecta y si tienes algún comentario o mejora, con gusto los escucharé.

información relacionada