Cómo configurar MPLS con tc en el kernel de Linux

La conmutación de etiquetas multiprotocolo (MPLS) es una técnica de enrutamiento de telecomunicaciones que utiliza etiquetas para dirigir datos entre nodos. Es compatible con la pila de red de Linux y se han escrito muchos artículos y tutoriales sobre cómo configurarlo con ip route. Sin embargo, también puede administrar MPLS en un nivel inferior con tc.

Las implementaciones reales suelen utilizar software de plano de control para configurar MPLS de forma dinámica. Sin embargo, es útil poder ejecutar tc comandos manualmente para aprender, experimentar y probar la funcionalidad del kernel de Linux.

Este artículo explica cómo hacer coincidir diferentes campos en encabezados MPLS con tc-flower, cubre las diferentes acciones MPLS que tc admite agregar, modificar o eliminar encabezados MPLS y, finalmente, muestra cómo encapsular MPLS en el Protocolo de datagramas de usuario (UDP).

Todos los comandos se basan en Linux v5.14 e iproute2 v5.10.0 (puede usar una versión de iproute2 anterior al kernel porque v5.10.0 implementa todas las funciones necesarias de Netlink). Además, el próximo Red Hat Enterprise Linux (RHEL) 8.5 tendrá estas funciones como una vista previa técnica. Los administradores del sistema deberán instalar el kernel-modules-extra paquete.

Índice

    ¿Qué es MPLS?

    Por lo general, un encabezado MPLS viene justo después de un encabezado Ethernet. Se compone de una o más entradas de pila de etiquetas (LSE). Un LSE se codifica de la siguiente manera (diagrama cortesía de RFC 5462):

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Label
     |                Label                  | TC  |S|       TTL     | Stack
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Entry
    
                         Label:  Label Value, 20 bits
                         TC:     Traffic Class field, 3 bits
                         S:      Bottom of Stack, 1 bit
                         TTL:    Time to Live, 8 bits
    

    La última LSE tiene la S poco asentado. El tipo de encabezado que sigue a la última LSE se deduce de su etiqueta (generalmente IP o Ethernet). Las etiquetas sólo tienen significado local.

    Haga coincidir paquetes MPLS con tc-flower

    A qdisco es un programador y "el bloque de construcción principal sobre el que se construye todo el control de tráfico de Linux". La mayoría de los ejemplos de este artículo se aplican a la qdisc de entrada eth0. Cree este qdisc de entrada:

        tc qdisc add dev eth0 ingress
    

    Este comando muestra cómo hacer coincidir los diferentes campos del primer LSE (el que está en la parte superior de la pila):

        tc filter add dev eth0 ingress protocol mpls_uc          
          flower mpls_label 100 mpls_tc 2 mpls_bos 1 mpls_ttl 64 
          action drop
    

    Encima:

    • desarrollador eth0: El dispositivo de red al que se aplica esta regla
    • Entrada: Aplicar esta regla en el qdisc de entrada (paquetes entrantes)
    • protocolo mpls_uc: Hacer coincidir paquetes MPLS
    • flor: Nombre del clasificador utilizado para el emparejamiento (el mpls_* los siguientes parámetros son específicos de este clasificador)
    • etiqueta_mpls 100: Coincide solo si el primer LSE tiene la etiqueta 100
    • mpls_tc 2: Coincide solo si el primer LSE tiene tráfico de clase 2
    • mpls_bos 1: coincide solo si el primer LSE tiene establecido el bit S (es decir, el encabezado MPLS contiene exactamente un LSE)
    • mpls_ttl64: Coincide solo si la primera LSE tiene TTL 64
    • caída de acción: elimina los paquetes que coinciden con este filtro

    Aquellos mpls_* los parámetros solo pueden coincidir con el primer LSE. Para una coincidencia más allá de la primera LSE, puede usar su sintaxis más expresiva con el lse palabra clave:

        tc filter add dev eth0 ingress protocol mpls_uc 
          flower mpls lse depth 1 label 100 tc 2 ttl 64 
                      lse depth 2 label 101 bos 1       
          action drop
    

    Encima:

    • mpls: Presenta una lista de LSE para hacer coincidir
    • lse: Introduce un LSE para que coincida
    • profundidad 1: Foco en el primer LSE
    • etiqueta 100: coincide solo si la LSE actual tiene la etiqueta 100
    • tc 2: Coincide solo si el LSE actual tiene tráfico de clase 2
    • ttl64: Coincide solo si la LSE actual tiene un TTL 64
    • jefe 1: coincide solo si el LSE actual tiene el bit S establecido

    Este filtro descarta paquetes MPLS donde el primer LSE tiene una etiqueta 100, Clase de tráfico 2y TTL 64 y le sigue exactamente un LSE con la etiqueta 101 (independientemente del valor de sus bits TC y TTL).

    el bos 1 La opción hace que el filtro coincida solo con los paquetes que tienen exactamente dos LSE. No es necesario agregar un bos 0 opción para la primera LSE: Tener otra LSE con depth 2 significa que solo considera paquetes MPLS que tienen al menos dos LSE.

    el depth la opción es obligatoria para cada lse. De lo contrario, el filtro no sabría en qué LSE trabajar. el label, tc, bos, y ttl los parámetros son opcionales. Omitirlos significa que cualquier valor coincidirá.

    El siguiente filtro elimina todos los paquetes MPLS que tienen una pila de al menos tres LSE:

        tc filter add dev eth0 ingress protocol mpls_uc 
          flower mpls lse depth 3                       
          action drop
    

    Otra forma de verlo es que el filtro hace coincidir (y elimina) cada paquete MPLS donde encuentra un LSE en profundidad. 3.

    Para hacer coincidir paquetes con exactamente tres LSE, agregue el bos 1 opción:

        tc filter add dev eth0 ingress protocol mpls_uc 
          flower mpls lse depth 3 bos 1                 
          action drop
    

    Por el contrario, puede utilizar bos 0 para hacer coincidir paquetes con más de tres LSE. Más técnicamente, el filtro coincidiría con los paquetes MPLS donde existe un LSE en profundidad 3, y que LSE no tiene la S poco asentado.

    La profundidad máxima que puede manejar el clasificador de flores es 7.

    Haz acciones simples de MPLS

    Hasta ahora, solo he usado una de las acciones más simples posibles: eliminar paquetes. Ahora presentaré algunas acciones específicas de MPLS.

    Por ejemplo, el siguiente filtro coincide con todos los paquetes IPv6 cuya dirección de destino pertenece a 2001:db8::/32 y encapsula el paquete IP en MPLS con Label 100, Clase de tráfico 2y TTL 64:

        tc filter add dev eth0 ingress protocol ipv6 
          flower dst_ip 2001:db8::/32                
          action mpls push label 100 tc 2 ttl 64
    

    Normalmente no es necesario especificar el bos opción para la nueva LSE, ya que debe inferirse correctamente del tipo de paquete original.

    [ Sign up for this free online course: RHEL technical overview. ]

    También se admite agregar un nuevo LSE encima de los demás:

        tc filter add dev eth0 ingress protocol mpls_uc 
          flower mpls_label 100                         
          action mpls push label 101 tc 3 ttl 64
    

    Este comando empuja una nueva LSE (Label 101, Clase de tráfico 3, TTL 64) por encima de los paquetes MPLS cuyo primer LSE tiene etiqueta 100.

    Otra acción muy común es eliminar el encabezado MPLS:

        tc filter add dev eth0 ingress protocol mpls_uc 
          flower mpls_label 100 mpls_bos 1              
          action mpls pop protocol ipv6
    

    Dado que las etiquetas MPLS solo tienen un significado local, tc y la pila de redes no tiene forma de determinar qué tipo de encabezado sigue al encabezado MPLS. es por eso pop requiere el protocol opción para decirle al núcleo cómo manejar el paquete resultante. el mpls_bos 1 La opción asegura que el LSE que está eliminando es el único en la pila.

    Si hay más LSE después del que desea eliminar, utilice:

        tc filter add dev eth0 ingress protocol mpls_uc flower 
          mpls_label 100 mpls_bos 0                            
          action mpls pop protocol mpls_uc
    

    También puede eliminar varios LSE:

        tc filter add dev eth0 ingress protocol mpls_uc 
          flower                                        
            mpls lse depth 1 label 101                  
                 lse depth 2 label 102                  
                 lse depth 3 label 103 bos 1            
          action mpls pop protocol mpls_uc              
          action mpls pop protocol mpls_uc              
          action mpls pop protocol ipv6
    

    Además de agregar o eliminar LSE, también puede editar la etiqueta más alta con el modify acción:

        tc filter add dev eth0 ingress protocol mpls_uc flower 
          mpls_label 100 mpls_tc 2 mpls_ttl 64                 
          action mpls modify label 101 tc 3
    

    Este comando cambia la etiqueta y la clase de tráfico del primer LSE pero deja el TTL como está.

    Haz acciones MPLS avanzadas

    el push La acción inserta un LSE justo después del encabezado de Ethernet. Pero a veces se usa MPLS para encapsular paquetes con su cabecera Ethernet. el mac_push acción fue desarrollada para este caso de uso. se comporta como push pero agregue el LSE antes del encabezado MAC (generalmente Ethernet) en lugar de después. Es importante tener en cuenta que después de aplicar el mac_push acción, el paquete no tiene ningún encabezado MAC ya que ahora comienza con un encabezado MPLS (el encabezado MAC original ahora es solo una carga útil). Por lo tanto, también debe enviar un nuevo encabezado de Ethernet. Esto es lo que push_eth la acción sí: toma las direcciones MAC de origen y destino como parámetros, pero no Ethertype, porque el kernel lo configura automáticamente. Se parece a esto:

        tc filter add dev eth0 ingress                   
          matchall                                       
          action mpls mac_push label 200 ttl 64          
          action vlan push_eth dst_mac 00:00:5e:00:53:01 
                               src_mac 00:00:5e:00:53:00 
          action mirred egress redirect dev eth1
    

    Este comando encapsula todos los paquetes que llegan a eth0, incluido su encabezado Ethernet, en MPLS (con etiqueta 200 y TTL 64), luego agrega un encabezado Ethernet externo y finalmente reenvía el paquete resultante en eth1.

    [ Plan your path to network automation. Download the free eBook Network automation for everyone. ]

    La operación inversa requiere eliminar el encabezado Ethernet externo y el encabezado MPLS. el pop_eth La acción se encarga de la parte de Ethernet. Para MPLS, puede utilizar el mpls pop acción, con protocolo teb (Puente Ethernet transparente) para indicar al núcleo que lo siguiente es un encabezado Ethernet:

        tc filter add dev eth0 ingress protocol mpls_uc 
          flower mpls_label 200 mpls_bos 1              
          action vlan pop_eth                           
          action mpls pop protocol teb                  
          action mirred egress redirect dev eth1
    

    Este filtro coincide con los paquetes MPLS entrantes en eth0 con etiqueta 200, luego elimine el encabezado Ethernet externo, elimine el encabezado MPLS (sabe que solo hay un LSE para mostrar como especificó mpls_bos 1), y finalmente transfiere el paquete resultante a eth1.

    Tenga en cuenta que el pop_eth La acción requiere que el paquete no tenga un encabezado de VLAN. Si el encabezado Ethernet externo tiene VLAN, primero deberá eliminarlas junto con algunas vlan pop acciones antes vlan pop_eth una.

    Encapsular MPLS en UDP

    Para encapsular MPLS en UDP, primero cree un bareudp dispositivo:

        ip link add name bareudp0 up type bareudp dstport 6635 ethertype mpls_uc
    

    Explicaciones:

    • nombre bareudp0: Nombre del nuevo dispositivo
    • en alto: Hacer que el nuevo dispositivo se pueda usar de inmediato
    • tipo bareudp: El nuevo tipo de dispositivo (los siguientes argumentos son específicos para este tipo de dispositivo)
    • puerto de salida 6635: El puerto UDP utilizado (6635 es el puerto asignado por la IANA para MPLS a UDP)
    • ethertype mpls_uc: MPLS no es el único protocolo compatible con desnudo, por lo tanto, debe indicar explícitamente qué protocolo gestiona este dispositivo

    Actualmente, bareudp funciona solo en modo externo (aunque la palabra clave "externo" no se pasa explícitamente en el parámetro). Un dispositivo virtual externo no tiene toda la información necesaria para crear los encabezados externos; estos deben adjuntarse a cada paquete como metadatos. Es lo que tc's tunnel_key la acción es para:

        tc filter add dev eth0 ingress protocol mpls_uc matchall  
          action tunnel_key set src_ip 192.0.2.1 dst_ip 192.0.2.2 
          action mirred egress redirect dev bareudp0
    

    Aquí el tunnel_key set La acción adjunta las direcciones IP externas de origen y destino como metadatos a cada paquete que coincida con el filtro (es decir, todos los paquetes MPLS recibidos en eth0). La segunda acción simplemente redirige los paquetes a la virtual bareudp0 dispositivo, que construye los encabezados externos en función de su propia configuración (para puertos UDP) y metadatos de paquetes (para direcciones IP), y finalmente enruta los paquetes resultantes a su destino.

    También es posible aplicar filtros en el bareudp dispositivo. El siguiente comando elimina el encabezado MPLS si la etiqueta es 200 y transferir el paquete a eth1, asumiendo que la carga útil es un paquete Ethernet. Este es el mismo filtro que en la sección anterior pero adaptado para trabajar en un bareudp dispositivo en lugar de un Ethernet:

        tc qdisc add dev bareudp0 ingress
        tc filter add dev bareudp0 ingress protocol mpls_uc 
          flower mpls_label 200 mpls_bos 1                  
          action mpls pop protocol teb                      
          action mirred egress redirect dev eth1
    

    Aquí no es necesario eliminar un encabezado MAC ya que el encabezado MPLS sigue directamente a UDP y es el primer encabezado que ve el bareudp dispositivo.

    Si el protocolo que sigue al encabezado MPLS es IP, debe insertar un encabezado Ethernet antes de reenviar el paquete:

        tc filter add dev bareudp0 ingress protocol mpls_uc 
          flower mpls_label 200 mpls_bos 1                  
          action mpls pop protocol ipv6                     
          action vlan push_eth dst_mac 00:00:5e:00:53:01    
                               src_mac 00:00:5e:00:53:00    
          action mirred egress redirect dev eth1
    

    Aprende más

    Bien tc Puede ser intimidante al principio, tiene un amplio conjunto de funciones que se pueden combinar para crear una ruta de datos MPLS potente.

    Puede encontrar más información en los siguientes documentos: enlace IP (8), tc (8), tc-flor (8), tc-matchall (8), tc-mirred (8), tc-mpls (8), tc-tunnel_key (8), y tc-vlan (8).

    Artículos de interés

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada.

    Subir