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


10

Estoy tratando de crear reglas de emparejamiento IP-MAC en ebtables . Hay pocos tutoriales y preguntas relacionadas [1] disponibles, pero tengo una configuración específica.

ENTORNO: Tengo muchos anfitriones físicos . Cada host tiene pocas tarjetas de ethernet, unidas en enlace y usadas como esclavas para bridge. 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 conexión en red funciona bien, todos los hosts físicos pueden ser fijados, también 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 a otra.

SOLUCIÓN ENCONTRADA: Existe una solución conocida en el sitio de 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 otro MAC que el permitido, el paquete se descarta. Si hay más de un host, requiere que todos los pares de IP-MAC existentes estén registrados en todos los hosts. Hay necesidad de una solución de política inversa.

SOLUCIÓN CREADA: He intentado usar ebtables de manera 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

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

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

Muchas gracias por cualquier respuesta.


2
Pero, ¿qué pasa si alguien falsifica su mac?
Zoredache

1
Bueno, eso también es un problema. Pero adivinar el par correcto de IP-MAC es muy difícil y oportuno excede el nivel de seguridad de mi servicio.
Martin

Respuestas:


12

Finalmente logré crear una solución de trabajo.

  1. La solución utiliza ebtables y pares IP-MAC.
  2. La única tabla necesaria es la tabla predeterminada 'filtro'.
  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 INPUT, OUTPUT y FORWARD en la tabla de filtros se encuentra en la página de manual de ebtables.
  4. Dado que ebtables funciona en el nivel de ethernet y el emparejamiento IP-MAC es aplicable solo para paquetes IP, es necesario enfatizar eso en las reglas para no bloquear tramas ARP y otro tráfico vital.

Por lo tanto, 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 filtro 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 de IP-MAC permitidos. Se llama VMS.

# ebtables -N VMS

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

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

La política predeterminada de la cadena VMS debe ser DROP. De esta manera, cada paquete IP que proviene de cualquier máquina virtual se descarta de forma predeterminada. Más tarde, se agregan las excepciones de pares IP-MAC permitidas. La política predeterminada DROP hace que todo el tráfico de cualquier máquina virtual con un par IP-MAC desconocido se descarte de una vez, lo que hace imposible la suplantación de IP.

# ebtables -P VMS DROP

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

Supongamos que hay dos máquinas en funcionamiento. Si intentamos hacer ping a / desde ellos, el tráfico se cae y el destino es inalcanzable. Este es el resultado deseado, ya que este tráfico aún no se ha permitido. 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 no ser perfecta y si tiene algún comentario o mejora, con gusto lo escucharé.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.