CentOS Linux y Servicios de Red

Anuncio
CentOS Linux y Servicios de Red
versiones 6 y 7
Antonio Vazquez
Este libro está a la venta en http://leanpub.com/centosserviciosdered
Esta versión se publicó en 2016-05-17
This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
© 2014 - 2016 Antonio Vazquez
Índice general
1.- Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.- CentOS 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.- CentOS 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
15
2.-Administración básica . . . . . . . . .
2.1.-Comandos básicos . . . . . . . . .
2.2.-Crear y editar ficheros . . . . . .
2.3.- Redirigir la salida de un comando
2.4.- Instalar software . . . . . . . . .
2.5.- Entorno gráfico . . . . . . . . . .
2.6.- Otros comandos útiles . . . . . .
2.7.- SELinux . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
27
29
36
36
48
58
61
3.- Networking . . . . . . . .
3.1.- IPv4 . . . . . . . . .
3.2.- IPv6 . . . . . . . . .
3.3.- Herramientas de red
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
66
66
75
77
4.- DNS . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.- Servicio DNS . . . . . . . . . . . . . . . . .
4.2.- Instalar un servidor DNS . . . . . . . . . . .
4.3.- Instalando un servidor maestro . . . . . . .
4.4.- Configuración del cliente . . . . . . . . . .
4.5.- Servidores esclavos y transferencias de zona
4.6.- DNSSEC . . . . . . . . . . . . . . . . . . . .
4.7.- Herramientas de diagnóstico . . . . . . . . .
4.8.- Resolución de problemas . . . . . . . . . . .
4.9.- Ficheros de log . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
82
82
84
87
99
101
111
114
119
124
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1.- Instalación
1.1.- CentOS 6
Como suele ocurrir con todo, existe más de una forma de instalar CentOS en un ordenador. Sin
embargo aqui únicamente nos centraremos en la instalación típica desde DVD. Lo primero que
hay que hacer es conseguir los DVDs. Éstos se pueden descargar desde el sitio oficial de CentOS
en https://www.centos.org/. En el momento de escribir este libro, los archivos ISO para Centos
6 se podían descargar desde los enlaces disponibles en http://wiki.centos.org/Download. Podemos
seleccionar la versión exacta que queremos instalar, la arquitectura (32 ó 64 bits) y el tipo de instación
(por red, mínima, etc…). Descargaremos los ficheros CentOS-6.2-i386-bin-DVD1.iso y CentOS-6.2i386-bin-DVD2.iso. Una vez que tenemos listos los DVDs la instalación es bastante sencilla. Nos
aseguramos de que el ordenador está configurado para arrancar desde DVD y lo reiniciamos con el
primer DVD de instalación insertado. Después de unos segundos veremos la pantalla de la Fig. 1.
Fig 1:Arrancando con el DVD de instalación
Elegiremos la primera opción “Install or upgrade an existing system”, esto lanzará el programa de
instalación. Ahora se nos ofrece la posibilidad de comprobar el medio de instalación (Fig. 2). Si
1
2
1.- Instalación
estamos seguros de que los DVDs están bien pulsamos en “Skip”.
Fig 2:Comprobando los medios de instalación
Ahora el sistema arrancará el instalador gráfico (Fig. 3).
3
1.- Instalación
Fig 3:El instalador gráfico
En las siguientes pantallas tendremos que elegir el idioma y la disposición del teclado (Fig. 4 y Fig.
5).
4
1.- Instalación
Fig 4:Idioma
5
1.- Instalación
Fig 5:Disposición del teclado
Ahora tenemos que especificar si estamos instalando CentOS en un disco estándar o en un dispositivo
especial como un disco de una SAN, un dispositivo iSCSI, etc… La mayoría de las veces instalaremos
sobre discos estándar así que seleccionaremos la primera opción (Fig. 6).
6
1.- Instalación
Fig 6:Seleccionando el tipo de dispositivo
Nada más pulsar el botón “Next” aparecerá un mensaje de advertencia (Fig. 7) para informarnos de
que se va a eliminar toda la información que pudiera haber en el disco. Como se trata de un disco
vacío, o bien de un disco cuyos datos ya no necesitamos, pulsamos en “Yes, discard any data”.
7
1.- Instalación
Fig 7:Advertencia, el disco podría tener datos
El programa ahora nos pide el nombre y el dominio del ordenador que estamos a punto de instalar
(Fig. 8). Podemos introducir esta información ahora o hacerlo una vez que la instalación haya
terminado. Pulsamos “Next”.
8
1.- Instalación
Fig 8:Nombre de máquina y dominio
En las siguientes pantallas tendremos que elegir la zona horaria y la contraseña del usuario root (Fig.
9 y Fig 10).
9
1.- Instalación
Fig 9:Zona horaria
10
1.- Instalación
Fig 10:Contraseña de root
Ahora se nos presentan varias opciones antes de comenzar con la instalación tal cual (Fig. 11).
Podemos elegir utilizar todo el disco independientemente de las particiones existentes, usar solo
las particiones Linux, solo el espacio libre, personalizar el particionado, etc… Como el particionado
por defecto resulta aceptable elegiremos la primera opción y utilizaremos todo el disco. Aunque si
tenemos perfectamente claro el papel que va a desempeñar el servidor en la red sería mejor optar
por un particionamiento personalizado con volúmenes o particiones separados para los directorios
/home, /var, etc…
11
1.- Instalación
Fig 11:Opciones de particionado del disco
Veremos otro mensaje de advertencia (Fig. 12) para recordarnos que los cambios se van a escribir a
disco, y acto seguido se nos pedirá que especifiquemos qué software queremos instalar.
A la hora de elegir el software tenemos varias opciones predefinidas como servidor de Bases de
Datos, servidor Web, etc… Elegiremos inicialmente la opción “Instalación mínima” (Fig. 13) y más
tarde instalaremos el software adicional según lo necesitemos.
Fig 12:Escribiendo a disco
12
1.- Instalación
Fig 13:Selección de software
Finalmente comienza la instalación propiamente dicha (Fig. 14).
13
1.- Instalación
Fig 14:Instalando los paquetes de software
Después de unos minutos la instalación habrá finalizado (Fig. 15) y tendremos que reiniciar el
sistema.
14
1.- Instalación
Fig 15:¡Felicidades!
Una vez que el sistema arranque ya tenemos un servidor CentOS funcional (Fig. 16).
15
1.- Instalación
Fig 16:Nuestro flamante servidor
1.1.- CentOS 7
La instalación de CentOS 7 la realizaremos también desde el DVD. En el momento de escribir este
libro la imagen del DVD se puede descargar desde su sitio oficial¹. DEspués de descargar el fichero
podremos grabarlo en un DVD. Después de eso ya estamos listos para arrancar el servidor con el
DVD de instalación, siempre que el ordenador esté ya configurado en la BIOS para arrancar desde
un DVD. En unos segundos aparecerá la pantalla de la Fig. 17.
¹http://www.centos.org/download/
16
1.- Instalación
Fig 17:Arrancando con el DVD de CentOS 7 DVD
Seleccionamos la primera opción, “Install CentOS 7”. Ahora se lanzará el instalador gráfico y se nos
preguntará qué idioma queremos utilizar durante la instalación (Fig. 18).
17
1.- Instalación
Fig 18:Instalando CentOS 7
Después de hacer click en el botón “Continue” podemos ver un breve resumen de la instalación (v.
Fig 19).
18
1.- Instalación
Fig 19:Instalando CentOS 7
En esta pantalla podemos fijar la zona horaria (Fig. 20) o cambiar la distribución del teclado (Fig.
21).
19
1.- Instalación
Fig 20:Eligiendo la zona horaria
20
1.- Instalación
Fig 21:Seleccionando una distribución del teclado
Tambień podemos elegir qué paquetes de software queremos instalar (Fig. 22). La opción seleccionada por defecto es la instalación mínima (Minimal install), pero hay muchas otras opciones
disponibles, como por ejemplo Web Server o Virtualization Host. Mantendremos la opción por
defecto: “Minimal Install”.
21
1.- Instalación
Fig 22:Selección de software
Antes de comenzar con la instalación propiamente dicha, necesitamos elegir el dispositivo donde
vamos a instalar (Fig.23).
22
1.- Instalación
Fig 23:Destino de la instalación
En la mayoría de los casos la instalación se realizará sobre el disco local, pero también se pueden
seleccionar otros dispositivos como discos de la SAN.
En este punto también podríamos configurar la red pero, como preferimos hacerlo después de la
instalación, podemos omitir este paso y hacer click en el botón “Begin Installation”.
Mientras el sistema está copiando ficheros (Fig. 24) podemos configurar la contraseña del root y
crear usuarios adicionales (Fig. 25 y 26).
23
1.- Instalación
Fig 24:Instalando el sistema
24
1.- Instalación
Fig 25:Configurando la contraseña del root
25
1.- Instalación
Fig 26:Creando usuarios adicionales
Una vez que termina la instalación (Fig. 27) podemos reiniciar la máquina y comenzar a usar CentOS
7.
26
1.- Instalación
Fig 27:¡Instalación completa!
2.-Administración básica
Una vez que el sistema está instalado y listo es el momento de empezar a hacer un buen uso de él.
Este no es un libro sobre administración básica de Linux, pero intentaremos explicar brevemente los
comandos más importantes que un administrador de sistemas Linux debería conocer.
2.1.-Comandos básicos
2.1.1.-Directorios y sus contenidos(ls y cd)
Una vez logados en el sistema como root, con la contraseña que especificamos al instalar, se nos
mostrará el prompt. Inicialmente nuestra ubicación será el directorio home del root (/root), podemos
confirmar este punto con el comando pwd. Si queremos listar los ficheros y subdirectorios dentro
de /root podemos hacerlo tecleando ls.
Igual que en la vida real es posible disponer de varias carpetas para organizar nuestros documentos,
también se puede hacer lo mismo en el ordenador y crear directorios con el comando mkdir
nombre_de_directorio. Ahora, para acceder a este directorio escribiremos cd nombre_de_directorio.
Más tarde podemos retornar al directorio superior añadiendo dos puntos al comando cd (v. Fig. 28).
Fig 28:Algunos comandos básicos
27
2.-Administración básica
28
2.1.2.-Crear usuarios
Antes nos hemos logado con el usuario root, esto resulta aceptable en un sistema de prueba pero
no es aconsejable hacerlo en un sistema en producción. En vez de esto, lo mejor es logarse con un
usuario estándar y cambiar al usuario root cuando haya que realizar tareas administrativas. Vamos
a ver cómo hacerlo.
Primero tendremos que crear el usuario estándar con useradd, useradd acepta varios parámetros
en línea de comandos, pero en este caso solamente usaremos -m para crear el directorio home del
usuario. Si no estamos seguros de la lista de parámetros asociada con cada comando (casi) siempre
podemos teclear comando -h y aparecerá un texto de ayuda.
Así que tecleamos useradd -m antonio y creamos el usuario. Ahora tenemos que asignarle a este
usuario una contraseña. Lo hacemos con passwd nombre_de_usuario.
1
2
3
4
5
6
7
8
[root@delphos ~]# useradd -m antonio
[root@delphos ~]# passwd antonio
Changing password for user antonio.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
Ahora que hemos creado el usuario abandonamos la sesión con exit y volvemos a logarnos con el
usuario que acabamos de crear. A partir de ahora si queremos realizar labores de administración
podemos cambiar a root con el comando su. Cuando terminemos tecleamos exit para volver a la
cuenta estándar. Si en un momento no estamos seguros del usuario con el que estamos logados
actualmente, podemos averiguarlo en cualquier momento con el comando whoami.
1
2
3
4
5
6
7
8
9
10
[antonio@delphos ~]$ pwd
/home/antonio
[antonio@delphos ~]$ su root
Password:
[root@delphos antonio]# whoami
root
[root@delphos antonio]# exit
exit
[antonio@delphos ~]$ whoami
antonio
29
2.-Administración básica
2.2.-Crear y editar ficheros
Cuando se administra un servidor, una de las acciones más habituales y repetidas es editar ficheros
de configuración. Esto se hace con editores de texto. Linux incluye varios de ellos, tanto en modo
texto como en modo gráfico.
2.2.1.-vi
Posiblemente el editor de texto más extendido en el mundo de Linux y Unix sea vi. Por eso resulta
recomandable que todo administrador de Linux conozca, al menos básicamente, este editor.
PAra crear un nuevo fichero de texto o editar uno ya existente pasaremos el nombre de fichero como
parámetro. Por ejemplo podríamos escribir vi nuevo_fichero. Aparecerá una pantalla en blanco (v.
Fig. 29). Pero antes de introducir algún texto tenemos que pulsar la tecla “i”. Al hacerlo estamos
cambiando del “modo comando” al “modo inserción”.
Fig 29:Crear un nuevo fichero con vi
Una vez en el modo insertar podemos teclear el texto (v. Fig. 30).
30
2.-Administración básica
Fig 30:Insertar texto en vi
Si cometemos un error o queremos cambiar algo deberemos cambiar de nuevo al modo comando
pulsando la tecla esc. Ahora podremos mover el cursor con las teclas del cursos y suprimir un carácter
con la tecla ‘x’. Por ejemplo, si queremos sustituir la palabra ‘king’ por ‘queen’ colocaremos el cursor
sobre la letra ‘k’ y pulsaremos la tecla ‘x’ 4 veces. Una vez que hemos borrado la palabra ‘king’
tendremos que teclear el nuevo texto, para ello cambiamos otra vez a modo insertar pulsando la
tecla ‘i’. Tendremos que repetir este proceso cada vez que queramos cambiar o borrar algo y cuando
hayamos terminado guardaremos el fichero y cerraremos vi. Para guardar el fichero en cualquier
momento basta con cambiar a modo comando y teclear “:w” sin las comillas (v. Fig. 31). Para salir del
programa hacemos exactamente lo mismo pero en lugar de teclear “:w” teclearemos “:q”. También
es posible guardar y salir en una misma operación con “:wq”.
31
2.-Administración básica
Fig 31:Guardar el fichero de texto
2.2.2.-nano
Otro editor de texto bastante conocido en Linux es nano. Su uso no está tan extendido como el de
vi pero, por otra parte, mucha gente lo considera más amigable.
Nano normalmente no se instala por defecto, por lo que será necesario instalarlo con yum (v. sección
2.3.- “Instalando software”).
1
2
3
4
5
6
7
8
9
10
11
[root@delphos ~]# nano
-bash: nano: command not found
[root@delphos ~]# yum provides nano
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
nano-2.0.9-7.el6.i686 : A small text editor
Repo
: c6-media
Matched from:
[root@delphos ~]# yum install nano
Para abrir o crear un fichero solo necesitamos teclear nano nombre_del_fichero” Por ejemplo,
nano otro_fichero_de_texto.txt. Una vez que lanzamos nano (v. Fig. 32) podemos teclear el texto
directamente, usando las teclas exactamente igual que haríamos en cualquier procesador de texto
del tipo WYSIWYG. Cuando hayamos terminado pulsaremos Ctrl-X para guardar el fichero.
32
2.-Administración básica
Fig 32:Nano
2.2.3.-cat
Otro de los comandos que podemos utilizar es cat, el cual mostrará directamente en pantalla el
contenido del fichero que se le pase como parámetro. Por ejemplo, si quisieramos ver el contenido
del fichero /etc/group teclearíamos esto:
1
2
3
4
5
6
7
8
9
10
[root@localhost named]# cat /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
.
.
.
2.2.4.-grep
Este es uno de los comandos más útiles para el administrador. Como entrada recibe un fichero o bien
la salida de otro comando y muestra solo las líneas del fichero que contienen un determinado patrón.
Por ejemplo, para ver el contenido del fichero /etc/passwd podríamos usar cat como ya hemos visto.
2.-Administración básica
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
33
[root@delphos ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
qpidd:x:498:499:Owner of Qpidd Daemons:/var/lib/qpidd:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
antonio:x:500:500::/home/antonio:/bin/bash
Pero si quisieramos ver solamente la línea del usuario root podríamos pasar la salida del cat al
comando grep. Para hacer esto necesitamos conectar ambos comandos con el símbolo “|”, lo que se
denomina en inglés pipe. Escribiríamos esto:
1
2
[root@delphos ~]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
Ahora solo se muestran las lineas que contienen la palabra root.
Una opción muy útil de grep es “-v”, lo que hace esta opción es mostrar todas las líneas que NO
contienen un cierto término o patrón. Por ejemplo, varios ficheros de configuración tienen muchas
líneas comentadas que comienzan por el símbolo (#). En estos casos siempre resulta mucho más fácil
ver solo las líneas que no están comentadas.
34
2.-Administración básica
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@delphos ~]# cat /etc/ssh/sshd_config | grep -v "#"
.
.
.
Protocol 2
SyslogFacility AUTHPRIV
.
.
PasswordAuthentication yes
ChallengeResponseAuthentication no
.
.
2.2.5.-more
Si el fichero que intentamos ver con cat es demasiado grande, no podremos ver todo el contenido
en una única pantalla y el texto se desplazará automáticamente hacia abajo. Si queremos ver el
contenido completo podemos usar el comando more. De este modo podemos ver todo el contenido
pantalla a pantalla, pasando manualmente de una a otra.
[root@localhost ∼]# more /var/log/messages
Fig 33:Viendo el contenido de un fichero con more
2.-Administración básica
35
2.2.6.-less
El comando less es muy parecido a more, con él también podemos ver un fichero grande pantalla a
pantalla. La única diferencia es que less nos permite retroceder a la página anterior, mientras que con
more cuando avanzamos a la siguiente pantalla ya no podemos retroceder (al menos que salgamos
de more y lo ejecutemos de nuevo).
2.2.7.-head
Hemos visto que podemos usar cat para ver el contenido de un fichero. Sin embargo, si el fichero es
muy grande el contenido ocupará varias pantallas. Como ya hemos visto podemos usar more o less
para ver todo el contenido pantalla a pantalla, pero es posible que solo queramos ver las primeras
líneas. Si este es el caso podemos escribir head nombre_del_fichero y veremos las 10 primeras líneas
(por defecto) del fichero.
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost named]# head /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root
lp:x:7:daemon,lp
mem:x:8:
kmem:x:9:
[root@localhost named]#
Si queremos ver solo las 3 primeras líneas usaremos -n 3. Por ejemplo:
1
2
3
4
5
[root@localhost named]# head -n 3 /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
[root@localhost named]#
2.2.8.-tail
Tail es un comando similar a head, pero muestra las últimas líneas del fichero en lugar de las
primeras. Para ver las últimas 4 líneas del fichero /etc/group podemos hacer esto:
2.-Administración básica
1
2
3
4
5
6
36
[root@localhost named]# tail -n 4 /etc/group
qpidd:x:499:
sshd:x:74:
antonio:x:500:
named:x:25:
[root@localhost named]#
Una opción realmente útil de tail es -f. Con ella se mostrarán en pantalla las últimas líneas del fichero
y las líneas que se vayan añadiendo a partir de ese momento. Por ejemplo, si queremos ver qué
eventos del sistema están teniendo lugar en este momento podemos abrir el fichero /var/log/messages
con la opción -f. Cuando hayamos terminado podemos salir pulsando Ctrl-C.
2.3.- Redirigir la salida de un comando
Al hablar del comando grep, vimos que podíamos asociar la salida de un programa a la entrada de
otro programa. Cuando tecleamos “cat /etc/passwd | grep root”, lo que estamos haciendo es pasar
los datos de salida del comando cat como parámetro de entrada para el programa grep.
También podríamos redirigir la salida a un fichero. Por ejemplo. si queremos ogtener una lista con el
contenido de la carpeta /etc, podemos redirigir la salida al fichero cat.txt. Entonces solo tendremos
que abrir el fichero con cualquier editor.
1
2
3
4
5
6
7
8
9
10
[root@delphos ~]# ls /etc/ > etc.txt
[root@delphos ~]# cat etc.txt
adjtime
aliases
aliases.db
alternatives
anacrontab
.
.
.
2.4.- Instalar software
Una de las principales tareas de un administrador es la instalación de nuevo software. En CentOS
esto se hace principalmente con las utilidades rpm y yum. La aplicación rpm fue desarrollada por
RedHat como un gestor de paquetes de software, permite al usuario instalar paquetes fácilmente y
mantiene una base de datos con todo el software instalado en el sistema. El fichero rpm contiene el
código binario que será instalado, así como los scripts que necesitan ser ejecutados antes o después
de la instalación, con el fin de copiar los ficheros a su destino, crear directorios, etc… Por ejemplo,
si tenemos el DVD de CentOS en /media/cdrom podríamos instalar un rpm así:
2.-Administración básica
1
2
3
37
[root@delphos ~]# rpm -ivh /media/cdrom/Packages/gedit-2.28.4-3.el6.i686.rpm
Preparing...
########################################### [100%]
package gedit-1:2.28.4-3.el6.i686 is already installed
Le decimos a rpm que instale (-i) el paquete gedit, y que nos muestre el progreso de la instalación
(-h) y toda la información posible.
En cualquier momento podemos revisar el software instalado en el sistema con rpm.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@delphos ~]# rpm -qa
libnl-1.1-14.el6.i686
ca-certificates-2010.63-3.el6_1.5.noarch
python-iwlib-0.1-1.2.el6.i686
centos-release-6-2.el6.centos.7.i686
pciutils-3.1.4-11.el6.i686
iwl5000-firmware-8.83.5.1_1-1.el6_1.1.noarch
lsof-4.82-2.el6.i686
xorg-x11-drv-ati-firmware-6.14.2-7.el6.noarch
libedit-2.11-4.20080712cvs.1.el6.i686
iwl4965-firmware-228.61.2.24-2.1.el6.noarch
libpcap-1.0.0-6.20091201git117cb5.el6.i686
.
.
.
Si queremos comprobar que el paquete llamado gedit está instalado podemos hacerlo combinando
el comando rpm con grep.
1
2
[root@delphos ~]# rpm -qa | grep -i gedit
gedit-2.28.4-3.el6.i686
Y finalmente, si queremos borrar el paquete instalado, podemos hacerlo muy fácilmente.
1
2
3
[root@delphos ~]# rpm -e gedit
[root@delphos ~]# rpm -qa | grep -i gedit
[root@delphos ~]#
Cada fichero rpm también nos informa de los demás rpms de los que depende, es decir, los ficheros
rpm que deben estar ya instalados para que el rpm que queremos instalar funcione correctamente.
Podría ocurrir, y de hecho sucede, que un determinado software depende de cierta libreria para
funcionar, la cual a su vez depende de otro componente. Por ejemplo, si intentamos instalar logwatch
recibiremos el siguiente mensaje.
38
2.-Administración básica
1
2
3
4
5
[root@delphos ~]# rpm -ivh /media/cdrom/Packages/logwatch-7.3.6-49.el6.noarch.rp\
m
error: Failed dependencies:
mailx is needed by logwatch-7.3.6-49.el6.noarch
perl(Date::Manip) is needed by logwatch-7.3.6-49.el6.noarch
Este fenómeno ha sido llamado “dependency hell”, y ha sido una pesadilla para los administradores
de Linux durante años. Para resolver este problema se creó yum. Yum intenta comprobar y resolver
automáticamente todas las dependencias que un determinado paquete de software pueda tener. De
tal modo que la instalación pase a ser una tarea de lo más sencilla.
2.4.1.- Configurando yum en Centos 6
Se puede configurar yum para que busque los paquetes de software en distintos repositorios.
Por defecto está configurado para buscarlos en http://mirror.centos.org. Si no tenemos conexión a
Internet, tendremos que especificarle a yum que use el DVD local como repositorio. Este repositorio
ya está configurado, pero se encuentra deshabilitado por defecto. En el directorio /etc/yum.repos.d
podemos ver los ficheros asociados con los repositorios de yum.
1
2
[root@delphos ~]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Debuginfo.repo
CentOS-Media.repo
Podemos editar el fichero CentOS-Media.repo para habilitar el repositorio, pero también podemos
hacerlo utilizando el propio yum. Si tecleamos yum, el comando nos mostrará en pantalla las
diferentes opciones disponibles. Para ver los repositorios actuales ejecutaremos yum repolist.
1
2
3
4
5
6
7
8
9
10
11
[root@delphos ~]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=i386&\
repo=os error was
14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"
repo id
repo name
status
base
CentOS-6 - Base
0
extras
CentOS-6 - Extras
0
updates
CentOS-6 - Updates
0
repolist: 0
Para asegurarnos de que yum utiliza únicamente el repositorio del DVD local, tendremos que
deshabilitar todos los repositorios y activar posteriormente el repositorio c6-media. Esto podemos
39
2.-Administración básica
hacerlo con las opciones –disablerepo y –enablerepo. El comando completo para listar los paquetes
de software disponibles en el dvd local sería este: yum –disablerepo=* –enablerepo=c6-media list.
Si ejecutamos el comando yum list, veremos todos los paquetes disponibles en este repositorio,
siempre que el dvd esté montado. Si no es así, podemos montarlo en cualquier momento con el
comando mount. Por ejemplo, para montar el cdrom en el directorio /media/cdrom creamos el
directorio (si no existe) y ejecutamos el comando mount /dev/cdrom /media/cdrom.
1
2
3
[root@delphos ~]# mkdir /media/cdrom
[root@delphos ~]# mount /dev/cdrom /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
Aquí podemos ver parte del listado de paquetes disponibles.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@delphos ~]# yum --disablerepo=* --enablerepo=c6-media list
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
Installed Packages
ConsoleKit.i686
0.4.1-3.el6
-CentOS-201112130233.i386/6.2
ConsoleKit-libs.i686
0.4.1-3.el6
-CentOS-201112130233.i386/6.2
GConf2.i686
2.28.0-6.el6
MAKEDEV.i686
3.24-6.el6
-CentOS-201112130233.i386/6.2
ORBit2.i686
2.14.17-3.1.el6
acl.i686
2.2.49-6.el6
-CentOS-201112130233.i386/6.2
aic94xx-firmware.noarch
30-2.el6
-CentOS-201112130233.i386/6.2
alsa-lib.i686
1.0.22-3.el6
apr.i686
1.3.9-3.el6_1.2
apr-util.i686
1.3.9-3.el6_0.1
apr-util-ldap.i686
1.3.9-3.el6_0.1
atk.i686
1.28.0-2.el6
atmel-firmware.noarch
1.3-7.el6
-CentOS-201112130233.i386/6.2
attr.i686
2.4.44-7.el6
-CentOS-201112130233.i386/6.2
audit.i686
2.1.3-3.el6
-CentOS-201112130233.i386/6.2
audit-libs.i686
2.1.3-3.el6
@anaconda\
@anaconda\
@c6-media
@anaconda\
@c6-media
@anaconda\
@anaconda\
@c6-media
@c6-media
@c6-media
@c6-media
@c6-media
@anaconda\
@anaconda\
@anaconda\
@anaconda\
40
2.-Administración básica
30
31
32
33
34
35
36
37
38
39
40
41
42
-CentOS-201112130233.i386/6.2
authconfig.i686
-CentOS-201112130233.i386/6.2
avahi-libs.i686
b43-openfwwf.noarch
-CentOS-201112130233.i386/6.2
basesystem.noarch
-CentOS-201112130233.i386/6.2
bash.i686
-CentOS-201112130233.i386/6.2
.
.
.
6.1.12-5.el6
@anaconda\
0.6.25-11.el6
5.2-4.el6
@c6-media
@anaconda\
10.0-4.el6
@anaconda\
4.1.2-8.el6.centos
@anaconda\
2.4.2.- Configurando yum en Centos 7
En CentOS 7 no existe ningún repositorio para el dvd local definido por defecto. Así que tendremos
que crearlo manualmente. En el directorio /etc/yum.repo.d/ veremos esto.
1
2
3
[root@Centos7 ~]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Debuginfo.repo
[root@Centos7 ~]#
CentOS-Sources.repo
CentOS-Vault.repo
Tenemos que creat un nuevo fichero llamado CentOS-Media.repo para este nuevo repositorio.
1
2
3
4
5
6
[root@Centos7 yum.repos.d]# cat CentOS-Media.repo
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/cdrom/
gpgcheck=0
enabled=0
Tendremos que crear el directorio /media/cdrom y montar el cdrom también.
1
2
3
[root@Centos7 ~]# mkdir /media/cdrom
[root@CentOS7 ~]# mount /dev/cdrom /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
Ahora podemos comprobar si este nuevo repositorio funciona listando los paquetes disponibles.
41
2.-Administración básica
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@Centos7 yum.repos.d]# yum --disablerepo=* --enablerepo=c7-media list
Installed Packages
ModemManager-glib.x86_64
NetworkManager.x86_64
conda
NetworkManager-glib.x86_64
conda
NetworkManager-tui.x86_64
conda
acl.x86_64
aic94xx-firmware.noarch
alsa-firmware.noarch
alsa-lib.x86_64
alsa-tools-firmware.x86_64
audit.x86_64
audit-libs.x86_64
authconfig.x86_64
avahi.x86_64
avahi-autoipd.x86_64
avahi-libs.x86_64
basesystem.noarch
.
.
.
1.1.0-6.git20130913.el7
@anaconda
1:0.9.9.1-13.git20140326.4dba720.el7
@ana\
1:0.9.9.1-13.git20140326.4dba720.el7 @ana\
1:0.9.9.1-13.git20140326.4dba720.el7 @ana\
2.2.51-12.el7
30-6.el7
1.0.27-2.el7
1.0.27.2-3.el7
1.0.27-4.el7
2.3.3-4.el7
2.3.3-4.el7
6.2.8-8.el7
0.6.31-13.el7
0.6.31-13.el7
0.6.31-13.el7
10.0-7.el7.centos
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
@anaconda
2.4.3.- Opciones de yum
Yum es una herramiente bastante versátil, hemos visto cómo listar los paquetes, pero también
podemos listar colecciones de paquetes llamadas grupos(groups). Para listar estos grupos podríamos
teclear yum –disablerepo=* –enablerepo=c6-media grouplist. Después de esto veremos en la
pantalla una lista con los grupos ya instalados y aquellos que se pueden instalar. En este ejemplo
podría haber alguna diferencia entre CentOS 6 y CentOS 7, ya que las versiones de yum son
diferentes. Por ejemplo, algunos grupos podrían no aparecer por defecto en CentOS 7, en este caso
deberíamos usar la opción “group list hidden”.
En CentOS 6:
2.-Administración básica
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@delphos ~]# yum --disablerepo=* --enablerepo=c6-media grouplist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
Setting up Group Process
Checking for new repos for mirrors
Installed Groups:
Client management tools
E-mail server
Graphical Administration Tools
Messaging Client Support
Systems Management Messaging Server support
Installed Language Groups:
Arabic Support [ar]
Armenian Support [hy]
Georgian Support [ka]
.
.
.
En CentOS 7:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@CentOS7 ~]# yum --disablerepo=* --enablerepo=c7-media group list
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available environment groups:
Minimal Install
Infrastructure Server
File and Print Server
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Installed groups:
System Administration Tools
Available Groups:
Compatibility Libraries
Console Internet Tools
Development Tools
Graphical Administration Tools
42
2.-Administración básica
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Legacy UNIX Compatibility
Scientific Support
Security Tools
Smart Card Support
System Management
Done
[root@CentOS7 ~]# yum --disablerepo=* --enablerepo=c7-media group list hidden
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available environment groups:
Minimal Install
Infrastructure Server
File and Print Server
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Installed groups:
Core
E-mail Server
Network Infrastructure Server
System Administration Tools
Available Groups:
Additional Development
Anaconda Tools
Backup Client
Backup Server
Base
Compatibility Libraries
Conflicts (Client)
Conflicts (Server)
Conflicts (Workstation)
Console Internet Tools
DNS Name Server
Debugging Tools
Desktop Debugging and Performance Tools
Development Tools
Dial-up Networking Support
Directory Client
43
2.-Administración básica
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Directory Server
Emacs
FTP Server
File and Storage Server
Fonts
GNOME
GNOME Applications
Graphical Administration Tools
Graphics Creation Tools
Guest Agents
Guest Desktop Agents
Hardware Monitoring Utilities
High Availability
Identity Management Server
Infiniband Support
Input Methods
Internet Applications
Internet Browser
Java Platform
KDE
KDE Applications
KDE Multimedia Support
Large Systems Performance
Legacy UNIX Compatibility
Legacy X Window System Compatibility
Load Balancer
Mainframe Access
MariaDB Database Client
MariaDB Database Server
Multimedia
Network File System Client
Networking Tools
Office Suite and Productivity
PHP Support
Performance Tools
Perl Support
Perl for Web
Platform Development
PostgreSQL Database Client
PostgreSQL Database Server
Print Server
Printing Client
44
2.-Administración básica
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
45
Python
Remote Desktop Clients
Remote Management for Linux
Resilient Storage
Ruby Support
Scientific Support
Security Tools
Smart Card Support
System Management
Technical Writing
Virtualization Client
Virtualization Hypervisor
Virtualization Platform
Virtualization Tools
Web Server
Web Servlet Engine
X Window System
Done
Si quisiéramos instalar uno de estos grupos, como “Hardware monitoring utilities”, podríamos
obtener algo más de información con el parámetro groupinfo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@delphos www]# yum --disablerepo=* --enablerepo=c6-media groupinfo "Hardwar\
e monitoring utilities"
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
Setting up Group Process
Checking for new repos for mirrors
Group: Hardware monitoring utilities
Description: A set of tools to monitor server hardware
Default Packages:
smartmontools
Optional Packages:
edac-utils
lm_sensors
Como podemos ver, el grupo cinsiste en un paquete por defecto y dos paquetes opcionales. Los
paquetes por defecto se instalarán siempre que instalamos el grupo, mientras que los paquetes
opcionales se instalarán solo si así los especificamos. De tal modo que para instalar el grupo con sus
2.-Administración básica
46
paquetes opcionales tendríamos que usar este comando: ‘yum –disablerepo=* –enablerepo=c6media –setopt=group_package_types=optional groupinstall “Hardware monitoring utilities”‘.
A continuación aparecerá una pantalla informativa pidiendo la confirmación. Decimos yes (y).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@delphos ~]# yum --disablerepo=* --enablerepo=c6-media --setopt=group_packa\
ge_types=optional groupinstall "Hardware monitoring utilities"
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
Setting up Group Process
Checking for new repos for mirrors
Resolving Dependencies
--> Running transaction check
---> Package edac-utils.i686 0:0.9-14.el6 will be installed
---> Package lm_sensors.i686 0:3.1.1-10.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package
Arch
Version
Repository
Size
================================================================================
Installing:
edac-utils
i686
0.9-14.el6
c6-media
40 k
lm_sensors
i686
3.1.1-10.el6
c6-media
122 k
Transaction Summary
================================================================================
Install
2 Package(s)
Total download size: 162 k
Installed size: 415 k
Is this ok [y/N]: y
Downloading Packages:
-------------------------------------------------------------------------------Total
2.0 MB/s | 162 kB
00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : lm_sensors-3.1.1-10.el6.i686
1/2
Installing : edac-utils-0.9-14.el6.i686
2/2
47
2.-Administración básica
40
41
42
43
Installed:
edac-utils.i686 0:0.9-14.el6
lm_sensors.i686 0:3.1.1-10.el6
Complete!
Otra característica muy útil de yum es su capacidad de identificar en qué paquete se ubica un
determinado comando. Por ejemplo, una de las herramientas más útiles para el administrador
Linux son las páginas del man, las cuales proporcionan una gran cantidad de información sobre
los distintos comandos y ficheros de configuración del sistema. Pero como hemos realizado una
instalación mínima de CentOS, esta utilidad no estará instalada. Sin embargo, podemos identificar
el paquete que contiene esta herramienta con la ayuda de yum.
1
2
3
4
5
6
7
8
9
[root@delphos ~]# man
-bash: man: command not found
[root@delphos ~]# yum --disablerepo=* --enablerepo=c6-media provides man
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
man-1.6f-29.el6.i686 : A set of documentation tools: man, apropos and whatis
Repo
: c6-media
Matched from:
Como podemos ver, el paquete que debemos instalar se llama - como cabría esperar - man. En este
caso el nombre del paquete es muy intuitivo, pero no siempre sucede esto y, en esos casos, yum
resulta de mucha ayuda. Ahora con solo teclear “yum –disablerepo=* –enablerepo=c6-media install
man”, podremos usar man para obtener información de cualquier comando.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@delphos ~]# yum --disablerepo=* --enablerepo=c6-media install man
[root@delphos ~]# man ls
LS(1)
User Commands
LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is speci�
fied.
48
2.-Administración básica
16
17
18
19
20
21
22
23
24
25
26
27
Mandatory
too.
arguments
to
long
options are mandatory for short options
-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . And ..
.
.
.
2.5.- Entorno gráfico
2.5.1.- CentOS 6
Después de realizar una instalación mínima, no tendremos entorno gráfico. Si queremos iniciar el
servidor en modo gráfico necesitaremos instalar los siguientes grupos de paquetes:
1
2
[root@localhost ~]# yum groupinstall desktop
[root@localhost ~]# yum groupinstall "X Window System"
Una vez que tenemos instalados ambos grupos, podemos pasar al modo gráfico con el comando init
5.
1
[root@localhost ~]# init 5
La primera vez veremos una página de bienvenida (Fig. 34) y la habitual información sobre la licencia
(Fig. 35). A continuación, el sistema nos pedirá que creemos un usuario normal (no root) (Fig. 36).
49
2.-Administración básica
Fig 34:Instalando el entorno gráfico
50
2.-Administración básica
Fig 35:Información sobre la licencia
51
2.-Administración básica
Fig 36:Creando un usuario
A continuación tendremos que introducir o confirmar los datos acerca de la fecha y la hora (Fig. 37).
Después podemos activar Kdump (Fig. 38) si así lo deseamos y tenemos suficiente memoria. Kdump
puede usarse para ayudar a resolver un posible fallo del kernel. La forma de utilizar kdump está más
allá del ámbito de este libro.
52
2.-Administración básica
Fig 37:Fecha y hora
53
2.-Administración básica
Fig 38:Kdump
Finalmente vemos la pantalla de login gráfico (Fig. 39).
54
2.-Administración básica
Fig 39:Login gráfico
2.5.2.- CentOS 7
Si utilizamos CentOS 7 los paquetes que tenemos que instalar son estos:
1
2
3
4
[root@CentOS7 ~]# yum --disablerepo=* --enablerepo=c7-media group install "X Win\
dow System"
[root@CentOS7 ~]# yum --disablerepo=* --enablerepo=c7-media group install "Gnome\
Desktop"
Cuando la instalación finalice podremos lanzar el entorno gráfico con startx.
1
[root@CentOS7 ~]# startx
En un momento veremos esto (v. Fig. 40).
55
2.-Administración básica
Fig 40: Configuración inicial
Como podemos ver, falta la información de la licencia, así que hacemos click en “LICENSE
INFORMATION” y aceptamos la licencia (v. Fig. 41).
56
2.-Administración básica
Fig 41: Información de licencia
Después de aceptar la licencia y pulsar el botón “Done” podemos ver que la licencia ha sido aceptada
(v. Fig. 42).
57
2.-Administración básica
Fig 42: Finalizando la configuración
Hacemos click en “Finish configuration” y accedemos a la ventana de login gráfico (Fig. 43).
58
2.-Administración básica
Fig 43:Login gráfico
2.6.- Otros comandos útiles
2.6.1.- chmod
Cada fichero en un sistema Linux tiene un conjunto de permisos asociados, es decir, no todos
los usuarios pueden leer o modificar el fichero. Algunos usuarios podrían abrir el fichero y
ejecutarlo (si es un fichero binario o un script), algunos otros podrían modificar su contenido, etc…
Tradicionalmente en Linux existen tres conjuntos de permisos asociados a cada fichero, para el
propietario, el grupo y el resto de usuarios. Podemos ver estos permisos con el comand ols -l. Por
ejemplo…
1
2
[root@localhost named]# ls -l /etc/init.d/named
-rwxr-xr-x. 1 root root 6806 Dec 7 2011 /etc/init.d/named
En este caso el propietario (root) puede leer (r), escribir(w) y ejecutar(x) el script /etc/init.d/named.
El grupo(root) solo puede leerlo y ejecutarlo. Y el resto de usuarios solo pueden leer y ejecutar el
fichero también.
Si por alguna razón necesitamos cambiar los permisos podemos hacerlo con chmod. Necesitamos
concretar qué grupo de permisos queremos modificar: u (propietario), g (grupo), o (otro) o bien a
2.-Administración básica
59
(los 3 grupos). También debemos especificar si queremos añadir (+) o quitar (-) el permiso. Veamos
un par de ejemplos.
1
2
3
[root@localhost named]# chmod o+w /etc/init.d/named
[root@localhost named]# ls -l /etc/init.d/named
-rwxr-xrwx. 1 root root 6806 Dec 7 2011 /etc/init.d/named
Hemos añadido(+) permiso de escritura(w) al resto de usuarios(other).
1
2
3
[root@localhost named]# chmod o-w /etc/init.d/named
[root@localhost named]# ls -l /etc/init.d/named
-rwxr-xr-x. 1 root root 6806 Dec 7 2011 /etc/init.d/named
Y ahora revertimos la situación quitando(-) el permiso de escritura.
2.6.2.- tee
Ya hemos visto que se puede redirigir la salida de un comando a un fichero.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@delphos ~]# ls /var/ > var_folder.txt
[root@delphos ~]# cat var_folder.txt
cache
db
empty
games
lib
local
lock
log
mail
named
nis
opt
preserve
run
spool
tmp
www
yp
Pero a veces puede que nos interese ver la salida del comando en pantalla al mismo tiempo que
redirigimos dicha salida a un fichero. Podemos hacer esto con tee.
2.-Administración básica
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
60
[root@delphos ~]# ls /var/ | tee var_folder.txt
cache
db
empty
games
lib
local
lock
log
mail
named
nis
opt
preserve
run
spool
tmp
www
yp
[root@delphos ~]# cat var_folder.txt
cache
db
empty
games
lib
local
lock
log
mail
named
nis
opt
preserve
run
2.6.3.- rm
A veces necesitamos eliminar ficheros o directorios, para hacerlo podemos usar rm. Por ejemplo,
para eliminar un fichero llamado file_to_delete.txt solo tendríamos que teclear esto:
2.-Administración básica
1
2
61
[root@delphos ~]# rm file_to_delete.txt
rm: remove regular empty file `file_to_delete.txt'? y
Por defecto rm pide confirmación antes de borrar un fichero, pero podemos forzar el borrado sin
necesidad de confirmar usando el parámetro -f. Si queremos borrar una carpeta tendremos que usar
el parámetro -r (recursivo).
1
2
3
4
5
[root@delphos ~]# rm -f file_to_delete.txt
rm: descend into directory `folder_to_delete'? y
rm: remove regular file `folder_to_delete/one.txt'? y
rm: remove regular file `folder_to_delete/two.txt'? y
rm: remove regular file `folder_to_delete/three.txt'? y
2.7.- SELinux
SELinux es un mecanismo de defensa desarrollado por la NSA. Se podría describir brevemente como
un mecanismo de seguridad que crea otra capa de protección contra accesos no autorizados y limita
el daño que una intrusión podría causar al sistema.
En un sistema Linux, SELinux podría estar en uno de estos tres estados:
• Disabled. SELinux no se está ejecutando y, por lo tanto, no realizará ninguna acción.
• Permissive. SELinux monitoriza el comportamiento del sistema y registra la actividad, pero
no bloquerá ni interferirá en ningún modo en las acciones del sistema.
• Enforcing. SELinux está en ejecución y, dependiendo de la configuración, podría bloquear
ciertas acciones efectuadas por los procesos en ejecución en el sistema.
Podemos ver si SELinux está en ejecución con el siguiente comando:
1
2
3
4
5
6
7
[root@localhost named]# sestatus
SELinux status:
enabled
SELinuxfs mount:
/selinux
Current mode:
enforcing
Mode from config file:
enforcing
Policy version:
24
Policy from config file:
targeted
En este caso podemos ver que SELinux está habilitado y en modo enforcing. En este modo SELinux
bloqueará cualquier acción que no esté permitida en la configuración de SELinux. Podríamos
cambiar el modo a permissive, que permite las acciones que SELinux normalmente bloquearía, pero
registra en un logs los detalles sobre cada acción que viola la configuración de SELinux. Este modo
permissive es muy útil cuando estamos afinando el funcionamiento de SELinux. Podemos cambiar
a este modo con setenforce.
62
2.-Administración básica
1
[root@centosv6 ~]# setenforce permissive
Podemos comprobar si el cambio fue efectivo con los comandos getenforce o setstatus.
1
2
3
4
5
6
7
8
9
[root@centosv6 ~]# getenforce
Permissive
[root@centosv6 ~]# sestatus
SELinux status:
SELinuxfs mount:
Current mode:
Mode from config file:
Policy version:
Policy from config file:
enabled
/selinux
permissive
enforcing
24
targeted
También es posible deshabilitar completamente SELinux. Podemos hacerlo editando el fichero
/etc/sysconfig/selinux. Debería haber una línea que comienza por “SELINUX=”, que puede tener
3 valores distintos: enforcing, permissive o disabled. Al asignar el valor disabled, en el siguiente
reinicio de la máquina SELinux estará deshabilitado.
SELinux asigna etiquetas (labels) a los procesos, ficheros y carpetas. De acuerdo con estas etiquetas,
habitualmente llamadas contextos, los procesos podrán o no llevar a cabo ciertas acciones.
Podemos comprobar el contexto de seguridad de cualquier carpeta con el comando ls -Z.
1
2
3
[root@centosv6 ~]# ls -Z /home/
drwx------. antonio antonio unconfined_u:object_r:user_home_dir_t:s0 antonio
drwx------. jose
jose
unconfined_u:object_r:user_home_dir_t:s0 jose
Las diferentes carpetas tendrán distintos contextos asociados.
1
2
3
4
5
[root@centosv6 ~]# ls
drwxr-xr-x. root root
drwxr-xr-x. root root
drwxr-xr-x. root root
drwxr-xr-x. root root
-Z /var/www/
system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
system_u:object_r:httpd_sys_content_t:s0 error
system_u:object_r:httpd_sys_content_t:s0 html
system_u:object_r:httpd_sys_content_t:s0 icons
Por ejemplo, para que Apache pueda acceder a los ficheros html de un sitio Web, la carpeta tendrá
que tener asignado el contexto httpd_sys_content_t. Debemos tener esto en cuenta al configurar los
distintos servicios en CentOS, y por supuesto también deberemos asignar los permisos de lectura,
escritura y/o ejecución cuando sea necesario.
Si necesitamos cambiar el contexto de un fichero o carpeta podemos hacerlo con chcon.
2.-Administración básica
1
2
3
4
5
6
63
[root@centosv6 ~]# mkdir test
[root@centosv6 ~]# ls -Zd test
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 test
[root@centosv6 ~]# chcon -t httpd_sys_content_t test/
[root@centosv6 ~]# ls -dZ test
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 test
También podemos ver el contexto asociado a un proceso en ejecución con ps -Z.
1
2
3
4
[root@CentOS7 ~]# ps -Z
LABEL
PID TTY
TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 40884 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 45546 pts/0 00:00:01 ps
SELinux también mantiene por defecto una serie de variables que, de acuerdo con su valor, van a
influir en el comportamiento del sistema. Podemos obtener una lista de estos valores con el comando
getsebool.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@centosv6 ~]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
allow_console_login --> on
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
allow_daemons_use_tcp_wrapper --> off
allow_daemons_use_tty --> on
allow_domain_fd_use --> on
allow_execheap --> off
allow_execmem --> on
.
.
.
Podemos cambiar cualquiera de estos valores con setsebool.
1
2
3
[root@centosv6 ~]# setsebool abrt_anon_write on
[root@centosv6 ~]# getsebool abrt_anon_write
abrt_anon_write --> on
El cambio tendrá efecto inmediatamente, pero cuando el servidor se reinicie de nuevo el parámetro
recuperará su antiguo valor. Para que el cambio sea permanente necesitamos añadir “-P” al comando
del ejemplo anterior.
64
2.-Administración básica
1
[root@centosv6 ~]# setsebool -P abrt_anon_write on
Otra herramienta útil para gestionar SELinux es semanage. Normalmente no se instala por defecto,
así que si queremos utilizarla tendremos que instalar el paquete policycoreutils-python.
Con semanage podemos obtener una lista de los distintos contextos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@centosv6 ~]# semanage fcontext -l
SELinux fcontext
/
bject_r:root_t:s0
/.*
bject_r:default_t:s0
/[^/]+
bject_r:etc_runtime_t:s0
/\.autofsck
bject_r:etc_runtime_t:s0
/\.autorelabel
bject_r:etc_runtime_t:s0
/\.journal
/\.suspended
bject_r:etc_runtime_t:s0
/a?quota\.(user|group)
bject_r:quota_db_t:s0
/afs
bject_r:mnt_t:s0
/bin
bject_r:bin_t:s0
/bin/.*
bject_r:bin_t:s0
/bin/alsaunmute
bject_r:alsa_exec_t:s0
/bin/bash
bject_r:shell_exec_t:s0
/bin/bash2
bject_r:shell_exec_t:s0
/bin/d?ash
bject_r:shell_exec_t:s0
.
.
.
type
Context
directory
system_u:o\
all files
system_u:o\
regular file
system_u:o\
regular file
system_u:o\
regular file
system_u:o\
all files
regular file
<<None>>
system_u:o\
regular file
system_u:o\
directory
system_u:o\
directory
system_u:o\
all files
system_u:o\
regular file
system_u:o\
regular file
system_u:o\
regular file
system_u:o\
regular file
system_u:o\
65
2.-Administración básica
También podemos obtener un listado de las variables booleanas de SELinux, junto con una breve
descripción.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@centosv6 ~]# semanage boolean -l
SELinux boolean
State Default Description
ftp_home_dir
(off , off)
in the user home directories
smartmon_3ware
(off , off)
ed to support devices on 3ware controllers.
xdm_sysadm_login
(off , off)
xen_use_nfs
(off , off)
mozilla_read_content
(off , off)
ssh_chroot_rw_homedirs
(off , off)
and write files in the user home directories
tftp_anon_write
(off , off)
used for public file transfer services.
allow_console_login
(on
,
on)
device. Required for System 390
spamassassin_can_network
(off , off)
use the network.
.
.
.
Allow ftp to read and write files \
Enable additional permissions need\
Allow xdm logins as sysadm
Allow xen to manage nfs files
Control mozilla content access
Allow ssh with chroot env to read \
Allow tftp to modify public files \
Allow direct login to the console \
Allow user spamassassin clients to\
A lo largo del libro usaremos estas herramientas para configurar SELinux, de modo que sea posible
la ejecución de los distintos servicios de red.
3.- Networking
En nuestros días un ordenador completamente aislado del mundo exterior es algo prácticamente
inservible. Muchas tareas cotidianas como enviar y recibir emails, compartir ficheros o consultar
una base de datos requieren una conexión externa.
Para comunicarse, los ordenadores usan un software que se denomina protocolo de red. No
entraremos en detalles acerca de los diferentes protocolos de red, puesto que ya existen multitud
de libros sobre este tema. En realidad existen muchos protocolos de red, pero el estándar de facto es
el protocolo TCP/IP.
3.1.- IPv4
Este protocolo fue desarrollado en los años 70 por la Agencia de Proyectos de Investigación de
Defensa Avanzada (DARPA por sus siglas en inglés). Es un modelo jerárquico que asigna a cada
ordenador una dirección IP en forma de cuatro octetos x.x.x.x . Cada dirección tiene una máscara
asociada que también consiste en cuatro octetos. Veremos esto con un poco más de detalle.
Como mencionamos anteriormente, una dirección IP se representa con 4 números cuyos valores
oscilan entre 0 y 255, por ejemplo 192.168.10.19, 198.165.30.40, 88.43.53.12, etc… Además, cada
dirección IP lleva asociado otro parámetro, la máscara de subred. La máscara de subred podría ser
255.255.255.0, 255.255.0.0, 255.240.0.0, etc… Imaginemos que tenemos un ordenador con los siguientes
parámetros:
Dirección IP: 192.168.10.19
Máscara de red: 255.255.255.0
Ahora debemos introducir un nuevo concepto, la dirección de red. Este valor nos servirá para
determinar si 2 ordenadores están en la misma o en diferentes redes. Para obtener la dirección de
red comparamos los valores de la dirección IP y de la máscara de red en binario.
Dirección IP: 11000000.10100100.00001010.00010011
Máscara de red: 11111111.11111111.11111111.00000000
La dirección de red será la parte de la dirección ip que se corresponde con la parte de la máscara de
red con “unos”. En este ejemplo será:
Dirección de red: 11000000.10100100.00001010 192.168.10
Dado que la dirección de red necesita tener una longitud de 4 octetos también, el resto de la dirección
se completará con “ceros”.
Dirección de red: 11000000.10100100.00001010.00000000 192.168.10.0
66
3.- Networking
67
Para que dos máquinas puedan comunicarse directamente deberán tener la misma dirección de
red. Por ejemplo, si ya tenemos un servidor con la dirección IP 192.168.10.19 y la máscara de red
255.255.255.0, deberíamos usar la misma dirección de red (y por supuesto una IP diferente) para un
nuevo ordenador. Una de las muchas direcciones IP válidas podría ser esta:
Dirección IP: 192.168.10.20
Máscara de red: 255.255.255.0
Dirección de red: 192.168.10.0
De forma que, como hemos dicho, una dirección IP siempre debe tener una máscara asociada, de otra
forma no podríamos determinar a qué red pertenece. En los ejemplos previos hemos especificado la
dirección IP y la máscara de red como dos valores separados, pero se pueden representar juntos en
una forma abreviada. Vamos a tomar el último ejemplo:
Dirección IP: 192.168.10.20 Máscara de red: 255.255.255.0
Si pasamos los valores a binario obtenemos esto:
Dirección IP: 11000000.10101000.00001010.00010010
Máscara de red: 11111111.11111111.11111111.00000000
Vemos que la máscara de red tiene 24 unos, así que podríamos representarla así:
192.168.10.20/24
Las direcciones IP también se pueden clasificar en varias categorías:
Clase A:
La dirección (en formato binario) comienza con un 0. Es decir, cada dirección entre 1.x.x.x y 127.x.x.x
se considera una dirección IP de clase A.
Clase B:
La dirección empieza con 10. El rango de IPs en este caso va de 128.x.x.x hasta 191.x.x.x.
Clase C:
En este caso la dirección empieza con 110. El rango válido de direcciones de este tipo va de 192.x.x.x
hasta 224.x.x.x.
También existe una Clase D y una Clase E, utilizadas para propósitos específicos, pero no entraremos
en detalles.
3.1.1.- Direcciones especiales
También hay unas cuantas direcciones que fueron definidas con un propósito específico.
Un ejemplo es la dirección IP 127.0.0.1, llamada dirección de bucle local (loopback en inglés). Cada
dispositivo que usa el protocolo TCP tiene asignada esta dirección con el fin de poder comprobar
localmente el funcionamiento del protocolo TCP.
3.- Networking
68
Otras direcciones de red están concebidas para su uso exclusivo en redes de área local (LANs) pero
no en Internet, ya que a diferencia de las direcciones estándar, éstas no son únicas. Estas direcciones
son:
10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
De modo que cada dirección IP que se encuentre contenida en uno de estos rangos es considerada
una dirección privada.
3.1.2.- Unicast, multicast y broadcast
Un dispositivo IPv4 se puede comunicar directamente con otro sispositivo estableciendo una relación
uno-a-uno. Esto se denomina unicast.
Pero tal vez este dispositivo quiera comunicarse con todos aquellos dispositivos con la misma
dirección de red. Esto se llama broadcast y consiste en la dirección de red y todos los bits de
hosts puestos a 1. Por ejemplo, si un ordenador tiene la dirección 192.168.1.20/24 y quiere enviar
un broadcast lo enviará a la dirección 192.168.1.255.
Y también hay un tercer escenario, en el cual un ordenador quiere comunicarse con un grupo de
máquinas en la misma red, pero no todas ellas. Para que esto funcione, estas máquinas deberán
compartir una dirección de multicast. Este tipo de comunicación se llama también así, multicast. of
communication is called multicast.
3.1.3.- Conficuración de IPv4 en CentOS
3.1.3.1.- CentOS 6
Para asignar temporalmente una dirección IP a nuestro servidor CentOS podemos usar el comando
ifconfig. Ejecutado con el parámetro -a nos mostrará todas las interfaces de red presentes,
independientemente de si éstas están configuradas o no.
1
2
3
4
5
6
7
8
9
10
11
12
[root@delphos ~]# ifconfig -a
eth0
Link encap:Ethernet HWaddr 00:0C:29:78:4C:B1
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:55678099 (0.0 b)
Interrupt:19 Base address:0x2000
lo
Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
3.- Networking
13
14
15
16
17
69
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:19843 errors:0 dropped:0 overruns:0 frame:0
TX packets:19843 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:19601819 (18.6 MiB) TX bytes:19601819 (18.6 MiB)
Podemos ver que hay 2 interfaces de red en nuestro servidor: lo (loopback), una interfaz de red
virtual usada internamente, y eth0, la cual se corresponde con una tarjeta ethernet. Esta última es la
interfaz que tendremos que usar para configurar la dirección IP de nuestro servidor.
1
[root@delphos ~]# ifconfig eth0 192.168.1.20 netmask 255.255.255.0 up
Con ifconfig podemos añadir una IP temporal, pero para que este cambio sea persistente tendremos
que modificar la configuración de red del sistema. Podemos hacer esto manualmente editando el
fichero /etc/sysconfig/network-scripts/ifcfg-eth0 y añadiendo las siguientes líneas:
1
2
3
4
IPADDR=192.168.10.19
BOOTPROTO=none
NETMASK=255.255.255.0
TYPE=Ethernet
También tendremos que cambiar la línea “ONBOOT=no” a “ONBOOT=yes”, de modo que la interfaz
de red se active después de cada reinicio. Este procedimiento funciona perfectamente, pero probablemente sea más cómodo utilizar una herramienta de configuración automática como system-confignetwork. Este programa seguramente no esté instalado por defecto, así que tendremos que instalarlo
ahora. Como vimos en el capítulo previo podemos usar yum para identificar el paquete asociado a
un comando determinado.
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@delphos ~]# yum --disablerepo=* --enablerepo=c6-media provides system-conf\
ig-network
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
file:///media/CentOS/repodata/repomd.xml: [Errno 14] Could not open/read file://\
/media/CentOS/repodata/repomd.xml
Trying other mirror.
file:///media/cdrecorder/repodata/repomd.xml: [Errno 14] Could not open/read fil\
e:///media/cdrecorder/repodata/repomd.xml
Trying other mirror.
c6-media
| 4.0 kB
00:00 ...
Warning: 3.0.x versions of yum would erroneously match against filenames.
70
3.- Networking
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
You can use "*/system-config-network" and/or "*bin/system-config-network" to ge\
t that behaviour
No Matches found
[root@delphos ~]# yum --disablerepo=* --enablerepo=c6-media provides */system-co\
nfig-network
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
system-config-network-tui-1.6.0.el6.2-1.el6.noarch : The Network Adminstration
: Tool
Repo
: c6-media
Matched from:
Filename
: /usr/share/system-config-network
Filename
: /usr/bin/system-config-network
Filename
: /etc/pam.d/system-config-network
Filename
: /etc/security/console.apps/system-config-network
Filename
: /usr/sbin/system-config-network
Así que instalamos el paquete system-config-network-tui con este comando: yum –disablerepo=*
–enablerepo=c6-media install system-config-network-tui. Una vez que el paquete está instalado,
podemos lanzar el programa con system-config-network (Fig. 44).
Fig 44:System-config-network
Seleccionamos la opción “Device configuration” y pulsamos INTRO. Ahora en la pantalla aparecerá
una lista con las interfaces de red (Fig. 45), en este caso solamente hay una, la seleccionamos y
pulsamos nuevamente INTRO.
71
3.- Networking
Fig 45:Seleccionar una interfaz
Rellenamos el formulario y hacemos click en Ok->Save & Quit (Fig. 46).
Fig 46:Asignar una dirección IP
Si revisamos de nuevo el fichero /etc/sysconfig/network-scripts/ifcfg-eth0, veremos que el contenido
del fichero se ha actualizado. Sin embargo aún tendremos que cambiar manualmente el parámetro
“ONBOOT=no” a “ONBOOT=yes”.
3.- Networking
72
3.1.3.2.- Centos 7
En CentOS 7 el comando ifconfig no se instala por defecto, ya que se aconseja emplear otras
utilidades en su lugar como por ejemplo el comando ip. Con ella podemos añadir una dirección
IP así:
1
[root@Centos7 ~]# ip address add 192.168.1.202/24 dev enp0s3
También podemos listar las interfaces y sus IPs asociadas.
1
2
3
4
5
6
7
8
9
10
11
12
[root@Centos7 ~]# ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP \
qlen 1000
link/ether 08:00:27:a0:46:d2 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.202/24 scope global enp0s3
valid_lft forever preferred_lft forever
Como ocurría en CentOS 6, la dirección IP que acabamos de asignar tendrá un carácter temporal.
Si queremos que sea persistente tendremos que editar el fichero /etc/sysconfig/network-scripts/ifcfgenp0s3 y añadir las siguientes líneas:
1
2
3
4
IPADDR=192.168.10.19
BOOTPROTO=static
NETMASK=255.255.255.0
TYPE=Ethernet
Tendremos que añadir el parámetro ONBOOT=yes, de modo que la interfaz de red se active cada
vez que el sistema arranca.
De este modo asignamos manualmente una dirección IP estática al servidor, pero resulta mucho
más cómodo hacerlo con una utilidad. En CentOS 6 utilizamos system-config-network, pero este
comando no está disponible en CentOS 7, en su lugar debemos usar nmtui (v. Fig. 47 y Fig. 48).
73
3.- Networking
Fig 47:nmtui
Fig 48:Editando una conexión con nmtui
74
3.- Networking
Como aún no hemos añadido una puerta de enlace por defecto, la ñadimos ahora (v. Fig. 49).
Fig 49:Añadiendo la puerta de enlace por defecto con nmtui
Aceptamos los cambios (v. Fig. 50).
75
3.- Networking
Fig 50:Añadiendo la puerta de enlace por defecto con nmtui
Y reiniciamos el servicio de red.
1
2
[root@localhost ~]# service network restart
Restarting network (via systemctl):
[
OK
]
Ahora podemos consultar la puerta de enlace predeterminada con el comando ip.
1
2
3
[root@localhost ~]# ip route show
default via 192.168.1.1 dev enp0s3 proto static metric 1024
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.202
3.2.- IPv6
Según Internet fue ganando popularidad, llegó un momento en el que resultó claro que no habría
suficientes direcciones IPv4 para satisfacer la creciente demanda. Las direcciones IPv4 tienen una
longitud de 4 bytes, lo que permite un máximo de 4200 millones de direcciones, mientras que la
población mundial es de unos 7000 millones. Obviamente no todas las personas tienen un ordenador
conectado a Internet - especialmente en países pobres - pero cada día más y más personas se conectan
a Internet, y cada vez es más habitual disponer de ordenador, smartphone y tablet, todos ellos
3.- Networking
76
con conexión a Internet. Además, también debemos tener en cuenta que cada servidor en Internet
necesita también una IP única.
Considerando estos hechos, parece bastante razonable pensar que IPv4 no será capaz de satisfacer
la creciente necesidad de más direcciones para una Internet en continuo crecimiento.
Para resolver este problema, los ingenieros del IETF(Internet Engineering Task Force) decidieron
ponerse manos a la obra para desarrollar un protocolo que cumpliera con las nuevas expecativas.
Así surgió el protocolo IPv6. IPv6 utiliza direcciones de 128 bits, lo que permite un máximo de 3.4 *
10ˆ38 direcciones, cifra que debería ser suficiente durante un largo tiempo.
Las direcciones IPv6 se representan habitualmente en 8 grupos de 16 bits, en formato hexadecimal,
de esta forma:
fe80:0000:0000:0000:020c:29ff:fedf:d786/64
El ‘/64’ se utiliza para representar la máscara, concepto que ya vimos al hablar de direcciones IPv4.
Esto quiere decir que los primeros 64 bits de la dirección se utilizarán para definir la dirección de
red.
Con el fin de simplificar la representación de las direcciones IPv6, cuando hay varios ceros
consecutivos el mayor grupo de 0’s puede omitirse.
fe80::020c:29ff:fedf:d786/64
Como ocurría con las direcciones IPv4, también hay unas cuantas direcciones IPv6 a las que se ha
asignado un papel especial. Las que comienzan por fe80 se consideran direcciones locales (link-local
addresses en inglés). Un concepto similar a las direcciones privadas en el mundo IPv4. Siempre que
una interfaz de red está habilitada para IPv6 se le asigna automáticamente una dirección IPv6 que
comienza por fe80.
Podemos asignar una dirección IPv6 a la interfaz eth0 con el comando ip.
1
[root@delphos ~]# ip address add 2000::20c:29ff:fe78:4cb1/64 dev eth0
Ahora podemos ver la nueva ip asignada.
1
2
3
4
5
6
7
8
9
10
[root@delphos ~]# ifconfig eth0
eth0
Link encap:Ethernet HWaddr 00:0C:29:78:4C:B1
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: 2000::20c:29ff:fe78:4cb1/64 Scope:Global
inet6 addr: fe80::20c:29ff:fe78:4cb1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3911047 errors:25 dropped:14 overruns:0 frame:0
TX packets:264248 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:387910100 (369.9 MiB) TX bytes:57615841 (54.9 MiB)
77
3.- Networking
11
12
13
14
15
16
17
18
19
20
21
Interrupt:19 Base address:0x2000
[root@delphos ~]# ip address show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNO\
WN qlen 1000
link/ether 00:0c:29:78:4c:b1 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.20/24 brd 192.168.1.255 scope global eth0
inet6 2000::20c:29ff:fe78:4cb1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe78:4cb1/64 scope link
valid_lft forever preferred_lft forever
3.3.- Herramientas de red
3.3.1.- netstat
Cada vez que un programa necesita comunicarse por red utiliza lo que el protocolo TCP llama
“puertos”. Un “puerto” sería una forma de identificar un servicio determinado dentro de la red. Por
ejemplo, para comunicarse con un servidor Web se utilizaría el puerto 80, para conectar con un
servidor FTP el puerto 21, etc… Es decir, por cada servicio de red en ejecución en el servidor habrá
(al menos) un puerto TCP abierto.
Si queremos saber qué puertos tenemos abiertos en un momento dado podemos usar netstat. Por
defecto mostrará solo los puertos con una conexión establecida.
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address
e
tcp
0
0 192.168.1.20:ssh
BLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags
Type
State
unix 2
[ ]
DGRAM
unix 10
[ ]
DGRAM
.
.
.
Foreign Address
Stat\
192.168.1.1:49775
ESTA\
I-Node Path
8587
@/org/kernel/udev/udevd
10473 /dev/log
En este caso podemos ver que tenemos un único puerto tcp conectado, el puerto ssh. El comando
muestra varios sockets unix abiertps, pero por ahora ignoraremos esta información. Podemos pasarle
varias opciones a netstat. Algunas de las más útiles son: (-a) para mostrar TODOS los puertos abiertos
78
3.- Networking
y no solo los que ya están conectados, (-p) para identificar el programa que tiene abierto el puerto,
(-t) para TCP, (-u) para UDP o (-n) para mostrar el número de puerto en lugar del nombre del servicio
asociado a dicho puerto. Veamos un ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# netstat -aptn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address
Foreign Address
e
PID/Program name
tcp
0
0 0.0.0.0:22
0.0.0.0:*
EN
1107/sshd
tcp
0
0 127.0.0.1:25
0.0.0.0:*
EN
1183/master
tcp
0
0 0.0.0.0:5672
0.0.0.0:*
EN
1196/qpidd
tcp
0
0 192.168.1.20:22
192.168.1.1:50316
BLISHED 6738/sshd
tcp
0
0 :::22
:::*
EN
1107/sshd
tcp
0
0 ::1:25
:::*
EN
1183/master
Stat\
LIST\
LIST\
LIST\
ESTA\
LIST\
LIST\
Obtenemos la lista de todos los puertos TCP abiertos, mostrando los números de puerto y los
programas que han abierto cada puerto.
3.3.2.- lsof
Otra herramienta muy útil es lsof. Probablemente no está instalada por defecto, pero podemos
instalarla con yum como ya hemos visto antes.
1
2
3
4
5
6
7
8
9
[root@localhost ~]# yum --disablerepo=* --enablerepo=c6-media provides lsof
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
lsof-4.82-2.el6.i686 : A utility which lists open files on a Linux/UNIX system
Repo
: c6-media
Matched from:
[root@localhost ~]# yum --disablerepo=* --enablerepo=c6-media install lsof
Esta herramienta enumera los ficheros abiertos en el sistema, pero también podemos usarla para ver
qué proceso está escuchando en un puerto dado.
79
3.- Networking
1
2
3
4
5
6
7
8
[root@localhost ~]#
COMMAND PID USER
named
8616 named
named
8616 named
named
8616 named
named
8616 named
named
8616 named
named
8616 named
lsof -i :53
FD
TYPE DEVICE SIZE/OFF NODE NAME
20u IPv6 27844
0t0 TCP *:domain (LISTEN)
21u IPv4 27849
0t0 TCP localhost:domain (LISTEN)
22u IPv4 27851
0t0 TCP 192.168.1.20:domain (LISTEN)
512u IPv6 27843
0t0 UDP *:domain
513u IPv4 27848
0t0 UDP localhost:domain
514u IPv4 27850
0t0 UDP 192.168.1.20:domain
3.3.3.- nmap
En ocasiones necesitamos conocer qué puertos son accesibles por red. Podría suceder que un servicio
estuviera escuchando en un puerto determinado, pero que un cortafuegos o filtro de cualquier
tipo estuviera bloqueando el acceso a dicho puerto. En este caso, obviamente, no podría haber
comunicación entre servidor y cliente. Para probar si un puerto es accesible o no podemos usar
nmap.
La sintaxis básica es nmap nombre_o_ip:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost named]# nmap 192.168.1.20
Starting Nmap 5.21 ( http://nmap.org ) at 2014-08-03 02:31 CEST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled.\
Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.1.20
Host is up (0.00071s latency).
Not shown: 998 filtered ports
PORT
STATE SERVICE
22/tcp open ssh
53/tcp open domain
MAC Address: 00:0C:29:78:4C:B1 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 5.29 seconds
[root@localhost named]#
Podemos especificar los puertos que queremos comprobar.
3.- Networking
1
2
3
4
5
6
7
8
9
10
11
12
13
14
80
[root@localhost named]# nmap -p 80,22 192.168.1.20
Starting Nmap 5.21 ( http://nmap.org ) at 2014-08-03 03:05 CEST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled.\
Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.1.20
Host is up (0.00024s latency).
PORT
STATE
SERVICE
22/tcp open
ssh
80/tcp filtered http
MAC Address: 00:0C:29:78:4C:B1 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
[root@localhost named]#
También podemos obtener más información acerca de los servicios que están escuchando en cada
puerto.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost named]# nmap -sV 192.168.1.20
Starting Nmap 5.21 ( http://nmap.org ) at 2014-08-03 03:07 CEST
Nmap scan report for delphos.olimpus.local (192.168.1.20)
Host is up (0.00034s latency).
Not shown: 998 filtered ports
PORT
STATE SERVICE VERSION
22/tcp open ssh
OpenSSH 5.3 (protocol 2.0)
53/tcp open domain
MAC Address: 00:0C:29:78:4C:B1 (VMware)
Service detection performed. Please report any incorrect results at http://nmap.\
org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 16.86 seconds
[root@localhost named]#
3.3.4.- ping
Una de las utilidades más sencillas y útiles para diagnosticar problemas de red es ping. Com ping
simplemente enviamos un pequeño paquete de datos al destino. Si el paquete llega, el destino habitualmente - responderá.
3.- Networking
1
2
3
4
81
[root@delphos ~]# ping 192.168.10.23
PING 192.168.10.23 (192.168.10.23) 56(84) bytes of data.
64 bytes from 192.168.10.23: icmp_seq=1 ttl=63 time=2.76 ms
64 bytes from 192.168.10.23: icmp_seq=2 ttl=62 time=1.59 ms
3.3.5.- ping6
Ping6 es la versión para IPv6 del comando ping. Funciona del mismo modo pero utilizando
direcciones IPv6.
1
2
3
4
[root@CentOS7 ~]# ping6 2001::20c:29ff:fe78:4cb2
PING 2001::20c:29ff:fe78:4cb2(2001::20c:29ff:fe78:4cb2) 56 data bytes
64 bytes from 2001::20c:29ff:fe78:4cb2: icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from 2001::20c:29ff:fe78:4cb2: icmp_seq=2 ttl=64 time=0.080 ms
Si intentamos hacer ping a una dirección local (las que empiezan con de80), necesitamos indicar la
interfaz. De otro modo obtendremos un error.
1
2
3
4
5
6
7
8
9
10
11
12
[root@delphos ~]# ping6 fe80::20c:29ff:fe78:4cb1
connect: Invalid argument
[root@delphos ~]# ping6 -I eth0 fe80::20c:29ff:fe78:4cb1
PING fe80::20c:29ff:fe78:4cb1(fe80::20c:29ff:fe78:4cb1) from fe80::20c:29ff:fe78\
:4cb1 eth0: 56 data bytes
64 bytes from fe80::20c:29ff:fe78:4cb1: icmp_seq=1 ttl=64 time=3.70 ms
64 bytes from fe80::20c:29ff:fe78:4cb1: icmp_seq=2 ttl=64 time=0.111 ms
64 bytes from fe80::20c:29ff:fe78:4cb1: icmp_seq=3 ttl=64 time=0.044 ms
^C
--- fe80::20c:29ff:fe78:4cb1 ping statistics --3 packets transmitted, 3 received, 0% packet loss, time 2300ms
rtt min/avg/max/mdev = 0.044/1.285/3.701/1.708 ms
4.- DNS
El número de ordenadores interconectados crece cada día. Es posible diseñar una red con un esquema
de direccionamiento de red jerárquico que asigne direcciones IP de acuerdo con la ubicación física
de cada máquina, pero incluso en este caso siempre será más fácil identificar a los dispositivos de
red por un nombre y no por una dirección IP. Un servidor de DNS local nos permite establecer una
relación directa entre un nombre de ordenador y su dirección IP, lo que facilita mucho la gestión de
la red.
4.1.- Servicio DNS
Para comunicarse entre sí, cada máquina de la red debe disponer de una dirección IP única. Se podría
decir que existe una cierta analogía conuna red telefónica, en la que un número de teléfono identifica
a un único dispositivo y le posibilita la comunicación con otros teléfonos.
Trabajar con direcciones IP está bien para las máquinas, pero puede resultar un engorro para
las personas. Sería necesario recordar la dirección IP de todos y cada uno de los dispositivos a
los que quisiéramos conectarnos. Definitivamente es mucho más cómodo utilizar nombres como
www.google.es o www.redhat.com, mucho más fáciles de recordar.
Internamente las computadoras se comunican entre sí utilizando sus direcciones IP, no sus nombres
asociados. Así que es necesario tener un sistema capaz de determinar la dirección IP asociada con
un determinado nombre de dominio.
De modo que, por ejemplo, si tecleamos http://www.google.es en nuestro navegador favorito, nuestro
PC tiene que ser capaz de averiguar la dirección IP asociada con el nombre www.google.es. Una vez
que descubre que la dirección IP es 173.194.41.215 establece una conexión y muestra la página Web.
Si hubiéramos escrito en la barra de direcciones http://173.194.41.215 no habría sido necesario
preguntar la dirección IP de www.google.es.
Un servidor DNS es una máquina que mantiene una lista de asociaciones nombre - dirección IP.
En los primeros días de Internet esto se conseguía con un único fichero de texto que todos los
ordenadores tenían que conocer para poder comunicarse entre sí. Este fichero es /etc/passwd, y
aún hoy está presente en cada computadora. Por ello se puede utilizar para proporcionar un servicio
de resolución de nombres básico. Por ejemplo, podemos abrir el fichero /etc/passwd y añadir la
siguiente línea:
1
192.168.10.19
www.dummy-domain.com
A partir de este momento, cada vez que nuestra máquina necesite conocer la dirección IP de
www.dummy-domain.com, asumirá que esta dirección IP es 192.168.10.19.
82
4.- DNS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
83
[root@localhost ~]# cat /etc/hosts
127.0.0.1
localhost localhost.localdomain localhost4 localhost4.localdomain4
::1
localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.19
dummy-server.example.com
192.168.10.19
www.dummy-domain.com
[root@localhost ~]# ping www.dummy-domain.com
PING www.dummy-domain.com (192.168.10.19) 56(84) bytes of data.
64 bytes from dummy-server.example.com (192.168.10.19): icmp_seq=1 ttl=64 time=0\
.056 ms
64 bytes from dummy-server.example.com (192.168.10.19): icmp_seq=2 ttl=64 time=0\
.058 ms
64 bytes from dummy-server.example.com (192.168.10.19): icmp_seq=3 ttl=64 time=0\
.052 ms
^C
--- www.dummy-domain.com ping statistics --3 packets transmitted, 3 received, 0% packet loss, time 2459ms
rtt min/avg/max/mdev = 0.052/0.055/0.058/0.006 ms
Utilizar el fichero host para la resoluciójn de nombres todavía puede resultar apropiado para
redes pequeñas, pero desde el momento en que Internet comenzó a crecer resultó evidente que se
necesitaba un nuevo sistema de resolución de nombres. Y por ello se desarrolló el sistema DNS.
Un servidor DNS mantiene una base de datos con todas las direcciones IP y nombres incluidos en un
dominio. Por supuesto un único servidor DNS es incapaz de almacenar todas las relaciones nombre dirección IP existentes en el Mundo, sino que habitualmente cada servidor DNS solamente mantiene
la información relativa a su propio dominio.
Los servidores DNS se organizan de un modo jerárquico, como hemos visto en la Fig. 51, de modo
que cuando el servidor DNS asignado no consigue resolver un nombre, le pasa la petición a otro
servidor de una capa superior. Es fácil de entender con un ejemplo.
84
4.- DNS
Fig 51:Jerarquía DNS
Imaginemos que estamos delante de una computadora del dominio acme.net y queremos acceder
a la web es.wikipedia.org. La computadora consultará si servidor DNS local acerca del nombre
es.wikipedia.org, pero este servidor solo conoce los registros www.acme.net, mail.acme.net, etc… Así
que decide consultar al servidor del dominio .net. Este servidor del dominio .net tampoco conoce
la dirección del servidor es.wikipedia.org así que tiene que consultar a su vez al servidor raíz (.) .
El servidor raíz no sabe la dirección exacta de es.wikipedia.org, pero sí que conoce la dirección del
servidor del domino .org, así que le pasa la consulta a dicho servidor. A su vez el servidor de nombres
de .org transmitirá esa misma consulta al servidor DNS del dominio wikipedia.org, que será quien
finalmente nos diga la dirección IP asociada con el nombre es.wikipedia.org, la respuesta se le pasará
al servidor DNS del dominio acme.net, que a su vez le responderá al cliente.
4.2.- Instalar un servidor DNS
Para ilustrar la teoría que hemos visto hasta ahora, vamos a instalar y configurar un servidor
DNS. El paquete que tendremos que instalar es bind. Si ya tenemos una conexión a Internet
podemos usar yum sin las opciones –disablerepo y –enablerepo, ya que la aplicación descargará
de los repositorios de Internet los paquetes necesarios. También podemos usar el parámetro -y para
responder automáticamente que sí a cualquier mensaje de confirmación. Por otro lado, si todavía no
tenemos una conexión a Internet tendremos que usar las opciones que vimos antes y asegurarnos
de que el DVD está montado.
85
4.- DNS
1
[root@localhost ~]# yum -y install bind
4.2.1.- Arrancando el servicio en CentOS 6
Una vez instalado, deberíamos tener un nuevo script en el directorio /etc/init.d. Este script se llamará
named.
1
2
[root@localhost ~]# ls /etc/init.d/named
/etc/init.d/named
Podemos comprobar el estado de este nuevo servicio llamando al script con el parámetro status.
1
2
3
[root@localhost ~]# /etc/init.d/named status
rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
named is stopped
O también podemos usar el comando service.
1
2
3
[root@localhost ~]# service named status
rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
named is stopped
En ambos casos vemos que el servicio named está parado. Y también parece que faltan un par de
ficheros. Entraremos en más detalle dentro de un momento, pero por ahora nos limitaremos a iniciar
el servicio con el siguiente comando:
1
2
3
4
5
[root@localhost ~]# service named start
Starting named:
[root@localhost ~]# service named status
rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
named (pid 1570) is running...
[
OK
]
Ahora deberemos asegurarnos de que el servicio arranca automáticamente cada vez que el servidor
se reinicie. Podemos comprobar esto con chkconfig.
1
2
[root@localhost ~]# chkconfig --list named
named
0:off
1:off
2:off
3:off
4:off
5:off
6:off
Podemos ver que, ahora mismo, el servicio named no está configurado para arrancar de forma
automática en ninguno de los 6 niveles de ejecución. Lo cambiamos.
86
4.- DNS
1
2
3
[root@localhost ~]# chkconfig named on
[root@localhost ~]# chkconfig --list named
named
0:off
1:off
2:on
3:on
4:on
5:on
6:off
Ahora el servicio named se iniciará en todos los niveles de ejecución, excepto el 0(apagado), el
1(monousuario) y el 6(reinicio).
Hasta ahora no hemos hablado de niveles de ejecución, pero podemos decir que es la forma que
tiene el SO de identificar si la máquina está apagada (nivel de ejecución 0), en modo monousuario
(nivel de ejecución 1), en modo texto multiusuario con conectividad limitada (nivel de ejecución
2), en modo texto multiusuario con conectividad completa (nivel de ejecución 3), en modo gráfico
multiusuario (nivel de ejecución 5) o reiniciándose (nivel de ejecución 6). El nivel de ejecución 4 no
se usa por defecto, pero puede ser definido por el usuario.
4.2.2.- Arrancando el servicio en CentOS 7
La gestión de servicios en CentOS 7 ha experimentado muchos cambios, y ahora el sistema ya no
utiliza los scripts de /etc/init.d, excepto para unos pocos servicios. El resto son gestionados ahora por
systemd.
Para comprobar el estado de un servicio tendremos que usar el comando systemctl.
1
2
3
4
[root@Centos7 ~]# systemctl status named
named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; disabled)
Active: inactive (dead)
Vemos que es servicio está detenido, así que lo iniciamos.
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Centos7 ~]# systemctl start named
[root@Centos7 ~]# systemctl status named
named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; disabled)
Active: active (running) since dom 2014-11-23 01:05:36 CET; 4s ago
Process: 2855 ExecStart=/usr/sbin/named -u named $OPTIONS (code=exited, status\
=0/SUCCESS)
Process: 2853 ExecStartPre=/usr/sbin/named-checkconf -z /etc/named.conf (code=\
exited, status=0/SUCCESS)
Main PID: 2857 (named)
CGroup: /system.slice/named.service
└─2857 /usr/sbin/named -u named
87
4.- DNS
14
15
16
17
18
19
20
21
22
23
24
nov 23 01:05:37 Centos7 named[2857]: validating @0x7fa9c062ff10: . NS: veri...un
nov 23 01:05:37 Centos7 named[2857]: validating @0x7fa9c062ff10: . NS: no v...nd
nov 23 01:05:37 Centos7 named[2857]: error (no valid RRSIG) resolving './NS...53
nov 23 01:05:37 Centos7 named[2857]: error (network unreachable) resolving ...53
nov 23 01:05:37 Centos7 named[2857]: validating @0x7fa9c062ff10: . NS: veri...un
nov 23 01:05:37 Centos7 named[2857]: validating @0x7fa9c062ff10: . NS: no v...nd
nov 23 01:05:37 Centos7 named[2857]: error (no valid RRSIG) resolving './NS...53
nov 23 01:05:37 Centos7 named[2857]: validating @0x7fa9c062ff10: . NS: veri...un
nov 23 01:05:37 Centos7 named[2857]: validating @0x7fa9c062ff10: . NS: no v...nd
nov 23 01:05:37 Centos7 named[2857]: error (no valid RRSIG) resolving './NS...53
Hint: Some lines were ellipsized, use -l to show in full.
Ahora el servicio está en ejecución, pero tenemos que asegurarnos de que se inicia con cada arranque
del servidor.
1
2
3
[root@Centos7 ~]# systemctl enable named
ln -s '/usr/lib/systemd/system/named.service' '/etc/systemd/system/multi-user.ta\
rget.wants/named.service'
Podemos comprobar que el servicio se ha habilitado correctamente con el siguiente comando:
1
[root@Centos7 ~]# systemctl list-unit-files --type=service
Obtenemos así un listado de los servicios instalados en el servidor.
1
2
3
4
5
6
7
8
9
UNIT FILE
auditd.service
.
.
.
named.service
.
.
.
STATE
enabled
enabled
4.3.- Instalando un servidor maestro
Antes de pasar a la instalación vamos a hablar un poco acerca de los tipos de servidores DNS:
Como ya sabemos, un servidor DNS traduce nombres en direcciones IP. Pero según su modo de
funcionamiento se pueden distinguir diferentes tipos de servidor:
88
4.- DNS
• Servidor de caché. En este caso, el servidor no almacena ninguna información con las
relaciones nombre - dirección IP, de forma que tiene que consultar con otros servidores que
sí disponen de dicha información. Pero una vez que obtiene esa información la mantiene
en caché, de tal modo que cuando otro cliente hace esa misma consulta puede responder
rápidamente sin necesidad de contactar con otros servidores.
• Servidor maestro. El servidor mantiene una copia de los nombres e IPs de los dispositivos
pertenecientes al dominio, lo que se denomina una zona. Este servidor tiene autoridad para
cambiar la IP asociada a un nombre determinado, así como para añadir o eliminar registros.
• Servidor esclavo. El servidor mantiene también una copia de la zona, pero de solo lectura.
El servidor cuenta con toda la información necesaria para responder a las consultas de los
clientes, pero no puede cambiar, añadir o eliminar registros.
Hasta ahora hemos instalado el software necesario pero, obviamente, necesitamos configurarlo.
Vamos a suponer que tenemos un dominio llamado olimpus.local, y unas cuantas máquinas llamadas
prometheus, zeus, aphrodite, etc… y queremos asegurarnos de que cuando un cliente busca la
máquina aphrodite.olimpus.local obtiene su dirección IP asociada. Para lograr esto, tendremos que
crear la zona. Veamos el procedimiento paso a paso.
El archivo de configuración principal del servidor DNS es /etc/named.conf. Después de una
instalación nueva tendrá un aspecto como este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//
//
//
//
//
//
//
//
named.conf
Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
server as a caching only nameserver (as a localhost DNS resolver only).
See /usr/share/doc/bind*/sample/ for example named configuration files.
options {
listen-on port 53 { 127.0.0.1; };
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; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
89
4.- DNS
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
Este es el fichero de configuración de un servidor CentOS 6, en CentOS 7 el fichero es ligeramente
distinto, no obstante la forma de configurarlo es exactamente la misma en los dos casos.
Estas son algunas de las opciones más importantes:
1
2
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
El servidor solamente escuchará en la dirección del localhost, es decir, no será accesible desde otros
dispositivos de la red. Como queremos que se pueda consultar al servidor DNS desde otras máquinas
cambiaremos estas dos líneas.
1
2
3
4
5
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory
"/var/named";
Esto solo significa que el directorio por defecto para los archivos de zona será /var/named. No es
necesario cambiar esto.
90
4.- DNS
1
allow-query
{ localhost; };
Queremos que el servidor responda a peticiones de cualquier máquina, así que cambiamos este valor.
1
2
3
4
5
6
allow-query
{ any; };
zone "." IN {
type hint;
file "named.ca";
};
Esta es la única zona definida por ahora en el fichero de configuración. La zona que se encuentra
en la cima de la jerarquía. Si abrimos el fichero /var/named/named.ca veremos que contiene las
direcciones de los servidores raíz de Internet.
Ahora tendremos que proporcionarle al servidor la información relativa a nuestro dominio. De modo
que debajo de la definición de la zona “.” teclearemos esto:
1
2
3
4
zone "olimpus.local" IN {
type master;
file "olimpus.local.zone";
};
Ahora podemos guardar los cambios. Para asegurarnos de que la sintaxis del fichero named.conf es
correcta podemos usar el comando named-checkconf.
1
2
[root@localhost ~]# named-checkconf
[root@localhost ~]#
Como vemos, el comando no ha mostrado ningún mensaje, por lo que podemos asumir que la
sintaxis es correcta. Si hubiera un error sintáctico el programa nos lo indicaría. Por ejemplo, si nos
hubiéramos olvidado de cerrar una llave recibiríamos un mensaje como este:
1
2
[root@localhost ~]# named-checkconf
/etc/named.conf:26: '}' expected near ';'
Acabamos de definir la zona en el archivo /etc/named.conf, pero ahora tenemos que crear el fichero
/var/named/olimpus.local.zone, al que hacemos referencia en la definición de la zona. Como cabría
esperar, el fichero debe cumplir con unas características sintácticas determinadas. Si estamos creando
un fichero de zona desde cero y no recordamos todos los detalles acerca de la sintaxis del fichero
podemos echar un vistazo a algunos de los ficheros de muestra en el directorio /usr/share/doc/bind9.7.3/sample. De hecho, la carpeta /usr/share/doc* es un recurso muy útil siempre que intentamos
configurar o afinar un servicio, ya que ahí podemos encontrar ejemplos de ficheros de configuración
para casi todos los servicios instalados en el servidor.
El fichero de zona debería quedar similar a este:
91
4.- DNS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;
;Data file for olimpus.local
;
$TTL 2D
olimpus.local. IN SOA olimpus.local. root.olimpus.local. (
2014082701;
Serial
1D;
Refresh
2H;
Retry
1W;
Expire
2D);
Default TTL
IN NS delphos.olimpus.local.
IN MX 10 prometheus.olimpus.local.
delphos
prometheus
aphrodite
delphos
dns
mail
IN
IN
IN
IN
IN
IN
A
192.168.1.20
A
192.168.1.21
A
192.168.1.22
AAAA fe80::20c:29ff:fe78:4cb1
CNAME
delphos
CNAME
prometheus
Las líneas que empiezan con “;” son comentarios que se utilizan para aclarar el contenido del fichero.
Después definimos los parámetros asociados al fichero de zona, tales como los parámetros de refresco
y reintento, el tiempo de expiración o el TTL por defecto. Cada fichero de zona debe tener un número
de serie asociado, este número se utilizará al replicar información entre servidores para saber si existe
una versión más nueva de un fichero de zona.
1
IN NS delphos.olimpus.local.
Este es un registro NS, nos dice cuáles son los servidores de nombres del dominio olimpus.local. Este
registro es obligatorio. En nuestro ejemplo el único servidor de nombres es delphos.olimpus.local,
pero podríamos tener varios de ellos.
1
IN MX 10 prometheus.olimpus.local.
De un modo similar, aquí definimos el servidor de correo del dominio olimpus.local y su prioridad
asociada (10). En este caso solo tenemos un servidor de correo, pero podríamos tener dos o incluso
más, y asignar a cada uno de ellos distinta prioridad dependiendo de su potencia de proceso. Veremos
esto de nuevo al hablar del servicio de correo.
92
4.- DNS
1
2
3
delphos
prometheus
aphrodite
IN A
IN A
IN A
192.168.1.20
192.168.1.21
192.168.1.22
Ahora tenemos una lista con todas las máquinas en la zona y sus direcciones IP asociadas. Estos
registros se denominan registros de tipo A.
1
delphos
IN AAAA fe80::20c:29ff:fe78:4cb1
Además podemos asociar nombres y direcciones IPv6, en este caso se usan registros AAAA.
1
2
dns
mail
IN CNAME
IN CNAME
delphos
prometheus
Y finalmente tenemos un par de registros CNAME, que funcionan como alias. Es decir, el cliente
podrá hacer ping a delphos.olimpus.local o a dns.olimpus.local indistintamente.
Una vez que hemos terminado de configurar la zona, podemos revisar la sintaxis con el comando
named-checkzone.
1
2
3
[root@localhost named]# named-checkzone olimpus.local olimpus.local.zone
zone olimpus.local/IN: loaded serial 20140827
OK
Ahora arrancamos el servicion named.
En CentOS 6:
1
2
[root@localhost named]# service named start
Starting named:
[
OK
]
En CentOS 7:
1
[root@Centos7 ~]# systemctl start named
Aparentemente todo ha ido bien, peor para asegurarnos vamos a consultar al servidor DNS la
dirección de la máquina delphos.olimpus.local. Más tarde veremos con más detalle algunas de
las herramientas que se pueden usar para consultar el servicio DNS, por ahora vamos a hacer una
breve introducción al comando dig.
Dig nos permite consultar al servidor DNS que elijamos. Para chequear nuestro nuevo servidor de
nombres teclearemos esto:
4.- DNS
1
2
93
[root@localhost named]# dig @192.168.1.20 delphos.olimpus.local
-bash: dig: command not found
Como hemos mencionado ya varias veces, si la utilidad no está instalada por defecto, tendremos que
averiguar el paquete al que pertenece e instalarlo. A partir de este momento ya no insistiremos más
en este punto.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@localhost named]# yum --disablerepo=* --enablerepo=c6-media provides dig
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
Warning: 3.0.x versions of yum would erroneously match against filenames.
You can use "*/dig" and/or "*bin/dig" to get that behaviour
No Matches found
[root@localhost named]# yum --disablerepo=* --enablerepo=c6-media provides */dig
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
32:bind-utils-9.7.3-8.P3.el6.i686 : Utilities for querying DNS name servers
Repo
: c6-media
Matched from:
Filename
: /usr/bin/dig
[root@localhost named]# yum --disablerepo=* --enablerepo=c6-media install bind-u\
tils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* c6-media:
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package bind-utils.i686 32:9.7.3-8.P3.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package
Arch
Version
Repository
Size
================================================================================
Installing:
bind-utils
i686
32:9.7.3-8.P3.el6
c6-media
177 k
94
4.- DNS
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Transaction Summary
================================================================================
Install
1 Package(s)
Total download size: 177 k
Installed size: 423 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : 32:bind-utils-9.7.3-8.P3.el6.i686
1/1
Installed:
bind-utils.i686 32:9.7.3-8.P3.el6
Complete!
[root@localhost named]#
Ahora ya podemos hacer la consulta…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost named]# dig @192.168.1.20 delphos.olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.20 delphos.olimpus.loc\
al
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27770
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;delphos.olimpus.local.
IN
A
;; ANSWER SECTION:
delphos.olimpus.local.
172800
IN
A
192.168.1.20
;; AUTHORITY SECTION:
olimpus.local.
172800
IN
NS
delphos.olimpus.local.
;; ADDITIONAL SECTION:
delphos.olimpus.local.
172800
IN
AAAA
fe80::20c:29ff:fe78:4cb1
95
4.- DNS
21
22
23
24
25
26
27
;;
;;
;;
;;
Query time: 7 msec
SERVER: 192.168.1.20#53(192.168.1.20)
WHEN: Sat Aug 2 10:42:07 2014
MSG SIZE rcvd: 97
[root@localhost named]#
Queremos consultar al servidor 192.168.1.20, así que le pasamos este dato como parámetro(@192.168.1.20).
Podemos ver que se ejecutó correctamente (status: NOERROR). Además, el servidor nos respondió
que delphos.olimpus.local tiene la dirección IPv4 192.168.1.20 y la dirección IPv6 fe80::20c:29ff:fe78:4cb1,
lo que es correcto.
Parece que ya tenemos un servidor DNS funcional, pero desafortunadamente esto no es completamente cierto. Hasta ahora tenemos una forma de traducir nombres en direcciones IP. Esto es lo que
se llama resolución directa, pero también deberíamos tener un modo de traducir direcciones IP en
nombres de máquina (resolución inversa). Para conseguir esto, el procedimiento es bastante similar
a lo que hemos visto antes.
En el fichero /etc/named.conf definiremos una nueva zona que proporcionará la resolución inversa.
La haremos justo debajo de la zona olimpus.local.
1
2
3
4
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.zone";
};
El formato x.x.x.in-addr.arpa, donde x.x.x.x es la dirección de red en orden inverso, es una forma
estándar de nombrar las zonas inversas.
Ahora creamos el fichero /var/named/192.168.1.zone. La sintaxis es similar a la utilizada en el fichero
olimpus.local.zone.
1
2
3
4
5
6
7
8
9
10
11
$TTL 2D;
1.168.192.in-addr.arpa. IN SOA delphos.olimpus.local. root.olimpus.local. (
2014082701
;serial
259200
;refresh(3 days)
14400
;retry(4 hours)
18140
;expire(3 weeks)
604800
;minimum(1 week)
)
NS delphos.olimpus.local.
20
Y lo revisamos.
PTR delphos.olimpus.local.
96
4.- DNS
1
2
3
[root@localhost named]# named-checkzone 1.168.192.in-addr.arpa 192.168.1.zone
zone 1.168.192.in-addr.arpa/IN: loaded serial 2014082701
OK
Reiniciamos el servicio…
En CentOS 6:
1
2
3
[root@localhost named]# service named restart
Stopping named:
Starting named:
[
[
OK
OK
]
]
En CentOS 7:
1
[root@Centos7 ~]# systemctl restart named
…y consultamos al servidor con la herramienta dig.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost named]# dig @192.168.1.20 -x 192.168.1.20
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.20 -x 192.168.1.20
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62275
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; QUESTION SECTION:
;20.1.168.192.in-addr.arpa.
IN
PTR
;; ANSWER SECTION:
20.1.168.192.in-addr.arpa. 172800 IN
PTR
delphos.olimpus.local.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 172800
IN
NS
delphos.olimpus.local.
;; ADDITIONAL SECTION:
delphos.olimpus.local.
delphos.olimpus.local.
IN
IN
A
AAAA
192.168.1.20
fe80::20c:29ff:fe78:4cb1
;;
;;
;;
;;
172800
172800
Query time: 2 msec
SERVER: 192.168.1.20#53(192.168.1.20)
WHEN: Sat Aug 2 11:28:31 2014
MSG SIZE rcvd: 136
4.- DNS
97
Como ocurrió antes, podemos ver que la consulta se ejecutó sin errores (status: NOERROR), y el
servidor respondió que la dirección IPv4 192.168.1.20 está asignada al servidor delphos.olimpus.local.
Finalmente crearemos la zona inversa para IPv6. Abrimos de nuevo el fichero /etc/named.conf y
añadimos las siguientes líneas:
1
2
3
4
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa" IN {
type master;
file "fe80.0.0.0.zone";
};
Como vemos, el nombre estándar es similar al que se utiliza con las zonas IPv4, también consiste en
la dirección de red en orden inverso, pero ahora el sufijo es ip6.arpa.
En lo que respecta al fichero /var/named/fe80.0.0.0.zone esto es lo que tenemos que escribir:
1
2
3
4
5
6
7
8
9
10
11
12
$TTL 172800 ; 2 days
0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa. IN SOA delphos.olimpus.local. root.oli\
mpus.local. (
2014082701
;serial
259200
;refresh(3 days)
14400
;retry(4 hours)
18140
;expire(3 weeks)
604800
;minimum(1 week)
)
NS delphos.olimpus.local.
1.b.c.4.8.7.e.f.f.f.9.2.c.0.2.0 IN PTR delphos
Y comprobamos la sintaxis.
1
2
3
4
[root@localhost named]# named-checkzone 0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa\
fe80.0.0.0.zone
zone 0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa/IN: loaded serial 2014082701
OK
Reiniciamos el servicio named y consultamos al servidor de nuevo.
98
4.- DNS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost named]# dig @192.168.1.20 -x fe80::20c:29ff:fe78:4cb1
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.20 -x fe80::20c:29ff:f\
e78:4cb1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29346
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; QUESTION SECTION:
;1.b.c.4.8.7.e.f.f.f.9.2.c.0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa. IN PT\
R
;; ANSWER SECTION:
1.b.c.4.8.7.e.f.f.f.9.2.c.0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa. 172800\
IN PTR delphos.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa.
;; AUTHORITY SECTION:
0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa. 172800 IN NS delphos.olimpus.local.
;; ADDITIONAL SECTION:
delphos.olimpus.local.
delphos.olimpus.local.
;;
;;
;;
;;
172800
172800
IN
IN
A
AAAA
192.168.1.20
fe80::20c:29ff:fe78:4cb1
Query time: 1 msec
SERVER: 192.168.1.20#53(192.168.1.20)
WHEN: Sat Aug 2 11:58:03 2014
MSG SIZE rcvd: 191
Todo está funcionando bien ahora, así que configuraremos el servicio para que arranque automáticamente después de cada reinicio. Hay diferentes formas de hacer esto, por ejemplo en CentOS 6
podemos usar chkconfig.
1
2
3
[root@localhost ~]# chkconfig named on
[root@localhost ~]# chkconfig --list named
named
0:off
1:off
2:on
3:on
En CentOS 7 deberíamos usar el comando systemctl.
4:on
5:on
6:off
99
4.- DNS
1
[root@localhost ~]# systemctl enable named
A partir de ahora, cada vez que se reinicie el servidor el servicio named se iniciará automáticamente.
Ahora podremos resolver los nombres de dominio que hemos definido en nuestras zonas, pero
si queremos que nuestro servidor pueda resolver dominios de Internet como www.google.com,
tendremos que reenviar esas peticiones a un servidor DNS externo. Si el servidor DNS externo tiene
la IP 192.168.1.1, habrá que incluir las siguientes líneas en el fichero /etc/named.conf :
1
2
3
forwarders {
192.168.1.1;
};
Estas líneas deberían incluirse en la sección de opciones generales, de modo que el fichero de
configuración debería quedar más o menos así:
1
2
3
4
5
6
7
8
9
10
11
12
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
.
.
.
forwarders {
192.168.1.1;
};
.
.
.
4.4.- Configuración del cliente
En Linux podemos ver la configuración actual del cliente DNS en el fichero /etc/resolv.conf.
1
2
3
[root@delphos ~]# cat /etc/resolv.conf
nameserver 192.168.1.20
search olimpus.local
En este ejemplo, el cliente enviará las consultas DNS al servidor 192.168.1.20. Si en la consulta no se
ha especificado un sufijo DNS se añadirá por defecto “olimpus.local”.
Podemos editar este fichero a mano, pero normalmente resulta más sencillo utilizar una de las
herramientas administrativas que cada distribución de Linux pone a nuestra disposición. Por
100
4.- DNS
ejemplo, en CentOS 6 podemos usar el programa system-config-network, en CentOS 7 no hay
ningún programa system-config-network, pero hay uno similar llamado nmtui, en Suse podemos
hacer lo mismo con Yast, en Ubuntu podemos abrir “System settings” e ir luego a “Network”.
Por su parte en Windows tendremos que editar las propiedades TCP/IP de la conexión LAN (Fig. 52
y Fig. 53).
Fig 52:propiedades de la conexión LAN
101
4.- DNS
Fig 53:Configuración IP
Por supuesto, para que los clientes puedan acceder al servidor DNS tenemos que permitir en el
firewall el acceso al puerto UDP 53.
En CentOS 6:
1
2
[root@delphos ~]# iptables -I INPUT 2 -m state --state new -p udp --dport 53 -j \
ACCEPT
En CentOS 7:
1
2
[root@CentOS7 ~]# firewall-cmd --add-service=dns
success
En el caso de CentOS 7, con el comando anterior estamos permitiendo el acceso tanto al puerto UDP
53 como al puerto TCP 53. Podremos ver más detalles acerca del firewall incluido en CentOS 7 en
la sección 10 de este libro.
4.5.- Servidores esclavos y transferencias de zona
En este punto, tenemos un servidor que alberga toda la información de la zona olimpus.local. Como
veremos a lo largo de este libro, el DNS es un servicio fundamental, puesto que de él depende el
4.- DNS
102
correcto funcionamiento de muchos otros servicios. Por lo que una caída del servicio DNS puede ser
desastrosa para el funcionamiento de la red. Para minimizar este riesgo podemos instalar un nuevo
servidor de nombres. Este nuevo servidor será un servidor esclavo, esto quiere decir que será un
servidor con una copia de los ficheros de zona de solo lectura. El servidor será capaz de responder
a las consultas de los clientes, pero no podrá actualizar la información. De este modo tenemos dos
servidores para compartir la carga, además, si el servidor maestro quedara inutilizable por una avería
podríamos convertir nuestro servidor esclavo en un servidor maestro muy fácilmente.
Ya hemos visto con anterioridad cómo instalar CentOS, así que vamos a suponer que tenemos otro
servidor CentOS funcionando. Instalamos el paquete bind como hicimos con el servidor maestro y
añadiremos las siguientes líneas al fichero named.conf :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
zone "olimpus.local" IN {
type slave;
file "slaves/olimpus.local.zone";
masters {
192.168.1.20;
};
};
zone "1.168.192.in-addr.arpa" IN {
type slave;
file "slaves/192.168.1.zone";
masters {
192.168.1.20;
};
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa" IN {
type slave;
file "slaves/fe80.0.0.0.zone";
masters {
192.168.1.20;
};
};
Básicamente enumeramos las zonas, las declaramos como esclavas e indicamos cuál es el servidor
maestro, 192.168.1.20 en este caso.
Por supuesto, igual que hicimos con el servidor maestro, tendremos que cambiar los parámetros por
defecto para asegurarnos de que el servidor escucha en todas las direcciones de red y puede ser
consultado por cualquier cliente.
4.- DNS
1
2
3
103
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
allow-query
{ any; };
También tendremos que hacer algunos otros cambios en los ficheros de zona del servidor maestro.
Crearemos otro registro NS para el servidor esclavo. Si el nuevo servidor esclavo es prometheus la
nueva línea quedará así:
1
2
3
4
5
6
7
8
.
.
.
IN NS delphos.olimpus.local.
IN NS prometheus.olimpus.local.
.
.
.
Esto hay que hacerlo en los ficheros olimpus.local.zone, 192.168.1.zone y fe80.0.0.0.zone. Además,
también deberíamos notificarle al servidor esclavo cada vez que el fichero de zona es actualizado.
Para eso utilizaremos la directiva “notify yes” en la definición de la zona del fichero named.conf :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
zone "olimpus.local" IN {
type master;
file "olimpus.local.zone";
notify yes;
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.zone";
notify yes;
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa" IN {
type master;
file "fe80.0.0.0.zone";
notify yes;
};
En el servidor esclavo el servicio named deberá ser capaz de crear los ficheros de zona en la carpeta
/var/named/slaves, así que tendremos que asegurarnos de que el usuario named tiene derechos de
escritura en dicha carpeta.
4.- DNS
1
2
104
[root@localhost named]# ls -ld slaves/
drwxrwx---. 2 named named 4096 Dec 8 2011 slaves/
Ya hemos hablado brevemente de SELINUX con anterioridad. Podríamos describirlo como un
mecanismo de seguridad que crea otra capa de protección contra el acceso no autorizado, limitando el
daño que un hacker podría hacer al sistema. SELinux limita lo que un proceso o servicio puede hacer,
esto por supuesto incluye también al servicio named. Veremos cómo hacer que named funcione
correctamente en un entorno con SELinux.
Primero comprobamos si SELinux está activo:
1
2
3
4
5
6
7
[root@localhost named]# sestatus
SELinux status:
enabled
SELinuxfs mount:
/selinux
Current mode:
enforcing
Mode from config file:
enforcing
Policy version:
24
Policy from config file:
targeted
También tenemos que comprobar los valores booleanos de SELinux relacionados con el servicio
DNS.
1
2
[root@localhost named]# getsebool -a | grep named
named_write_master_zones --> off
Lo que nos indica este parámetro es que named no podrá escribir los ficheros de zona. Obviamente,
esto haría que fallara la transferencia de zona, por lo que tendremos que cambiar este valor a “on”.
1
2
3
[root@localhost named]# setsebool named_write_master_zones on
[root@localhost named]# getsebool -a | grep named
named_write_master_zones --> on
Haremos que el cambio sea permanente con (-P).
1
[root@Centos7b ~]# setsebool -P named_write_master_zones 1
Al transferir zonas, el servidor esclavo tendrá que conectar con el puerto 53 del servidor maestro.
Evidentemente, es preciso que el puerto sea accesible desde la red. Para comprobar este punto
podemos ejecutar el programa nmap desde el servidor esclavo.
105
4.- DNS
1
2
3
4
5
6
7
8
9
10
11
[root@localhost named]# nmap -p 53 192.168.1.20
Starting Nmap 5.21 ( http://nmap.org ) at 2013-11-12 01:12 CET
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled.\
Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.1.20
Host is up (0.00026s latency).
PORT
STATE
SERVICE
53/tcp filtered domain
MAC Address: 00:0C:29:78:4C:B1 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
Como vemos, el puerto está filtrado. Tendremos que abrirlo en el firewall en el servidor maestro. En
una sección posterior del libro veremos más detalles acerca de la administración del firewall. Por
ahora explicaremos cómo abrir el puerto. Dependiendo de si estamos usando CentOS 6 o CentOS
7 la forma de hacerlo será diferente.
En CentOS 6 podemos listar la configuración del firewall tecleando iptables -L en el servidor
maestro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost named]# iptables -L
Chain INPUT (policy ACCEPT)
target
prot opt source
ACCEPT
all -- anywhere
LISHED
ACCEPT
icmp -- anywhere
ACCEPT
tcp -- anywhere
sh
REJECT
all -- anywhere
st-prohibited
Chain FORWARD (policy ACCEPT)
target
prot opt source
REJECT
all -- anywhere
st-prohibited
Chain OUTPUT (policy ACCEPT)
target
prot opt source
destination
anywhere
state RELATED,ESTAB\
anywhere
anywhere
state NEW tcp dpt:s\
anywhere
reject-with icmp-ho\
destination
anywhere
reject-with icmp-ho\
destination
Por defecto solo se permiten las conexiones al puerto ssh. Tendremos que añadir la siguiente línea
para permitir el acceso al puerto 53.
106
4.- DNS
1
2
[root@localhost named]# iptables -I INPUT 4 -m state --state NEW -m tcp -p tcp -\
-dport 53 -j ACCEPT
Insertamos una nueva regla de entrada en la 4ª posición. Permitiendo las nuevas conexiones al puerto
53. Una vez que se establece la nueva conexión, el tráfico asociado estará permitido como se indica
en la línea:
1
2
ACCEPT
LISHED
all
--
anywhere
anywhere
state RELATED,ESTAB\
El conjunto completo de reglas en el firewall podría ser más o menos este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost named]# iptables -L
Chain INPUT (policy ACCEPT)
target
prot opt source
ACCEPT
all -- anywhere
LISHED
ACCEPT
icmp -- anywhere
ACCEPT
tcp -- anywhere
sh
ACCEPT
tcp -- anywhere
omain
REJECT
all -- anywhere
st-prohibited
Chain FORWARD (policy ACCEPT)
target
prot opt source
REJECT
all -- anywhere
st-prohibited
Chain OUTPUT (policy ACCEPT)
target
prot opt source
destination
anywhere
state RELATED,ESTAB\
anywhere
anywhere
state NEW tcp dpt:s\
anywhere
state NEW tcp dpt:d\
anywhere
reject-with icmp-ho\
destination
anywhere
reject-with icmp-ho\
destination
En CentOS 7 también se puede utilizar iptables, pero se recomienda usar el comando firewall-cmd
en su lugar. Lo primero de todo será averiguar la zona por defecto.
1
2
[root@localhost ~]# firewall-cmd --get-default-zone
public
Y ahora listamos los servicios permitidos.
4.- DNS
1
2
107
[root@localhost ~]# firewall-cmd --zone=internal --list-services
ssh
En este caso solo está permitido el acceso al servicio ssh, tendremos que añadir el servicio dns.
1
2
[root@localhost ~]# firewall-cmd --zone=internal --add-service=dns
success
Si ahora repetimos el test con nmap desde el servidor esclavo veremos que el puerto está abierto.
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost named]# nmap -p 53 192.168.1.20
Starting Nmap 5.21 ( http://nmap.org ) at 2013-11-12 01:31 CET
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled.\
Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.1.20
Host is up (0.0020s latency).
PORT
STATE SERVICE
53/tcp open domain
MAC Address: 00:0C:29:78:4C:B1 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
Tendremos que hacer lo mismo en el servidor esclavo, de forma que las transferencias de zona puedan
tener lugar en ambos sentidos.
También tendremos que cambiar las siguientes directivas del fichero named.conf, las cuales se usan
con DNSEC.
1
2
dnssec-enable no;
dnssec-validation no;
Ahora podemos comprobar si la transferencia de zona realmente funciona reiniciando el servicio
named en el servidor esclavo.
En CentOS 6:
108
4.- DNS
1
2
3
4
[root@localhost named]# service named restart
Stopping named:
Starting named:
[root@localhost named]#
[
[
OK
OK
]
]
En CentOS 7:
1
[root@Centos7 ~]# systemctl restart named
Si todo ha ido bien deberemos tener tres ficheros en la carpeta /var/named/slaves.
1
2
[root@localhost named]# ls /var/named/slaves/
192.168.1.zone fe80.0.0.0.zone olimpus.local.zone
Ahora cada vez que modifiquemos una zona en el servidor maestro actualizaremos el número
de serie, de este modo el cambió se replicará al servidor esclavo. Por ejemplo, supongamos que
añadimos un nuevo registro para el servidor vulcan, con dirección IPv4 192.168.1.23 y dirección
IPv6 fe80::20c:29ff:fedf:d786/64.
Añadimos los nuevos registros A y AAAA al fichero de zona.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
.
.
delphos
prometheus
aphrodite
vulcan
delphos
prometheus
vulcan
.
.
.
IN
IN
IN
IN
A
A
A
A
192.168.1.20
192.168.1.21
192.168.1.22
192.168.1.23
IN AAAA fe80::20c:29ff:fe78:4cb1
IN AAAA fe80::20c:29ff:feeb:4443
IN AAAA fe80::20c:29ff:fedf:d786
Y añadimos también los registros PTR a los ficheros de zona inversa.
109
4.- DNS
1
2
3
4
5
6
7
8
.
.
.
22
PTR vulcan.olimpus.local.
.
.
.
6.8.7.d.f.d.e.f.f.f.9.2.c.0.2.0 IN PTR vulcan
Finalmente, actualizamos el número de serie de los 3 ficheros.
1
2014090102;
Serial
La actualización de los ficheros de zona tendrá lugar en uno u otro momento de acuerdo con los
parámetros definidos en las propias zonas, la recarga del servicio, etc… Pero también podemos forzar
una transferencia de zona con el comando rndc (ver sección 4.6.1 acerca de cómo instalar rndc). Lo
ejecutamos desde el servidor esclavo.
1
rndc retransfer olimpus.local
Después de unos segundos el maestro y el esclavo tendrán la misma información. Podemos
comprobarlo consultando a ambos servidores con el comando dig. Desde el servidor esclavo
podemos consultar a ambos servidores. Primero consultamos al servidor esclavo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# dig @192.168.1.21 prometheus.olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.21 prometheus.olimpus.\
local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18441
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; QUESTION SECTION:
;prometheus.olimpus.local.
IN
;; ANSWER SECTION:
prometheus.olimpus.local. 172800 IN
;; AUTHORITY SECTION:
A
A
192.168.1.21
110
4.- DNS
18
19
20
21
22
23
24
25
26
27
28
29
olimpus.local.
olimpus.local.
172800
172800
IN
IN
;; ADDITIONAL SECTION:
delphos.olimpus.local. 172800 IN
delphos.olimpus.local. 172800 IN
prometheus.olimpus.local. 172800 IN
;;
;;
;;
;;
NS
NS
prometheus.olimpus.local.
delphos.olimpus.local.
A
AAAA
AAAA
192.168.1.20
fe80::20c:29ff:fe78:4cb1
fe80::20c:29ff:feeb:4443
Query time: 1 msec
SERVER: 192.168.1.21#53(192.168.1.21)
WHEN: Sun Aug 3 04:40:00 2014
MSG SIZE rcvd: 166
Y a continuación consultamos al servidor maestro para ver si las 2 respuestas son iguales. Debemos
tener en cuenta que el firewall podría estar bloqueando la consulta. Para permitir las transferencias
de zona habíamos abierto el puerto TCP 53, sin embargo las consultas DNS no utilizan el puerto TCP
53, sino el puerto UDP 53. Si este es el caso, tendremos que abrir el puerto UDP 53 en el firewall.
En Centos 6:
1
[root@localhost ~]# iptables -I INPUT 4 -p udp --dport 53 -j ACCEPT
En CentOS 7:
El mismo comando que utilizamos anteriormente para permitir las transferencias permitirá también
las consultas.
1
2
[root@localhost ~]# firewall-cmd --zone=internal --add-service=dns
success
Ahora podemos lanzar la consulta…
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# dig @192.168.1.20 prometheus.olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.20 prometheus.olimpus.\
local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57417
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
111
4.- DNS
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
;; QUESTION SECTION:
;prometheus.olimpus.local.
IN
A
;; ANSWER SECTION:
prometheus.olimpus.local. 172800 IN
A
192.168.1.21
;; AUTHORITY SECTION:
olimpus.local.
olimpus.local.
NS
NS
prometheus.olimpus.local.
delphos.olimpus.local.
A
AAAA
AAAA
192.168.1.20
fe80::20c:29ff:fe78:4cb1
fe80::20c:29ff:feeb:4443
172800
172800
IN
IN
;; ADDITIONAL SECTION:
delphos.olimpus.local. 172800 IN
delphos.olimpus.local. 172800 IN
prometheus.olimpus.local. 172800 IN
;;
;;
;;
;;
Query time: 2 msec
SERVER: 192.168.1.20#53(192.168.1.20)
WHEN: Sun Aug 3 05:42:05 2014
MSG SIZE rcvd: 166
Como vemos, el resultado es el mismo en ambos casos.
4.6.- DNSSEC
El servicio de nombres tiene una importancia vital en cualquier infraestructura de red, pero
lamentablemente es bastante vulnerable a los ataques. Si un hacker consigue inyectar falsas
respuestas DNS en la red será capaz de controlar el tráfico. Por ejemplo, digamos que un usuario
quiere consultar su correo y para ello accede a http://gmail.com, si el atacante envía su propia
respuesta DNS para el dominio http://gmail.com el ordenador del usuario intentará acceder al
servidor gmail.com equivocado.
Para minimizar este riesgo se desarrolló DNSSEC. DNSSEC en realidad no evita estos ataques, pero
hace posible su detección. Funciona firmando los ficheros de zona de forma que podamos detectar
si ha habido un cambio no autorizado. Para usar DNSSEC primero debemos generar 2 conjuntos de
claves para nuestra zona: la Zone Signing Keys (ZSK) y la Key Signing Keys. Primero creamos la
ZSK.
1
2
3
[root@localhost named]# dnssec-keygen -a RSASHA1 -b 512 -n ZONE olimpus.local
Generating key pair.....++++++++++++ ....++++++++++++
Kolimpus.local.+005+08586
4.- DNS
112
El proceso de generar las claves puede demorarse bastante, llegando a durar varias horas. Si queremos
acelerar el proceso podemos instalar haveged, que actúa como generador de números pseudoaleatorios. El paquete haveged actualmente no se incluye como parte de la instalación estándar de
CentOS 6, pero se puede instalar desde Internet². Por otra parte, si estamos trabajando con CentOS 7
podemos descargarlo desde el repositorio EPEL. Este repositorio no está incluido en los repositorios
por defecto de CentOS 7, pero se puede configurar de forma muy sencilla ejecutando el siguiente
comando:
1
[root@CentOS7 ~]# yum install epel-release
Y ahora generamos el KSK. Como ya dijimos antes, este proceso puede ser muy lento.
1
2
3
4
5
[root@localhost named]# dnssec-keygen -f KSK -a RSASHA1 -b 4096 -n ZONE olimpus.\
local
Generating key pair.............++..............................................\
..........................................++
Kolimpus.local.+005+35116
Ahora tendremos que añadir los ficheros de clave que acabamos de crear al fichero de zona.
1
[root@localhost named]# cat Kolimpus.local.*.key >> olimpus.local.zone
Y firmamos el fichero de zona.
1
2
3
4
5
6
7
[root@localhost named]# dnssec-signzone -N increment -o olimpus.local olimpus.lo\
cal.zone
Verifying the zone using the following algorithms: RSASHA1.
Zone signing complete:
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
ZSKs: 1 active, 0 stand-by, 0 revoked
olimpus.local.zone.signed
A partir de ahora tenemos un nuevo fichero olimpus.local.zone.signed. Tendremos que cambiar la
definición de la zona olimpus.local en /etc/named.conf para apuntar a este nuevo fichero.
²http://www.issihosts.com/haveged
113
4.- DNS
1
2
3
4
5
6
7
8
9
10
11
.
.
.
zone "olimpus.local" IN {
type master;
file "olimpus.local.zone.signed";
notify yes;
};
.
.
.
Y reiniciamos el servicio named.
En CentOS 6:
1
2
3
[root@localhost named]# service named restart
Stopping named:
Starting named:
[
[
OK
OK
]
]
En CentOS 7:
1
[root@CentOS7 named]# systemctl restart named
Para asegurarnos de que DNSSEC está funcionando realmente, podemos consultar el registro
DNSKEY de un determinado dominio del siguiente modo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# dig @192.168.1.20 DNSKEY olimpus.local. +multiline
;; Truncated, retrying in TCP mode.
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.20 DNSKEY olimpus.loca\
l. +multiline
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48176
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;olimpus.local.
;; ANSWER SECTION:
IN DNSKEY
114
4.- DNS
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
olimpus.local.
olimpus.local.
;;
;;
;;
;;
172800 IN DNSKEY 257 3 5 (
AwEAAeGilVrj9hxnmjRY9Yd9SqrBMwtiqKwfSda3wXhn
d3koFZQzVI129xRVxEhaXpQvcH4tZG724hE/NF/zq6jI
H2q6OtU0poslWLnRTE4Cte0EMP/Q4dSpSzLqjT4+cPrw
Fyfgvv7q+dHBHJ0TiWJjeSffFDFcACPfqY3KIFHNxgD3
bBwdO/GXgLDACBVoH7qVCNRBosuji24lmxwYu9qO0qX5
sTF1mhmKpOm4u02CEVhSnTeXlER4XermehqLhOLlodWl
R75EmAYc13SvMS9CoFc66eXEOpSLOl7F9eZQ/RHh/Wob
x74moN1uSwP32fTYhJZr3GXOTey+kfnpvhBIxXRa6nbB
2jfLsN0PMb4ZEYTAXOICtevRDYptuM3ytakPd3elNfrm
px9vxkFMye1/18diS/VWXD7RBc8wpbK0aQBMYV94dKhB
a3F6SV9tbXF7nTadG7k0I+US0kUSfppCjWr+TTwdfvGR
e/M7XPM1riBv/zUgSp7XzOKWdYT2mQjPR4xl21FcsSwy
tehCWoS+xGEd3y9AaW7RHAwPjeexMR30458/h1cqQcEs
QCQltl3uboqjFon3s4iHcHIqtpnBUC/TaonMA39pBTXt
VFPO+EV3YJBKFgGf1qZRW9aFAU+BHAnaRt2svPmBId7n
4O778a14Jgaco4b64Y6Ij3Mx8as5
) ; key id = 9187
172800 IN DNSKEY 256 3 5 (
AwEAAb386KgB7QrWAWBZ9+uSaHjHmpW+3TpcGkCfh9T4
Znl6BJVb/kPp6DmfeTRzjFUQSbAGRiI3yvzJ9+iEUhra
dME=
) ; key id = 28332
Query time: 2 msec
SERVER: 192.168.1.20#53(192.168.1.20)
WHEN: Sun Aug 3 20:11:10 2014
MSG SIZE rcvd: 647
Como podemos ver, la consulta fue respondida correctamente.
4.7.- Herramientas de diagnóstico
4.7.1.- rndc
Rndc es una gran herramienta para gestionar el servidor de nombres. Si recordamos, cuando comprobamos el estado del servicio named vimos un mensaje que decía: “rndc: neither /etc/rndc.conf
nor /etc/rndc.key was found”. Estos dos ficheros son necesarios para que el comando rndc funcione.
Rndc es un front-end para controlar el servidor DNS, por lo que habrá que modificar el fichero
/etc/named.conf para permitirle a rndc gestionar el servidor. Podemos hacerlo a mano, pero es
mucho más fácil hacerlo tecleando el comando rndc-confgen. Éste nos generará una salida con
un fichero rndc-key y las líneas correspondientes que habrá que añadir al fichero rndc.conf.
4.- DNS
115
Rndc-confgen necesitará generar claves, lo que puede llevarle unos minutos. Deberemos tener un
poco de paciencia.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost ~]# rndc-confgen
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "Yg1R5vvMWBu/+P9RxCKm8g==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
#
#
#
#
#
#
#
#
#
#
#
Use with the following in named.conf, adjusting the allow list as needed:
key "rndc-key" {
algorithm hmac-md5;
secret "Yg1R5vvMWBu/+P9RxCKm8g==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
End of named.conf
Así que creamos un fichero /etc/rnc.conf :
1
2
3
4
5
6
7
8
9
10
11
12
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "Yg1R5vvMWBu/+P9RxCKm8g==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
4.- DNS
Y modificamos /etc/named.conf añadiendo las líneas generadas por rndc-confgen.
Reiniciamos el servicio e intentamos ejecutar rndc.
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost named]# rndc status
version: 9.7.3-P3-RedHat-9.7.3-8.P3.el6
CPUs found: 1
worker threads: 1
number of zones: 22
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
Para ver las opciones disponibles podemos usar la opción -h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost named]# rndc -h
Usage: rndc [-b address] [-c config] [-s server] [-p port]
[-k key-file ] [-y key] [-V] command
command is one of the following:
reload
Reload configuration file and zones.
reload zone [class [view]]
Reload a single zone.
refresh zone [class [view]]
Schedule immediate maintenance for a zone.
retransfer zone [class [view]]
Retransfer a single zone without checking serial number.
freeze
Suspend updates to all dynamic zones.
freeze zone [class [view]]
Suspend updates to a dynamic zone.
thaw
Enable updates to all dynamic zones and reload them.
thaw zone [class [view]]
Enable updates to a frozen dynamic zone and reload it.
notify zone [class [view]]
Resend NOTIFY messages for the zone.
reconfig
Reload configuration file and new zones only.
sign zone [class [view]]
116
4.- DNS
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
117
Update zone keys, and sign as needed.
loadkeys zone [class [view]]
Update keys without signing immediately.
stats
Write server statistics to the statistics file.
querylog
Toggle query logging.
dumpdb [-all|-cache|-zones] [view ...]
Dump cache(s) to the dump file (named_dump.db).
secroots [view ...]
Write security roots to the secroots file.
stop
Save pending updates to master files and stop the server.
stop -p
Save pending updates to master files and stop the server
reporting process id.
halt
Stop the server without saving pending updates.
halt -p
Stop the server without saving pending updates reporting
process id.
trace
Increment debugging level by one.
trace level
Change the debugging level.
notrace
Set debugging level to 0.
flush
Flushes all of the server's caches.
flush [view] Flushes the server's cache for a view.
flushname name [view]
Flush the given name from the server's cache(s)
status
Display status of the server.
recursing
Dump the queries that are currently recursing (named.recursing)
validation newstate [view]
Enable / disable DNSSEC validation.
*restart
Restart the server.
addzone ["file"] zone [class [view]] { zone-options }
Add zone to given view. Requires new-zone-file option.
delzone ["file"] zone [class [view]]
Removes zone from given view. Requires new-zone-file option.
* == not yet implemented
Version: 9.7.3-P3-RedHat-9.7.3-8.P3.el6
4.7.2.- dig
Ya hemos visto esta herramienta anteriormente, podemos utilizarla para consultar a un servidor DNS
y especificar el tipo de registro que nos interesa. Por ejemplo, para conocer el servidor de correo del
dominio olimpus.local teclearíamos esto:
118
4.- DNS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost ~]# dig mx @192.168.1.21 olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> mx @192.168.1.21 olimpus.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3247
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4
;; QUESTION SECTION:
;olimpus.local.
IN
MX
;; ANSWER SECTION:
olimpus.local.
172800
IN
MX
10 prometheus.olimpus.local.
;; AUTHORITY SECTION:
olimpus.local.
olimpus.local.
172800
172800
IN
IN
NS
NS
prometheus.olimpus.local.
delphos.olimpus.local.
A
AAAA
A
AAAA
192.168.1.21
fe80::20c:29ff:feeb:4443
192.168.1.20
fe80::20c:29ff:fe78:4cb1
;; ADDITIONAL SECTION:
prometheus.olimpus.local. 172800 IN
prometheus.olimpus.local. 172800 IN
delphos.olimpus.local. 172800 IN
delphos.olimpus.local. 172800 IN
;;
;;
;;
;;
Query time: 12 msec
SERVER: 192.168.1.21#53(192.168.1.21)
WHEN: Sun Aug 3 04:37:03 2014
MSG SIZE rcvd: 182
Si no queremos ver toda esta información y únicamente queremos conocer la respuesta final
podemos decirle a dig que no muestre todos los detalles de la consulta (+noall) e incluya solo la
respuesta como tal (+answer).
1
2
[root@localhost ~]# dig +noall +answer mx @192.168.1.21 olimpus.local
olimpus.local.
172800 IN
MX
10 prometheus.olimpus.local.
También podemos solicitar una transferencia de zona completa.
4.- DNS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
119
[root@localhost ~]# dig axfr @192.168.1.20 olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> axfr @192.168.1.20 olimpus.local
; (1 server found)
;; global options: +cmd
olimpus.local.
172800 IN
SOA
olimpus.local. root.olimpus.loca\
l. 2014090103 60 7200 604800 172800
olimpus.local.
172800 IN
NS
delphos.olimpus.local.
olimpus.local.
172800 IN
NS
prometheus.olimpus.local.
olimpus.local.
172800 IN
MX
10 prometheus.olimpus.local.
aphrodite.olimpus.local. 172800 IN
A
192.168.1.22
delphos.olimpus.local. 172800 IN
AAAA
fe80::20c:29ff:fe78:4cb1
delphos.olimpus.local. 172800 IN
A
192.168.1.20
dns.olimpus.local.
172800 IN
CNAME
delphos.olimpus.local.
mail.olimpus.local.
172800 IN
CNAME
prometheus.olimpus.local.
prometheus.olimpus.local. 172800 IN
AAAA
fe80::20c:29ff:feeb:4443
prometheus.olimpus.local. 172800 IN
A
192.168.1.21
vulcan.olimpus.local.
172800 IN
AAAA
fe80::20c:29ff:fedf:d786
vulcan.olimpus.local.
172800 IN
A
192.168.1.23
olimpus.local.
172800 IN
SOA
olimpus.local. root.olimpus.loca\
l. 2014090103 60 7200 604800 172800
;; Query time: 6 msec
;; SERVER: 192.168.1.20#53(192.168.1.20)
;; WHEN: Sun Aug 3 05:46:46 2014
;; XFR size: 14 records (messages 1, bytes 373)
4.7.3.- host
Host es una herramienta bastante similar a dig, aunque su sintaxis es algo diferente.
1
2
3
4
5
6
7
8
[root@localhost ~]# host prometheus.olimpus.local 192.168.1.20
Using domain server:
Name: 192.168.1.20
Address: 192.168.1.20#53
Aliases:
prometheus.olimpus.local has address 192.168.1.21
prometheus.olimpus.local has IPv6 address fe80::20c:29ff:feeb:4443
4.8.- Resolución de problemas
Como sabe bien todo administrador de sistemas, a veces surgen incidencias y las cosas no funcionan
como se espera, o directamente dejan de funcionar. Estos son algunos de los escenarios más comunes
4.- DNS
120
que podemos ver.
4.8.1.- Una máquina no puede resolver nombres
Si solo un pequeño porcentaja de máquinas es incapaz de resolver nombres, esto probablemente será
un problema con el software cliente. Tendremos que comprobar que el dispositivo tiene configurada
correctamente la dirección IP del servidor DNS de la red. En el caso de un ordenador con Linux,
esto se hace en el fichero /etc/resolv.conf. Por ejemplo, si el servidor DNS es 192.168.1.20, el fichero
/etc/resolv.conf debería mostrar algo parecido a esto:
1
2
[root@localhost ~]# cat /etc/resolv.conf
nameserver 192.168.1.20
Si el fichero es correcto habrá que comprobar también la configuración de red y la conexión física a
la red.
4.8.2.- Varias máquinas no pueden resolver nombres
Si son muchas las máquinas que no pueden resolver nombres, podría haber un problema con el
propio servidor DNS. Lo primero que habrá que hacer es comprobar que el servicio está corriendo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# service named status
version: 9.7.3-P3-RedHat-9.7.3-8.P3.el6
CPUs found: 1
worker threads: 1
number of zones: 22
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
named (pid 8616) is running...
Si el servicio está funcionando correctamente, el siguiente paso será asegurarnos de que el servicio
es accesible desde la red. Como dijimos antes, las consultas DNS se dirigen al puerto UDP 53 del
servidor. De modo que podemos utilizar nmap desde un cliente para comprobar si el puerto está
abierto o no.
121
4.- DNS
1
2
3
4
5
6
7
8
[root@localhost ~]# nmap -sU -p 53 192.168.1.20
Starting Nmap 5.21 ( http://nmap.org ) at 2014-08-03 05:40 CEST
Nmap scan report for delphos.olimpus.local (192.168.1.20)
Host is up (0.00085s latency).
PORT
STATE
SERVICE
53/udp filtered domain
MAC Address: 00:0C:29:78:4C:B1 (VMware)
En este caso el puerto está filtrado. Esta es la razón por la que los clientes no pueden resolver los
nombres, no pueden contactar con el servidor de nombres.
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# nmap -sU -p 53 192.168.1.20
Starting Nmap 5.21 ( http://nmap.org ) at 2014-08-03 06:23 CEST
Nmap scan report for delphos.olimpus.local (192.168.1.20)
Host is up (0.00033s latency).
PORT
STATE SERVICE
53/udp open domain
MAC Address: 00:0C:29:78:4C:B1 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
Ahora el puerto está abierto. Deberíamos realizar una consulta desde el cliente con dig o host.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# dig @192.168.1.20 delphos.olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.20 delphos.olimpus.loc\
al
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51991
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; QUESTION SECTION:
;delphos.olimpus.local.
;; ANSWER SECTION:
delphos.olimpus.local.
;; AUTHORITY SECTION:
172800
IN
A
IN
A
192.168.1.20
122
4.- DNS
18
19
20
21
22
23
24
25
26
27
28
29
olimpus.local.
olimpus.local.
172800
172800
IN
IN
;; ADDITIONAL SECTION:
delphos.olimpus.local. 172800 IN
prometheus.olimpus.local. 172800 IN
prometheus.olimpus.local. 172800 IN
;;
;;
;;
;;
NS
NS
delphos.olimpus.local.
prometheus.olimpus.local.
AAAA
A
AAAA
fe80::20c:29ff:fe78:4cb1
192.168.1.21
fe80::20c:29ff:feeb:4443
Query time: 2 msec
SERVER: 192.168.1.20#53(192.168.1.20)
WHEN: Sun Aug 3 06:26:04 2014
MSG SIZE rcvd: 166
En este caso el servidor DNS parece estar bien. El cliente hizo una consulta y recibió la correspondiente respuesta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# dig @192.168.1.20 neptune.olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> @192.168.1.20 neptune.olimpus.loc\
al
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 60601
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;neptune.olimpus.local.
IN
;; AUTHORITY SECTION:
olimpus.local.
172800 IN
l. 2014090103 60 7200 604800 172800
;;
;;
;;
;;
A
SOA
olimpus.local. root.olimpus.loca\
Query time: 2 msec
SERVER: 192.168.1.20#53(192.168.1.20)
WHEN: Sun Aug 3 06:26:21 2014
MSG SIZE rcvd: 80
Por el contrario, en este otro caso el servidor respondió a la consulta, pero no pudo localizar el
registro neptune.olimpus.local. Este registro podría no existir, o tal vez el servidor tenga un archivo
de zona desfasado.
4.- DNS
123
4.8.3.- El servidor maestro y el esclavo no tienen la misma
información
Si el servidor esclavo tiene información desactualizada necesitamos averiguar si existe un problema
con las transferencias de zona. Como hemos visto, podemos usar dig para pedir una transferencia
de zona desde el servidor esclavo.
1
2
3
[root@localhost ~]# dig axfr @192.168.1.20 olimpus.local
;; Connection to 192.168.1.20#53(192.168.1.20) for olimpus.local failed: host un\
reachable.
En este caso no conseguimos hacer la transferencia de zona, probablemente el puerto TCP 53 del
servidor maestro esté cerrado o filtrado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost ~]# dig axfr @192.168.1.20 olimpus.local
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6 <<>> axfr @192.168.1.20 olimpus.local
; (1 server found)
;; global options: +cmd
olimpus.local.
172800 IN
SOA
olimpus.local. root.olimpus.loca\
l. 2014090103 60 7200 604800 172800
olimpus.local.
172800 IN
NS
delphos.olimpus.local.
olimpus.local.
172800 IN
NS
prometheus.olimpus.local.
olimpus.local.
172800 IN
MX
10 prometheus.olimpus.local.
aphrodite.olimpus.local. 172800 IN
A
192.168.1.22
delphos.olimpus.local. 172800 IN
AAAA
fe80::20c:29ff:fe78:4cb1
delphos.olimpus.local. 172800 IN
A
192.168.1.20
dns.olimpus.local.
172800 IN
CNAME
delphos.olimpus.local.
mail.olimpus.local.
172800 IN
CNAME
prometheus.olimpus.local.
prometheus.olimpus.local. 172800 IN
AAAA
fe80::20c:29ff:feeb:4443
prometheus.olimpus.local. 172800 IN
A
192.168.1.21
vulcan.olimpus.local.
172800 IN
AAAA
fe80::20c:29ff:fedf:d786
vulcan.olimpus.local.
172800 IN
A
192.168.1.23
olimpus.local.
172800 IN
SOA
olimpus.local. root.olimpus.loca\
l. 2014090103 60 7200 604800 172800
;; Query time: 6 msec
;; SERVER: 192.168.1.20#53(192.168.1.20)
;; WHEN: Sun Aug 3 05:46:46 2014
;; XFR size: 14 records (messages 1, bytes 373)
Ahora la transferencia de zona se hizo correctamente. A continuación podemos usar rndc desde el
servidor esclavo para forzar la actualización del fichero de zona.
4.- DNS
1
2
124
[root@localhost ~]# rndc retransfer olimpus.local
[root@localhost ~]#
4.9.- Ficheros de log
Posiblemente la herramienta más importante a la hora de solucionar problemas sean los ficheros de
log. En una instalación por defecto de bind, el fichero de log será /var/named/data/named.run. Esto
se define en el fichero /etc/named.conf en las siguientes líneas:
1
2
3
4
5
6
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
Viendo este fichero podemos monitorizar el estado del servidor. Por ejemplo, esta podría ser una
parte del fichero de log.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.
.
.
received control channel command 'stop'
shutting down: flushing changes
stopping command channel on 127.0.0.1#953
no longer listening on ::#53
no longer listening on 127.0.0.1#53
no longer listening on 192.168.1.20#53
exiting
zone 0.in-addr.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 1.168.192.in-addr.arpa/IN: loaded serial 2014090102
zone 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\
: loaded serial 0
zone 0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa/IN: loaded serial 2014090102
zone olimpus.local/IN: loaded serial 2014090103
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
.
.
.
4.- DNS
125
En este caso podemos ver que el servidor de nombres se detuvo y arrancó de nuevo para cargar de
nuevo los ficheros de zona.
Descargar