Saltar al contenido principal

Práctica 302. Servidor DNS Technitium

Nesta práctica imos crear o noso propio servidor DNS para poder engadir rexistros. Para levantar o servizo utilizaremos Docker.


Requisitos


Apartado 1

Crea un ficheiro compose.yml co seguinte contido:

compose.yml
services:
dns-server:
container_name: dns-server
hostname: dns-server
image: technitium/dns-server:latest
# For DHCP deployments, use "host" network mode and remove all the port mappings,
# including the ports array by commenting them network_mode: "host"
ports:
- "5380:5380/tcp" #DNS web console (HTTP)
- "53:53/udp" #DNS service
- "53:53/tcp" #DNS service
environment:
- DNS_SERVER_DOMAIN=dns-server #The primary domain name used by this DNS Server to identify itself.
volumes:
- config:/etc/dns
restart: unless-stopped
sysctls:
- net.ipv4.ip_local_port_range=1024 65000

volumes:
config:
Ficheiro compose.yml completo.
compose.yml
services:
dns-server:
container_name: dns-server
hostname: dns-server
image: technitium/dns-server:latest
# For DHCP deployments, use "host" network mode and remove all the port mappings, including the ports array by commenting them
# network_mode: "host"
ports:
- "5380:5380/tcp" #DNS web console (HTTP)
# - "53443:53443/tcp" #DNS web console (HTTPS)
- "53:53/udp" #DNS service
- "53:53/tcp" #DNS service
# - "853:853/udp" #DNS-over-QUIC service
# - "853:853/tcp" #DNS-over-TLS service
# - "443:443/udp" #DNS-over-HTTPS service (HTTP/3)
# - "443:443/tcp" #DNS-over-HTTPS service (HTTP/1.1, HTTP/2)
# - "80:80/tcp" #DNS-over-HTTP service (use with reverse proxy or certbot certificate renewal)
# - "8053:8053/tcp" #DNS-over-HTTP service (use with reverse proxy)
# - "67:67/udp" #DHCP service
environment:
- DNS_SERVER_DOMAIN=dns-server #The primary domain name used by this DNS Server to identify itself.
# - DNS_SERVER_ADMIN_PASSWORD=password #DNS web console admin user password.
# - DNS_SERVER_ADMIN_PASSWORD_FILE=password.txt #The path to a file that contains a plain text password for the DNS web console admin user.
# - DNS_SERVER_PREFER_IPV6=false #DNS Server will use IPv6 for querying whenever possible with this option enabled.
# - DNS_SERVER_WEB_SERVICE_LOCAL_ADDRESSES=172.17.0.1,127.0.0.1 #Comma separated list of network interface IP addresses that you want the web service to listen on for requests. The "172.17.0.1" address is the built-in Docker bridge. The "[::]" is the default value if not specified. Note! This must be used only with "host" network mode.
# - DNS_SERVER_WEB_SERVICE_HTTP_PORT=5380 #The TCP port number for the DNS web console over HTTP protocol.
# - DNS_SERVER_WEB_SERVICE_HTTPS_PORT=53443 #The TCP port number for the DNS web console over HTTPS protocol.
# - DNS_SERVER_WEB_SERVICE_ENABLE_HTTPS=false #Enables HTTPS for the DNS web console.
# - DNS_SERVER_WEB_SERVICE_USE_SELF_SIGNED_CERT=false #Enables self signed TLS certificate for the DNS web console.
# - DNS_SERVER_OPTIONAL_PROTOCOL_DNS_OVER_HTTP=false #Enables DNS server optional protocol DNS-over-HTTP on TCP port 8053 to be used with a TLS terminating reverse proxy like nginx.
# - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks #Recursion options: Allow, Deny, AllowOnlyForPrivateNetworks, UseSpecifiedNetworks.
# - DNS_SERVER_RECURSION_DENIED_NETWORKS=1.1.1.0/24 #Comma separated list of IP addresses or network addresses to deny recursion. Valid only for `UseSpecifiedNetworks` recursion option.
# - DNS_SERVER_RECURSION_ALLOWED_NETWORKS=127.0.0.1, 192.168.1.0/24 #Comma separated list of IP addresses or network addresses to allow recursion. Valid only for `UseSpecifiedNetworks` recursion option.
# - DNS_SERVER_ENABLE_BLOCKING=false #Sets the DNS server to block domain names using Blocked Zone and Block List Zone.
# - DNS_SERVER_ALLOW_TXT_BLOCKING_REPORT=false #Specifies if the DNS Server should respond with TXT records containing a blocked domain report for TXT type requests.
# - DNS_SERVER_BLOCK_LIST_URLS= #A comma separated list of block list URLs.
# - DNS_SERVER_FORWARDERS=1.1.1.1, 8.8.8.8 #Comma separated list of forwarder addresses.
# - DNS_SERVER_FORWARDER_PROTOCOL=Tcp #Forwarder protocol options: Udp, Tcp, Tls, Https, HttpsJson.
# - DNS_SERVER_LOG_USING_LOCAL_TIME=true #Enable this option to use local time instead of UTC for logging.
volumes:
- config:/etc/dns
restart: unless-stopped
sysctls:
- net.ipv4.ip_local_port_range=1024 65000

volumes:
config:

Apartado 2

Sitúate coa terminal no directorio onde está almacenado o compose.yml.

Executa o seguinte comando para arrancar o servidor:

docker compose up -d

Cando remates coa tarefa, para deter o servidor DNS, executa:

docker compose down

Para proseguir ca tarefa, volve executar o primeiro comando. Sempre se debe facer no directorio onde se atopa o ficheiro compose.yaml.


Apartado 3

Desde un navegador web, accede á URL localhost:5380 para ver a interface web que xestiona o servidor DNS.

As credenciais de acceso son:

  • Usuario: admin
  • Contrasinal: abc123.

Apartado 4

Imos comprobar que funciona. Para iso, o comando dig debe ter a seguinte forma:

dig @localhost

Con isto estás indicando que en lugar de resolver cara o servidor DNS que está configurado no sistema operativo, falo cara o servidor DNS de localhost. Neste caso localhost é o servidor DNS que creamos.

Resolve o dominio de www.google.com utilizando o noso servidor. Realiza capturas da saída da execución do comando.

Como o noso servidor non é un servidor autoritario da zona google.com, fai unha consulta recursiva para dar resolto dito nome.


Apartado 5

Imos crear unha zona directa que o noso servidor poida resolver.

Segue o seguintes pasos:

  • Na interface web do servidor DNS, vaite a Zones e preme no botón Add Zone.
  • Engade a zona iniciais.gal como zona primaria.

Realiza unha captura onde se vexa na interface web a zona creada.

Comezaremos creando os rexistros A da seguinte táboa:

nomeIP
www.iniciais.gal10.0.0.101
db.iniciais.gal10.0.0.102
sftp.iniciais.gal10.0.0.103

Con dig resolve estes tres rexistros. Realiza capturas da saída da execución dos comandos.


Apartado 6

Imaxinemos agora que a nosa web se atopa na IP 10.0.0.101, que é onde apunta o nome www.iniciais.gal. Pero queremos que tamén se poida acceder a web con outros nomes como es.iniciais.gal ou en.iniciais.gal. Poderiamos engadir outros dous rexistros A. Se nalgún momento tiveramos que migrar o servidor web (algo bastante habitual), entón teriamos que modificar os tres rexistros A pola nova IP. Nestes casos o mellor é utilizar os rexistros CNAME.

Engade un rexistro CNAME para es.iniciais.gal e en.iniciais.gal que apunte a www.iniciais.gal.

Fai a resolución con dig destes nomes de dominio. Realiza capturas da saída da execución dos comandos.


Apartado 7

Xeralmente cando nun navegador web introducimos un nome de dominio, este automaticamente mostra o contido da web. Por exemplo, se poñemos google.com este xa nolo traduce por www.google.com. Imos facer o mesmo pero para o noso dominio. Teremos que utilizar o rexistro ANAME para este caso.

Fai a resolución con dig do nome iniciais.gal. Verás que non che resolve con ningunha IP. Realiza capturas da saída da execución dos comandos.

Engade un novo rexistro ANAME pero no nome escribe o símbolo @. Este tradúcese polo nome da zona, neste caso iniciais.gal. Fai que apunte a www.iniciais.gal.

Fai a resolución con dig do nome iniciais.gal. Realiza capturas da saída da execución dos comandos.


Apartado 8

Cando estás despregando unha aplicación web (por exemplo en Let's Encrypt), é común que o provedor che pida engadir un rexistro TXT no DNS para verificar que es o propietario do dominio antes de que permitan enlazar a túa aplicación con ese dominio. Imos ver un exemplo de como engadir este tipo de rexistro.

Engade un rexistro TXT para o nome _acme-challenge.www.iniciais.gal co valor x8FsezU9-8FwGz3gABX6JcRQ8hX8K4sNzyEaD9xRZpA.

Resolve este nome de dominio. Recorda utilizar dig TXT ... para realizar a consulta deste tipo de rexistros Realiza capturas da saída da execución dos comandos.


Apartado 9

Os rexistros CNAME tamén permiten resolver cara dominios doutra zona. Isto é moi habitual. En moitos servizos de Cloud, se che proporcionan unha máquina virtual non che indican a súa IP, senón que che din o seu nome (isto realizase para esquivar o problema de falta de IPs públicas). Polo tanto, se eu levanto unha aplicación nesa máquina virtual, terei que apuntar cara ese nome que me proporcionaron cun rexistro CNAME.

Engade un rexistro CNAME para search.iniciais.gal que apunte a www.google.com.

Fai a resolución con dig destes nomes de dominio. Realiza capturas da saída da execución dos comandos.