Red Hat Training

A Red Hat training course is available for RHEL 8

Capítulo 25. Introducción al TCP multirruta

Importante

El TCP multirruta se proporciona sólo como una Muestra de Tecnología. Las funciones de la Muestra de Tecnología no son compatibles con los Acuerdos de Nivel de Servicio (SLA) de producción de Red Hat, pueden no ser funcionalmente completas y Red Hat no recomienda su uso para la producción. Estas vistas previas proporcionan un acceso temprano a las próximas características del producto, permitiendo a los clientes probar la funcionalidad y proporcionar comentarios durante el proceso de desarrollo.

Consulte el alcance del soporte de las características de Technology Preview en el Portal del Cliente de Red Hat para obtener información sobre el alcance del soporte de las características de Technology Preview.

El TCP multirruta (MPTCP) es una extensión del Protocolo de Control de Transmisión (TCP). Mediante el Protocolo de Internet (IP), un host puede enviar paquetes a un destino. TCP garantiza la entrega fiable de los datos a través de Internet y ajusta automáticamente su ancho de banda en respuesta a la carga de la red.

Las ventajas de MPTCP son las siguientes:

  • Permite el uso de TCP en dispositivos equipados con dos o más interfaces de red.
  • Permite a los usuarios utilizar simultáneamente diferentes interfaces de red o cambiar sin problemas de una conexión a otra.
  • Mejora el uso de los recursos dentro de la red y la resistencia a los fallos de la misma.

Esta sección describe cómo:

  • crear una nueva conexión MPTCP,
  • utilizar iproute2 para añadir nuevos subflujos y direcciones IP a las conexiones MPTCP, y
  • desactivar MPTCP en el kernel para evitar que las aplicaciones utilicen conexiones MPTCP.

25.1. Preparación de RHEL para habilitar el soporte de MPTCP

Pocas aplicaciones soportan nativamente MPTCP. En su mayoría, los sockets orientados a la conexión y al flujo solicitan el protocolo TCP en la llamada socket() al sistema operativo. Puede habilitar el soporte de MPTCP en RHEL utilizando la herramienta sysctl para los programas que soportan MPTCP de forma nativa. La implementación de MPTCP también está diseñada para permitir el uso del protocolo MPTCP para las aplicaciones que solicitan la llamada IPPROTO_TCP al kernel.

Este procedimiento describe cómo habilitar el soporte de MPTCP y preparar a RHEL para habilitar MPTCP en todo el sistema utilizando un script de SystemTap.

Requisitos previos

Los siguientes paquetes están instalados:

  • kernel-debuginfo
  • kernel-debuginfo-common
  • systemtap
  • systemtap-devel
  • kernel-devel
  • nmap-ncat

Procedimiento

  1. Habilitar los sockets MPTCP en el kernel:

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
  2. Cree un archivo mptcp.stap con el siguiente contenido:

    #! /usr/bin/env stap
    
    %{
    #include <linux/in.h>
    #include <linux/ip.h>
    %}
    
    /* according to [1], RSI contains 'type' and RDX
     * contains 'protocol'.
     * [1] https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S#L79
     */
    
    function mptcpify () %{
        if (CONTEXT->kregs->si == SOCK_STREAM &&
            (CONTEXT->kregs->dx == IPPROTO_TCP ||
             CONTEXT->kregs->dx == 0)) {
                    CONTEXT->kregs->dx = IPPROTO_MPTCP;
                    STAP_RETVALUE = 1;
        } else {
               STAP_RETVALUE = 0;
        }
    %}
    
    probe kernel.function("__sys_socket") {
            if (mptcpify() == 1) {
                    printf("command %16s mptcpified\n", execname());
            }
    }
  3. Sustituye el socket TCP por MPTCP:

    # stap -vg mptcp.stap

    Nota: Utilice Ctrl+C para volver a convertir la conexión a TCP desde MPTCP.

  4. Inicie un servidor que escuche el puerto TCP 4321:

    # ncat -4 -l 4321

  5. Conectar con el servidor e intercambiar tráfico. Por ejemplo, aquí el cliente escribe "Hola mundo" al servidor 5 veces, luego termina la conexión.

    # ncat -4 192.0.2.1 4321
    Hello world 1
    Hello world 2
    Hello world 3
    Hello world 4
    Hello world 5

    Pulse Ctrl+D para salir.

Pasos de verificación

  1. Verifique que MPTCP está habilitado en el kernel:

    # sysctl -a | grep mptcp.enabled
    net.mptcp.enabled = 1
  2. Después de que el script mptcp.stap instale la sonda del kernel, aparecen las siguientes advertencias en la salida del kernel dmesg

    # dmesg
    ...
    [ 1752.694072] Kprobes globally unoptimized
    [ 1752.730147] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module_layout: kernel tainted.
    [ 1752.732162] Disabling lock debugging due to kernel taint
    [ 1752.733468] stap_1ade3b3356f3e68765322e26dec00c3d_1476: loading out-of-tree module taints kernel.
    [ 1752.737219] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module verification failed: signature and/or required key missing - tainting kernel
  3. Una vez establecida la conexión, verifique la salida de ss para ver el estado específico del subflujo:

    # ss -nti '( dport :4321 )' dst 192.0.2.1
    State Recv-Q Send-Q Local Address:Port    Peer Address:Port Process
    
    ESTAB 0      0          192.0.2.2:60874      192.0.2.1:4321
    cubic wscale:7,7 rto:201 rtt:0.042/0.017 mss:1448 pmtu:1500 rcvmss:536 advmss:1448 cwnd:10 bytes_sent:64 bytes_$cked:65 segs_out:6 segs_in:5 data_segs_out:4 send 2758095238bps lastsnd:57 lastrcv:3054 lastack:57 pacing_rate 540361516$bps delivery_rate 413714280bps delivered:5 rcv_space:29200 rcv_ssthresh:29200 minrtt:0.009 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/4bffe73d(id:0) seq:c11f40d6c5337463 sfseq:1 ssnoff:f7455705 maplen:0
  4. Capturar el tráfico mediante tcpdump y comprobar el uso de la subopción MPTCP:

    # tcpdump -tnni interface tcp port 4321
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [S], seq 3420255622, win 29200, options [mss 1460,sackOK,TS val 411 4539945 ecr 0,nop,wscale 7,mptcp capable v1], length 0
    client In  IP 192.0.2.1.4321 > 192.0.2.2.60802: Flags [S.], seq 2619315374, ack 3420255623, win 28960, options [mss 1460 sackOK,TS val 3241564233 ecr 4114539945,nop,wscale 7,mptcp capable v1 {0xb6f8dc721aee7f64}], length 0
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [.], ack 1, win 229, options [nop,nop,TS val 4114539945 ecr 3241564 233,mptcp capable v1 {0xcc58d5d632a32d13,0xb6f8dc721aee7f64}], length 0
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [P.], seq 1:17, ack 1, win 229, options [nop,nop,TS val 4114539945 ecr 3241564233,mptcp capable v1 {0xcc58d5d632a32d13,0xb6f8dc721aee7f64},nop,nop], length 16
    client In  IP 192.0.2.1.4321 > 192.0.2.2.60802: Flags [.], ack 17, win 227, options [nop,nop,TS val 3241564233 ecr 411459945,mptcp dss ack 1105509586894558345], length 0
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [P.], seq 17:33, ack 1, win 229, options [nop,nop,TS val 4114540939 ecr 3241564233,mptcp dss ack 13265586846326199424 seq 105509586894558345 subseq 17 len 16,nop,nop], length 16

    El paquete tcpdump es necesario para ejecutar este comando.

Recursos adicionales