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.
- Resolver DNS de internet en todos los equipos de la red interna.
- 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:
- named.conf.options
- 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:
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:
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.
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) […]