
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[ The Cloudflare Blog ]]></title>
        <description><![CDATA[ Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet. ]]></description>
        <link>https://blog.cloudflare.com</link>
        <atom:link href="https://blog.cloudflare.com/es-es/" rel="self" type="application/rss+xml"/>
        <language>es-es</language>
        <image>
            <url>https://blog.cloudflare.com/favicon.png</url>
            <title>The Cloudflare Blog</title>
            <link>https://blog.cloudflare.com</link>
        </image>
        <lastBuildDate>Fri, 17 Apr 2026 07:52:40 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Sesiones de cliente Zero Trust]]></title>
            <link>https://blog.cloudflare.com/es-es/zero-trust-client-sessions/</link>
            <pubDate>Fri, 18 Mar 2022 13:00:48 GMT</pubDate>
            <description><![CDATA[ A partir de hoy, puedes crear reglas Zero Trust que requieran autenticación periódica para controlar el acceso a la red ]]></description>
            <content:encoded><![CDATA[ <p>A partir de hoy, puedes crear reglas <a href="https://www.cloudflare.com/learning/security/glossary/what-is-zero-trust/">Zero Trust</a> que requieran autenticación periódica para controlar el acceso a la red. Llevamos años ofreciendo esta función para las aplicaciones web, pero nos ilusiona llevar este nivel de aplicación granular a las conexiones TCP y a los flujos UDP.</p><p></p><p>Nos complace anunciar la disponibilidad general de las sesiones de cliente Zero Trust. Durante la CIO Week de 2021, anunciamos el programa beta para esta función. Hemos incorporado los comentarios de los primeros usuarios a la versión disponible para el público general. En esta publicación, volveré a explicar por qué son importantes las sesiones de cliente Zero Trust, cómo funciona la función y lo que hemos aprendido durante la versión beta.</p>
    <div>
      <h3>Cómo proteger el tráfico con sesiones</h3>
      <a href="#como-proteger-el-trafico-con-sesiones">
        
      </a>
    </div>
    <p>Diseñamos las sesiones de cliente Zero Trust para mejorar la seguridad del acceso a la red Zero Trust (ZTNA) de Cloudflare. El cliente Zero Trust es un software que se ejecuta en el equipo de un usuario y reenvía todo el tráfico del equipo a Cloudflare antes de que se envíe por Internet. Esto incluye el tráfico destinado a las direcciones IP y nombres de host internos que suelen albergar aplicaciones empresariales con información confidencial. Tradicionalmente se accedía a estas aplicaciones confidenciales con una VPN. A diferencia de las VPN, la solución ZTNA de Cloudflare permite que los administradores establezcan políticas granulares sobre quién puede acceder a un recurso específico. La única pieza que faltaba era que una vez que un usuario registraba su equipo con el cliente Zero Trust, la sesión se quedaba abierta para siempre. Debido a esto, los portátiles perdidos o robados, las estaciones de trabajo compartidas y los dispositivos personales suponían un riesgo mayor del debido. Creamos sesiones basadas en el cliente Zero Trust para solucionarlo.</p><p>Las sesiones de cliente Zero Trust requieren que el usuario se vuelva a autenticar con su proveedor de identidad antes de poder acceder a determinados recursos. La ventana emergente de autenticación solo se activa cuando un usuario intenta acceder a un recurso protegido. Con esto, se evitan ventanas emergentes innecesarias para los usuarios, en los casos en los que no sea necesaria una sesión. Los administradores pueden especificar la frecuencia con la que quieren que sus usuarios se vuelvan a autentificar, en función del recurso. Esto es posible porque se guarda la última autenticación correcta del usuario, y se evalúa con respecto a cualquier política de ZTNA con una sesión configurada.</p>
    <div>
      <h3>Lo que hemos aprendido durante la versión beta</h3>
      <a href="#lo-que-hemos-aprendido-durante-la-version-beta">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7wEzf3RR9myNQR8FxML1iK/1b32ade28d71a11a537bf70bd0481ff3/image1-76.png" />
            
            </figure><p>Durante la versión beta de las sesiones de cliente Zero Trust, hemos trabajado estrechamente con nuestros clientes y con el propio equipo de seguridad de Cloudflare para identificar las áreas que necesitaban una mejora inmediata. Identificamos dos áreas principales de mejora antes de abrirlo al público general: las ventanas emergentes, que pueden llegar a ser molestas, y la autenticación basada en el navegador, que no siempre es posible. Identificamos nuevas estrategias para servir correctamente una ventana emergente de autenticación a un usuario sin que fuera demasiado molesta. En el futuro, los usuarios podrán controlar cuándo reciben las notificaciones para autenticarse. La otra área de mejora era que, en ciertos equipos y sistemas operativos, la autenticación basada en el navegador no siempre era posible. Tenemos planeado añadir una opción para autenticar directamente desde el propio cliente Zero Trust.</p>
    <div>
      <h3>¿Y ahora qué?</h3>
      <a href="#y-ahora-que">
        
      </a>
    </div>
    <p>Esto es solo el comienzo de la autenticación basada en el cliente Zero Trust. En el futuro, tenemos planeado añadir opciones para la autenticación multifactor escalonada, y opciones de inscripción automatizada mediante certificados y tokens de servicio. ¡Empezar es fácil! Consulta <a href="https://developers.cloudflare.com/cloudflare-one/policies/filtering/enforce-sessions/">esta guía</a> para configurar sesiones basadas en el cliente Zero Trust en tu panel de control Cloudflare Zero Trust.</p> ]]></content:encoded>
            <category><![CDATA[Security Week]]></category>
            <category><![CDATA[Zero Trust]]></category>
            <category><![CDATA[Cloudflare Zero Trust]]></category>
            <category><![CDATA[TCP]]></category>
            <category><![CDATA[Seguridad]]></category>
            <guid isPermaLink="false">42l3UWEBITlWpYkQsLLjAw</guid>
            <dc:creator>Kenny Johnson</dc:creator>
        </item>
        <item>
            <title><![CDATA[Magic Transit: Funciones de la red en la magnitud de Cloudflare]]></title>
            <link>https://blog.cloudflare.com/es-es/magic-transit-network-functions/</link>
            <pubDate>Tue, 13 Aug 2019 13:00:00 GMT</pubDate>
            <description><![CDATA[ Hoy hemos anunciado Cloudflare Magic Transit, que hace que la red de Cloudflare esté disponible para cualquier tráfico de IP en internet. Hasta ahora, Cloudflare ha administrado principalmente servicios proxy: nuestros servidores finalizan sesiones HTTP, TCP y UDP con usuarios de internet ]]></description>
            <content:encoded><![CDATA[ <p>Hoy hemos anunciado <a href="https://www.cloudflare.com/magic-transit">Cloudflare Magic Transit</a>, que hace que la red de Cloudflare esté disponible para cualquier tráfico de IP en internet. Hasta ahora, Cloudflare ha administrado principalmente servicios proxy: nuestros servidores finalizan sesiones HTTP, TCP y UDP con usuarios de internet y pasan esos datos a través de nuevas sesiones que crean con servidores de origen. Con Magic Transit, ahora también operamos en la capa IP: además de finalizar sesiones, nuestros servidores están aplicando una serie de funciones de red (mitigación de DoS, establecimiento de firewall, enrutamiento, etc.) por paquete.</p><p>En los últimos nueve años, hemos creado una red global sólida y escalable que actualmente se extiende a 193 ciudades en más de 90 países y se sigue expandiendo. Todos los clientes de Cloudflare se benefician con este alcance gracias a dos técnicas importantes. La primera es la red de direccionamiento <i>anycast.</i> Cloudflare fue uno de los <a href="/a-brief-anycast-primer/">primeros en adoptarla</a>, y utilizó esta técnica de enrutamiento para distribuir el tráfico de internet a través de nuestros centros de datos. Esto significa que cualquier centro de datos puede manejar el tráfico de cualquier cliente, y podemos crear nuevos centros de datos sin la necesidad de adquirir y suministrar nuevas direcciones IP. La segunda técnica es la arquitectura de servidor homogénea. Todos los servidores en cada uno de nuestros centros de datos periféricos <a href="/cloudflare-architecture-and-how-bpf-eats-the-world/">puede ejecutar cada tarea</a>. Construimos nuestros servidores en hardware básico, lo que permite aumentar rápidamente nuestra capacidad de procesamiento mediante la adición de nuevos servidores a los centros de datos existentes. Al no tener que depender de un hardware especial, hemos adquirido experiencia en ir hasta el límite de lo posible en las redes utilizando técnicas modernas del núcleo Linux.</p><p>Magic Transit se ha creado en la misma red utilizando las mismas técnicas, lo que significa que nuestros clientes ahora pueden ejecutar sus funciones de red en Cloudflare. Nuestra ventaja global rápida, segura y confiable se convierte en una ventaja para nuestros clientes. Para ver cómo funciona, sigamos el recorrido de un paquete desde un usuario en internet hasta la red de un cliente de Magic Transit.</p>
    <div>
      <h2><b>Ponemos en funcionamiento nuestra mitigación para DoS... ¡Para usted!</b></h2>
      <a href="#ponemos-en-funcionamiento-nuestra-mitigacion-para-dos-para-usted">
        
      </a>
    </div>
    <p>En <a href="https://www.cloudflare.com/magic-transit">announcement blog post</a> describimos un ejemplo de implementación para Acme Corp. Continuemos con este ejemplo aquí. Cuando Acme trae su prefijo de IP 203.0.113.0/24 a Cloudflare, comenzamos a anunciar ese prefijo a nuestros proveedores de tránsito, colegas y a los intercambios de internet en cada uno de nuestros centros de datos de todo el mundo. Además, Acme deja de anunciar el prefijo a sus propios ISP. Esto significa que cualquier paquete de IP en internet con una dirección de destino dentro del prefijo de Acme se entrega a un centro de datos de Cloudflare cercano, no al enrutador de Acme.</p><p>Supongamos que quiero acceder al servidor FTP de Acme en 203.0.113.100 desde mi computadora en la oficina de Cloudflare en Champaign, IL. Mi computadora genera un paquete TCP SYN con la dirección de destino 203.0.113.100 y lo envía a Internet. Gracias a <a href="https://www.cloudflare.com/learning/cdn/glossary/anycast-network/"><i>anycast</i></a>, ese paquete termina en el centro de datos de Cloudflare en Chicago, que es el centro de datos más cercano (en cuanto a distancia de enrutamiento de internet) a Champaign. El paquete llega en el enrutador del centro de datos, que utiliza el <a href="https://en.wikipedia.org/wiki/Equal-cost_multi-path_routing">enrutamiento ECMP (Multitrayecto de igual costo)</a> para seleccionar qué servidor debe administrar el paquete y enviarlo al servidor seleccionado.</p><p>Una vez en el servidor, el paquete fluye a través de nuestras funciones de detección y mitigación de DoS <a href="/cloudflare-architecture-and-how-bpf-eats-the-world/">XDP e iptables</a>. Si se determina que este paquete TCP SYN forma parte de un ataque, se descartaría y sería el fin de este. Afortunadamente para mí, el paquete puede pasar.</p><p>Hasta ahora, esto es exactamente igual que cualquier otro tráfico en la red de Cloudflare. Debido a nuestra experiencia en la gestión de una red <i>anycast</i> global, podemos atraer el tráfico de clientes de Magic Transit a cada centro de datos y aplicar la <a href="/tag/ddos/">misma solución de mitigación de DoS</a> que ha estado protegiendo a Cloudflare durante años. Nuestra solución de DoS ha controlado algunos de los ataques más grandes que se registraron, lo que incluye un ataque SYN de 942 Gbps en 2018. A continuación se muestra una captura de pantalla de un reciente ataque SYN de 300 millones de paquetes por segundo. <a href="/how-cloudflares-architecture-allows-us-to-scale-to-stop-the-largest-attacks/">Nuestra arquitectura nos permite escalar</a> para detener los ataques más grandes.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/BeJqqpkQ9uUUFLWFPjYe9/1c241da7ad7018a32c277d3bb3dfaee7/large-syn-flood.png" />
            
            </figure>
    <div>
      <h2><b>Espacios de nombres de red para aislamiento y control</b></h2>
      <a href="#espacios-de-nombres-de-red-para-aislamiento-y-control">
        
      </a>
    </div>
    <p>Lo anterior es idéntico a la forma en que se procesa todo el resto del tráfico de Cloudflare, pero aquí es donde se acaban las similitudes. Para nuestros otros servicios, el paquete TCP SYN ahora se enviaría a un proceso de proxy local (por ejemplo, nuestra pila HTTP/S en nginx). Para Magic Transit, queremos suministrar y aplicar de manera dinámica funciones de red definidas por el cliente como firewalls y enrutamiento. Necesitábamos una manera de acelerar y configurar estas funciones de red, y al mismo tiempo proporcionar un aislamiento entre redes. Para ello, recurrimos a los espacios de nombres de red.</p><p>Los espacios de nombres son una serie de características del núcleo Linux para crear instancias virtuales ligeras de recursos del sistema que se pueden compartir entre un grupo de procesos. Los espacios de nombres son un componente fundamental para la contenerización en Linux. En particular, Docker se crea en espacios de nombres de Linux. Un <i>espacio de nombres de red</i> es una instancia aislada de la pila de la red Linux, que incluye sus propias interfaces de red (con sus propios ganchos eBPF), tablas de enrutamiento, configuración de netfilter, etc. Los espacios de nombres de red nos proporcionan un mecanismo de bajo costo para aplicar rápidamente configuraciones de red definidas por el cliente en forma aislada, con las características integradas del núcleo Linux para que el rendimiento no se vea afectado por el reenvío de paquetes del espacio de usuario o el proxy.</p><p>Cuando un nuevo cliente comienza a usar Magic Transit, creamos un nuevo espacio de nombres de red para ese cliente en todos los servidores de nuestra red perimetral (¿mencioné que cada servidor puede ejecutar cada tarea?). Creamos un <i>daemon</i> que se ejecuta en nuestros servidores y se encarga de administrar estos espacios de nombres de red y sus configuraciones. Este <i>daemon</i> lee constantemente las actualizaciones de configuración de <a href="/helping-to-build-cloudflare-part-4/">Quicksilver</a>, nuestra tienda clave distribuida a nivel global, y aplica las configuraciones definidas por el cliente para firewalls, enrutamiento, etc., <i>dentro del espacio de nombres del cliente</i>. Por ejemplo, si Acme desea suministrar una regla de firewall para permitir el tráfico de FTP (puertos TCP 20 y 21) a 203.0.113.100, esa configuración se propaga a nivel global a través de Quicksilver y el daemon de Magic Transit aplica la regla de firewall mediante la adición de una regla nftables al espacio de nombres del cliente Acme:</p>
            <pre><code># Apply nftables rule inside Acme’s namespace
$ sudo ip netns exec acme_namespace nft add rule inet filter prerouting ip daddr 203.0.113.100 tcp dport 20-21 accept</code></pre>
            <p># Aplicar regla nftables en el espacio de nombres de Acme</p><p>$ sudo ip netns exec acme_namespace nft add rule inet filter prerouting ip daddr 203.0.113.100 tcp dport 20-21 accept</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7qBuqejDrTQ3QFlEZ5IRzk/e7cdbc6f6d3c14a6a8dfe8d9d76abbb3/067C8C9E-3C73-4DA0-AD77-35DAC9A5F182.png" />
            
            </figure><p>Llevar el tráfico del cliente a su espacio de nombres de red requiere una configuración de enrutamiento en el espacio de nombres de red predeterminado. Cuando se crea un espacio de nombres de red, también se crea un par de interfaces ethernet virtuales (veth): una en el espacio de nombres predeterminado y la otra en el espacio de nombres recién creado. Este par de interfaz crea un "cable virtual” para enviar el tráfico de red dentro y fuera del nuevo espacio de nombres de red. En el espacio de nombres de red predeterminado, mantenemos una tabla de enrutamiento que reenvía los prefijos de IP del cliente de Magic Transit a las veth que corresponden a los espacios de nombres de esos clientes. Utilizamos iptables para marcar los paquetes que están destinados a los prefijos del cliente de Magic Transit, y tenemos una regla de enrutamiento que especifica que estos paquetes marcados especialmente deben utilizar la tabla de enrutamiento de Magic Transit.</p><p>(¿Por qué tomarse la molestia de marcar los paquetes en iptables y mantener una tabla de enrutamiento separada? Aislamiento. Al mantener separadas las configuraciones de enrutamiento de Magic Transit, reducimos el riesgo de modificar accidentalmente la tabla de enrutamiento predeterminada y afectar el flujo del tráfico que no es de Magic Transit en nuestra periferia).</p><p>Los espacios de nombres de red ofrecen un entorno ligero donde un cliente de Magic Transit puede ejecutar y administrar funciones de red de manera aislada, lo que nos permite poner el control total en manos del cliente.</p>
    <div>
      <h2><b>GRE +</b> <b><i>anycast</i></b> <b>= magia</b></h2>
      <a href="#gre-anycast-magia">
        
      </a>
    </div>
    <p>Después de pasar las funciones de red perimetral, el paquete TCP SYN está listo finalmente para ser entregado nuevamente a la infraestructura de red del cliente. Debido a que Acme Corp. no tiene un espacio físico de red en una instalación con Cloudflare, necesitamos enviar su tráfico de red a través de la internet pública.</p><p>Esto plantea un problema. La dirección de destino del paquete TCP SYN es 203.0.113.100, pero la única red que anuncia el prefijo IP 203.0.113.0/24 en internet es Cloudflare. Esto significa que no podemos simplemente reenviar este paquete a internet, ¡ya que volvería a nosotros como un bumerán! Para enviar este paquete a Acme necesitamos utilizar una técnica que se denomina tunelización.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6I9uQQIPjqBE6hGYsIyPsF/61e810c12480ad0ee7267f5354e1f510/97ED9A08-71AA-490B-BD35-1E6D288EE1A3.png" />
            
            </figure><p>La tunelización es un método que permite transportar tráfico desde una red a través de otra red. En nuestro caso, esto implica la encapsulación de los paquetes de IP de Acme dentro de los paquetes de IP que se pueden enviar al enrutador de Acme a través de internet. Hay una serie de <a href="https://en.wikipedia.org/wiki/Tunneling_protocol#Common_tunneling_protocols">protocolos de tunelización comunes</a>, pero la <a href="https://en.wikipedia.org/wiki/Generic_Routing_Encapsulation">encapsulación de enrutamiento genérico</a> (GRE) se utiliza con frecuencia por su simplicidad y el soporte generalizado que brindan los proveedores.</p><p>Los extremos del túnel de GRE se configuran tanto en los servidores de Cloudflare (dentro del espacio de nombres de red de Acme) como en el enrutador de Acme. Luego, los servidores de Cloudflare encapsulan los paquetes de IP con destino a 203.0.113.0/24 dentro de los paquetes de IP con destino a una dirección IP enrutable públicamente para el enrutador de Acme, que desencapsula los paquetes y los libera en la red interna de Acme.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1422XZlV6HM7wgqKUYrBVx/4c7ddd86b938510b08dcdc8d43f9953f/228C64E9-DBE0-45AE-ACA9-8F1931998D4A.png" />
            
            </figure><p>Ahora bien, he omitido un detalle importante en el diagrama anterior: la dirección IP del lado de Cloudflare del túnel de GRE. La configuración de un túnel de GRE exige la especificación de una dirección IP para cada lado, y el encabezado IP externo para los paquetes enviados por el túnel debe utilizar estas direcciones específicas. Pero Cloudflare tiene miles de servidores, cada uno de los cuales puede necesitar el envío de paquetes al cliente a través de un túnel. Entonces, ¿con cuántas direcciones IP de Cloudflare (y túneles de GRE) necesita hablar el cliente? La respuesta: solo una, gracias a la magia de <i>anycast</i>.</p><p>Cloudflare utiliza direcciones IP de <i>anycast</i> para los extremos de nuestro túnel de GRE, lo que significa que cualquier servidor en cualquier centro de datos puede encapsular y desencapsular paquetes para el mismo túnel de GRE. <i>¿Cómo es posible? ¿Un túnel no es un enlace de extremo a extremo?</i> El protocolo GRE en sí es un protocolo sin estado, cada paquete se procesa de manera independiente y no se necesita ninguna negociación o coordinación entre los extremos del túnel. Si bien el túnel <i>está</i> técnicamente vinculado a una <i>dirección IP,</i> no necesita estar vinculado a un <i>dispositivo específico.</i> Todo dispositivo que pueda quitar los encabezados externos y luego enrutar el paquete interno puede administrar cualquier paquete de GRE enviado por el túnel. En realidad, en el contexto de <i>anycast</i> el término “túnel” resulta confuso, ya que implica un enlace entre dos puntos fijos. Con GRE de <i>Anycast</i> de Cloudflare, un único “túnel” le brinda un conducto a cada servidor en cada centro de datos en el perímetro global de Cloudflare.</p><p>Una ventaja muy importante del GRE de <i>Anycast</i> es que elimina las fallas individuales que luego generan una falla global. Tradicionalmente, el GRE en internet puede resultar un problema, ya que un corte de internet entre los dos extremos del GRE rompe completamente el “túnel”. Esto significa que para enviar datos de manera segura es necesario configurar y mantener túneles de GRE adicionales que terminen en diferentes sitios físicos y volver a enrutar el tráfico cuando uno de los túneles se rompe. Pero como Cloudflare encapsula y envía el tráfico de los clientes desde cada uno de los servidores de cada centro de datos, si se rompe un “túnel”, están los adicionales. Esto significa que los clientes de Magic Transit pueden aprovechar la redundancia y la fiabilidad de las terminales de los túneles en varios sitios físicos y configurar y mantener un único extremo de GRE, lo que simplifica sus trabajos.</p>
    <div>
      <h2><b>Nuestra escala ahora es su escala</b></h2>
      <a href="#nuestra-escala-ahora-es-su-escala">
        
      </a>
    </div>
    <p>Magic Transit es una manera novedosa y potente de implementar funciones de red a escala. No solo le brindamos una instancia virtual, le ofrecemos una <i>ventaja virtual a nivel global.</i> Magic Transit toma los componentes de hardware que usted normalmente colocaría en la red en sus instalaciones y los distribuye entre todos los servidores de cada centro de datos en la red de Cloudflare. Esto le brinda acceso a nuestra red de <i>anycast</i> global, a nuestra flota de servidores con capacidad de ejecutar <i>sus</i> tareas <i>y</i> a nuestra experiencia en ingeniería para construir redes rápidas, confiables y seguras. Nuestra escala ahora es su escala.</p> ]]></content:encoded>
            <category><![CDATA[Velocidad/fiabilidad]]></category>
            <category><![CDATA[Magic Transit]]></category>
            <category><![CDATA[Network]]></category>
            <category><![CDATA[Anycast (ES)]]></category>
            <category><![CDATA[TCP]]></category>
            <category><![CDATA[Noticias de productos]]></category>
            <guid isPermaLink="false">7vElLpZoHQk7fk7D087Jvq</guid>
            <dc:creator>Nick Wondra</dc:creator>
        </item>
        <item>
            <title><![CDATA[Estructura de Cloudflare y cómo el filtro de paquetes Berkeley (BPF) se come el mundo]]></title>
            <link>https://blog.cloudflare.com/es-es/cloudflare-architecture-and-how-bpf-eats-the-world/</link>
            <pubDate>Sat, 18 May 2019 15:00:00 GMT</pubDate>
            <description><![CDATA[ Recientemente, en Netdev 0x13, la conferencia sobre Redes en Linux en Praga, di una breve charla titulada “Linux en Cloudflare”. La charla terminó siendo casi en su totalidad sobre el BPF.  ]]></description>
            <content:encoded><![CDATA[ <p>Recientemente, en <a href="https://www.netdevconf.org/0x13/schedule.html">Netdev 0x13</a>, la conferencia sobre Redes en Linux en Praga, di <a href="https://netdevconf.org/0x13/session.html?panel-industry-perspectives">una breve charla titulada “Linux en Cloudflare”</a>. La <a href="https://speakerdeck.com/majek04/linux-at-cloudflare">charla</a> terminó siendo casi en su totalidad sobre el BPF. Parece que independientemente de la pregunta, el BPF es la respuesta.</p><p>Aquí presentamos una transcripción de una versión ligeramente adaptada de esa charla.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1jvISZgDDA9AnXaBAJzYys/13b124e1f305c9ab4594db66f9123789/01_edge-network-locations-100.jpg" />
            
            </figure><p>En Cloudflare, ejecutamos Linux en nuestros servidores. Operamos dos categorías de centros de datos: los centros de datos “básicos” grandes, donde procesamos registros, analizamos ataques y hacemos cálculos analíticos, y la flota de servidores “perimetrales”, que envían contenido de clientes desde 180 ubicaciones en todo el mundo.</p><p>En esta charla, nos concentraremos en los servidores “perimetrales”. Es aquí donde utilizamos las características más recientes de Linux, optimizamos el rendimiento y nos ocupamos en gran medida de la resiliencia del DoS.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2L3Wbz94VfdflLpsTuIp9D/8b11fa614a4cc1134e4d4df466464425/image-9.png" />
            
            </figure><p>Nuestro servicio perimetral es especial debido a nuestra configuración de red, estamos utilizando ampliamente el enrutamiento <i>anycast.</i> <i>Anycast</i> significa que todos nuestros centros de datos anuncian la misma serie de direcciones IP.</p><p>Este diseño tiene enormes ventajas. En primer lugar, garantiza la velocidad óptima para los usuarios finales. Independientemente del lugar en que usted se encuentre, siempre llegará al centro de datos más cercano. Luego, <i>anycast</i> nos ayuda a extender el tráfico de DoS. Durante los ataques, cada una de las ubicaciones recibe una pequeña fracción del tráfico total, lo que facilita la asimilación y el filtrado del tráfico no deseado.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4xiYwbjJRCpt76iDITKowY/9800bb2637bb3f601ccbc7c6eedb6b36/03_edge-network-uniform-software-100-1.jpg" />
            
            </figure><p><i>Anycast</i> nos permite mantener la uniformidad de la configuración de red en todos los centros de datos perimetrales. Aplicamos el mismo diseño en nuestros centros de datos: nuestra pila de software es uniforme en todos los servidores perimetrales. Todas las piezas de software se ejecutan en todos los servidores.</p><p>En principio, cada equipo puede gestionar cada tarea, y nosotros ejecutamos una cantidad de tareas diversas y exigentes. Tenemos una pila HTTP completa, el mágico Cloudflare Workers, dos series de servidores DNS - autorización y resolución, y muchas otras aplicaciones públicas como Spectrum y Warp.</p><p>Si bien en cada servidor se está ejecutando todo el software, las solicitudes suelen pasar por muchas máquinas en su trayecto hacia la pila. Por ejemplo, una máquina diferente puede gestionar una solicitud HTTP durante cada una de las 5 etapas del procesamiento.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/268deIgT4XLrgXfhRXxfx1/a5ced85738359d15ee16f9238ac759d8/image-23.png" />
            
            </figure><p>Permítanme guiarlos en las primeras etapas del procesamiento de paquetes entrantes:</p><p>(1) En primer lugar, los paquetes llegan a nuestro enrutador. El enrutador genera una multirruta de igual costo (ECMP) y reenvía los paquetes a nuestros servidores Linux. Utilizamos ECMP para distribuir cada IP de destino entre muchas máquinas, al menos 16. Esto se utiliza como una técnica rudimentaria de equilibrio de carga.</p><p>(2) En los servidores tomamos paquetes con eBPF de XDP. En XDP ejecutamos dos etapas. En primer lugar, ejecutamos mitigaciones de DoS volumétricas y eliminamos los paquetes que pertenecen a ataques muy grandes de la capa 3.</p><p>(3) Luego, aún en XDP, llevamos a cabo el equilibrio de carga de la capa 4. Todos los paquetes que no son de ataque se redirigen a través de los equipos. Esto se utiliza para solucionar los problemas de ECMP, nos da un equilibrio de carga de granularidad fina y nos permite sacar correctamente de servicio a los servidores.</p><p>(4) Después de la redirección, los paquetes llegan a un equipo designado. En este punto, la pila de redes de Linux normal los toma, pasan por el firewall de iptables habitual y se envían a un socket de red adecuado.</p><p>(5) Por último, una aplicación recibe los paquetes. Por ejemplo, las conexiones HTTP son manejadas por un servidor de “protocolo” encargado del cifrado TLS y el procesamiento de los protocolos HTTP, HTTP/2 y QUIC.</p><p>Es en estas primeras fases de procesamiento de solicitudes donde utilizamos las características nuevas más interesantes de Linux. Podemos agrupar las funciones modernas útiles en tres categorías:</p><ul><li><p>Control de DoS</p></li><li><p>Equilibrio de carga</p></li><li><p>Envío de sockets</p></li></ul><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3IlhL5q8CplwN5H1BY0ZZo/7f73d7d4c662113fac18404bcfac96c4/image-25.png" />
            
            </figure><p>Analicemos el control de DoS en más detalle. Como se mencionó anteriormente, el primer paso después del enrutamiento ECMP es la pila XDP de Linux donde, entre otras cosas, ejecutamos mitigaciones de DoS.</p><p>Históricamente, nuestras mitigaciones de ataques volumétricos se expresaban en la gramática clásica de estilo de iptables y BPF. Recientemente, hicimos una adaptación para ejecutar en el contexto de eBPF de XDP, lo que resultó ser increíblemente difícil. Siga leyendo sobre nuestras experiencias:</p><ul><li><p><a href="/l4drop-xdp-ebpf-based-ddos-mitigations/">L4Drop: Mitigaciones de DDoS XDP</a></p></li><li><p><a href="/xdpcap/">xdpcap: Captura de paquetes XDP</a></p></li><li><p>Charla de <a href="https://netdevconf.org/0x13/session.html?talk-XDP-based-DDoS-mitigation">mitigación de DoS en función de XDP</a> de Arthur Fabre</p></li><li><p><a href="https://netdevconf.org/2.1/papers/Gilberto_Bertin_XDP_in_practice.pdf">XDP en la práctica: integración de XDP en nuestra canalización de mitigación de DDoS</a>(PDF)</p></li></ul><p>Durante este proyecto nos encontramos con una serie de limitaciones de eBPF/XDP. Una de ellas fue la falta de primitivas de concurrencia. Resultó muy difícil implementar cosas como algoritmos <i>token buckets</i> sin competencia. Más tarde, descubrimos que la <a href="http://vger.kernel.org/lpc-bpf2018.html#session-9">ingeniera de Facebook Julia Kartseva</a> tenía los mismos problemas. En febrero, este problema se solucionó con la introducción de la aplicación auxiliar bpf_spin_lock.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2LAXf4Ayxh2sRR3hIsbBja/f8be1df5b19b10954b6a4ad092a177f7/image-26.png" />
            
            </figure><p>Si bien nuestros modernos sistemas de defensa de ataques DoS volumétricos se hacen en la capa XDP, aún contamos con iptables para aplicar las mitigaciones de la capa 7. Aquí, resultan útiles las características de un firewall de nivel superior: connlimit, hashlimits e ipsets. También utilizamos el módulo de iptables xt_bpf para ejecutar cBPF en iptables que coincidan con las cargas útiles del paquete. Ya hablamos de esto antes:</p><ul><li><p><a href="https://speakerdeck.com/majek04/lessons-from-defending-the-indefensible">Lecciones de defensa de lo indefendible</a> (PPT)</p></li><li><p><a href="/introducing-the-bpf-tools/">Presentación de herramientas del BPF</a></p></li></ul><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7MhIUEVsoocz1OSd8FKeYZ/a9e4321a070cd2d49800e978eb50b2d7/image-34.png" />
            
            </figure><p>Después de XDP e iptables, tenemos una última capa de defensa DoS del lado del núcleo.</p><p>Considere una situación en la que fallan nuestras mitigaciones del protocolo de datagramas de usuarios (UDP). En tal caso, podríamos recibir una avalancha de paquetes que llegan a al socket de UDP de nuestra aplicación. Esto podría desbordar el socket y generar la pérdida de paquetes. Esto es un problema, ya que se eliminarán indiscriminadamente tanto los paquetes buenos como los malos. Para aplicaciones como DNS esto resulta catastrófico. En el pasado, para reducir el daño ejecutamos un socket de UDP por dirección IP. Una inundación sin mitigar era algo malo, pero al menos no afectaba el tráfico a otras direcciones IP del servidor.</p><p>En la actualidad, esa estructura ya no resulta adecuada. Estamos ejecutando más de 30 000 IP DNS, y la ejecución de esa cantidad de sockets UDP no es una situación óptima. Nuestra solución actual es la ejecución de un único socket UDP con un filtro de socket eBPF complejo - utilizando la opción de socket SO_ATTACH_BPF. En publicaciones anteriores, hablamos sobre la ejecución de eBPF en sockets de red:</p><ul><li><p><a href="/epbf_sockets_hop_distance/">eBPF, sockets, distancia de salto y escritura manual de ensamblado de eBPF</a></p></li><li><p><a href="/sockmap-tcp-splicing-of-the-future/">SOCKMAP - Empalme de TCP del futuro</a></p></li></ul><p>El tipo de eBPF mencionado limita los paquetes. Mantiene el estado - recuento de paquetes - en un mapa de eBPF. Estamos seguros de que una sola IP inundada no afectará al resto del tráfico. Esto funciona bien, sin embargo, mientras trabajábamos en este proyecto encontramos un error bastante preocupante en el verificador de eBPF:</p><ul><li><p><a href="/ebpf-cant-count/">¡¿eBPF no puede contar?!</a></p></li></ul><p>Supongo que ejecutar eBPF en un socket UDP no es una tarea común.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/79bzCglYGH8Vb2hH6R9j39/39aa41a6e11b5cb0dc7f640cd7d7aa72/image-27.png" />
            
            </figure><p>Aparte del DoS, en XDP también ejecutamos un equilibrador de carga de capa 4. Este es un proyecto nuevo, y aún no hemos hablado mucho de este. Sin entrar en tantos detalles: en ciertas ocasiones, necesitamos hacer una búsqueda de socket desde XDP.</p><p>El problema es relativamente simple - nuestro código necesita buscar la estructura del núcleo del “socket” para una tupla-5 extraída de un paquete. Por lo general, esto es fácil - hay una asistencia bpf_sk_lookup disponible para esto. Como era de esperar, hubo algunas complicaciones. Un problema fue la incapacidad de verificar si un paquete ACK recibido era una parte válida del protocolo de enlace de tres vías cuando se activan las cookies SYN. Mi colega Lorenz Bauer está trabajando para lograr más apoyo para este caso fuera de lo habitual.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6j7ypFSgorN0lWBNY6Nc2m/b0ca29a08e3a1623a5f8c06c213f8d97/image-28.png" />
            
            </figure><p>Después de la denegación de servicio (DoS) y las capas de equilibrio de carga, los paquetes pasan a la pila de TCP / UDP de Linux habitual. Aquí hacemos un envío de socket - por ejemplo, los paquetes que van al puerto 53 pasan a un socket que pertenece a nuestro servidor DNS.</p><p>Hacemos todo lo posible por utilizar características estándar de Linux, pero las cosas se vuelven complejas cuando se usan miles de direcciones IP en los servidores.</p><p>Convencer a Linux para enrutar paquetes correctamente es bastante fácil con <a href="/how-we-built-spectrum">el truco “AnyIP</a>. Verificar que los paquetes se envían a la aplicación correcta es otra cuestión. Lamentablemente, la lógica de envío de sockets Linux estándar no es lo suficientemente flexible para nuestras necesidades. Para puertos populares como TCP/80 queremos compartir el puerto entre varias aplicaciones, cada una de las cuales lo maneja en un rango de IP diferente. Linux no es compatible de manera directa. Usted puede llamar enlazar() a una dirección IP específica o a todas las IP (con 0.0.0.0).</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2ERTm7jhXbKKfdo3CVmV81/2c8b5986539832c73971269a6bcf0964/image-29.png" />
            
            </figure><p>Para solucionar este inconveniente, desarrollamos un parche de núcleo personalizado que agrega <a href="http://patchwork.ozlabs.org/patch/602916/">una opción de socket SO_BINDTOPREFIX</a>. Como su nombre lo indica, nos permite llamar enlazar() un prefijo de IP seleccionado. Esto resuelve el problema de aplicaciones múltiples que comparten puertos populares como 53 u 80.</p><p>Luego nos encontramos con otro problema. Para nuestro producto Spectrum, necesitamos escuchar en los 65535 puertos. Ejecutar tantos sockets de escucha no es una buena idea (ver <a href="/revenge-listening-sockets/">nuestro viejo blog con historias de guerras</a>), por lo tanto, tuvimos que encontrar otra manera. Después de algunos experimentos, aprendimos a utilizar un módulo de iptables no muy conocido - TPROXY - para este propósito. Leer sobre este aquí:</p><ul><li><p><a href="/how-we-built-spectrum/">Abuso del <i>firewall</i> de Linux: el <i>hack</i> que nos permitió crear Spectrum</a></p></li></ul><p>Esta configuración está funcionando, pero no nos gustan las reglas de firewall adicionales. Estamos trabajando para resolver correctamente este problema, en realidad estamos ampliando la lógica de envío de socket. Adivinó, queremos extender la lógica de envío de socket mediante la utilización de eBPF. Estamos desarrollando algunos parches.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5eEog6Kt512U7uVmD5DVt8/d8216cc24e674f5f86b1d385bf93dfc5/image-32.png" />
            
            </figure><p>Luego, hay una manera de utilizar eBPF para optimizar las aplicaciones. Recientemente, nos interesamos en el empalme de TCP con SOCKMAP:</p><ul><li><p><a href="/sockmap-tcp-splicing-of-the-future/">SOCKMAP - Empalme de TCP del futuro</a></p></li></ul><p>Esta técnica ofrece un gran potencial para mejorar la latencia de cola en muchas piezas de nuestra pila de software. La implementación de SOCKMAP actual aún no está lista para el horario de mayor tráfico, pero el potencial es enorme.</p><p>Del mismo modo, los nuevos enlaces <a href="https://netdevconf.org/2.2/papers/brakmo-tcpbpf-talk.pdf">TCP-BPF también conocidos como BPF_SOCK_OPS</a> ofrecen una excelente manera de inspeccionar los parámetros de rendimiento de los flujos de TCP. Esta funcionalidad resulta muy útil para nuestro equipo de rendimiento.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1MC8LLNDHLZ4wDYLcbbCHQ/3491b09f9b5eaf796457eb06781f8b98/12_prometheus-ebpf_exporter-100.jpg" />
            
            </figure><p>Algunas características de Linux no soportaron bien el paso del tiempo y tenemos que trabajar en esto. Por ejemplo, estamos llegando a los límites de las métricas de red. No quiero que me malinterprete: las métricas de red son increíbles, pero lamentablemente no tienen la granularidad suficiente. Cosas como TcpExtListenDrops y TcpExtListenOverflows se informan como contadores globales, y nosotros necesitamos la información de cada aplicación.</p><p>Nuestra solución es utilizar un sondeo de eBPF para extraer los números directamente del núcleo. Mi colega Ivan Babrou desarrolló un exportador de métricas Prometheus que se llama “ebpf_exporter” para facilitar esto. Seguir leyendo:</p><ul><li><p><a href="/introducing-ebpf_exporter/">Presentación de ebpf_exporter</a></p></li><li><p><a href="https://github.com/cloudflare/ebpf_exporter">https://github.com/cloudflare/ebpf_exporter</a></p></li></ul><p>Con “ebpf_exporter”, podemos generar todo tipo de métricas detalladas. Es muy potente y nos salvó en muchas ocasiones.</p><hr />
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1obSUWhzzUQxg8cmDqQ0Lr/15e6419a78802c4d19fc4d21bf161738/image-33.png" />
            
            </figure><p>En esta charla analizamos las 6 capas del BPF que se ejecutan en nuestros servidores perimetrales:</p><ul><li><p>Las mitigaciones de DoS volumétricas se ejecutan en eBPF de XDP</p></li><li><p>Iptables xt_bpf cBPF para ataques de capas de aplicaciones</p></li><li><p>SO_ATTACH_BPF para límites de velocidad en sockets UDP</p></li><li><p>Equilibrador de carga, que se ejecuta en XDP</p></li><li><p>Auxiliares de aplicaciones que se ejecutan en eBPF como SOCKMAP para el empalme de socket TCP y TCP-BPF para mediciones de TCP</p></li><li><p>“ebpf_exporter” para métricas granulares</p></li></ul><p>¡Y eso es solo el comienzo! Pronto haremos más con el envío de socket basado en eBPF, eBPF que se ejecuta en la capa <a href="https://linux.die.net/man/8/tc">Linux TC (Control de tráfico)</a> y más integración con enlaces eBPF para cgroup. Además, nuestro equipo de ingeniería de confiabilidad del sitio (SRE) lleva una lista cada vez más extensa de <a href="https://github.com/iovisor/bcc">scripts BCC</a>qué resulta útil para la depuración.</p><p>Parece que Linux dejó de desarrollar nuevas API y todas las características nuevas se implementan como auxiliares y enlaces eBPF. Esto está bien y presenta muchas ventajas. Es más fácil y seguro actualizar el programa de eBPF que tener que volver a compilar un módulo del núcleo. Algunas cosas como TCP-BPF, que exponen un gran volumen de datos de seguimiento del rendimiento, probablemente serían imposibles sin eBPF.</p><p>Algunos afirman que “el software se está comiendo el mundo”, yo diría que: “el BPF se está comiendo el software”.</p> ]]></content:encoded>
            <category><![CDATA[eBPF]]></category>
            <category><![CDATA[Linux]]></category>
            <category><![CDATA[Programming]]></category>
            <category><![CDATA[Desarrolladores]]></category>
            <category><![CDATA[Anycast (ES)]]></category>
            <category><![CDATA[TCP]]></category>
            <guid isPermaLink="false">5EXsVZKcFTNLXVbrgHx73a</guid>
            <dc:creator>Marek Majkowski</dc:creator>
        </item>
        <item>
            <title><![CDATA[Gestión de paquetes SYN en internet de libre circulación]]></title>
            <link>https://blog.cloudflare.com/es-es/syn-packet-handling-in-the-wild/</link>
            <pubDate>Mon, 15 Jan 2018 13:49:09 GMT</pubDate>
            <description><![CDATA[ En Cloudflare, tenemos mucha experiencia en la operación de servidores en la internet de libre circulación. Sin embargo, siempre tratamos de optimizar nuestro dominio de este arte negro. ]]></description>
            <content:encoded><![CDATA[ <p>En Cloudflare, tenemos mucha experiencia en la operación de servidores en la internet de libre circulación. Sin embargo, siempre tratamos de optimizar nuestro dominio de este arte negro. En este mismo blog hemos tratado varios puntos oscuros de los protocolos de internet: como <a href="/this-is-strictly-a-violation-of-the-tcp-specification/">comprensión de FIN-WAIT-2</a> o <a href="/the-story-of-one-latency-spike/">recepción del ajuste de la memoria intermedia</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/GBoY12EMNx75snoQtVcGI/46163cd4b532746e1a9603f57c4b044f/1471936772_652043cb6c_b.jpg" />
            
            </figure><p><a href="https://creativecommons.org/licenses/by/2.0/">Imagen</a> <a href="https://www.flickr.com/photos/isaimoreno/1471936772/in/photolist-3f54wd-6mweJG-maUn5T-2tgqad-6YuCuM-pZ7r8T-Sa3LQ9-adTFS2-qSLQzk-sJ66Lq-71cJPS-oFU9rf-mbom12-23fVpJW-71ciCN-718DHR-j4VCQQ-71chKo-5DMBr4-5DLQFK-71cG4s-qQFjhZ-2RMBP6-718KWR-71cAFA-fAr8Ri-pe5zev-8TtDbQ-b6p5gk-qAdMqQ-qSBvUZ-qyg7oz-o5yof6-adTGvc-718xp4-5XQgJZ-bgGiwk-kf7aMc-qAjY14-718uti-smXfxF-8Kdnpx-nVVy8a-cmMJGb-puizaG-qP18i9-71cu1E-nYNfjq-718CjH-qyQM72">CC BY 2.0</a> por <a href="https://www.flickr.com/photos/isaimoreno/">Isaí Moreno</a></p><p>Sin embargo, no se le ha prestado la atención suficiente a un tema: las inundaciones SYN. Utilizamos Linux y resulta que el manejo de paquetes SYN en Linux es verdaderamente complejo. En esta publicación revelaremos información para aclarar este tema.</p>
    <div>
      <h3><b>La historia de dos colas</b></h3>
      <a href="#la-historia-de-dos-colas">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/X9oaRfcffxKbxYg4VvWuc/8a2277a49d7e092794d581d499a6083c/all-1.jpeg.jpeg" />
            
            </figure><p>En primer lugar, debemos entender que cada socket enlazado, en el estado TCP de “ESCUCHA” tiene dos colas separadas:</p><ul><li><p>La cola SYN</p></li><li><p>La cola de aceptación</p></li></ul><p>En los textos, a estas colas se les suelen dar otros nombres como “reqsk_queue”, “registro de ACK”, “registro de escucha” o incluso “registro de TCP”, pero usaré los nombres anteriores para evitar confusiones.</p>
    <div>
      <h3><b>Cola SYN</b></h3>
      <a href="#cola-syn">
        
      </a>
    </div>
    <p>La cola SYN almacena los paquete SYN entrantes<a href="/syn-packet-handling-in-the-wild/#fn1">[1]</a> (en concreto: <a href="https://elixir.free-electrons.com/linux/v4.14.12/source/include/net/inet_sock.h#L73">struct inet_request_sock</a>). Se encarga de enviar paquetes SYN+ACK y de reintentar el envío en el tiempo de espera. En Linux, el número de reintentos se configura con lo siguiente:</p>
            <pre><code>$ sysctl net.ipv4.tcp_synack_retries
net.ipv4.tcp_synack_retries = 5</code></pre>
            <p>Los <a href="https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt">documentos describen esta alternancia</a>:</p>
            <pre><code>tcp_synack_retries - INTEGER

	Number of times SYNACKs for a passive TCP connection attempt
	will be retransmitted. Should not be higher than 255. Default
	value is 5, which corresponds to 31 seconds till the last
	retransmission with the current initial RTO of 1second. With
	this the final timeout for a passive TCP connection will
	happen after 63 seconds.
</code></pre>
            <p>Después de transmitir el SYN+ACK, la cola SYN espera un paquete ACK del cliente: el último paquete en el protocolo de enlace de tres vías. Todos los paquetes ACK que se reciben primero se deben hacer coincidir con la tabla de conexiones totalmente establecida, y solo después con los datos en la cola SYN correspondiente. En la coincidencia de cola SYN, el núcleo elimina el elemento de la cola SYN, establece una conexión completa (en concreto: <a href="https://elixir.free-electrons.com/linux/v4.14.12/source/include/net/inet_sock.h#L183">struct inet_sock</a>), y lo agrega a la cola de aceptación.</p>
    <div>
      <h3><b>Cola de aceptación</b></h3>
      <a href="#cola-de-aceptacion">
        
      </a>
    </div>
    <p>La cola de aceptación tiene conexiones completamente establecidas: listas para que la aplicación las tome. Cuando un proceso anuncia aceptar(), los sockets se eliminan de la cola y pasan a la aplicación.</p><p>Esta es una visión bastante simplificada del manejo de paquetes SYN en Linux. Con la alternancia de sockets como TCP_DEFER_ACCEPT<a href="/syn-packet-handling-in-the-wild/#fn2">[2]</a> y TCP_FASTOPEN, las cosas funcionan un poco diferente.</p>
    <div>
      <h3><b>Límites de tamaño de cola</b></h3>
      <a href="#limites-de-tamano-de-cola">
        
      </a>
    </div>
    <p>La longitud máxima permitida de ambas colas Accept y SYN se toma del parámetro registro que la aplicación transmite a la llamada del sistema escucha(2). Por ejemplo, esto determina los tamaños de la cola Accept y SYN en 1,024:</p>
            <pre><code>listen(sfd, 1024)</code></pre>
            <p><code>listen(sfd, 1024)</code></p><p>Importante: en los núcleos anteriores a 4.3, la <a href="https://github.com/torvalds/linux/commit/ef547f2ac16bd9d77a780a0e7c70857e69e8f23f#diff-56ecfd3cd70d57cde321f395f0d8d743L43">longitud de la cola SYN se consideró de manera diferente</a>.</p>
            <pre><code>$ sysctl net.core.somaxconn
net.core.somaxconn = 16384</code></pre>
            <p>Este límite de cola SYN solía ser configurado por la alternancia net.ipv4.tcp_max_syn_backlog,, pero ya no se hace de este modo. Actualmente net.core.somaxconn limita ambos tamaños de cola. En nuestros servidores lo establecemos en 16k:</p>
    <div>
      <h3>Valor de registro perfecto</h3>
      <a href="#valor-de-registro-perfecto">
        
      </a>
    </div>
    <p>Teniendo en cuenta todo eso, podríamos hacer la siguiente pregunta: ¿cuál es el valor ideal del parámetro de registro?</p><p>La respuesta es la siguiente: depende. Para la mayoría de los servidores TCP triviales, realmente no es importante. Por ejemplo, antes de la versión 1.11 <a href="https://github.com/golang/go/issues/6079">Golang no respaldó, como es de público conocimiento, la personalización del registro</a>. Sin embargo, hay razones válidas para incrementar este valor:</p><ul><li><p>Cuando el ritmo de las conexiones entrantes es realmente importante, incluso con una aplicación de rendimiento, es posible que la cola SYN entrante necesite un mayor número de espacios.</p></li><li><p>El valor del registro controla el tamaño de la cola SYN. Esto efectivamente se puede leer como “paquetes ACK en proceso”. Cuanto mayor sea el tiempo promedio de ida y vuelta al cliente, más espacios se utilizarán. En el caso de muchos clientes que están lejos del servidor, a cientos de milisegundos de distancia, tiene sentido aumentar el valor del registro.</p></li><li><p>La opción TCP_DEFER_ACCEPT hace que los sockets permanezcan en el estado SYN-RECV por más tiempo y contribuyan con los límites de cola.</p></li></ul><p>Exceder el registro también es malo:</p><ul><li><p>Cada espacio en la cola SYN utiliza cierta memoria. Durante una inundación SYN no tiene sentido desperdiciar recursos en el almacenamiento de paquetes de ataque. Cada entrada struct inet_request_sock en la cola SYN utiliza 256 bytes de memoria en el núcleo 4.14.</p></li></ul>
            <pre><code>$ ss -n state syn-recv sport = :80 | wc -l
119
$ ss -n state syn-recv sport = :443 | wc -l
78</code></pre>
            <p>Para dar un vistazo a la cola SYN en Linux, podemos utilizar el comando ss y buscar los sockets SYN-RECV. Por ejemplo, en uno de los servidores de Cloudflare podemos ver 119 espacios que se utilizan en la cola tcp/80 SYN y 78 en tcp/443.</p><p>Se pueden mostrar datos similares con nuestro <a href="https://github.com/cloudflare/cloudflare-blog/blob/master/2018-01-syn-floods/resq.stp">overenginered SystemTap script: resq.stp</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/M8OtXMLU8ocN9jg1du8p1/57edd7ac7c6340c44e21970f27a0596d/full-accept-1.jpeg.jpeg" />
            
            </figure>
    <div>
      <h3><b>Aplicación lenta</b></h3>
      <a href="#aplicacion-lenta">
        
      </a>
    </div>
    <p>¿Qué sucede si la aplicación no puede mantener el ritmo rápido de la llamada de aceptación()?</p><p>¡Aquí es cuando sucede la magia! Cuando la cola de aceptación está completa (tiene un tamaño de registro+1) entonces:</p><ul><li><p>Los paquetes SYN entrantes a la cola SYN se caen.</p></li><li><p>Los paquetes ACK entrantes a la cola SYN se caen.</p></li><li><p>El contador TcpExtListenOverflows / <code>LINUX_MIB_LISTENOVERFLOWS</code> se incrementa.</p></li><li><p>El contador TcpExtListenDrops / <code>LINUX_MIB_LISTENDROPS</code> se incrementa.</p></li></ul><p>Hay una sólida razón para descartar los paquetes <i>entrantes</i>: es un mecanismo de rechazo. La otra parte, tarde o temprano, reenviará los paquetes SYN o ACK, y para ese entonces se espera que la aplicación lenta se haya recuperado.</p><p>Este es el comportamiento que se desea para la mayoría de los servidores. Para completar: se puede ajustar con la alternancia global net.ipv4.tcp_abort_on_overflow, pero es mejor no tocarlo.</p><p>Si su servidor necesita manejar una gran cantidad de conexiones entrantes y tiene problemas con la aceptación() del rendimiento, lea nuestra publicación <a href="/the-sad-state-of-linux-socket-balancing/">Ajuste de Nginx / Distribución de trabajo de Epoll</a> y un <a href="/perfect-locality-and-three-epic-systemtap-scripts/">seguimiento que muestre scripts útiles de SystemTap</a>.</p>
            <pre><code>$ nstat -az TcpExtListenDrops
TcpExtListenDrops     49199     0.0</code></pre>
            <p>Puede rastrear las estadísticas de desbordamiento de la cola de aceptación mediante el análisis de los contadoresnstat:</p>
            <pre><code>$ ss -plnt sport = :6443|cat
State   Recv-Q Send-Q  Local Address:Port  Peer Address:Port
LISTEN  0      1024                *:6443             *:*</code></pre>
            <p>Este es un contador global. No es lo ideal: a veces veíamos que aumentaba cuando el estado de todas las aplicaciones no tenía problemas. El primer paso siempre debe ser imprimir los tamaños de la cola de aceptación con ss:</p><p>La columna Recv-Q muestra la cantidad de sockets en la cola de aceptación, y Send-Q muestra el parámetro de registro. En este caso, vemos que no hay sockets pendientes de aceptación(), pero aún vemos el incremento del contador ListenDrops.</p>
            <pre><code>$ sudo stap -v acceptq.stp
time (us)        acceptq qmax  local addr    remote_addr
1495634198449075  1025   1024  0.0.0.0:6443  10.0.1.92:28585
1495634198449253  1025   1024  0.0.0.0:6443  10.0.1.92:50500
1495634198450062  1025   1024  0.0.0.0:6443  10.0.1.92:65434
...</code></pre>
            <p>Resulta que nuestra aplicación se atascó por fracciones de segundo. Esto fue suficiente para que la cola de aceptación se desbordara por un período de tiempo muy breve. Momentos después se recuperaría. Los casos como este son difíciles de solucionar con ss, así que escribimos <a href="https://github.com/cloudflare/cloudflare-blog/blob/master/2018-01-syn-floods/acceptq.stp">un acceptq.stp SystemTap script</a> a modo de ayuda. Se enlaza en el núcleo e imprime los paquetes SYN que se están cayendo:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3y08wVb2ROvhucECXpWm8x/f9ce889bf44d01ee2fd34c6a8d74b9cb/3713965419_20388fb368_b.jpg" />
            
            </figure><p>Aquí usted puede ver con precisión qué paquetes SYN se vieron afectados por ListenDrops. Con este script, no tiene importancia entender qué aplicación está eliminando conexiones.</p><p><a href="https://creativecommons.org/licenses/by/2.0/">Imagen</a> <a href="https://www.flickr.com/photos/16339684@N00/3713965419/in/photolist-6Ec3wx-5jhnwn-bfyTRX-5jhnCa-phYcey-dxZ95n-egkTN-kwT1YH-k22LWZ-5jBUiy-bzvDWx-5jBV31-5jhnr8-5jBTkq-5jxzHk-4K3cbP-9EePyg-4e5XNt-4e5XNn-dxZ8Tn-dy5A89-dxZ6GH-cztXcJ-gF7oY-dxZ9jv-dxZ7qM-ZvSPCv-dxZ6YV-5jBTqs-5jxzaP-MvuyK-nmVwP1-5jBRhY-dxZ7YF-5jxAc2-5jBU9U-5jBTEy-ejbWe6-5jxBc6-99ENZW-99KUsi-9bWScw-5jBRow-5jxzmx-5jBTfw-r6HcW-dy5zXE-5jxzg4-5jxBYR-5jxA2B">CC BY 2.0</a> por <a href="https://www.flickr.com/photos/16339684@N00/">internets_dairy</a></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7KIPBW1tsmG1nRfI3Guvmn/33abe68f9be1e5838ba472624c99be8d/full-syn-1.jpeg.jpeg" />
            
            </figure>
    <div>
      <h3><b>Inundación SYN</b></h3>
      <a href="#inundacion-syn">
        
      </a>
    </div>
    <p>Si es posible que se desborde la cola de aceptación, también puede ser posible que se desborde la cola SYN. ¿Qué sucede en ese caso?</p><p>De esto se tratan los <a href="https://en.wikipedia.org/wiki/SYN_flood">ataques de inundación SYN</a>. En la última inundación, la cola SYN con paquetes SYN falsificados fue un verdadero problema. Antes de 1996, se podía denegar el servicio de prácticamente cualquier servidor TCP con muy poco ancho de banda, solo con completar las colas SYN.</p><p>La solución es <a href="https://lwn.net/Articles/277146/">Cookies SYN</a>. Las cookies SYN son una construcción que permite que SYN+ACK se genere sin estado, sin guardar en realidad el SYN entrante ni desperdiciar la memoria del sistema. Las cookies SYN no interrumpen el tráfico legítimo. Cuando la otra parte es real, responderá con un paquete ACK válido que incluye el número de secuencia reflejado, que se puede verificara nivel criptográfico.</p><p>Las cookies SYN se activan de manera predeterminada cuando es necesario - para sockets con una cola SYN completa. Linux actualiza un par de contadores en las cookies SYN. Cuando se envía una cookie SYN:</p><ul><li><p>TcpExtTCPReqQFullDoCookies / <code>LINUX_MIB_TCPREQQFULLDOCOOKIES</code> se incrementa.</p></li><li><p>TcpExtSyncookiesSent / <code>LINUX_MIB_SYNCOOKIESSENT</code> se incrementa.</p></li><li><p>Linux solía incrementar TcpExtListenDrops pero <a href="https://github.com/torvalds/linux/commit/9caad864151e525929d323de96cad382da49c3b2">eso no sucede desde el núcleo 4.7</a>.</p></li></ul><p>Cuando un ACK entrante se dirige a la cola SYN con cookies SYN activadas:</p><ul><li><p>TcpExtSyncookiesRecv /  <code>LINUX_MIB_SYNCOOKIESRECV</code> se incrementa cuando la validación de criptografía es correcta.</p></li><li><p>TcpExtSyncookiesFailed / <code>LINUX_MIB_SYNCOOKIESFAILED</code> se incrementa cuando se produce un error en la criptografía.</p></li></ul><p>Un sysctl net.ipv4.tcp_syncookies puede desactivar las cookies SYN o forzar las activaciones. El valor predeterminado es bueno, no lo cambie.</p>
    <div>
      <h3><b>Cookies SYN y marcas de tiempo TCP</b></h3>
      <a href="#cookies-syn-y-marcas-de-tiempo-tcp">
        
      </a>
    </div>
    
            <pre><code>+----------+--------+-------------------+
|  6 bits  | 2 bits |     24 bits       |
| t mod 32 |  MSS   | hash(ip, port, t) |
+----------+--------+-------------------+</code></pre>
            <p>La magia de las cookies SYN funciona, pero existen ciertas desventajas. El principal problema es que se pueden guardar muy pocos datos en una cookie SYN. En concreto, solo 32 bits del número de secuencia se devuelven en el ACK. Estos bits se utilizan de la siguiente manera:</p><p>Con la configuración de MSS <a href="https://github.com/torvalds/linux/blob/5bbcc0f595fadb4cac0eddc4401035ec0bd95b09/net/ipv4/syncookies.c#L142">reducida a solo 4 valores distintos</a>, Linux no conoce ningún parámetro TCP opcional de la otra parte. La información sobre marcas de tiempo, ECN, ACK selectivos o escalado de ventana se pierde y puede disminuir el rendimiento de la sesión de TCP.</p>
            <pre><code>+-----------+-------+-------+--------+
|  26 bits  | 1 bit | 1 bit | 4 bits |
| Timestamp |  ECN  | SACK  | WScale |
+-----------+-------+-------+--------+</code></pre>
            <p>f, Linux ha trabajado en este tema. Si las marcas de tiempo de TCP están activadas, el núcleo puede reutilizar otro espacio de 32 bits en el campo de marcas de tiempo. Contiene:</p>
            <pre><code>$ sysctl net.ipv4.tcp_timestamps
net.ipv4.tcp_timestamps = 1</code></pre>
            <p>Las marcas de tiempo de TCP deben estar activadas de manera predeterminada, para verificar el sysctl:</p><p>Históricamente, se ha debatido mucho sobre la utilidad de las marcas de tiempo de TCP.</p><ul><li><p>Anteriormente, las marcas de tiempo generaban pérdidas del tiempo activo del servidor (si eso es importante sería tema d). Esto <a href="https://github.com/torvalds/linux/commit/95a22caee396cef0bb2ca8fafdd82966a49367bb">se solucionó hace 8 meses</a>.</p></li><li><p>Las marcas de tiempo de TCP utilizan <a href="http://highscalability.com/blog/2015/10/14/save-some-bandwidth-by-turning-off-tcp-timestamps.html">una cantidad insignificante de ancho de banda</a> - 12 bytes en cada paquete.</p></li><li><p>Pueden agregar aleatoriedad a las sumas de comprobación del paquete, lo que <a href="https://www.snellman.net/blog/archive/2017-07-20-s3-mystery/">puede ayudar con cierto hardware dañado</a>.</p></li><li><p>Como se mencionó anteriormente, las marcas de tiempo de TCP pueden aumentar el rendimiento de las conexiones TCP si se activan las cookies SYN.</p></li></ul><p>Actualmente, en Cloudflare las marcas de tiempo de TCP están desactivadas.</p><p>Por último, con las cookies SYN activadas, algunas características interesantes no funcionarán, como por ejemplo <code>[TCP_SAVED_SYN](https://lwn.net/Articles/645128/), TCP_DEFER_ACCEPT oTCP_FAST_OPEN</code>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1nw81MpcuH9JCz80nnq4du/4737ceb4a755113713159ee7b454370a/Screen-Shot-2016-12-02-at-10.53.27-1.png" />
            
            </figure>
    <div>
      <h3><b>Inundaciones SYN en proporción a la necesidad de Cloudflare</b></h3>
      <a href="#inundaciones-syn-en-proporcion-a-la-necesidad-de-cloudflare">
        
      </a>
    </div>
    <p>Las cookies SYN son un excelente invento y resuelven el problema de las inundaciones SYN de menor magnitud. Sin embargo, en Cloudflare, tratamos de evitarlas en la medida de lo posible. Si bien el envío de un par de miles de paquetes SYN+ACK verificables a nivel criptográfico por segundo se puede hacer correctamente, vemos <a href="/the-daily-ddos-ten-days-of-massive-attacks/">ataques de más de 200 millones de paquetes por segundo.</a> En esta proporción, nuestras respuestas SYN+ACK simplemente llenarían la internet de basura, sin generar ningún beneficio.</p><p>En lugar de hacer esto, tratamos de eliminar los paquetes SYN maliciosos en la capa de firewall. Usamos las huellas digitales SYN p0f compiladas para BPF. Puede obtener más información en esta publicación del blog <a href="/introducing-the-p0f-bpf-compiler/">Introducción al compilador p0f BPF</a>. Para detectar e implementar las mitigaciones, hemos desarrollado un sistema de automatización que denominamos “Gatebot”. Lo describimos aquí <a href="/meet-gatebot-a-bot-that-allows-us-to-sleep/">Conoce a Gatebot - el bot que nos permite dormir</a></p>
    <div>
      <h3><b>Panorama en evolución</b></h3>
      <a href="#panorama-en-evolucion">
        
      </a>
    </div>
    <p>Para obtener más información, un poco desactualizada, sobre el tema, lea <a href="https://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html">una excelente explicación de Andreas Veithen de 2015</a> y <a href="https://www.giac.org/paper/gsec/2013/syn-cookies-exploration/103486">un documento exhaustivo de Gerald W. Gordon de 2013</a>.</p><p>El panorama del manejo de paquetes SYN de Linux evoluciona constantemente. Hasta hace poco, las cookies SYN eran lentas debido a un bloqueo obsoleto en el núcleo. Esto se solucionó en 4.4 y ahora usted puede confiar en el núcleo para enviar millones de cookies SYN por segundo, y resolver prácticamente el problema de inundación SYN de la mayoría de los usuarios. Con el ajuste adecuado, es posible mitigar incluso las inundaciones SYN más fastidiosas sin afectar el rendimiento de las conexiones legítimas.</p><p>El rendimiento de las aplicaciones también está recibiendo una atención considerable. Ideas recientes como <code>SO_ATTACH_REUSEPORT_EBPF</code> introducen una capa totalmente nueva de programabilidad en la pila de red.</p><p>Resulta extraordinario ver cómo las innovaciones y los pensamientos renovados se canalizan en la pila de redes en un mundo de sistemas operativos que de otra manera estaría estancado.</p><p><i>Agradecemos a Binh Le por colaborar con esta publicación.</i></p><hr /><p><i>¿Está tratando de que los aspectos internos de Linux y NGINX suenen interesantes? Únase a nuestro</i> <a href="https://boards.greenhouse.io/cloudflare/jobs/589572"><i>equipo de reconocimiento internacional</i></a><i>en Londres, Austin, San Francisco y nuestra selecta oficina en Varsovia, Polonia.</i></p><hr /><ol><li><p>Estoy simplificando, técnicamente hablando, la cola SYN almacena las conexiones aún no ESTABLECIDAS, no paquetes SYN sí. Aunque con TCP_SAVE_SYN se acerca lo suficiente. <a href="/syn-packet-handling-in-the-wild/#fnref1">↩︎</a></p></li><li><p>Si <a href="http://man7.org/linux/man-pages/man7/tcp.7.html">TCP_DEFER_ACCEPT</a> es nuevo para usted, definitivamente verifique la versión de FreeBSD - <a href="http://www.freebsd.org/cgi/man.cgi?query=accf_http&amp;sektion=9">acepta filtros</a>. <a href="/syn-packet-handling-in-the-wild/#fnref2">↩︎</a><a href="/tag/syn/">SYN</a> <a href="/tag/tcp/">TCP</a> <a href="/tag/programming/">Programación</a></p></li></ol> ]]></content:encoded>
            <category><![CDATA[SYN]]></category>
            <category><![CDATA[TCP]]></category>
            <category><![CDATA[Programming]]></category>
            <guid isPermaLink="false">6G40dgfhgCyPSDplLMR9DO</guid>
            <dc:creator>Marek Majkowski</dc:creator>
        </item>
    </channel>
</rss>