Configurar GNU/Linux para usar forward DNS y el servidor DNS de Consul

Escrito por el .
planeta-codigo gnu-linux
Enlace permanente Comentarios

Una de las cuestiones que tenía pendiente de mirar sobre Consul es como hacer que un nodo con GNU/Linux pueda acceder al catálogo de servicios mediante la interfaz DNS que ofrece Consul. Para esto es necesario configurar el forward DNS.

HashiCorp Consul

Quizá las aplicaciones no se pueden modificar para integrarse directamente con Consul por su antigüedad o no hay tiempo ni personas para hacerle esos grandes cambios, una forma sencilla que no requiere grandes cambios en las aplicaciones y que les da acceso a algunas de las funcionalidades que proporciona Consul es utilizar su servicio DNS.

Configurar que el nodo donde se ejecuta un servicio pueda acceder al catálogo de servicios de Consul mediante la interfaz DNS requiere configurar el forward DNS en la configuración de red.

El servidor Consul

Consul es una herramienta desarrollada por Hashicorp centrada en la conectividad entre los servicios. Ofrece varias funcionalidades específicas para las aplicaciones compuestas de múltiples servicios. Consul proporciona una catálogo de servicios actualizado y con información del estado de los servicios, conectividad entre los servicios con el service mesh y almacenamiento clave-valor para la configuración de aplicaciones.

Algo ya he comentado en varios artículos sobre Consul y otros productos de Hashicorp como Vault y Nomad.

Consul además a través de su API el catálogo de los servicios lo ofrece mediante un servidor DNS propio. Los servicios del catálogo se añaden a su servidor DNS con el sufijo consul, los servicios registrados en Consul tienen un nombre de dominio con la siguiente estructura. Consul se encarga de que en una consulta solo se devuelvan los servicios que han respondido correctamente al healthcheck y devolver todas las instancias de un mismo servicio si hay varias en varios nodos.

  • web.service.consul para los servicios.
  • web.query.consul para las consultas.

Con las consultas o queries es posible crear filtros específicos por varios criterios y obtener los servicios que coincidan con la consulta, pero las consultas dan para otro artículo. En este artículo con el servidor DNS que ofrece Consul la cuestión es cómo hacer que en GNU/Linux uno de esos dominios sea resuelto para lo que hay que configurar el forward DNS.

Configurar en GNU/Linux el forward DNS al servicio DNS de Consul

El número puerto estándar del servicio DNS es el 53, en GNU/Linux los servicios en el número de puerto menor de 1024 requiere permisos de root que por seguridad es algo que no se desea ejecutar Consul.

Consul ofrece el servicio de DNS en el puerto 8600 con lo que para ejecutar consul sin permisos de root es necesario redirigir las consultas de DNS al puerto 8600. Esta redirección en GNU/Linux se puede hacer de dos formas con systemd-resolver o con dnsmasq. A continuación muestro la configuración para la opción con systemd-resolver y NetworkManager.

Redirigir peticiones DNS de los dominios a Consul

En Arch Linux el gestor de red que utilizo es NetworkManager, el primer paso para la configuración es hacer que NetworkManager también utilice systemd-resolved para la resolución de las consultas DNS. Hay que crear el siguiente archivo de configuración /etc/NetworkManager/conf.d/dns.conf.

1
2
[main]
dns=systemd-resolved
dns.conf

El segundo paso es configurar systemd-resolved para que redirigir las consultas de DNS de los dominios con el sufijo consul al servidor DNS de Consul, en esta configuración se especifica la dirección IP del servidor de Consul que será la local y el puerto. Hay que editar el archivo /etc/systemd/resolved.conf.

1
2
3
[Resolve]
DNS=127.0.0.1:8600
Domains=consul
resolved.conf

Con la configuración realizada hay que iniciar y habilitar el servicio systemd-resolved y recargar la configuración de NetworkManager.

1
2
$ sudo systemctl start systemd-resolved.service
$ nmcli general reload
systemctl.sh

Ahora es posible acceder a la interfaz de la consola web de Consul con el dominio en vez de con la dirección IP.

Consola web de Consul con dominio del servicio

Consola web de Consul con dominio del servicio

También es posible hacer un ping y el dominio se resolverá a la dirección IP. Y obtener información del dominio con los comandos dig y nslookup.

1
2
$ dig consul.service.consul

dig.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
; <<>> DiG 9.18.24 <<>> consul.service.consul
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16847
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
consul.service.consul.	0	IN	A	127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Feb 24 17:57:02 CET 2024
;; MSG SIZE  rcvd: 66
dig.out
1
2
$ nslookup consul.service.consul

nslookup.sh
1
2
3
4
5
6
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	consul.service.consul
Address: 127.0.0.1
nslookup.out


Comparte el artículo: