DNS sobre docker con CoreDNS
Hace bastante que no publicaba sobre nada de docker y no es que haya pasado algo sino que estaba con otras cosas… asi que sin demasiadas vueltas les dejo un tutorial sencillito con algunos aportes de teoria minimos para montar su propio servidor de DNS sobre docker con CoreDNS
¿Que es un DNS?
El sistema de nombres de dominio es un sistema de nomenclatura jerárquico descentralizado para dispositivos conectados a redes IP como Internet o una red privada.
En castellano: Como todo en nuestra red son servicios que corren sobre numeros de ip alguien dijo: ¿Quien se va acordar de todo esto? y así hicieron que 142.251.134.46 sea google.com (por ejemplo)

¿Porque coredns?
Tambien podríamos usar BIND pero CoreDNS es algo más moderno y se comenzo a utilizar mucho con implementaciones en docker y kubernetes. Está escrito en Go . Se puede utilizar en una multitud de entornos debido a su flexibilidad. CoreDNS tiene la licencia Apache License Version 2 y es completamente de código abierto.
Algo muy bueno de coredns que viene con muchísimos plugins que pueden facilitarnos la vida.
Web Oficial: https://coredns.io/
¿Para que nos serviría tener nuestros propio DNS?
Supongamos que una empresa me ofrece vender servicios para ella. Su marca es pepe.com y cada vez que vendo un hosting tengo que decirle a mi cliente: tu dominio apuntalo a los dns ns1.pepe.com y ns2.pepe.com
Algo mucho mejor seria que si soy el que vendo pueda contar con mis propios dns, por ejemplo yo le compro a pepe.com el hosting, creo mi dominio hostingculturalibre.com y a mis clientes les digo: apunten a ns1.hostingculturalibre.com con lo cual refuerzo mi marca.
No solo eso, internamente puedo tener un servidor web, una pc, camaras, etc y cada una de esas cosas que tengan un nombre real en vez de recordar la ip de cada cosa. Por ejemplo para entrar a la camara ip que tengo en el patio debo ingresar a la 192.168.1.15 y con un dns propio seria patio.casa.local para la que tengo al frente frente.casa.local donde casa.local seria el dominio local que tendria en casa…..
En fin, rapidito y al pie trate sin demasiadas vueltas explicar un poco de que va el dns, si quieren información tecnica este no es un curso sino un simple tutorial…
La idea de hacer lo sobre docker es por la facilidad, asi que sino tenes instalado docker: https://culturalibre.ar/2022/05/06/instalacion-de-docker/
Una vez que tienen instalado docker en esa pc viejita que la usan para servidor por ejemplo…. vamos a empezar a montar nuestro DNS sobre docker con CoreDNS
Paso 1: Creamos una carpeta llamada coredns (o como quieran) e ingresamos:
mkdir coredns
cd coredns
Paso 2: creamos el archivo docker-compose.yml
version: '3.1'
services:
coredns:
image: coredns/coredns
container_name: coredns
restart: on-failure # podemos usar always si queremos que sea persistente a través de reinicios del host
expose:
- '53'
- '53/udp'
ports:
- '53:53'
- '53:53/udp'
volumes:
- './config:/etc/coredns'
command: -conf /etc/coredns/corefile
Paso 3: Creamos una carpeta llamada config e ingresamos:
mkdir config
cd config
Paso 4: creamos el archivo de configuracion de coredns llamado corefile con esto en su interior:
.:53 {
forward . 8.8.8.8 9.9.9.9
log
errors
}
casa.local:53 {
file /etc/coredns/db.casa.local
log
errors
}
Paso 5: Creamos la base de datos que contiene nuestros equipos relacionados con ip que en mi caso se llamara db.casa.local
casa.local. IN SOA ns1.casa.local. ns2.casa.local. 202209000 7200 3600 1209600 3600
server1.casa.local. IN A 192.168.1.1
cam2.casa.local. IN A 192.168.1.1
www.casa.local. IN CNAME server1
En el archivo db.casa.local estoy diciendo que server1.casa.local es 192.168.1.1 y lo mismo con cam2.casa.local pero uds deberan poner la ip que tengan sus equipos obviamente, ya que esto es un ejemplo…
Paso 6: resolver kilombitos en gnulinux
Un servidor dns utiliza el puerto 53, en mi caso al utilizar ubuntu 22.04 el puerto esta siendo ocupado por system.resolv y no como antes que se utilizaba el archivo /etc/resolv.conf
¿Entonces que hago?
Primero edito /etc/resolv.conf y pongo dentro algo asi:

la linea 127.0.0.53 ya la van a tener creada y seguramente mas cosas tambien, solo tienen que poner en segundo y tercer lugar esos otros nameserver que son el de cloudflare y el de google para cuando deje de funcionar la primer linea que es el system.resolv
¿y por que va a dejar de funcionar? porq ue lo vamos a bajar para levantar coredns en nuestra misma maquina! si fuera en otra tendrias que hacer lo mismo seguramente.
Bajamos system.resolv:
systemctl disable systemd-resolved.service
systemctl stop systemd-resolved
Paso 7; Levantar el contenedor
docker-compose up -d
Paso 8: Probamos que este funcionando el contenedor
docker ps

y ahora a probar propiamente el dns:

Como ven al utilizar dig para consumir el dns de “localhost” que es mi propia maquina que tiene levantado coredns y preguntarle por la web www.casa.local me dice que se encuentra en server1.casa.local y que esta con la ip 192.168.1.1
Ojala este tutorial les sirva en algun momento!
Si quieren deshacer esto:
IMPORTANTE: los siguientes comandos (los dos primeros) que son de docker solo ejecuntelos si tienen contenedores que no les importen! por que bajan todos los contenedores y los borra. de lo contrario usen docker ps para obtener el id y luego docker stop id y docker rm id
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
systemctl start systemd-resolved
systemctl enable systemd-resolved.service
Mi consejo que el /etc/resolv.conf lo dejen como les enseñe por que seguramente en otro momento la pasan a cagar y ya esta solucionado 🙂 asi que aca reinician la maquina y ya esta!
Gracias por ser parte de culturalibre.ar y se les gusto la entrada a compartir en sus redes!
Filed under: docker,gnulinux,redes - @ 12 septiembre, 2022 1:04 am
Etiquetas: bind, coredns, dns, docker, kubernetes, networking, redes, resolucion de nombres, resolv.conf, systemd resolved service