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.
Respuestas:
Finalmente logré crear una solución de trabajo.
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í:
Se agrega una nueva cadena. Esta cadena contiene todos los pares de IP-MAC permitidos. Se llama 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.
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.
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).
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.
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é.
fuente