Hola amigo bienvenido de nuevo, este este post te voy a enseñar a configurar un servidor DNS Bind en ubuntu server 20.04. Todo esto con el objetivo de que puedas resolver nombres de dominios tanto de forma interna como de forma externa, todo esto desde tu propio servidor DNS.

Pero primero que nada que es un Servidor DNS, pues te lo explico de la forma mas simple que pueda todos los servidores que hay en internet tienen direcciones IP publicas asignadas a lo largo del planeta, como podrás ver son millones de direcciones IPs, las cuales son difíciles de recordar por ejemplo mi ip en este momento del post es la siguiente: 187.153.86.73.

como comprenderás es algo complicado que alguien valla por ahi aprendiendo las ips de todos los sitios de internet(aunque hay quien lo hace jejeje). Es por eso que se crearon los nombre de dominios como por ejemplo jcastaneda.com o www.google.com, los cuales son mas faciles de recordar.

Aquí es donde entran en juego los servidores de nombres de dominios, los cuales se encargan de organizar y otorgar una forma rápida de encontrar la dirección ip de un nombre de dominio.

Algo muy parecido a los extintos directorios telefónicos en donde primero buscabas en una lista de palabras ordenadas por orden alfabético por ejemplo: limpieza, computación, taller de autos etc, Estas palabras te daban un numero de pagina, al ver la pagina podías observar los distintos negocios que tenían en común la palabra seleccionada.

Casi lo mismo ocurre con los nombres de dominios supongamos que quieres ir a la siguiente dirección: https://tester.jcastaneda.com primero se buscan los TLD o Top Level Domain como lo son: .com, .net, .edu, .gob etc.

Estos TLD le dicen donde puede estar el nombre de dominio alojado para este caso jcastaneda. como respuesta obtienen el servidor de DNS donde esta configurado el dominio y este nos va a responder cual es la ip que esta configurada para tester.

Se que puede sonar algo enredado y lo increible es que pasa un pestanear. Pero que mejor que explicarlo con un ejemplo.

Objetivo de configuración del Servidor DNS Bind

Primero que nada dejame contarte que mi sitio web esta alojado en un VPS el cual ya me provee de un servidor dns lo cual voy a seguir aprovechando para resolver subdomios que estaran alojados dentro de mi servidor personal. a continuacion te listo los objetivos a complir.

  1. Resolver DNS de internet en todos los equipos de la red interna.
  2. Resolver DNS de subdominios de jcastaneda.com dentro de la red interna.

Sabiendo los objetivos del servidor procedamos al siguiente paso.

Instalación

$ sudo apt update
$ sudo apt install bind9 bind9-utils

Con esto ya estara instalado el servidor DNS para resolver dominios de forma interna por ejemplo:

$ dig google.com

; <<>> DiG 9.16.1-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8526
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;google.com.			IN	A

;; ANSWER SECTION:
google.com.		190	IN	A	172.217.1.142

;; Query time: 455 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Mon Feb 22 08:26:01 UTC 2021
;; MSG SIZE  rcvd: 55

Abrimos el puerto que usan bind9 con el siguiente comando:

$ sudo ufw allow Bind9

Probando configuración de Servidor DNS Bind en otro equipo de la red.

Con esta configuracion ya podras configurar la ip del servidor como servidor DNS en los equipos dentro de tu red. por ejemplo mi servidor tiene la ip 192.168.1.110 y aqui podemos ver una prueba con el siguiente comando:

% dig google.com               

; <<>> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37519
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com.			IN	A

;; ANSWER SECTION:
google.com.		300	IN	A	172.217.5.174

;; Query time: 76 msec
;; SERVER: 192.168.1.110#53(192.168.1.100)
;; WHEN: Mon Feb 22 02:36:17 CST 2021
;; MSG SIZE  rcvd: 55

Una vez que podemos verificar que tenemos conexion a internet en otros equipos de la red con el DNS configurado corectamente pasamos al siguiente paso.

Configurar Servidor DNS Primario

La configuración de BIND la encuentras en /etc/bind:

$ ls /etc/bind
bind.keys       db.127                     db.empty
named.conf      named.conf.local           rndc.key
zones.rfc1918   db.0                       db.255
db.local        named.conf.default-zones   named.conf.options

De los cuales configuraremos los siguientes:

  1. named.conf.options
  2. named.conf.local

El primer archivo a configurar sera el de named.conf.options con el siguiente comando:

$ sudo vi /etc/bind/named.conf.options

Presionamos «i» para editarlo y dejarlo de la siguiente manera:

acl internals {
        127.0.0.1;
        192.168.1.0/24;
};


options {
        directory "/var/cache/bind";

        recursion yes; # permitir consultas recursivas
        allow-recursion { internals; };  # definimos desde que rango de Ips pueden realizar consultas
        listen-on port 53 { 192.168.1.100; };   # definimos ip privada - solo para red interna
        allow-transfer { none; }; # desabilitamos la transferencia de zonas por default


        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        //listen-on-v6 { any; };
};

Presiona «esc» y despues «:wq» para guardar y salir.

Con esta configuración nos aseguramos que las consultas dentro de la red interna sean recursivas para resolver los nombres de dominios.

El siguiente archivo a editar es el archivo named.conf.local lo abrimos con el siguiente comando:

$ sudo vi /etc/bind/named.conf.local

Presionamos «esc» y lo editamos para dejarlo de la siguiente manera:

//
// Do any local configuration here
//

zone "jcastaneda.com" {
        type master;
        file "/etc/bind/zones/db.jcastaneda.com";
        allow-transfer { internals; };
};

zone "1.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/zones/db.192.168.1";
        allow-transfer { internals; };
};

// Consider adding the 1918 zones here, if they are not used in your
// organization
include "/etc/bind/zones.rfc1918";

Como puedes ver agregamos 2 zonas de configuración la primera para el dominio jcastaneda.com y la segunda para una zona inversa. y activamos las zonas 1918 (vacias).

Ahora crearemos la carpeta donde se ubicaran las zonas que configuramos anteriormente con el siguiente comando:

$ sudo mkdir /etc/bind/zones

Despues creamos el archivo de zona db.jcastaneda.com con el siguiente comando:

sudo vi /etc/bind/zones/db.jcastaneda.com

presionamos «i» para editarlo y dejarlo de la siguiente forma:

;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     ns1.jcastaneda.com. root.jcastaneda.com. (
                        20210222                ; Serial
                        12h             ; Refresh
                        15m             ; Retry 
                        3w              ; Expire
                        2h )    ; Negative Cache TTL
;

@       IN      NS      ns1.jcastaneda.com.
@       IN      A       162.214.112.125
ns1     IN      A       192.168.1.110
www     IN      CNAME   jcastaneda.com.
tester  IN      A       192.168.1.110

lo primero que hicimos aqui fue definir la zona de autoridad con ns1.jcastaneda.com. despues definimos un correo de administracion con root.jcastaneda.com. ten en cuenta que no podemos agregar @ en este archivo en ves de eso usamos un punto.

El serial es un id incremental que debes de actualizar cada vez que editar el archivo en mi caso yo tomo la fecha actual. Como siguiente paso asignamos un NS a nuestro servidor y despues la ip por medio de «A» el ultimo paso sera crear nuestro subdominio «tester» y asignarle la ip interna donde esta alojado el servidor.

Cuando se definen los registros primero creamos el NS (nameserver) normalmente ns1. después puedes observar que definimos @ IN A 162.214.112.125 esto es debido a que el dominio jcastaneda.com esta registrado en otro servidor así que para resolver el nombre de dominio lo apuntamos a la ip del servidor externo. Posteriormente creamos un registro CNAME con www para jcastaneda.com y con esto nos aseguramos que dentro de la red siempre podamos ver la pagina web del servidor externo. Por ultimo creamos el registro A tester el cual nos apuntara a la ip del servidor web para este caso 192.168.1.110.

recuerda que este servidor solo funcionara en la red interna.

Ahora crearemos el archivo de zona inverso db.192.168.1 con el siguiente comando:

$ sudo vi /etc/bind/zones/db.192.168.1

Presionamos «i» para editarlo y lo dejamos de la siguiente forma:

;
; BIND reverse data file for local loopback interface
;
$TTL    1d ;
@       IN      SOA     ns1.jcastaneda.com root.jcastaneda.com. (
                        20210222        ; Serial
                        12h             ; Refresh
                        15m             ; Retry
                        3w              ; Expire
                        2h )    ; Negative Cache TTL
;
@       IN      NS      ns1.jcastaneda.com.
110     IN      PTR     tester.jcastaneda.com.

Como puedes observar la configuración es casi la misma lo unico que cambia es la asignación de la ip. En nuestro caso solo tomaremos el ultimo octeto de nuestra red de acuerdo a como fue nombrado el archivo (db.192.168.1) que toma los 3 primeros octetos. en nuestro caso seria la ip 110 ya que es donde esta alojado el sitio web.

Probar configuracion de la sintaxis

Como una primera prueba ejecuta este comando:

$ named-checkconf

si existe algun error te lo mostrara en la terminal regularmente es que te falto algun punto y coma.

Con este comando podras revizar los archivos de zona:

$ sudo named-checkzone jcastaneda.com /etc/bind/zones/db.jcastaneda.com
zone jcastaneda.com/IN: loaded serial 20210222
OK

y con este comando podras revizar el archivo de zona inversa:

 sudo named-checkzone db.192.168.1.in-addr.arpa /etc/bind/zones/db.192.168.1
zone db.192.168.1.in-addr.arpa/IN: loaded serial 20210222
OK

Cuando no haya errores en la configuracion procedemos a reinicar el servidor Bind con el siguiente comando:

$ sudo systemctl restart bind9

Configurar Clientes DNS

Ha llegado el momento de probar nuestra configuración esta es muy sencilla y la puedes realizar de varias formas.

La primera es verificar su tu modem de internet te permite configurar los servidores de DNS para los equipos que se conecten a la red.

La segunda opción es definir equipo por equipo la ip de DNS Server esto es muy sencillo se realiza desde el panel de administración de red aunque varia entre sistemas operativos te comparto algunos ejemplos:

configurando servidor DNS en Mac
configurando servidors DNS en Windows

Una vez cambiados los Servidores DNS en los clientes lo primero que puedes hacer es dar verificar si tienes internet por medio de un ping en consola con el siguiente comando:

 % ping www.google.com
PING www.google.com (142.250.68.132): 56 data bytes
64 bytes from 142.250.68.132: icmp_seq=0 ttl=117 time=50.725 ms
64 bytes from 142.250.68.132: icmp_seq=1 ttl=117 time=50.300 ms
64 bytes from 142.250.68.132: icmp_seq=2 ttl=117 time=50.388 ms
64 bytes from 142.250.68.132: icmp_seq=3 ttl=117 time=51.388 ms
64 bytes from 142.250.68.132: icmp_seq=4 ttl=117 time=51.028 ms
^C
--- www.google.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 50.300/50.766/51.388/0.404 ms

Despues probaremos si podemos conectar con la el subdominio tester.jcastaneda.com el cual esta alojado en un servidor dentro de nuestra red interna:

% ping tester.jcastaneda.com
PING tester.jcastaneda.com (192.168.1.110): 56 data bytes
64 bytes from 192.168.1.110: icmp_seq=0 ttl=64 time=0.253 ms
64 bytes from 192.168.1.110: icmp_seq=1 ttl=64 time=0.342 ms
64 bytes from 192.168.1.110: icmp_seq=2 ttl=64 time=0.308 ms
64 bytes from 192.168.1.110: icmp_seq=3 ttl=64 time=0.329 ms
64 bytes from 192.168.1.110: icmp_seq=4 ttl=64 time=0.298 ms
^C
--- tester.jcastaneda.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.253/0.306/0.342/0.031 ms

Por ultimo podemos hacer un ping a www.jcastaneda.com el cual si recuerdas se encuentra en el servidor VPS fuera de la red.

% ping www.jcastaneda.com
PING jcastaneda.com (162.214.112.125): 56 data bytes
64 bytes from 162.214.112.125: icmp_seq=0 ttl=50 time=79.989 ms
64 bytes from 162.214.112.125: icmp_seq=1 ttl=50 time=80.057 ms
64 bytes from 162.214.112.125: icmp_seq=2 ttl=50 time=79.983 ms
64 bytes from 162.214.112.125: icmp_seq=3 ttl=50 time=80.396 ms
64 bytes from 162.214.112.125: icmp_seq=4 ttl=50 time=80.863 ms
^C
--- jcastaneda.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 79.983/80.258/80.863/0.339 ms

Configurar Virtualhost para el subdominio tester.jcastaneda.com

como vimos en guias anteriores crearemos un virtualhost de forma rápida con el siguiente comando:

sudo vi /etc/apache2/sites-available/tester.jcastaneda.com.conf

Presionamos «i» para insertar el siguiente texto.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName tester.jcastaneda.com
    DocumentRoot /var/www/tester.jcastaneda.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Presionamos «:wq» para guardar y salir. Después creamos la carpeta del sitio y el archivo index con los siguientes comandos:

sudo mkdir /var/www/tester.jcastaneda.com

sudo vi /var/www/tester.jcastaneda.com/index.php

Ingresamos el siguiente código:

<html>
        <head>
                <title>Tester</title>
        </head>
        <body>
                <h1> Bienvenido a Tester </h1>
                <p>Este sitio web corre desde mi servidor en casero</p>
        </body>
</html>

Guardamos y después activamos el virtualhost y reiniciamos apache

sudo a2ensite tester.jcastaneda.com.conf

sudo systemctl restart apache2

Aqui tenemos el resultado final:

Virtualhost con Bind9

Espero que con esta guia pequeña te puedas dar una idea de como funciona un servidor de nombres de dominios, se que no es la mejor forma de implementarlos por que se requieren servidores primarios y secundarios para que se propague correctamente la dns pero al ser internos con un servidor basta.

Sin mas te invito a que nos siguas en las redes sociales y compartas en contenido.

Nos vemos en otra entrega.

Categorías: servidores

8 comentarios

Antonio · julio 17, 2021 a las 2:19 pm

Hola primero gtacias por tus indicaciones. El bind ya funciona pero al resolver las direcciones internas no me da la ip. ¿Podrias agregar la configuración para otro dominio virtual de apacche adicional a tester? Abri el puerto 53 y 43. Saludos

    Jorge Castañeda · octubre 5, 2021 a las 3:24 am

    Hola que tal buen dia. Una disculpa por la respuesta algo tarde. pero estaba trabajando en otros proyectos.
    Claro que es posible si quisieras agregar otro dominio lo primero que tienes que hacer es configurar la zona en este archivo del mismo modo como en jcastaneda /etc/bind/named.conf.local
    por ejemplo:

    zone "tudominio.com" {
    type master;
    file "/etc/bind/zones/db.tudominio.com";
    allow-transfer { internals; };
    };

    zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
    allow-transfer { internals; };
    };

    y ya dentro del archivo:

    /etc/bind/zones/db.tudominio.com

    ;
    ; BIND data file for local loopback interface
    ;
    $TTL 604800
    @ IN SOA ns1.jcastaneda.com. root.jcastaneda.com. (

    20210222
    ; Serial
    12h ; Refresh
    15m ; Retry
    3w ; Expire
    2h ) ; Negative Cache TTL
    ;

    @ IN A 192.168.1.110
    www IN CNAME tudominio.com.
    tester IN A 192.168.1.110

    y el archivo inverso quedaria de esta forma:

    ;
    ; BIND reverse data file for local loopback interface
    ;
    $TTL 1d ;
    @ IN SOA ns1.jcastaneda.com root.jcastaneda.com. (
    20210222 ; Serial
    12h ; Refresh
    15m ; Retry
    3w ; Expire
    2h ) ; Negative Cache TTL
    ;
    @ IN NS ns1.jcastaneda.com.
    110 IN PTR tudominio.com.

    si tienes dudas al respecto igual y podemos revisar mas a detalle con la configuracion de tus archivos.

    saludos y gracias por tus comentarios.

jacinto · diciembre 1, 2021 a las 4:35 pm

muchas gracias jcastaneda.

servidor casero ubuntu · enero 9, 2022 a las 10:57 pm

me sirvio mucho…

gustavo · abril 29, 2022 a las 5:22 am

Hola… todo me funciona menos el acceso des u browser en un equipo de red
no abre el host configurado

    Jorge Castañeda · abril 29, 2022 a las 3:39 pm

    Hola que tal gustavo. que bueno que te funciona el mini tutorial. para poder acceder desde un browser en red. primero verificaria que el equipo este configurado con el dns correcto configurando la ip del servidor dns para mi caso la 192.168.1.100, despues de esto haria ping al host vitual para ver si resuelve correctamente. con esto comprobarias que el dns esta configurado correctamente. posteriormente veficaria que el virtualhost esta bien configurado. espero con esto ayudar un poco con tu server. Saludos

Jaime · noviembre 19, 2022 a las 2:54 am

Si quiero poner al dominio comunidadsnet.nat.cu y ponerle ns1.comunidadsnet.nat.cu

Cómo sería ???

▷ Tutorial:Configurar certificados ssl en Ubuntu Server 20.04 - jcastaneda · diciembre 6, 2021 a las 6:38 am

[…] servidor de nombres de dominios DNS (opcional) […]

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *