{"id":806,"date":"2026-06-20T18:09:28","date_gmt":"2026-06-20T23:09:28","guid":{"rendered":"https:\/\/guille.pe\/blog\/?p=806"},"modified":"2026-06-20T19:58:01","modified_gmt":"2026-06-21T00:58:01","slug":"validacion-de-rutas-bgp-con-rpki-construyendo-una-red-mas-segura-y-resiliente","status":"publish","type":"post","link":"https:\/\/guille.pe\/blog\/2026\/06\/20\/validacion-de-rutas-bgp-con-rpki-construyendo-una-red-mas-segura-y-resiliente\/","title":{"rendered":"Validaci\u00f3n de rutas BGP con RPKI construyendo una red m\u00e1s segura y resiliente"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Cuando la mayor\u00eda de las personas piensa en internet, piensa en ancho de banda, piensa en fibra \u00f3ptica, cobertura, estabilidad o capacidad de transmisi\u00f3n. Sin embargo, cuando administras una red propia descubres que existe una capa menos visible, pero igual de importante el <strong>routing<\/strong>.<br>A medida que Signal a ido creciendo y comenzamos a operar nuestro propio <a href=\"https:\/\/es.wikipedia.org\/wiki\/Sistema_aut%C3%B3nomo\">ASN<\/a>, nuestros propios bloques IPv4 e IPv6 y una infraestructura cada vez m\u00e1s distribuida, empec\u00e9 a interesarme m\u00e1s por la seguridad del enrutamiento, porque anunciar rutas correctamente es solo una parte del trabajo la otra parte consiste en validar las rutas que aceptamos desde Internet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El problema que rara vez se menciona<br><\/strong>Internet est\u00e1 formado por miles de redes interconectadas mediante <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP <\/a>(Border Gateway Protocol) cada una anuncia qu\u00e9 prefijos IP administra y el resto de operadores usa esa informaci\u00f3n para decidir por d\u00f3nde enviar el tr\u00e1fico, el modelo ha funcionado durante a\u00f1os, pero fue dise\u00f1ado en una \u00e9poca muy diferente a la actual hoy en d\u00eda existen m\u00e1s de cien mil sistemas aut\u00f3nomos intercambiando informaci\u00f3n de routing constantemente, en un entorno de esta magnitud, un error de configuraci\u00f3n en una sola red puede propagarse mucho m\u00e1s lejos de lo que deber\u00eda, no hace falta comprometer servidores ni explotar vulnerabilidades basta con que una ruta incorrecta sea aceptada y propagada por suficientes redes.<br>Eso pas\u00f3 en 2015 cuando Telekom Malaysia filtr\u00f3 m\u00e1s de 170,000 rutas hacia uno de sus proveedores de tr\u00e1nsito, quien las propag\u00f3 globalmente sin los controles adecuados, el resultado fue afectaci\u00f3n severa de conectividad durante horas en m\u00faltiples regiones del mundo especialmente en Australia y Nueva Zelanda, puedes revisar el an\u00e1lisis t\u00e9cnico completo de ese incidente <a href=\"https:\/\/www.bgpmon.net\/massive-route-leak-cause-internet-slowdown\/\">aqu\u00ed<\/a> y a pesar que ese incidente tiene m\u00e1s de diez a\u00f1os este tipo de eventos sigue ocurriendo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Qu\u00e9 es RPKI y c\u00f3mo se conecta con <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP<\/a><\/strong><br><a href=\"https:\/\/en.wikipedia.org\/wiki\/Resource_Public_Key_Infrastructure\">RPKI<\/a>, Resource Public Key Infrastructure, es el mecanismo dise\u00f1ado para reducir ese riesgo permite que el titular leg\u00edtimo de un bloque de IP firme criptogr\u00e1ficamente una declaraci\u00f3n que indica qu\u00e9 sistema aut\u00f3nomo tiene autorizaci\u00f3n para anunciarlo en <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP<\/a>, esa firma se llama <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROA <\/a>(Route Origin Authorization) la validaci\u00f3n de esas firmas sobre los anuncios <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP <\/a>que recibe tu red se llama ROV (Route Origin Validation).<br>Cuando un router tiene ROV activo, cada anuncio <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP <\/a>recibido obtiene uno de tres estados:<br>Valid = el prefijo y el <a href=\"https:\/\/es.wikipedia.org\/wiki\/Sistema_aut%C3%B3nomo\">ASN<\/a> origen coinciden con un <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROA <\/a>firmado por lo tanto el anuncio es leg\u00edtimo<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image.png\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"70\" src=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image.png\" alt=\"\" class=\"wp-image-808\" srcset=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image.png 800w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-300x26.png 300w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-768x67.png 768w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-600x53.png 600w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-3.png\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" width=\"674\" height=\"63\" src=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-3.png\" alt=\"\" class=\"wp-image-812\" srcset=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-3.png 674w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-3-300x28.png 300w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-3-600x56.png 600w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><br>Invalid = existe un <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROA <\/a>pero el anuncio no coincide algo est\u00e1 mal<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-1.png\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" width=\"756\" height=\"64\" src=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-1.png\" alt=\"\" class=\"wp-image-809\" srcset=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-1.png 756w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-1-300x25.png 300w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-1-600x51.png 600w\" sizes=\"auto, (max-width: 756px) 100vw, 756px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><br>Not Found = no hay <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROA <\/a>que cubra este prefijo no hay informaci\u00f3n suficiente para validar<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La diferencia entre publicar <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROAs <\/a>y tener ROV activo es importante, los <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROAs <\/a>son la firma, ROV es el mecanismo que realmente utiliza esa informaci\u00f3n para tomar decisiones, sin ROV, la firma existe pero nadie la verifica en el flujo real de anuncios BGP, es como poner un candado en la puerta y dejar la llave puesta por fuera.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4.png\" data-rel=\"lightbox-image-3\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"517\" src=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4-1024x517.png\" alt=\"\" class=\"wp-image-818\" srcset=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4-1024x517.png 1024w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4-300x151.png 300w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4-768x388.png 768w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4-1536x776.png 1536w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4-600x303.png 600w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-4.png 1826w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u00bfY si mi upstream ya filtra? \u00bfNo es suficiente?<\/strong><br>La respuesta corta es no del todo, algunos operadores ya aplican validaci\u00f3n <a href=\"https:\/\/en.wikipedia.org\/wiki\/Resource_Public_Key_Infrastructure\">RPKI<\/a> antes de propagar rutas a sus clientes eso es una capa de protecci\u00f3n real nuestro upstream actual tiene ese comportamiento y lo valoramos, pero depender exclusivamente de que otro filtre por ti tiene un problema de fondo <strong>\u00abNO\u00bb <\/strong>tienes control ni visibilidad sobre lo que acepta o rechaza si ma\u00f1ana cambias o agregas un proveedor que no aplique los mismos criterios, quedas expuesto sin saberlo, las buenas pr\u00e1cticas de seguridad no se delegan, tener ROV propio significa que la validaci\u00f3n est\u00e1 bajo tu control, documentada, <strong>AUDITABLE <\/strong>e independiente de las decisiones de terceros.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Lo que implementamos en Signal Per\u00fa<\/strong><br>Empezamos verificando que nuestros propios prefijos se encuentren correctamente firmados los cinco bloques que anunciamos en <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP <\/a>tres IPv4 y dos IPv6 tienen <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROAs <\/a>y todos retornan estado VALID. Cualquier operador con ROV activo en el mundo puede verificar que nuestros anuncios son leg\u00edtimos aqui viene lo interesante, desplegamos Routinator 0.15.2 como validador <a href=\"https:\/\/en.wikipedia.org\/wiki\/Resource_Public_Key_Infrastructure\">RPKI <\/a>dentro de nuestra propia infraestructura. Routinator descarga y valida criptogr\u00e1ficamente los repositorios de los cinco registros regionales <strong><a href=\"https:\/\/www.lacnic.net\/\">LACNIC<\/a>, <a href=\"https:\/\/www.arin.net\/\">ARIN<\/a>, <a href=\"https:\/\/www.ripe.net\/\">RIPE<\/a>, <a href=\"https:\/\/www.apnic.net\/\">APNIC <\/a>y <a href=\"https:\/\/afrinic.net\/\">AFRINIC <\/a><\/strong>y mantiene una cach\u00e9 local de m\u00e1s de 960,000 prefijos validados globalmente, actualiz\u00e1ndose autom\u00e1ticamente cada pocos minutos, desde que conectamos ese validador a nuestros routers de borde, cada anuncio <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP<\/a> que recibimos pasa por verificaci\u00f3n autom\u00e1tica antes de entrar a nuestra tabla de routing.<br>Nuestra pol\u00edtica es rechazamos \u00fanicamente los anuncios marcados como Invalid los prefijos sin <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROA <\/a>siguen pasando porque gran parte del trafico global proviene de redes que a\u00fan no han publicado <a href=\"https:\/\/www.arin.net\/resources\/manage\/rpki\/roas\/\">ROAs <\/a>y no tendr\u00eda sentido dejar a nuestros clientes sin acceso a esas redes la idea es mejorar la seguridad sin reducir el alcance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La validaci\u00f3n de rutas <a href=\"https:\/\/es.wikipedia.org\/wiki\/Border_Gateway_Protocol\">BGP <\/a>no es un proyecto aislado forma parte de un proceso m\u00e1s amplio que incluye el registro correcto de objetos IRR, pr\u00e1cticas de anti spoofing y el alineamiento con <strong>MANRS<\/strong>, la iniciativa global de seguridad de routing a la que estamos aplicando activamente, son decisiones que el usuario final no nota no aceleran la conexi\u00f3n ni cambian la experiencia de navegaci\u00f3n pero construyen la infraestructura sobre la que todo lo dem\u00e1s funciona y cuando se piensa en una red a largo plazo, son exactamente este tipo de decisiones las que importan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el articulo me percate que tenia un MaxLength de \/48 as\u00ed que aproveche en hacer el cambio a \/40<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/48.png\" data-rel=\"lightbox-image-4\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"660\" src=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/48.png\" alt=\"\" class=\"wp-image-819\" srcset=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/48.png 862w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/48-300x230.png 300w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/48-768x588.png 768w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/48-600x459.png 600w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Despues del cambio:<\/strong><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-5.png\" data-rel=\"lightbox-image-5\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" width=\"885\" height=\"776\" src=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-5.png\" alt=\"\" class=\"wp-image-820\" srcset=\"https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-5.png 885w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-5-300x263.png 300w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-5-768x673.png 768w, https:\/\/guille.pe\/blog\/wp-content\/uploads\/2026\/06\/image-5-600x526.png 600w\" sizes=\"auto, (max-width: 885px) 100vw, 885px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Cuando la mayor\u00eda de las personas piensa en internet, piensa en ancho de banda, piensa en fibra \u00f3ptica, cobertura, estabilidad o capacidad de transmisi\u00f3n. Sin embargo, cuando administras una red&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[96,100,101],"class_list":["post-806","post","type-post","status-publish","format-standard","hentry","category-general","tag-bgp","tag-roa","tag-routinator"],"_links":{"self":[{"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/posts\/806","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/comments?post=806"}],"version-history":[{"count":10,"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/posts\/806\/revisions"}],"predecessor-version":[{"id":826,"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/posts\/806\/revisions\/826"}],"wp:attachment":[{"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/media?parent=806"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/categories?post=806"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guille.pe\/blog\/wp-json\/wp\/v2\/tags?post=806"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}