{"id":2543,"date":"2014-02-27T19:09:38","date_gmt":"2014-02-27T23:09:38","guid":{"rendered":"http:\/\/arielantigua.com\/weblog\/?p=2543"},"modified":"2014-02-27T19:09:38","modified_gmt":"2014-02-27T23:09:38","slug":"openwrt-en-aanetworks-bgp-anycast-dns-opendns","status":"publish","type":"post","link":"https:\/\/arielantigua.com\/weblog\/2014\/02\/openwrt-en-aanetworks-bgp-anycast-dns-opendns\/","title":{"rendered":"<!--:es-->OpenWRT en aaNetworks \u2013 BGP, Anycast DNS &#038; OpenDNS.<!--:-->"},"content":{"rendered":"<p><!--:es-->OpenWRT puede ser que no necesite introducci\u00f3n pero aqu\u00ed va, OpenWRT es un peque\u00f1o Linux que se instala en muchos dispositivos embeded. Despu\u00e9s de muchos a\u00f1os siendo usuario de m0n0wall luego pfSense y por ultimo Vyatta, decid\u00ed usar este peque\u00f1o amiguito por el hardware que tengo disponible en este momento, tengo 2 Soekris, uno es 4801 y otro es 4501, ambos productos son bastante viejos.<\/p>\n<p>La instalaci\u00f3n en x86 (plataforma de Soekris) fue muy sencilla, estos son los pasos:<\/p>\n<ol>\n<li>descargar <a href=\"http:\/\/downloads.openwrt.org\/attitude_adjustment\/12.09\/x86\/generic\/openwrt-x86-generic-combined-ext4.img.gz\">http:\/\/downloads.openwrt.org\/attitude_adjustment\/12.09\/x86\/generic\/openwrt-x86-generic-combined-ext4.img.gz<\/a><\/li>\n<li>Usando 7-Zip extraer el archivo .img<\/li>\n<li>Usando dd en Linux o WinImage en Windows enviamos la imagen a nuestro CF.<\/li>\n<li>Nos aseguramos de tener la velocidad correcta en el Soekris, esta debe ser igual que la implementada por defecto en OpenWRT (38400).<\/li>\n<\/ol>\n<p>En este punto deber\u00edamos tener un OpenWRT listo para trabajar con \u00e9l.<\/p>\n<p>El Soekris 4801 (ELZAR) y el 4501 (WERNSTROM) forman parte de una Mesh VPN usando Tinc. Gracias a esto tengo varias localidades interconectadas v\u00eda VPN con poco mantenimiento requerido para funcionar.<\/p>\n<p>En este post me centrare en como he hecho para tener filtro de DNS y Anycast DNS. Anycast es algo que no se ve en una red casera pero mi red desde hace tiempo dejo de ser normal. OpenWRT cuenta con un package manager (opkg) que nos permitir\u00e1 instalar software para conseguir las funcionalidades que deseamos en nuestro OpemWRT. Lo primero, claro, es tener nuestro OpenWRT funcionando y con el NAT deshabilitado (ese es el caso en mi red), instalaremos \u00a0BGP (Quagga) y reconfiguraremos DNSmasq.<\/p>\n<p>Instalando los paquetes.<\/p>\n<p>Quagga es la suite que usaremos para tener BGP (OSPF lo uso para redistribuir rutas a mi Vyatta), esto nos ahorrara trabajo (tengo otros nodos con Quagga) ya que solo tendr\u00e9 que copiar parte de la configuraci\u00f3n, cambiar ASN, router ID y otras m\u00ednimas l\u00edneas de la config.<\/p>\n<p>opkg update<\/p>\n<p>Estos son los paquetes instalados actualmente en ELZAR.<\/p>\n<ul>\n<li>quagga<\/li>\n<li>quagga-bgpd<\/li>\n<li>quagga-libospf<\/li>\n<li>quagga-libzebra<\/li>\n<li>quagga-ospf6d<\/li>\n<li>quagga-ospfd<\/li>\n<li>quagga-vtysh<\/li>\n<li>quagga-watchquagga<\/li>\n<li>quagga-zebra<\/li>\n<\/ul>\n<p>Ahora toca configurar e iniciar los servicios para tener BGP funcionando. La instalaci\u00f3n es por defecto, esto quiere decir que tendremos \/etc\/quagga donde pondremos los archivos de configuraci\u00f3n que se requieren.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-1\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-1.jpg?m=1393541500\" width=\"597\" height=\"204\" \/><\/a><\/p>\n<p>Para que BGP (m\u00f3dulo de Quagga) funcione necesitamos tener configurado zebra.conf y bgpd.conf.<\/p>\n<p>Configuraci\u00f3n b\u00e1sica de estos archivos.<\/p>\n<p>zebra.conf :<\/p>\n<ul>\n<li>hostname -zebra<\/li>\n<li>password MiSuperPassword<\/li>\n<li>service advanced-vty<\/li>\n<li>!<\/li>\n<li>line vty<\/li>\n<li>access-class vty<\/li>\n<li>!<\/li>\n<\/ul>\n<p>bgpd.conf :<\/p>\n<ul>\n<li>hostname -bgpd<\/li>\n<li>password MiSuperPassword<\/li>\n<li>service advanced-vty<\/li>\n<li>!<\/li>\n<li>access-list vty permit 127.0.0.0\/8<\/li>\n<li>access-list vty deny any<\/li>\n<li>!<\/li>\n<li>line vty<\/li>\n<li>access-class vty<\/li>\n<li>exec-timeout 0 0<\/li>\n<li>!<\/li>\n<\/ul>\n<p>Con esto podemos iniciar el servicio de Quagga usando \/etc\/init.d\/quagga start, ya tendremos el servicio de BGP funcionando pero aun no es suficiente para que OpenWRT cumpla con la tarea asignada, ahora toca configurar BGP conect\u00e1ndonos a la consola que est\u00e1 disponible en el puerto 2605 (telnet localhost bgpd) y nos pedir\u00e1 el password que usamos en la configuraci\u00f3n base (MiSuperPassword en este ejemplo). Una vez dentro configuraremos nuestro n\u00famero aut\u00f3nomo, las subredes que anunciaremos desde este router y los vecinos a quienes estaremos anunciando estas subredes.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-2\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-2.jpg?m=1393541515\" width=\"450\" height=\"249\" \/><\/a><\/p>\n<p>Esta es la configuraci\u00f3n en ELZAR (un poco editada).<\/p>\n<ul>\n<li>Current configuration:<\/li>\n<li>!<\/li>\n<li>hostname elzar-bgpd<\/li>\n<li>password MiSuperPassword<\/li>\n<li>service advanced-vty<\/li>\n<li>!<\/li>\n<li>router bgp 64845<\/li>\n<li>bgp router-id 10.45.254.9<\/li>\n<li>network 10.45.254.9\/32<\/li>\n<li>network 10.45.255.1\/32<\/li>\n<\/ul>\n<p>Toda la configuraci\u00f3n despu\u00e9s de estas l\u00edneas es relacionada a los vecinos (neighbors) con los cuales el servicio de BGP intercambia rutas.<\/p>\n<p>Internamente son 3 router con BGP que usar el ASN 64845 y est\u00e1n agrupados as\u00ed:<\/p>\n<ul>\n<li>neighbor aaNetworksHQ peer-group<\/li>\n<li>neighbor aaNetworksHQ remote-as 64845<\/li>\n<li>neighbor aaNetworksHQ override-capability<\/li>\n<li>neighbor aaNetworksHQ next-hop-self<\/li>\n<li>neighbor aaNetworksHQ soft-reconfiguration inbound<\/li>\n<\/ul>\n<p>De esta manera solo necesito hacer lo siguiente para establecer relaci\u00f3n entre 2 routers con el mismo ASN:<\/p>\n<ul>\n<li>neighbor 10.45.252.10 peer-group aaNetworksHQ<\/li>\n<li>neighbor 10.45.252.10 update-source 10.45.252.9<\/li>\n<li>neighbor 10.45.252.14 peer-group aaNetworksHQ<\/li>\n<li>neighbor 10.45.252.14 update-source 10.45.252.13<\/li>\n<\/ul>\n<p>El router 10.45.252.10 es otro OpenWRT (wernstrom) el cual tambi\u00e9n funciona como Anycast DNS en mi red local, el router con 10.45.252.14 es un Vyatta que funciona como router para Internet y es quien agrupa todas las rutas que se puede distribuir hacia el OSPF internamente.<\/p>\n<p>Al final terminamos con algo as\u00ed:<\/p>\n<ul>\n<li>router bgp 64845<\/li>\n<li>bgp router-id 10.45.254.9<\/li>\n<li>network 10.45.254.9\/32<\/li>\n<li>network 10.45.255.1\/32<\/li>\n<li>neighbor aaNetworks peer-group<\/li>\n<li>neighbor aaNetworks remote-as 64635<\/li>\n<li>neighbor aaNetworks update-source aanet<\/li>\n<li>neighbor aaNetworks override-capability<\/li>\n<li>neighbor aaNetworks soft-reconfiguration inbound<\/li>\n<li>neighbor 10.45.252.10 peer-group aaNetworksHQ<\/li>\n<li>neighbor 10.45.252.10 update-source 10.45.252.9<\/li>\n<li>neighbor 10.45.252.14 peer-group aaNetworksHQ<\/li>\n<li>neighbor 10.45.252.14 update-source 10.45.252.13<\/li>\n<\/ul>\n<p>Ya tenemos a ELZAR conectado (Interfaces dedicadas hacia los dem\u00e1s routers) a sus vecinos e intercambiando rutas, Excelente!.<\/p>\n<p>La idea es que ELZAR y WERNSTROM publiquen la direcci\u00f3n 10.45.255.1 y a su vez est\u00e9n corriendo DNSmasq que por defecto viene instalado en OpenWRT. Antes de seguir, aqu\u00ed dejo un peque\u00f1o diagrama de red para que se pueda entender la idea.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/aaNetworks-VPN-Networking\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/aaNetworks%20VPN%20Networking.jpg?m=1393541489\" width=\"640\" height=\"612\" \/><\/a><\/p>\n<p>Otra configuraci\u00f3n que debemos realizar es en zebra.conf, all\u00ed crearemos las interfaces donde tendremos las direcciones IP con \/32, estas son la loopback (usada en router id &amp; la IP para Anycast).<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-3\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-3.jpg?m=1393541514\" width=\"449\" height=\"238\" \/><\/a><\/p>\n<p>La configuraci\u00f3n en ELZAR es la siguiente:<\/p>\n<ul>\n<li>Current configuration:<\/li>\n<li>!<\/li>\n<li>hostname elzar-zebra<\/li>\n<li>password MiSuperPassword<\/li>\n<li>service advanced-vty<\/li>\n<li>!<\/li>\n<li>interface aanet<\/li>\n<li>ipv6 nd suppress-ra<\/li>\n<li>!<\/li>\n<li>interface eth0<\/li>\n<li>description \u00abtesting\u00bb<\/li>\n<li>ipv6 address 2001:470:b24c:f021::1\/126<\/li>\n<li>ipv6 nd suppress-ra<\/li>\n<li>!<\/li>\n<li>interface eth1<\/li>\n<li>ipv6 address 2001:470:b24c:ff22::2\/126<\/li>\n<li>ipv6 nd suppress-ra<\/li>\n<li>!<\/li>\n<li>interface eth2<\/li>\n<li>ipv6 address 2001:470:b24c:dead::9\/64<\/li>\n<li>ipv6 nd suppress-ra<\/li>\n<li>!<\/li>\n<li>interface lo<\/li>\n<li>ip address 10.45.254.9\/32<\/li>\n<li>ipv6 address 2001:470:b24c:254::9\/128<\/li>\n<li>ip address 10.45.255.1\/32<\/li>\n<li>!<\/li>\n<li>access-list vty permit 127.0.0.0\/8<\/li>\n<li>access-list vty deny any<\/li>\n<li>!<\/li>\n<li>ip forwarding<\/li>\n<li>ipv6 forwarding<\/li>\n<li>!<\/li>\n<li>!<\/li>\n<li>line vty<\/li>\n<li>access-class vty<\/li>\n<li>!<\/li>\n<li>End<\/li>\n<\/ul>\n<p>Aqu\u00ed se pueden ver las 2 direcciones IP.<\/p>\n<p>En este momento las direcciones de loopback y la usada para Anycast son visibles en los dem\u00e1s routers de mi red.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/nixon-showipbgp-1\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/nixon-showipbgp-1.jpg?m=1393541525\" width=\"640\" height=\"604\" \/><\/a><\/p>\n<p>Configurando DNSmasq al estilo OpenWRT.<\/p>\n<p>OpenWRT tiene su m\u00e9todo de configuraci\u00f3n, aunque la mayor\u00eda de los paquetes instalables se pueden configurar v\u00eda su propio m\u00e9todo, algunas veces es mejor hacerlo as\u00ed.<\/p>\n<p>DNSmasq es configurado desde \/etc\/config espec\u00edficamente en el archivo dhcpd.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-dhcpd-1\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-dhcpd-1.jpg?m=1393541517\" width=\"589\" height=\"640\" \/><\/a><\/p>\n<p>Luego procedemos a editar el dnsmasq.conf ubicado en \/etc, aqu\u00ed podemos realizar configuraci\u00f3n de la forma oficial y soportada por el proyecto de dnsmasq. La configuraci\u00f3n es muy extensa pero lo m\u00e1s importante y relacionado con esta entrada es:<\/p>\n<ul>\n<li>listen-address=10.45.255.1<\/li>\n<li>#Send most DNS lookups to opendns.com<\/li>\n<li>server=208.67.222.222<\/li>\n<li>server=208.67.220.220<\/li>\n<li>#aaNetworks request to internal servers<\/li>\n<li>server=\/aanetworks.org\/172.22.35.66<\/li>\n<li>#server=\/aanetworks.org\/10.45.254.7<\/li>\n<li>server=\/172.in-addr.arpa\/172.22.35.66<\/li>\n<li>server=\/10.in-addr.arpa\/172.22.35.66<\/li>\n<li>server=\/aanetworks.local\/172.22.35.50<\/li>\n<li>server=\/aanetworks.local\/172.22.35.100<\/li>\n<\/ul>\n<p>No me gusta que OpenDNS me responda bogus-nxdomain as\u00ed que agregamos lo siguiente:<\/p>\n<ul>\n<li>#blocked opendns.com bogus-nx<\/li>\n<li>bogus-nxdomain=67.215.65.130<\/li>\n<li>bogus-nxdomain=67.215.65.132<\/li>\n<li>bogus-nxdomain=208.67.222.222<\/li>\n<li>bogus-nxdomain=208.67.220.220<\/li>\n<\/ul>\n<p>Reiniciamos DNSmasq para probar que nuestro IP para Anycast DNS sea utilizado como IP preferido para escuchar en los puertos de DNS.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-dnsmasq-1\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/elzar-dnsmasq-1.jpg?m=1393541517\" width=\"640\" height=\"107\" \/><\/a><\/p>\n<p>Desde un cliente de la red, con una direcci\u00f3n de 172.22.35.0\/26 esto es lo que tenemos cuando hacemos un dnslookup.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/nslookup-1\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/nslookup-1.jpg?m=1393541521\" width=\"640\" height=\"414\" \/><\/a><\/p>\n<p>Tambi\u00e9n un traceroute desde el mismo cliente que se realiz\u00f3 el nslookup.<\/p>\n<p><a href=\"http:\/\/galeria.arielantigua.com\/index.php\/Ariel-Antigua\/Varios\/OpenWRT\/tracert-1\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/galeria.arielantigua.com\/var\/resizes\/Ariel-Antigua\/Varios\/OpenWRT\/tracert-1.jpg?m=1393541526\" width=\"640\" height=\"414\" \/><\/a><!--:--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>OpenWRT puede ser que no necesite introducci\u00f3n pero aqu\u00ed va, OpenWRT es un peque\u00f1o Linux que se instala en muchos dispositivos embeded. Despu\u00e9s de muchos a\u00f1os siendo usuario de m0n0wall luego pfSense y por ultimo Vyatta, decid\u00ed usar este peque\u00f1o amiguito por el hardware que tengo disponible en este momento, tengo 2 Soekris, uno es [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,34],"tags":[110,111],"class_list":["post-2543","post","type-post","status-publish","format-standard","hentry","category-general","category-networking","tag-aanetworks","tag-openwrt"],"_links":{"self":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/2543","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/comments?post=2543"}],"version-history":[{"count":0,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/2543\/revisions"}],"wp:attachment":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/media?parent=2543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/categories?post=2543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/tags?post=2543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}