Multipath TCP

Publicado en 'GNU/Linux' por gnox, 7 Ago 2017.





  1. gnox

    gnox Miembro de bronce

    Registro:
    3 Ene 2013
    Mensajes:
    2,137
    Likes:
    844
    Temas:
    72




    Equipos conectados a internet normalmente están, valga la redundancia, conectados a distintas rutas, pero cuando se establece una comunicación entre equipo y equipo solo se usa una ruta, como funciona actualmente TCP. Multipath TCP permite usar distintas rutas entre ambos puntos separando el trafico y uniéndolo en cada extremo sin afectar el comportamiento de la aplicación que use la conexión.
    [​IMG]

    Mas claro con un ejemplo :
    "Tienes 2 proveedores de Internet, normalmente tu equipo usa una tarjeta de red para conectarse a uno o al otro pudiendo usar solo el ancho de banda que provee el que escogiste como activo. El ancho de banda se puede 'sumar/unir' si se usa Bonding que une 2 tarjetas de red en una sola interfaz virtual, pero esta solo te sirve para Download, en algunos casos no aplica por que la aplicación que se usa necesita que la comunicación sea por una sola vía, por lo cual solo serviria para Downloads que no manejen estado tipo Torrent, HTTP, otros downloaders por partes, para Upload se regresa al problema inicial solo se puede usar una de las tarjetas.

    Con Multipath TCP puedes definir un servidor que tenga la conexión mayor (Gbps), conectarse a el y usar tus N proveedores de internet (Mbps) a la vez en tu PC cliente tanto para Download como Upload".

    Multipath todavia se sigue mejorando/modificando en sus especificaciones y hay cierta resistencia en la comunidad Linux por aplicarlo al Mainline ya que es un cambio radical en el network core de Linux. Algunas empresas de seguridad y redes lo ven con mala cara ya que les va ha hacer mas difícil el controlar el trafico o husmear y modificar el contenido ya que tendrían que colaborar entre ellas (caso ISP) para poder tener todas las partes del contenido.

    Actualmente esta implementado por :
    Apple : En Ipad,Iphone multiples antenas 3G,4G, Wifi puedes continuar la comunicación cuando se intercambian entre estas principalmente para Siri, tambien ya agregado a MacOS.

    Tessares : Redes hibridas de Coaxial y DSL donde solo con un dispositivo intermedio hacia el modem hacen uso del MPTCP.

    Gigapath : convenció a Samsung y LG a adaptar el protocolo en algunos modelos de celular para hacer uso de redes Wifi/4G de alta velocidad hacia sus servidores.

    Amazon : algunos servicios AWS estan con multipath activo .

    Ya y? dirán, pues ahí van los pasos para replicar esto :

    Versión pueblo ...

    Configuración de Servidor

    - Debe ser un VPS KVM donde puedan instalar una nueva versión de kernel, en este ejemplo Ubuntu .
    - Instalar Kernel MPTCP
    Código:
    $sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-keys 379CE192D401AB61
    
    #agregamos al final de este archivo las linea subsiguientes
    $sudo vim /etc/apt/sources.list
    deb https://dl.bintray.com/cpaasch/deb jessie main
    $sudo apt-get update
    $sudo apt-get install linux-mptcp
    
    #Reiniciamos y en el menu de grub escogemos el kernel 4.4.70.mptcp
    
    #validamos kernel y si esta activo mptcp
    $uname -a
    Linux umptcp 4.4.70.mptcp
    $sysctl net.mptcp.mptcp_enable
    net.mptcp.mptcp_enabled = 1
    

    Configuración de Cliente

    - Si usas Ubuntu, seguir los mismos pasos de "Instalar kernel MPTCP" de Servidor.
    - Si usas ArchLinux
    Código:
    $pacaur -S linux-mptcp linux-mptcp-header iproute-mptcp
    
    -Conectar aparte de la tarjeta de red activa las interfaces a los otros operadores (sea USB Wifi, celular Tethering via USB, nueva tarjeta de red, etc), dejarlas con IP y gateway activo, wifi conectadas.
    - Configuración de ruteo MPTCP
    Código:
    #En mi caso tengo 2 interfaces : wlp5s0 (ISP 1) y enp0s20u5 (ISP 2)
    #Ver como están configuradas 
    $ip a s
    3: wlp5s0: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 28:b2:bd:0d:b2:6d brd ff:ff:ff:ff:ff:ff
        inet 192.168.8.100/24 brd 192.168.8.255 scope global wlp5s0
           valid_lft forever preferred_lft forever
        inet6 fe80::2ab2:bdff:fe0d:b26d/64 scope link
           valid_lft forever preferred_lft forever
    5: enp0s20u5: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
        link/ether 0a:e3:e1:dc:49:dc brd ff:ff:ff:ff:ff:ff
        inet 192.168.42.27/24 brd 192.168.42.255 scope global enp0s20u5
           valid_lft forever preferred_lft forever
        inet6 fe80::8e3:e1ff:fedc:49dc/64 scope link
           valid_lft forever preferred_lft forever
    
    #Ver como están configuradas las rutas
    $ip r s
    default via 192.168.8.1 dev wlp5s0
    192.168.8.0/24 dev wlp5s0  proto kernel  scope link  src 192.168.8.100
    192.168.8.1 dev wlp5s0  scope link
    192.168.42.0/24 dev enp0s20u5  proto kernel  scope link  src 192.168.42.27
    192.168.42.129 dev enp0s20u5  scope link
    
    #Tomar nota de datos relevantes :de los comandos anteriores
    #IP y Gateway por interfaz
    #wlp5s0        ::IP = 192.168.8.100 , Gateway = 192.168.8.1
    #enp0s20u5 ::IP = 192.168.42.27 , Gateway = 192.168.42.129
    
    #Configuramos MPTCP
    $sudo ip rule add from 192.168.8.100 table 1
    $sudo ip rule add from 192.168.42.27 table 2
    $sudo ip rule
    32764:   from 192.168.42.27 lookup 2
    32765:   from 192.168.8.100 lookup 1
    32766:   from all lookup main
    32767:   from all lookup default
    
    #
    $sudo ip route add 192.168.8.0/24 dev wlp5s0 scope link table 1
    $sudo ip route add default via 192.168.8.1 dev wlp5s0 table 1
    
    #
    $sudo ip route add 192.168.42.0/24 dev enp0s20u5 scope link table 2
    $sudo ip route add default via 192.168.42.129 dev enp0s20u5 table 2
    
    #repetir si hay mas interfaces a otro ISP N.
    
    #en Archlinux si la interfaz al hacer ip a s, muestra NOMULTIPATH activarlo con : 
    $sudo ip link set dev <interfaz> multipath on
    
    -Probamos
    Código:
    $curl http://www.multipath-tcp.org
    Yay, you are MPTCP-capable! You can now rest in peace.
    
    #abrimos otra ventana y ejecutamos para monitorear el trafico : 
    $apt-get install bwm-ng
    $sudo bwm-ng -I wlp5s0,enp0s20u5
      bwm-ng v0.6.1 (probing every 0.500s), press 'h' for help
      input: /proc/net/dev type: rate
      |         iface                   Rx                   Tx                Total
      ==============================================================================
               wlp5s0:           0.00 KB/s            0.00 KB/s            0.00 KB/s
            enp0s20u5:           0.00 KB/s            0.00 KB/s            0.00 KB/s
      ------------------------------------------------------------------------------
                total:          00.00 KB/s           00.00 KB/s           00.00 KB/s
    
    #ejecutamos download del sitio de multipath (Lo mismo se puede probar en el Server KVM)
    $wget  http://multipath-tcp.org/snapshots/mptcp_2016_04_18.tar.gz
    
      bwm-ng v0.6.1 (probing every 0.500s), press 'h' for help
      input: /proc/net/dev type: rate
      /         iface                   Rx                   Tx                Total
      ==============================================================================
               wlp5s0:          585.11 KB/s            4.23 KB/s           589.34 KB/s
            enp0s20u5:          618.50 KB/s           11.98 KB/s           630.48 KB/s
      ------------------------------------------------------------------------------
                total:         1203.61 KB/s           16.22 KB/s          1219.82 KB/s
    
    
    - Hasta aca los equipos que manejan MPTCP se pueden comunicar usando N interfaces, partiendo el trafico entre ellas entre los ISP usado en cada interfaz.
    - Para que el internet pase via MPTCP (Server <-> Cliente) se puede configurar un proxy via ssh-tunneling, en la cual la conexión ssh se partira entre las interfaces.
    Código:
    #En server
    #instalamos un proxy no-caching
    $sudo apt-get install tinyproxy
    
    #modificamos su configuración para que solo escuche en 127.0.0.1
    $sudo vim /etc/tinyproxy/tinyproxy.conf
    Listen 127.0.0.1
    Port 8888
    
    #reiniciamos proxy
    $sudo systemctl restart tinyproxy
    
    #En Cliente
    #ssh tunneling
    $ssh -4 -L 8888:127.0.0.1:8888 <usuarioVPS>@<IPVPS>
    #Y podemos usar tinyproxy como proxy en navegadores apuntando solamente a http://localhost:8888
    #o en forma general si lo ponen como variable de entorno (/etc/profile.d)
    $export http_proxy=http://localhost:8888
    
     
    A Epikurolibre le gustó este mensaje.


  2. JairoQuispe03

    JairoQuispe03 Miembro frecuente

    Registro:
    10 Ene 2017
    Mensajes:
    151
    Likes:
    30
    Temas:
    2
    Interesante video