# Open vSwitch

Open vSwitch, abreviado OVS, es un software de código abierto diseñado para ser utilizado como un switch virtual en entornos de servidores virtualizados. Es el encargado de reenviar el tráfico entre diferentes máquinas virtuales (VMs) en el mismo host físico y también reenviar el tráfico entre las máquinas virtuales y la red física. Esta bajo licencia Apache 2.0.

## Introducción

Open vSwitch es un software multicapa para switches cuyo objetivo es la implementación de una plataforma de calidad que soporte interfaces de gestión estándar y que exponga las funciones de forwarding de forma programable. Se puede decir que Open vSwitch es una de las implementaciones más populares de OpenFlow.
Este software está bien adaptado para funcionar como un switch virtual en ambientes implementados con máquinas virtuales. Además de exponer interfaces estándar de control y visibilidad con la capa de red virtual, fue diseñado para soportar una distribución a través de múltiples servidores físicos. Open vSwitch soporta numerosas tecnologías de virtualización basadas en Linux:
* Xen/XenServer: es un monitor de máquinas virtuales de código abierto.
* KVM (Kernel-Based-Virtual Machine): es una solución para implementar virtualización completa Linux.
* VirtualBox: es un software para realizar la virtualización de equipos.
* Proxmox VE: es una solución completa de virtualización de servidores basada en sistemas de código abierto. Permite la virtualización tanto sobre KVM como contenedores y gestiona máquinas virtuales, almacenamiento, redes virtualizadas y clústeres HA.
También se ha integrado en muchos sistemas de gestión virtuales como OpenStack, OpenQRM, OpenNebula y oVirt. Open vSwitch permite más capacidades que los módulos regulares de kernel Linux, aun cuando la ruta de datos está dentro del propio kernel Linux, lo que lo hace ideal para la construcción de esquemas de redes virtuales para nubes o para investigación de nuevos protocolos de red. La mayor parte del código está escrito sobre una plataforma independiente en C y es fácilmente portable a otros entornos.

## Características

La versión actual de Open vSwitch es compatible con las siguientes características:
* Modelo estándar de VLAN 802.1Q con puertos troncales y de acceso.
* NetFLow y sFlow: posibilidad de sacar netflow (paquetes del protocolo NetFlow que sirven para capturar información sobre el tráfico IP) y sFlow (paquetes del protocolo sFlow diseñado para monitorización de interfaces, dispositivos wireless y del equipo anfitrión) entre máquinas virtuales, que pueden ser capturados y analizados. Detectar cualquier anomalía de la red, malware, etc.
* OpenFlow 1.0 o extensiones posteriores.
* SPAN (Switch port Analyzer) y RSPAN ( Remote SPAN ): Nos permite hacer mirroring de un puerto o incluso de un bridge entero, es decir, enviar una copiar de los paquetes vistos en un puerto del swicth (o VLAN entera) a una conexión para la monitorización de red en un puerto del switch y de esta forma poder llevar a cabo el diagnóstico de errores en la red.
* LACP, Bonding (IEE 802.1 AX-2008): permite balancear el tráfico entre varios enlaces, LACP es a nivel de switch exterior (trunking) y el bonding a nivel de máquina virtual.
* STP, del inglés Spanning Tree Protocol (IEEE 802.1D-1998): es un protocolo de red de nivel 2 del modelo OSI. Su función es la gestión de bucles en topologías de red. Los bucles ocurren cuando hay rutas alternativas hacia un mismo destino, necesarias para proporcionar redundancia y ofrecer mayor fiabilidad a la red. Entonces los dispositivos de interconexión de nivel de enlace reenvían indefinidamente las tramas broadcast y multicast, al no existir un campo TTL (tiempo de vida) en las tramas de la capa 2, creando así un bucle infinito que consume el ancho de banda. STP calcula una única ruta libre de bucles entre los dispositivos de la red pero manteniendo los enlaces redundantes desactivados como reserva, con el fin de activarlos en caso de fallo.
* Políticas de tráfico por puerto, firewalling.
* QoS: Para definir niveles de calidad de servicio como disponibilidad, ancho de banda, ratio de error, latencia, priorizar tráfico, etc.
* Protocolos de túnel Múltiples (GRE, VXLAN, IPsec, GRE y VXLAN sobre IPsec): GRE Generic Routing Encapsulation es un protocolo de túnel desarrollado por Cisco Systems que puede encapsular una variedad de protocolos de capa de red dentro de enlaces virtuales punto a punto a través del protocolo IP.
* Soporte para Bidirectional Forwarding Detection (BFD)
* Soporte para HFSC qdisc: es un algoritmo que permite priorizar el tráfico en una red basándose en QoS (calidad de servicio) y CBQ (Class-based quequing o Encolamiento Basado sobre Clases) que permite que el tráfico este organizado por clases y así compartir el ancho de banda (shaping).
* Selección de herramientas para el monitoreo de enlaces 802.1ag CFM, estándar para redes de puentes virtuales y metropolitanas, que define una serie de protocolos y prácticas para operaciones, administración y mantenimiento para puentes y redes locales (LAN).

## Descripción

Open vSwitch dispone de un diseño de mayor complejidad que los "bridges", siendo este compuesto por varios componentes. Mientras que los bridges solo se ejecutan en el espacio del kernel del Host, el Open vSwitch, al necesitar un código más complejo que los bridges para poder proporcionar todas las funcionalidades avanzadas, aparte de hacer uso del espacio del kernel, también se ejecuta en el user space, y así puede tomar la decisión de cómo procesar los “nuevos” paquetes.
Sabemos que el kernel space y el user space son dos separaciones lógicas de la memoria que tienen los Sistemas Operativos, y así poder proteger al sistema de fallos o ataques. En el espacio del kernel se ejecutarían los módulos y los drivers del sistema, mientras que en el espacio de usuarios se encontraría la mayoría del Software. Cuando nos referimos a un paquete "nuevo" queremos decir que es un tipo de paquete perteneciente a un flujo del cual no se ha realizado todavía ninguna decisión de forwarding, y por tanto dicha decisión no puede encontrarse en la caché.
Cuando un paquete de un nuevo flujo llega al Open vSwitch, este realizará una decisión bajo el "user space", pero los sucesivos paquetes de ese flujo serán encaminados directamente por el "kernel space", así es mucho más rápido y por lo tanto mayor rendimiento.

### Componentes

Los principales componentes son:
* Ovs-vswitchd: un demonio que implementa las funcionalidades del switch. (junto con el módulo del kernel openvswitch_mod.ko), con un módulo del núcleo Linux para conmutación basada en flujos. Implementa el comportamiento ante VLANs, el bonding o la monitorización.
Este proceso es el Core del Open vSwitch, y se ha de comunicar con los otros dos componentes. El proceso ovs-vswitchd debe comunicarse con el ovsdb-server para poder guardar y aplicar las configuraciones almacenadas en la base de datos albergada por el servidor ovsdb-server. Esta comunicación se realiza mediante sockets Unix con el protocolo OVSDB. El módulo del kernel openvswitch_mod.ko también debe ser contactado por el demonio ovs-vswitchd para poder tomar decisiones sobre los nuevos flujos que proporciona el kernel. Para ello utiliza el protocolo netlink el cual permite comunicar el espacio del kernel con el del usuario.
* Ovsdb-server: un servidor de base de datos ligero que ovs-vswitchd consulta para obtener su configuración. En la base de datos que gestiona se encuentran todos los parámetros de configuración del Open vSwitch, los cuales se almacenan de forma que dicha información se mantenga tras un reinicio del Host.
Por ejemplo, algunas de las tablas que existen en esa base de datos, las cuales contienen la configuración de sus elementos correspondientes son:
* Open_vSwitch Open vSwitch configuration.
* Bridge Bridge configuration.
* Port Port configuration.
* Interface One physical network device in a Port.
* Flow_Table OpenFlow table configuration
* QoS Quality of Service configuration
* Queue QoS output queue.
* Mirror Port mirroring.
* Controller OpenFlow controller configuration.
* Manager OVSDB management connection.
* NetFlow NetFlow configuration.
* SSL SSL configuration.
* sFlow sFlow configuration.
* IPFIX IPFIX configuration.
* Flow_Sample_Collector_Set Flow_Sample_Collector_Set configuration.
Esta base de datos puede ser modificada desde elementos externos utilizando el protocolo Open vSwitch Database Management Protocol (OVSDB).
* El módulo del kernel openvswitch_mod.ko es quien maneja el packet switching. Ha sido designado para ser muy simple y rápido, por lo que no puede ser modificado mediante Openflow, ni llevar a cabo el borrado de flujos, tan solo maneja una memoria caché en la que le dice que tiene que hacer con cada flujo y, de no saber qué hacer, esté contactará con el proceso ovs-vswitchd mediante netlink para saber qué hacer con él.
* Ovs-brcompatd: un demonio que permite a ovs-vswitchd actuar como un reemplazo momentáneo del bridge de Linux.
* Ovs-dpctl: herramienta para configurar el módulo del kernel del switch.
* Ovs-appctl: es una utilidad que envía comandos para ejecutar los demonios de Open vSwitch.
* OVS-vsctl: es una utilidad para consultar y actualizar la configuración del Ovs-vswitchd.
* Ovs-ofctl: para mostrar los flujos cacheados.
* Ovsdbmonitor: es una herramienta de GUI para la visualización remota de las bases de datos OVS y las tablas de flujo OpenFLow.

### Herramientas

Algunas herramientas que proporciona Open vSwitch:
* Ovs-testcontroller: es un controlador OpenFlow básico útil para pruebas.
* Ovs-pki: es una utilidad para crear y administrar la clave pública de la infraestructura de switches OpenFlow.
* Ovs-ofctl: es una utilidad para consultar y manejar switches y controladores OpenFlow.
* Un parche para tcpdump que le permite analizar los mensajes OpenFlow.
Open vSwitch puede ser portado a diferentes plataformas de hardware y diferentes sistemas operativos. Además se ejecuta en servidores físicos y soporta la administración remota de una manera que hace que así sea más fácil para los desarrolladores de las plataformas de virtualización.
La configuración del Open vSwitch es controlada por un esquema de base de datos organizada en varias tablas, todo realizado en el espacio de usuario (el módulo del kernel se utiliza estrictamente para la transmisión). Esta base de datos es persistente en los reinicios, y está basado en JSON.

### Protocolos gestión externa

Open vSwitch proporciona dos protocolos de gestión externa que están diseñados especialmente para la gestión remota de redes virtualizadas, necesitando el uso de un controlador que centralice la gestión de flujos:
* OpenFlow: es un ejemplo principal de SDN en una arquitectura de red basada en un controlador. La idea sería usar Open vSwitch como una capa de acceso al entorno virtual, tomando instrucciones del controlador que es el que empuja los flujos hacia abajo del vSwitch.
Permite consultar y modificar las tablas de flujos del proceso ovs-vswitchd, haciendo posible que el Software residente en el controller tome decisiones atendiendo a una serie de variables, y "reprograme" dinámicamente el comportamiento del Open vSwitch con este protocolo, para que los paquetes sean reenviados en consecuencia a uno u otro puerto. Por otro lado, el protocolo Openflow permite modificar la tabla de flujos, pero de lo que no es capaz es de cambiar la configuración de un dispositivo, por ejemplo deshabilitando una interfaz, por lo que para todas las gestiones que no estén directamente relacionadas con la modificación de las tablas de flujos se utilizará el protocolo OVSDB.
* OVSDB (Open vSwitch Database Management Protocol): es un componente de Open vSwitch de código abierto diseñado para administrar implementaciones en OVS. protocolo de gestión que expone el estado del puerto del switch.
El protocolo OVSDB management protocol, como se ha visto, permite consultar y modificar la configuración del Open vSwitch, permitiendo un medio de reprogramar las variables de la base de datos interna, realizando de esta manera tareas como por ejemplo:
* Creación y modificación de puertos en OpenFlow.
* Creación de datapaths OpenFlow.
* Configuración de los controllers que gestionan la plataforma.
* Recolección de estadísticas.
* Configuración, modificación y eliminación de túneles.
* Configuración de QoS (Calidad de Servicio).
* Creación, modificación y eliminación de las colas.
Los siguientes son los diferentes métodos de jsonRPC especificados por el protocolo. List_dbs: List databases Get_schema: Get schema Transact: operations on database Cancel: cancel transact request Monitor: monitor certain table columns Update: sent by server to client for tables that are monitored Monitor_cancel: cancelling monitor request Lock, steal, unlock: locking, unlocking operations on database Echo: to check liveliness
Además el método Transact puede hacer distintas operaciones de base de datos como seleccionar, insertar, eliminar, actualizar, etc.

## Ventajas del OVS

Sabemos que Open vSwitch es un sustituto de los “bridges” a la hora de dar conectividad a las máquinas virtuales. Además su funcionamiento, que puede ser a través de un “controller” o “standlone” tiene ciertas ventajas. Las ventajas de este sustituto de los bridges a la hora de dar conectividad a las máquinas virtuales son varias. Algunas de ellas se pueden encontrar en ambos métodos de funcionamiento (standalone y con Controller), mientras que otras son exclusivas de la utilización de flujos programados regidos por Controller.
Incorporan funcionalidades de red similares a los switches Hardware El Open vSwitch, aparte de las funcionalidades L2 y L3, VLAN etiquetadas (por puerto) y agregar enlaces, también administra funcionalidades propias de un switch Hardware configurable, que son las que características compatibles que definíamos anteriormente como pueden ser SPAN/RSPAN, Netflow/sFlow, QoS, Túneles GRE, etc. Las configuraciones de VLANs y agregados se realizan directamente sobre el Open vSwitch, no sobre terceros elementos como pueden ser “bondings”, un bridge por VLAN, etc. Por lo que se asemejan de este modo a los switches Hardware.
OVSDB y Openflow (OVS en modo flujos configurables) Al utilizar Open vSwitch y el Controller SDN, se facilita el responder dinámicamente a la gran tasa de cambios que se producen en la infraestructura de red, modificando la configuración de red. Anteriormente, se ha dicho que el Open vSwitch mantiene la base de datos llamada OVSDB (Open vSwitch Network State Database), la cual contiene toda la información distribuida de la configuración y el estado de los Open vSwitch de una infraestructura. Utilizando esta información que contiene la base de datos podemos hacer triggers de numerosos aspectos de red más allá de los tradicionales, como por ejemplo el movimiento de máquinas virtuales, de modo que las herramientas de dirección puedan conocer el estado de la Cloud y utilizar esa información para modificar, mediante el Controller SDN, el comportamiento de reenvío de paquetes dentro de los flujos con Openflow. También, gracias a la base de datos OVSDB, el estado del puerto de red de una máquina virtual puede ser fácilmente migrado junto con la máquina.
Compatibilidad con Software basado en bridges Cuando Open vSwitch necesitase ser compatible con software´s que están basados en bridges, se tendría que configurar el Open vSwitch de manera que imitara el comportamiento de un “bridge” frente a las VLANs. Así que, tendríamos un “bridge” (puente) por cada VLAN, en lugar de tener un Open vSwitch, en el que cada puerto tiene una configuración propia como si fuese un switch tradicional.
Offloading de procesamiento de paquetes a Hardware Una ventaja añadida de Open vSwitch es que está diseñado para poder realizar el procesamiento en Hardware, es decir, que puede realizar un offloading del procesamiento de paquetes a las NICs de los Host KVMs en los que residen, en lugar de hacerlo por Software, con lo que así se mejora del rendimiento.

## Casos prácticos

A continuación describiremos usos comunes de Open vSwitch en entornos virtuales:
Gestión centralizada: Los interfaces para la configuración centralizada y las notificaciones asíncronas pueden ser utilizadas para crear un único switch lógico sobre varios Open vSwitches ejecutándose en servidores físicos diferentes. Básicamente, un proceso de gestión global abstrae una vista lógica de los switches y su configuración y permite a los administradores operar con esa vista lógica en lugar de con switches individuales. Es responsabilidad de este proceso de gestión el asegurar que cualquier estado de configuración de los switches individuales acoplados a las entidades lógicas se mantenga estable, como la unión, salida, y migración de VMs.
Redes privadas virtuales: Un creciente segmento de la virtualización es el "cloud hosting" en el cual, un host ajeno (third part host) alberga máquina virtual de múltiples clientes (inquilinos) . Idealmente, para utilizar mejor el hardware, estos ambientes debe co - localizar los inquilinos en la misma infraestructura física y proporcionar fuertes garantías de aislamiento al mismo tiempo. De la misma manera que un grupo de máquinas físicas pueden estar conectados entre sí a través de una red dedicada, en un entorno virtualizado una colección de máquinas virtuales puede estar conectados entre sí a través de una red privada virtual implementada en la parte superior de una infraestructura de red física compartida. Si todas las máquinas virtuales de un solo arrendatario están en el mismo host físico, o si están en hosts separados donde cada uno dedica una NIC para conectarse a un switch físico aislado, el apoyo a estas redes privadas virtuales es simple. Sin embargo, cuando las máquinas virtuales que comparten una red privada se distribuyen en varios hosts y / o múltiple switches físicos, la capa de red de virtualización debe soportar la creación dinámica de superposición. Open vSwitch soporta túneles de tipo GRE y VLAN.
Mobility between IP subnets: Una limitación bien sabida por las plataformas de virtualización comerciales de hoy en día es que la migración debe ocurrir dentro de una misma subred IP. Esto se debe a la imposibilidad de mantener sesiones de transporte TCP si se cambia la dirección del host destino. La migración entre subredes es deseable por varias razones. Por ejemplo si una red tiene problemas de escalamiento en cuanto al número de hosts, Hay diversas formas de conseguir esto con Open vSwitch un proceso de gestión global. La más directa es unir un modelo similar a Mobile IP en el que un Open vSwitch base recibe todos los paquetes dirigidos a una máquina virtual y luego reenvía los paquetes a la verdadera dirección del host usando tunelado. El proceso de gestión global debe manejar reglas de tunelado consistentes en la localización de las máquinas virtuales dentro de la red.