Guía paso a paso para configurar un servidor DNS BIND en un entorno chroot para Red Hat (RHEL / CentOS) 7

La traducción del artículo se ha preparado para los estudiantes del curso «Seguridad de Linux». ¿Te interesa desarrollarte en esta área? Mira la grabación de la transmisión del taller de Ivan Piskunov «Seguridad en Linux en comparación con Windows y MacOS»

Guía paso a paso para configurar un servidor DNS BIND en un entorno chroot para Red Hat (RHEL / CentOS) 7

En este artículo, hablaré sobre los pasos para configurar un servidor DNS en RHEL 7 o CentOS 7. Para la demostración, utilicé Red Hat Enterprise Linux 7.4. Nuestro objetivo es crear un registro A y un registro PTR para la zona de búsqueda directa y la inversa, respectivamente.

Primero, instale los paquetes rpm necesarios para el servidor DNS.

NOTA: Para RHEL, debe tener una suscripción activa a RHN, o puede configurar un repositorio local autónomo, que permitirá al administrador de paquetes «yum» instalar los paquetes rpm y dependencias necesarias.

# yum install bind bind-chroot caching-nameserver

Mis configuraciones:

# hostname
golinuxhub-client.example
Мой IP-адрес 192.168.1.7
# ip address | egrep 'inet.*enp0s3'
    inet 192.168.1.7/24 brd 192.168.1.255 scope global dynamic enp0s3

Dado que usaremos chroot, es necesario detener el servicio.

# systemctl stop named
# systemctl disable named

Luego, copie los archivos necesarios en el directorio chroot.
NOTA. Use el argumento -p en el comando cp para mantener los permisos y propietarios.

[root@golinuxhub-client ~]# cp -rpvf /usr/share/doc/bind-9.9.4/sample/etc/* /var/named/chroot/etc/
‘/usr/share/doc/bind-9.9.4/sample/etc/named.conf’ -> ‘/var/named/chroot/etc/named.conf’
‘/usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones’ -> ‘/var/named/chroot/etc/named.rfc1912.zones’

Luego, copie los archivos de zona en el nuevo lugar.

[root@golinuxhub-client ~]# cp -rpvf /usr/share/doc/bind-9.9.4/sample/var/named/* /var/named/chroot/var/named/
‘/usr/share/doc/bind-9.9.4/sample/var/named/data’ -> ‘/var/named/chroot/var/named/data’
‘/usr/share/doc/bind-9.9.4/sample/var/named/my.external.zone.db’ -> ‘/var/named/chroot/var/named/my.external.zone.db’
‘/usr/share/doc/bind-9.9.4/sample/var/named/my.internal.zone.db’ -> ‘/var/named/chroot/var/named/my.internal.zone.db’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.ca’ -> ‘/var/named/chroot/var/named/named.ca’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.empty’ -> ‘/var/named/chroot/var/named/named.empty’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.localhost’ -> ‘/var/named/chroot/var/named/named.localhost’
‘/usr/share/doc/bind-9.9.4/sample/var/named/named.loopback’ -> ‘/var/named/chroot/var/named/named.loopback’
‘/usr/share/doc/bind-9.9.4/sample/var/named/slaves’ -> ‘/var/named/chroot/var/named/slaves’
‘/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.ddns.internal.zone.db’ -> ‘/var/named/chroot/var/named/slaves/my.ddns.internal.zone.db’
‘/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.slave.internal.zone.db’ -> ‘/var/named/chroot/var/named/slaves/my.slave.internal.zone.db’
```bash
Ahora veamos el archivo de configuración principal.
```bash
# cd /var/named/chroot/etc/

Limpie el contenido de named.conf e inserte lo siguiente.

[root@golinuxhub-client etc]# vim named.conf
options {
        listen-on port 53 { 127.0.0.1; any; };
#       listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; any; };
        allow-query-cache { localhost; any; };
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

view my_resolver {
        match-clients      { localhost; any; };
        recursion yes;
        include "/etc/named.rfc1912.zones";
};

La información relacionada con la zona debe ser añadida en /var/named/chroot/etc/named.rfc1912.zones. Agregue los registros indicados a continuación. El archivo example.zone es un archivo de zona de vista directa, y example.rzone — es el archivo de zona inversa.

NOTA IMPORTANTE: La zona de vista inversa contiene 1.168.192, ya que mi dirección IP es 192.168.1.7

zone "example" IN {
        type master;
        file "example.zone";
        allow-update { none; };
};

zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "example.rzone";
        allow-update { none; };
};

Los archivos relacionados con las zonas están aquí:

# cd /var/named/chroot/var/named/

A continuación, crearemos archivos para las zonas directa e inversa. Los nombres de los archivos serán los mismos que arriba en el archivo named.rfc1912.zones. Ya tenemos algunas plantillas predeterminadas que podemos usar.

# cp -p named.localhost  example.zone
# cp -p named.loopback example.rzone

Como puede ver, los permisos actuales de todos los archivos y directorios son propiedad de root.

[root@golinuxhub-client named]# ll
total 32
drwxr-xr-x. 2 root root    6 May 22  2017 data
-rw-r--r--. 1 root root  168 May 22  2017 example.rzone
-rw-r--r--. 1 root root  152 May 22  2017 example.zone
-rw-r--r--. 1 root root   56 May 22  2017 my.external.zone.db
-rw-r--r--. 1 root root   56 May 22  2017 my.internal.zone.db
-rw-r--r--. 1 root root 2281 May 22  2017 named.ca
-rw-r--r--. 1 root root  152 May 22  2017 named.empty
-rw-r--r--. 1 root root  152 May 22  2017 named.localhost
-rw-r--r--. 1 root root  168 May 22  2017 named.loopback
drwxr-xr-x. 2 root root   71 Feb 12 21:02 slaves

Cambia los permisos de todos los archivos, estableciendo al usuario root y al grupo named.

# chown root:named *

Pero para data, el propietario debe ser named:named.

# chown -R  named:named data
# ls -l
total 32
drwxr-xr-x. 2 named named    6 May 22  2017 data
-rw-r--r--. 1 root  named  168 May 22  2017 example.rzone
-rw-r--r--. 1 root  named  152 May 22  2017 example.zone
-rw-r--r--. 1 root  named   56 May 22  2017 my.external.zone.db
-rw-r--r--. 1 root  named   56 May 22  2017 my.internal.zone.db
-rw-r--r--. 1 root  named 2281 May 22  2017 named.ca
-rw-r--r--. 1 root  named  152 May 22  2017 named.empty
-rw-r--r--. 1 root  named  152 May 22  2017 named.localhost
-rw-r--r--. 1 root  named  168 May 22  2017 named.loopback
drwxr-xr-x. 2 root  named   71 Feb 12 21:02 slaves

Agregue el contenido a continuación al archivo de zona directa. Aquí creamos un registro A para localhost (golinuxhub-client) y otro para el servidor (golinuxhub-server).

# vim example.zone
$TTL 1D
@       IN SOA  example. root (
                                        1       ; serial
                                        3H      ; refresh
                                        15M     ; retry
                                        1W      ; expire
                                        1D )    ; minimum

                IN NS           example.

                        IN A 192.168.1.7
golinuxhub-server       IN A 192.168.1.5
golinuxhub-client       IN A 192.169.1.7

A continuación, agregue el contenido al archivo de zona inversa. Aquí creamos un registro PTR para golinuxhub-client y para el servidor golinuxhub-server.

# vim example.rzone
$TTL 1D
@       IN SOA  example. root.example. (
                                        1997022700      ; serial
                                        28800           ; refresh
                                        14400           ; retry
                                        3600000         ; expire
                                        86400  )        ; minimum

        IN NS   example.
5       IN PTR  golinuxhub-server.example.
7       IN PTR  golinuxhub-client.example.

Antes de iniciar el servicio named-chroot, verifiquemos la configuración del archivo de zona.

[root@golinuxhub-client named]# named-checkzone golinuxhub-client.example example.zone
zone golinuxhub-client.example/IN: loaded serial 1
OK

[root@golinuxhub-client named]# named-checkzone golinuxhub-client.example example.rzone
zone golinuxhub-client.example/IN: loaded serial 1997022700
OK

Todo parece estar bien. Ahora verifique el archivo de configuración utilizando el siguiente comando.

[root@golinuxhub-client named]# named-checkconf -t /var/named/chroot/ /etc/named.conf

Así que, todo se realizó con éxito.

[root@golinuxhub-client named]# echo $?
0

IMPORTANTE: tengo SELinux en modo permisivo

# getenforce
Permissive

Todo se ve bien, así que es hora de iniciar nuestro servicio named-chroot .

[root@golinuxhub-client named]# systemctl restart named-chroot

[root@golinuxhub-client named]# systemctl status named-chroot
● named-chroot.service - Dominio de Nombre de Internet de Berkeley (DNS)
   Cargado: cargado (\/usr\/lib\/systemd\/system\/named-chroot.service; deshabilitado; predeterminado del proveedor: deshabilitado)
   Activo: activo (ejecutándose) desde lun 12 de feb 2018 21:53:23 IST; hace 19s
  Procesos: 5236 ExecStop=\/bin\/sh -c \/usr\/sbin\/rndc stop >\/dev\/null 2>&1 || \/bin\/kill -TERM $MAINPID (código=sale, estado=0/SUCESSO)
  Procesos: 5327 ExecStart=\/usr\/sbin\/named -u named -c ${NAMEDCONF} -t \/var\/named\/chroot $OPTIONS (código=sale, estado=0/SUCESSO)
  Procesos: 5325 ExecStartPre=\/bin\/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then \/usr\/sbin\/named-checkconf -t \/var\/named\/chroot -z "$NAMEDCONF"; else echo "La verificación de archivos de zona está desactivada"; fi (código=sale, estado=0/SUCESSO)
 PID Principal: 5330 (named)
   CGroup: \/system.slice\/named-chroot.service
           └─5330 \/usr\/sbin\/named -u named -c \/etc\/named.conf -t \/var\/named\/chroot

Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: managed-keys-zone\/my_resolver: cargado serial 0
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: zona 0.in-addr.arpa\/IN\/my_resolver: cargado serial 0
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: zona 1.0.0.127.in-addr.arpa\/IN\/my_resolver: cargado serial 0
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: zona 1.168.192.in-addr.arpa\/IN\/my_resolver: cargado serial 1997022700
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: zona ejemplo\/IN\/my_resolver: cargado serial 1
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: zona localhost\/IN\/my_resolver: cargado serial 0
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: zona 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa\/IN\/my_resolver: cargado serial 0
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: zona localhost.localdomain\/IN\/my_resolver: cargado serial 0
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: todas las zonas cargadas
Feb 12 21:53:23 golinuxhub-client.ejemplo named[5330]: en ejecución
```bash
Asegúrate de que resolv.conf contenga tu dirección IP para que pueda funcionar como un servidor DNS.
```bash
# cat \/etc\/resolv.conf
search ejemplo
nameserver 192.168.1.7
```bash
Verifiquemos nuestro servidor DNS para la zona inversa usando dig.
```bash
[root@golinuxhub-client named]# dig -x 192.168.1.5

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> -x 192.168.1.5
;; opciones globales: +cmd
;; Recibió respuesta:
;; ->>HEADER<<- opcode: QUERY, estado: NOERROR, id: 40331
;; banderas: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; SECCIÓN PSEUDOOPT:
; EDNS: versión: 0, banderas:; udp: 4096
;; SECCIÓN DE PREGUNTA:
;5.1.168.192.in-addr.arpa.      IN      PTR

;; SECCIÓN DE RESPUESTA:
5.1.168.192.in-addr.arpa. 86400 IN      PTR     golinuxhub-server.ejemplo.

;; SECCIÓN DE AUTORIDAD:
1.168.192.in-addr.arpa. 86400   IN      NS      ejemplo.

;; SECCIÓN ADICIONAL:
ejemplo.                86400   IN      A       192.168.1.7

;; Tiempo de consulta: 1 mseg
;; SERVIDOR: 192.168.1.7#53(192.168.1.7)
;; CUANDO: lun feb 12 22:13:17 IST 2018
;; TAMAÑO MSG recibido: 122

Como puedes ver, recibimos una respuesta positiva (ANSWER) a nuestra consulta (QUERY).

[root@golinuxhub-client named]# dig -x 192.168.1.7

; <> DiG 9.9.4-RedHat-9.9.4-50.el7 <> -x 192.168.1.7
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55804
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;7.1.168.192.in-addr.arpa.      IN      PTR

;; ANSWER SECTION:
7.1.168.192.in-addr.arpa. 86400 IN      PTR     golinuxhub-client.example.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400   IN      NS      example.

;; ADDITIONAL SECTION:
example.                86400   IN      A       192.168.1.7

;; Query time: 1 msec
;; SERVER: 192.168.1.7#53(192.168.1.7)
;; WHEN: Mon Feb 12 22:12:54 IST 2018
;; MSG SIZE  rcvd: 122

De la misma manera, podemos verificar la zona directa.

[root@golinuxhub-client named]# nslookup golinuxhub-client.example
Server:         192.168.1.7
Address:        192.168.1.7#53

Name:   golinuxhub-client.example
Address: 192.169.1.7

[root@golinuxhub-client named]# nslookup golinuxhub-server.example
Server:         192.168.1.7
Address:        192.168.1.7#53

Name:   golinuxhub-server.example
Address: 192.168.1.5

Este artículo está algo desactualizado, ya que en RHEL 7 ya no es necesario copiar los archivos de configuración de BIND en chroot. Tutorial Paso a Paso: Configurar el Servidor DNS usando BIND chroot (CentOS/RHEL 7).

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster