Configuración de vistas en el servidor DNS con Bind9
- Francisco Javier Huete
- Servicios
- January 27, 2025
Índice
En un escenario formado por dos máquinas, en el que una de ellas contiene dos contenedores LXC, se configura un servidor DNS con diferentes vistas.
El servidor DNS se configura en uno de los contenedores alojados en la máquina que funciona como router del escenario. Para ello, en primer lugar se accede al conetenedor y se instala el servidor DNS Bind9.
apt install bind9
En el fichero /etc/bind/named.conf.options se configuran las opciones del servidor. En principio, se puede usar el parámetro allow-query
para permitir consultas desde todas las redes del escenario y desactivar el sistema dnssec-validation
.
dnssec-validation no;
allow-query {172.22.0.0/16; 192.168.0.0/24; 172.16.0.0/16; };
A continuación, se definen las zonas sobre las que el servidor DNS tiene dominio en el fichero /etc/bind/named.conf.local. Para ello se van a usar dos vistas diferentes según si la consulta al DNS llega desde la red intra (192.168.0.0/24) o desde la red DMZ (172.16.0.0/16).
view red_intra {
match-clients { 192.168.0.0/24; };
allow-recursion { any; };
zone "javi.gonzalonazareno.org"
{
type master;
file "db.javiintra.gonzalonazareno.org";
};
zone "0.168.192.in-addr.arpa"
{
type master;
file "db.192.168.0";
};
zone "16.172.in-addr.arpa"
{
type master;
file "db.172.16";
};
include "/etc/bind/zones.rfc1918";
include "/etc/bind/named.conf.default-zones";
};
view red_DMZ {
match-clients { 172.16.0.0/16; 127.0.0.1; };
allow-recursion { any; };
zone "javi.gonzalonazareno.org"
{
type master;
file "db.javidmz.gonzalonazareno.org";
};
zone "0.168.192.in-addr.arpa"
{
type master;
file "db.192.168.0";
};
zone "16.172.in-addr.arpa"
{
type master;
file "db.172.16";
};
include "/etc/bind/zones.rfc1918";
include "/etc/bind/named.conf.default-zones";
};
Además, hay que comentar las zonas que se han declarado en este fichero en los otros ficheros incluidos en él. Así, en el fichero /etc/bind/zones.frc1918 se comentan las siguientes líneas:
//zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
//zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
Y en el fichero /etc/bind/named.conf se comenta la línea que incluye el fichero de zonas por defecto.
//include "/etc/bind/named.conf.default-zones";
Después, hay que rellenar los ficheros de de zona para las zonas declaradas previamente. Primero, se configura la zona javi.gonzalonazareno.org
cp /etc/bind/db.empty /var/cache/bind/db.javiintra.gonzalonazareno.org
En este fichero se configura la resolución directa de los nombres de las máquinas y servicios del escenario.
$TTL 86400
@ IN SOA nami.javi.gonzalonazareno.org. root.javi.gonzalonazareno.org. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS nami.javi.gonzalonazareno.org.
$ORIGIN javi.gonzalonazareno.org.
nami IN A 192.168.0.2
sanji IN A 192.168.0.3
luffy IN A 192.168.0.1
zoro IN A 172.16.0.200
www IN CNAME zoro
bd IN CNAME sanji
A partir de este fichero de zona, se puede generar el fichero para la otra zona definida anteriormente.
cp /var/cache/bind/db.javiintra.gonzalonazareno.org /var/cache/bind/db.javidmz.gonzalonazareno.org
En este caso, sólo cambia la línea para la resolución de luffy
, que es la única máquina del escenario que cuenta con dos direcciones IP diferentes.
luffy IN A 172.16.0.1
También hay que rellenar la información para los ficheros de resolución inversa. En este escenario hay dos redes y, por tanto, se usan dos ficheros de resolución inversa diferentes. Primero, se rellena el fichero para la resolución inversa de la red 192.168.0.0/24.
cp /etc/bind/db.empty /var/cache/bind/db.192.168.0
Con el siguiente contenido:
$TTL 86400
@ IN SOA nami.javi.gonzalonazareno.org. root.javi.gonzalonazaren>
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS nami.javi.gonzalonazareno.org.
$ORIGIN 0.168.192.in-addr.arpa.
1 IN PTR luffy.javi.gonzalonazareno.org.
2 IN PTR nami.javi.gonzalonazareno.org.
3 IN PTR sanji.javi.gonzalonazareno.org.
Después se repite la operación con el fichero para la zona 172.16.0.0/16.
cp /etc/bind/db.empty /var/cache/bind/db.172.16
Este fichero tiene el siguiente contenido:
$TTL 86400
@ IN SOA nami.javi.gonzalonazareno.org. root.javi.gonzalonazaren>
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS nami.javi.gonzalonazareno.org.
$ORIGIN 16.172.in-addr.arpa.
1.0 IN PTR luffy.javi.gonzalonazareno.org.
200.0 IN PTR zoro.javi.gonzalonazareno.org.
Configuración del DNS en los clientes
Para que el resto de máquinas de la red se refieran a nami
como servidor DNS, hay que configurar su dirección como DNS por defecto en los clientes. En este escenario nami
y sanji
son contenedores Ubuntu, con un direccionamiento estático y que usan netplan para su configuración de red. Así, un ejemplo de configuración de una de estas máquinas contendo con nami
como servidor DNS es el siguiente:
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.0.3/24
routes:
- to: default
via: 192.168.0.1
mtu: 1442
nameservers:
addresses:
- 192.168.0.2
En ambos contenedores se aplican los cambios.
netplan apply
La otra máquina del escenario, zoro
usa el sistema operativo Rocky Linux 9. En esta distribución se establece la configuración de red a través de NetworkManager usando algunos de sus clientes para terminal, ya sea nmcli
(línea de comandos) o nmtui
(interfaz de texto). En este caso, usando nmtui
se accede al menú edit connection
y se edita la única conexión configurada en la máquina para añadir la IP de nami
como DNS por defecto.
┌───────────────────────────┤ Edit Connection ├───────────────────────────┐
│ ↑│
│ Profile name Wired connection 1______________________ ▮│
│ Device eth0 (FA:16:3E:67:F3:1E)________________ ▒│
│ ▒│
│ ═ ETHERNET <Show> ▒│
│ ═ 802.1X SECURITY <Show> ▒│
│ ▒│
│ ╤ IPv4 CONFIGURATION <Manual> <Hide> ▒│
│ │ Addresses 172.16.0.200/32__________ <Remove> ▒│
│ │ <Add...> ▒│
│ │ Gateway 172.16.0.1_______________ ▒│
│ │ DNS servers 192.168.0.4______________ <Remove> ▒│
│ │ <Add...> ▒│
│ │ Search domains <Add...> ▒│
│ │ ▒│
│ │ Routing (No custom routes) <Edit...> ▒│
│ │ [ ] Never use this network for default route ▒│
│ │ [ ] Ignore automatically obtained routes ▒│
│ ↓│
└─────────────────────────────────────────────────────────────────────────┘
Por último, luffy
toma el servidor DNS por defecto de la configuración DHCP y, además, usa systemd
para gestionar la configuración de red. Así, se puede configurar su servidor DNS modificando el contenido del fichero de configuración /etc/systemd/resolved.conf.
[Resolve]
DNS=192.168.0.2
Para aplicar el cambio, se reinicia el servicio.
sudo systemctl restart systemd-resolved.service
Configuración del parámetro search
para poder usar los nombres cortos del escenario
Para poder usar los nombres cortos de las máquinas del escenario, se debe configurar en todos los clientes el nombre de dominio de las máquinas en el parámetro search
en la configuración del DNS.
En los contenedores, tanto nami
como sanji
, este parámetro se puede configurar en el fichero de configuración de red /etc/netplan/10-lxc.yaml.
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.0.2/24
routes:
- to: default
via: 192.168.0.1
mtu: 1442
nameservers:
addresses:
- 192.168.0.2
search:
- javi.gonzalonazareno.org
En el caso de zoro
, con Rocky Linux 9, esta configuración se puede añadir a través de la interfaz de texto nmtui
, desde la interfaz de la línea de comando nmcli
o editando el menú de configuración de la conexión. En este caso, este fichero es /etc/NetworkManager/system-connections/Wired connection 1.nmconnection. En este fichero, la configuración de la conexión para IPv4 es la siguiente:
[ipv4]
address1=172.16.0.200/32,172.16.0.1
dns=192.168.0.2;
method=manual
dns-search=javi.gonzalonazareno.org
Por úlitmo, en la máquina luffy
, que usa systemd
, una opción para configurar la búsqueda de dominios es uasr usa el parámetro Domains
en el fichero /etc/systemd/resolved.conf.
[Resolve]
DNS=192.168.0.2
Domains=javi.gonzalonazareno.org
Para aplicar el cambio, se reinicia el servicio.
sudo systemctl restart systemd-resolved.service
Configuración para acceder al servidor DNS desde el exterior
La máquina router de este escenario, luffy
es la única que tiene una dirección IP accesible desde fuera de esta red. Para que se pueda usar el servidor DNS desde fuera de la red hay que configurar una regla DNAT en el router que redirija el tráfico del puerto 53 al DNS. También es necesario contar con una nueva vista que muestre sólo la información que debe ser accesible desde fuera de la red y oculte aquella que no debe ser pública.
Regla DNAT
En el router luffy
una regla DNAT debe redirigir el tráfico que llegue al puerto 53 del router a la IP de nami
.
iptables -t nat -A PREROUTING -p udp --dport 53 -i ens3 -j DNAT --to 192.168.0.2
iptables-save > /etc/iptables/rules.v4
Creación de una nueva vista
Para que el servidor DNS sólo muestre al exterior la información relevante para el acceso a la red a través de la IP pública, es decir, la IP de luffy
y el alias del servicio www, hay que configurar una nueva vista en el servidor DNS. Esta vista se añade al fichero /etc/bind/named.conf.local.
view red_externa {
match-clients { 172.22.0.0/16; };
allow-recursion { any; };
zone "javi.gonzalonazareno.org"
{
type master;
file "db.javiexterna.gonzalonazareno.org";
};
include "/etc/bind/named.conf.default-zones";
};
En /var/cache/bind/ se rellena el fichero de zona.
$TTL 86400
@ IN SOA luffy.javi.gonzalonazareno.org. root.javi.gonzalonazare>
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS luffy.javi.gonzalonazareno.org.
$ORIGIN javi.gonzalonazareno.org.
luffy IN A 172.22.201.28
www IN CNAME luffy
Configurar el DNS como forwarder
Para que desde dentro del escenario se puedan resolver direcciones de fuera, hay que configurar el servidor DNS como forwarder hacia el servidor DNS principal en la red, que tiene configurada la delegación de dominio a los subdominos del resto de compañeros. Esta configuración se aplica en el fichero /etc/bind/named.conf.options.
forwarders {
172.22.0.1;
};