Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Texto Linux Modulo Ii
Texto Linux Modulo Ii
MODULO 2
Módulo 2
Tema 2.1: Shells, secuencias de comandos (scripts) y gestión de datos
2.1.1. Personalizar y usar el entorno de la Shell
Una de las ventajas y un punto fuerte de los sistema Linux y Unix frente al resto de los
sistemas operativos es su poderoso línea de comandos que vimos en el anterior modulo,
comúnmente denominado Shell. Este Shell es un programa que sirve de interfaz al
usuario para que pueda dar instrucciones al kernel del sistema operativo. Durante el
recorrido de este módulo, se ha estado interactuando constantemente mediante el
interpretador de comandos ejecutando las diversas instrucciones para realizar múltiples
tareas. El conocimiento de una shell va mucho más alla de simplemente ejecutar los
programas por su nombre.
Una de las tareas esenciales de TI es automatizar los procesos. Como administradores de
servidores, la habilidad de poder automatizar las tareas del siga se traduce en tiempo
ahorrado para enfocarse donde lo necesitan. Automatizar las tareas tanto en Linux como
en unix. Va mucho más allá de simplemente ejecutar un comando en cron, es una
programación adecuada de la tarea que pueda manejar distintas situaciones sin error.
A lo que se trata de personalizar Linux permite personalizar el entorno del usuario y del
sistema en global, los archivos de configuración del entorno pueden clasificarse de la
siguiente manera:
y guardar luego hacer una conexión con putty al usuario y observar lo que sale.
Cuando definamos una variable en un shell script, no será necesario exportarla, si no que
la definiremos y posteriormente el programa irá haciendo uso de ella conforme se vaya
necesitando. Una variable debe de empezar por una letra o un guión bajo „_„ pero no por
un número. A este tipo de variables simples se les conoce como escalares (scalar)
Podemos ver el valor de una variable concreta desde la línea de comandos así:
$ echo "$HOSTNAME"
Nota: Fijémonos en la importancia de preceder el nombre de la variable con el signo „$„,
algo que no se debe de hacer cuando se declara o define.
Si lo que queremos es ver todas las variables definidas para un entorno utilizaremos el
comando env. Este comando dispone de un par de opciones útiles pero para listar todas
las variables bastará con invocarlo sin parámetro alguno:
Podemos definir una variable para un único programa con env de la siguiente manera:
sistema
TERM: Indica la terminal en uso.
DISPLAY: Otra variable ya vista, identifica la pantalla utilizada por X que suele ser :0.0.
Este valor puede ir precedido del nombre de un host remoto o cambiar a :1.0 por ejemplo
si tenemos dos sesiones de X abiertas (:0.0 para la primera sesión y :1.0 para la
segunda).
EDITOR: El editor de texto iniciado por defecto será aquel que conste en el valor de esta
variable.
Igual que definimos las variables podemos definir los alias de comandos, pero… ¿Que
son o para que sirve? – La principal ventaja de utilizar alias de comandos es la de crear
una versión acortada de un comando, para que cada vez que queramos que un comando
actúe de determinada manera no tengamos que escribirlo de forma completa. Vamos a
ver esto con un ejemplo sencillo:
Supongamos que cuando ejecutamos ls -l, el listado que nos devuelve el comando es un
listado de directorios y archivos sin color, es decir el mismo color utilizado para las letras
de la consola. Cabe la posibilidad de listar el contenido de un directorio de forma que los
archivos sean mostrado en diferentes colores, para que a simple vista reconozcamos de
que tipo de archivo se trata, por ejemplo verde para ejecutables, azul para directorios,
celeste para enlaces simbólicos, rojo con fondo negro para enlaces rotos, amarillo con
fondo negro para archivos de caracter, etc… ¿y como conseguimos esto? – Para hacer
que cada vez que ejecutemos el comando „ls‟ a secas despleguemos un listado en
formato de una sola columna (con los permisos, propietario, fecha, etc..) en color y
ordenado por fecha descendente, haremos lo siguiente:
$ alias ls='ls -lt --color'
Así de sencillo es crear un alias.
Nota: Para utilizar este alias de forma persistente podremos definirlo en alguno de los
archivos de inicio de consola. Dependiendo si queremos que sea aplicado de forma global
o local elegiremos uno u otros archivos.
Los Arrays
Un array o vector es una variable que tiene asignado un conjunto de valores a los cuales
podemos acceder mediante su número de posición, el cual nos sirve como índice de
valores. Podemos definir un array de la siguientes maneras:
Múltiples valores de forma simultánea:
$ array=(ford renault "mercedes benz" dacia vw bmw)
De uno en uno:
$ array[0]=ford
$ array[1]=renault
$ array[2]="mercedes benz"
...
Nota: Los indices no necesariamente tienen que ser numéricos, por ejemplo sería válido
también definir los valores del array tal que así: $ array[primero]=ford, $
array[segundo]=renault, etc…
Igualmente podemos añadir un nuevo valor al array:
$ array[6]=chevrolet
Para consultar todos o un valor específico del array:
Consultar un valor concreto:
$ echo ${array[1]}
renault
Mostrar todos los valores:
$ echo ${array[*]}
ford renault mercedes benz dacia vw bmw chevrolet
$ echo ${array[@]}
ford renault mercedes benz dacia vw bmw Chevrolet
2.1.2. Personalizar o escribir scripts simples
Cuando linus torvalds creo Linux, no tenía una interfaz para interactuar con el kernel
creado. La consola que hubiese ocupado en ese momento hubiese sido sh, también
llamado Bourne Shel para honrar a su creador Stephen Bourne. Este interpretador de
comandos es la interfaz por defecto en Unix, pero, al igual que el sistema operativo,
estaba atado a licencias propietarias, que era justamente lo que Linus Torvalds quería
prevenir.
Fue por aquella época cuando un proyecto rebelde llamado GNU nació y dio luz uno de
los primeros frutos para su proyecto de crear un sistema Unix que no fuese Unix. Este
fruto fue un interpretador de comandos que emulaba las funcionalidades del original
Bourne Shell y añadía otras capacidades más. Para distinguirse se llamó bash, cuyas
siglas en ingres representan Bourne Again Shell
Como se ha mencionado anteriormente, una Shell es la interfaz que le permite al usuario
enviar comandos al sistema operativo, y estos comandos pueden ser estructurados dentro
de un fichero en forma de script para ser ejecutados automáticamente. Tareas comunes
para automatizar de esta manera incluyen la creación de varios usuarios a la vez o
realizar copias de seguridad regularmente.
Al ejecutar este primer script mediante la línea de comandos, se invoca otra instancia de
bash para ejecutar los comandos que había en este sencillo programa. En este primer
script, se alimenta a echo directamente con la cadena de caracteres. En programas
complejos, para mantener estructura y legibilidad, se utilizan variables que contienen los
valores que hay que tratar. El siguiente ejemplo muestra como se declara una variable:
Nuevamente, desde la primera línea se declara el interpretador de comandos que hay que
utilizar. En la segunda línea, se declara una variable llamada var, que será utilizada en la
cuarta línea del programa. Es en la quinta y sexta línea donde se hace referencia a las
variables especiales anteriormente demostradas. La quinta línea le informara de todos los
argumentos que le pase al script en el momento de ejecutarlo, mientras que la sexta línea
le informara del numero identificador del proceso del programa. Este es distinto al de la
línea de comandos de donde se ejecuta este script, puesto que, como se mencionó antes,
se invoca una nueva instancia de bash para ejecutar las instrucciones.
Volvamos a ejecutar pero con los parámetros uno dos tres.
Trabajar con variables result ser muy comodo una vez que haya dominado el concepto.
Una de las particularidades de las variables es que estas en realidad se expanden al valor
contenido para luego ser interpretadas por bash. De esta manera, puede contener dentro
de ellas un comando que luego pueda ejecutar.
Si guarda el código de este ultimo ejemplo en un fichero y lo ejecuta, listara todos los
ficheros de su directiorio de inicio. Esto es para demostrar que, en realidad, las variables
son reemplazados por el contenido y luego son interpretadas por bash como si fuesen
comandos. Pero, ¿de donde ha salido la variable HOME?
En todo sistema operativo, cuando inicia una sesión, existen uan serie de variables de
entorno que se asocian al usuario. La variable HOME es una de ellas y contiene el
directorio de inicio del usuario actual. Para ver todas sus variables de entorno, ejecute
env en la línea de comandos. Muchas de estas variables de entorno son simplementes
rutas a lugares predefinidos que se utilizan por programas. Por ejemplo, la instalación de
Este script saluda de una manera personalizada y sabe todo acerca del usuario que lo
ejecuta. Independientemente de quien lo ejecute, el programa se adapta usando la
información otorgada por las variables de entorno. Fijase como en la línea 5, se han
utilizado corchetes con la variable SEPARADOR. La razón es que, si se hibiese escrito
sin ellas, se hubiese interpretado de manera equivocada.
Sin corchetes queda como $HOME$SEPARADORDesktop y mientras que la intención es
concatenar en contenido de la variable SEPARADOR con la cadena de caracteres
Desktop, bash interpreta estos dos como una sola variable llamada
SEPARADORDesktop. Utilice siempre los corchetes para proteger sus variables y evitar
errores en sus programas. Problemas como estos son los que hacen perder el tiempo
buscando esa <<aguja en el pajar>>.
Otra característica interesante de las variables es poder almacenar los resultados de la
ejecución de algún otro programa. Existen dos maneras de evaluar comandos en bash,
estas son:
VARUNO=$(comando a evaluar)
VARDOS=’comando a evaluar’
Condicionales en Bash
If condición
then
comando1
comando2
…
else
comando3
fi
If condicion1
then
comando1
comando2
comando3
elif condicion2
then
comando1
comando2
else
then
comando1
comando2
fi
Las condiciones deben ser valores booleanos o expresiones que se evalúen como
verdadero o falso. Puede construir estas expresiones utilizando el comando test o
escribiendo la expresión dentro de un par de corchetes ([ ]). Las expresiones
utilizaran uno o dos operandos que serán evaluados por un operador. Un ejemplo
es el siguiente:
test –f documento
[ -f documento ]
Las dos expresiones son iguales, intercambiando el uso del comando test por el
par de corchetes. Esta expresión, al ocupar el operador –f, se evalúa a TRUE si
encuentra que documento es un fichero. Otros operadores que puede utilizar se
presentan en la siguiente tabla:
case $var in
opcion1)
comando1
comando2
……………
;;
opcion2)
comando1
…………
;;
*)
comando1
…………
;;
esac
En caso de que la variable var contenga como valor una de las opciones, se
ejecuta el código dentro de un bloque. Si ninguna opción es incluida dentro de la
variable, entonces ejecuta el código dentro del bloque de asterisco, dejando así
una acción por defecto. Considere el siguiente ejemplo para comprender mejor su
utilidad:
Bucles en Bash
Al ejecutar este ultimo ejemplo, se listan los contenidos del directorio de inicio del
usuario qie ejecuta el fichero. Se utiliza la variable de entorno HOME que existe
de manera predeterminada en la sesión del usuario. Si no tiene argumentos que
dar, utilice el bucle while, que se ocupa de la siguiente manera:
while expresión
do
comando1
comando2
…….
done
El operador while ejecutara los comandos específicos dentro del bloque mientras
la expresión se evalue como verdadera. En el momento en que se evalue como
falsa, el bucle se interrumpe y se prosigue a la siguiente instrucción. Para obtener
el efecto opuesto, ocupe until:
until expresión
do
comando1
comando2
……
done
Funciones en Bash
function Mifuncion()
{
Comando1
Comando2
…..
}
#utilizando la función
Mifuncion
Las instrucciones que contenga la función deben ser escritas dentro de los
corchetes. Para utilizar la función, simplemente escriba el nombre en el cuerpo de
su código y ejecutara este mismo. Las funciones tienen acceso a todas las
Al ejecutar este ultimo script, vera como MiFuncion puede acceder al contenido
de la variable var2 declarada fuera de la función. De la misma manera, la función
MiFuncion2 cambia el contenido de la variable dedicada var2. Debe estar atento
en estos casos y ser precavido al utilizar las funciones de esta manera.
Las funciones son muy útiles para contener procedimientos que se repiten dentro
del programa. Además de esto, al crear funciones que utiliza para su script,
puede reutilizar estos en otros sin tener que reescribir el código. Acostúmbrese a
crear funciones para poder hacer su código legible y ahorrarse tiempo al
desarrollar mas programas para su administración Linux.
Una base de datos permite recuperar datos que coincidan con un criterio
específico. Por ejemplo, podemos buscas aquellas extensiones de carnet que
terminen en CB. También podemos insertar, borrar y actualizar la información de
una tabla. Las columnas de una base de datos contienen tipos de datos
específicos, por lo que no tiene mucho sentido intercambiarlos. Las restricciones
relacionadas con lo que puede aparecer en una columna se conocen como
dominio o tipo de dato.
Existen otros tipos de datos pero esta lista solo ofrece algunos de los tipos con los
que nos encontraremos. Hay implementaciones que poseen tipos de datos
exclusivos. Cada tipo de dato posee sus propias características, por ejemplo, los
tipos de datos numéricos se pueden manipular mediante operadores
matemáticos.
Y nos tiene que aparecer el promt del manejador de BD SQLite. Para ver las
bases de datos que hay en SQLite ejecutamos el siguiente comando:
Para crear primeramente una base de datos ejecutamos los siguientes comandos:
Instalar SQLite
Insertar filas
Recuperar datos
El criterio campos se incluye como una lista de columnas separadas por comas ( ,
). Las condiciones de WHERE ofrecen un modo más interesante de recuperar
datos. Podemos utilizar estas condiciones para recuperar datos específicos de
varias maneras:
Una base de datos contiene varias tablas, lo que permite crear tablas para
funciones diferentes. Por ejemplo podríamos tener una base de datos con
características de materias y alumnos, las cuales ambas tablas deben tener al
menos 1 campo similar características para poder emparejar y combinar. Por
ejemplo tengamos la tabla materia donde este el carnet del estudiante y las
materias que tomo con su respectivo promedio, más o menos así:
ci Nombre_materia Promedio
6406966 LINUX 100
6406966 TELEFONIA IP 100
1234567 LINUX 50
6406966 REDES 70
1234567 CABLEADO 80
9876543 LINUX 95
9516234 CABLEADO 60
7418525 TELEFONIA IP 20
9876543 TELEFONIA IP 20
7418525 LINUX 20
Para realizar este punto, tenemos que crear la tabla materia de la siguiente
manera:
Una vez introducido realizaremos una prueba, quisiéramos saber las materias que
están tomando cada alumno seria la siguiente consulta:
También podemos agrupar con la sentencia GROUP BY, por ejemplo quisiéramos
saber cuántas materias tomo un alumno y el promedio de sus notas de cada
materia seria así:
Borrar datos
En ocasiones necesitaremos borrar datos. La tabla anterior indica que el árbol del
patio está enfermo y, si optamos por cortarlo, tendremos que eliminarlo de la
base de datos. Para ello utilizaremos el comando DELETE que recibe la siguiente
información:
________________________________________
Tema 2.2: Tareas de administración
tarea. Este fichero contiene toda la información necesaria para empezar una
sesión en Linux. Este fichero tiene permisos de lectura para todos. Si abre este
fichero, se puede encontrar con algo similar a lo siguiente:
Cada campo está separado por dos puntos. La información que detallan los
campos se interpreta de la siguiente manera:
root El nombre del usuario. Esta cuenta debe ser única en la maquina
local.
x Campo de contraseña. En el pasado aquí es donde se guardaba la
contraseña cifrada, pero ahora se prefiere el uso del fichero
/etc/shadow, la x marca que existe una contraseña.
0 Campo correspondiente al identificador de usuario (o comúnmente
referido como UID de User Identification). Este identificador es único
en la computadora y se ocupa de mantener un rastro de que archivos
pertenecen en la cuenta.
0 Este valor corresponde al identificador del grupo (comúnmente
referido como GID, siglas de Group Identification). Este identificador
es único en la computadora y se ocupa de mantener un rastro de que
archivo pertenecen a ese grupo particular.
root Este campo es netamente descriptivo.
/root Contiene el directorio de inicio del usuario. Cada vez que inicie una
sesión en la computadora, comienza a trabajar dentro de este
directorio.
/bin/bash Este campo contiene la consola por defecto que ocupa el usuario para
ejecutar instrucciones en la computadora.
más altos son reservados también para cuentas especiales como nobody,
que tiene un UID de 65534.
Grupos de Linux
Además de tener usuarios, Linux sabe cómo administrar grupos. Por qué las
redes informáticas están hechas para colaborar en equipo, para lograr tareas
en común, resulta bastante cómodo agrupar a varios usuarios bajo un solo
grupo para administrar mejor controles de acceso a recursos de la red de
trabajo. Los grupos de Linux son guardados en el fichero /etc/group.
Seguidamente tenemos un ejemplo resumido del archivo:
Al igual que los ficheros ocupados para los usuarios y las contraseñas, cada
línea contiene datos sobre un grupo específico. Considere la última línea de
este fichero. A continuación daremos una explicación de que significa cada
campo:
Gestión de usuarios
Nótese que el grupo principal del usuario relaciona con el GID que acompaña
al nombre del grupo. Además de esto, el argumento –m crea
automáticamente el directorio personal del usuario llamado de la misma
manera que la cuenta en /home. Este directorio seria creado copiando todo el
contenido de /etc/skel, que es el directorio que por standard contiene ficheros
de configuración tanto como directorios estándar para usuarios del sistema.
También se puede verificar que se haya añadido el nuevo usuario a los grupos
especificados:
video:x:39:usuario
dialout:x:18:usuario
Una vez creada una cuenta, se puede modificar las características de las
cuentas de usuario simplemente modificando los ficheros mencionados
previmanete. De nuevo, esto puede llegar a ser tedioso si se decide hacerlo
con un editor de texto. Esto se puede lograr de manera automatizada
ocupando el comando usermod. Si se quiere por ejemplo bloquear una
cuenta para que no se pueda validar al sistema, se puede ejecutar de la
siguiente manera:
Gestión de grupos
Añadiendo un grupo
Solo el ususario root puede asignar una contraseña al grupo. Al igual que las
contraseñas de usuario, esta esta encriptada y se guarda en el campo de
contraseña en /etc/group. La contrasela se encuentra dentro del fichero
/etc/gshadow. Para crear la contraseña, como root, ejecute el comando
gpasswd:
Borrando un grupo
Una vez que un grupo ya deje de tener validez, se puede borrar este de la
misma manera que las cuentas de usuario. Para esta tarea, se cuenta con el
comando groupdel. Es importante destacar que solo la cuenta de usuario
root puede borrar una cuenta:
El papel de cron
- Las tareas cron del sistema: se ejecutan como root y llevan a cabo tareas
de mantenimiento en todo el sistema. La mayoría de distribuciones
incluyen tareas cron que eliminan los ficheros antiguos de /tmp.
- Las tareas cron de los usuarios: podrían ejecutar ciertos programas del
usuario de manera regular. Podemos crear una tarea cron de usuario como
root si necesitamos realizar alguna en un momento no contemplado por las
tareas cron del sistema.
Unos de los puntos críticos de las tareas cron es que se ejecutan sin
supervisión, por lo que no deberíamos llamar a ninguna tarea de ningún
programa que requiera la entrada del usuario.
El fichero /etc/crontab controla las tareas cron del sistema, suele comenzar
con varias líneas que definen variables de entorno como $PATH y $MAILTO.
Sus líneas tienen el siguiente aspecto:
02 4 * * * root /etc/curso_linux.sh
La línea comienza con cinco campos que especifican el tiempo: minutos (0-
59), horas (0-23), día del mes (1-31), mes (1.12) y día de la semana (0-7,
tanto 0 como 7 corresponden con el domingo). Tanto para el mes como para
el día de la semana, podemos utilizar las tres primeras letras del nombre en
lugar de un número.
Tras los primeros cinco campos, las entradas siguen con el nombre de la
cuenta a utilizar cuando se ejecute el programa (root en este ejemplo) y el
comando a ejecutar; en este ejemplo, /etc/curso_linux.sh. El ejemplo anterior
ejecuta todos los scripts de /etc/curso_linux.sh a las 4:02 AM de cada día. La
mayoría de distribuciones incluyen tareas cron del sistema que se ejecutan
cada mes, día, semana y hora; tienen sus scripts en el directorio
/etc/cron.intervalo, donde intervalo es una palabra asociada con la frecuencia
de ejecución. Otras distribuciones utilizan los directorios /etc/cron.d/intervalo.
Para crear una tarea cron del sistema, crearemos un script para que realice la
tarea deseada y lo copiaremos en el directorio /etc/cron.intervalo apropiado.
Cuando se vuelva a leer el contenido del directorio, cron ejecutara el script.
Debemos comprobar que el script funciona correctamente antes de añadirlo
como una tarea cron, especialmente si dicha tarea se ejecuta cuando no
estemos cerca.
Para trabajar directamente con una tarea cron utilizaremos -l, que muestra la
tarea cron actual, -r elimina la elimina y -e que abre un editor para poder
modificarla (por defecto suele ser vi). También podemos crear un fichero de
configuración de la tarea cron y pasarle el nombre del fichero a crontab, por
ejemplo, crontab -u user mi_tarea_cron. El formato del fichero cron es
similar al formato del fichero crontab. En una tarea cron del usuario no
tenemos por qué especificar el nombre del usuario que la ejecuta, al contrario
de lo que se hace con las tareas cron del sistema. La información se deduce
del propietario de la tarea.
Uso de anacron
cron es una buena herramienta para realizar tareas como rotar los ficheros de
registro en sistemas que están activos la mayor parte del tiempo, pero es
menos útil en sistemas que se apagan con frecuencia como ordenadores
portátiles o PC, ya que en este tipo de equipos no se suelen ejecutar las
tareas cron nocturnas, algo que puede saturar los ficheros de registro, crear
confusión en /tmp y otros problemas.
tipos de líneas:
Para que esto funcione hay que llamar a anacron, lo que se suele hacer de
una de estas dos maneras:
Uso de at
- Una hora del día: podemos especificar la hora del día como HH:MM
seguida opcionalmente por AM o PM si utilizamos un formato de 12 horas.
Si la hora especificada ya ha pasado, la operación se ejecutará al día
siguiente.
- noon (mediodía), midnight (medianoche) o teatime (la hora de té):
estas tres palabras se explican por si solas, la hora del té son las 4 PM.
- Un día específico: podremos planificar una tarea at con más de 24 horas
de antelación especificando el día tras la hora del día. Para ello se emplea
el siguiente formato MMDDAA, MM/DD/AA o DD.MM.AA. Otra opción sería
especificar la fecha como nombre del mes día año.
y batch que funciona de un modo similar a at pero que ejecuta las tareas
cuando el nivel de carga del sistema baja de 0,8. Estas utilidades son muy
sencillas, a atq le basta con que le escribamos su nombre. Para utilizar atrm
sólo tendremos que pasarle el número de tarea atque devuelve atq.
Esta seguridad más restrictiva hace que el programa rara vez se instale con
permisos de ejecución restrictivos, aunque podemos utilizar los permisos del
fichero del programa para denegar a los usuarios normales la posibilidad de
ejecutar at si queremos una capa adicional de seguridad.
[idioma[_territorio][.conjuntodecodigos][@modificador]]
Cada parte de la cadena tiene su significado. Por ejemplo, idioma puede ser:
en (ingles), fr (frances), ja (japones) o cualquier otro código de idioma de dos
o tres letras. El territorio puede ser US (Estados Unidos), FR (Francia), JP
(Japón) o cualquier otro código especifico de región, generalmente naciones.
El conjunto de códigos puede ser ASCII, UTF-8 u otra codificación. ASCII es el
método de configuración más antiguo, emplea una codificación de 7 bits que
puede utilizarse para el inglés, incluyendo símbolos y marcas de puntuación.
ASCII no puede manejar los caracteres de la mayoría de los demás idiomas.
ISO-8859 es uno de los primero intentos para ampliar ASCII, usa un octavo
bit para ampliar a 128 caracteres y hacer sitio a caracteres que necesitan un
pequeño número de alfabetos no romanos. ISO-8859 se divide en muchos
subestándares, cada uno de los cuales se ocupa de un idioma o un pequeño
grupo de idiomas (ISO -8859-1 para idiomas de Europa del este y ISO-8859-5
incluye al Cirílico).
La opción -a del comando locale identifica todos los ajustes locales que están
disponibles:
En este caso, hay muy pocos ajustes locales instalados, aunque puede haber
ordenadores que tengan cientos.
Si vamos a cambiar nuestro ajuste local, primero tendremos que verificar que
hay disponible uno apropiado para nuestro caso. Utilizaremos locale -a; en
caso de que no aparezcan los códigos apropiados, puede que necesitemos
instalar paquetes adicionales. Los nombres de estos paquetes no están
estandarizados y lo mejor para localizarlos es utilizar un gestor de paquetes
GUI como yumex o synaptic y buscar así los nombres o descripciones de
paquetes que incluyan locale o language. En sistemas como Ubuntu, sólo se
proporcionan unos cuantos ajustes locales, pero se pueden instalar más desde
Como resultado, todas las variables locales cambian para la sesión, así como
la salida de los programas que tienen en cuenta estos ajustes. Sólo afecta a la
consola actual y a los programas que se inician desde ésta, por lo que no
habrá cambios en los programas en ejecución o los que iniciemos desde otra
consola.
El parámetro LANG=C hace que los programas que ven esta variable de
entorno muestren una salida que no ha pasado por el filtro de las traducciones
de los ajustes locales. Es útil cuando el ajuste local corrompe la salida de un
programa. Si definimos LANG=C, podemos evitar algunos tipos de problemas,
en particular las canalizaciones y scripts que pasan los datos de un programa
a otro en formato binario.
Los SO como Windows y las versiones de MacOS anteriores a X configuran sus relojes
con la hora local. Es un sistema cómodo y sencillo pero no es el más adecuado de cara a
la red ya que los protocolos de red que se basan en la hora, aunque sea parcialmente,
pueden llegar a confundirse cuando trabajen en varias zonas horarias distintas. Linux y
otros SO de tipo Unix configuran su reloj con UTC (Tiempo Universal Combinado) que, a
todos los efectos, es igual a GMT (Greenwich Mean Time), que no se ajusta al horario de
verano. Esto implica que los sistemas Linux de diferentes zonas horarias tengan horas
idénticas, suponiendo que todos estuvieran debidamente configurados. Sin embargo, para
comunicarse con los usuarios, estos sistemas necesitan conocer sus zonas horarias. Para
mostrar la información temporal de por ejemplo un archivo, Linux leerá la marca temporal
en UTC y después añadirá o substraerá la cantidad de tiempo apropiado para que la
marca temporal se muestre con nuestra hora local. Todo esto significa que tenemos que
ser capaces de configurar la zona horaria del ordenador,algo que se hace normalmente
cuando se instala el sistema; el instalador nos preguntará la zona horaria y definirá todo
correctamente.
El uso interno de UTC en Linux puede complicar la configuración del reloj del hardware,
ya que, si tenemos un arranque múltiple con Linux y un SO que espera que el reloj del
hardware tenga la hora local, tendremos que configurar el reloj del hardware y Linux para
que se tenga en cuenta este echo. Esta configuración no suele dar problemas, pero
puede que tengamos que modificar el reloj la primera vez que iniciemos en primavera u
otoño, debido al ajuste del horario de verano. Incluso, dependiendo de la configuración,
puede que el reloj del hardware se reinicie en algunos SO. Tanto el reloj del hardware
como el del software tienden a desajustarse levemente, por lo que es fácil que el reloj
acabe con una diferencia de varios minutos con respecto al tiempo correcto un mes o dos
después de ser ajustado. La solución a este problema es utilizar protocolos de red para
configurar la hora. El más popular es NTP (Protocolo de hora en red).
Configurar la hora manualmente
La principal herramienta para configurar el reloj del software es date que posee la
siguiente sintaxis:
Por defecto, date asume que la hora se especifica en tiempo local. Para configurar el reloj
en UTC incluiremos -u, –utc o .universal. Una vez configurado el reloj del software, Linux
proporciona herramientas para sincronizar esta hora con el reloj del hardware. En
concreto, la utilidad hwclock permite configurar el reloj del hardware desde el reloj del
software o viceversa, así como algunas otras cosas, su sintaxis es:
hwclock [function] [options...]
Se pasan funciones y opciones para objetivos determinados:
- Mostrar el reloj del hardware: con las opciones -r o –-show se mostrará la hora
local, incluso cuando el reloj del hardware se haya configurado con UTC.
- Configurar manualmente el reloj del hardware: –-set y -–date=nueva_fecha
permiten configurar el reloj del hardware con la hora especificada. nueva_fecha
está en el formato de fecha que acepta el programa date.
- Configurar el reloj del hardware en función del reloj del software: para
sincronizar el reloj del hardware con el mismo valor con el que hemos configurado
el valor del software, utilizaremos la opción –-systohc.
- Configurar el reloj del software en función al reloj del hardware: para definir el
reloj del software con el valor del reloj del hardware, utilizaremos la opción –-
hctosys. Se utiliza con frecuencia en los scripts de inicio SysV para definir el reloj
del sistema cuando arranque por primera vez el ordenador.
- Especificar UTC o la hora local: podemos decirle a Linux que guarde el valor del
reloj del hardware como UTC con la opción –-utc o como hora local con la opción –
localtime. El valor por defecto es que se haya utilizado la última vez que se
configuró el reloj del hardware.
No es habitual utilizar hwclock directamente, pero puede ser necesario tras el
desplazamiento provocado por el horario de verano si el reloj del hardware sigue la hora
local. Hay distribuciones que incluyen scripts que controlan esta tarea automáticamente.
Es aconsejable usarlo de vez en cuando para que el reloj del hardware no se aleje
demasiado de la hora exacta; hay distribuciones que lo hacen automáticamente durante el
proceso de apagado del sistema.
El reloj del hardware se puede configurar a través de la BIOS. Para ello tendremos que
reiniciar el sistema y pulsar la tecla adecuada durante el proceso de arranque para
acceder a la configuración de la BIOS. Allí buscaremos la opción horaria y la
configuraremos adecuadamente. Si Linux utiliza UTC, tendremos que configurar el reloj
con UTC en vez de la hora local.
Uso de NTP
En un ordenador aislado no suele hacer falta configurar el reloj con mucha precisión, pues
no supone un problema real mientras que la hora sea razonablemente consistente a
efectos de cron. Otras herramientas de planificación o las marcas temporales. A veces, es
importante mantener la precisión de la hora en el sistema, especialmente en las
aplicaciones científicas, empresariales e industriales; en un entorno de red es aún más
importante mantener la hora completa. Por todas estas razones, existen varios protocolos
para sincronizar los relojes de varios sistemas, NTP es el más flexible y popular y
debemos conocer los principios básicos de su funcionamiento para configurar un servidor
NTP en nuestra red y otros sistemas como clientes.
Conocer los fundamentos de NTP
NTP crea una jerarquía por capas de fuentes horarias, es una de las herramientas más
populares para configurar la hora de la red. La parte superior de la estructura contiene
una o varias fuentes horarias que normalmente son relojes atómicos o receptores de
radio, que obtienen sus horas de señales temporales emitidas en base a relojes atómicos.
Se conocen como servidores temporales estrato 0, no se puede acceder a ellos
directamente. Sólo los servidores temporales estrato 1 a los que están conectados tienen
acceso a ellos. Los ordenadores estrato 1 ejecutan servidores NTP que distribuyen la
hora a servidores estrato 2, que, a su vez, distribuyen la hora a servidores estrato 3, y así
sucesivamente en un número arbitrario de capas.
- Nuestro ISP: muchos ISP trabajan con servidores NTP para sus usuarios. Suelen
estar muy cerca en términos de red, lo que los convierte en buenos candidatos.
Podemos consultar a nuestro ISP o el departamento de red de nuestra empresa
para saber si disponen de un servidor de este tipo.
- El servidor NTP de nuestra distribución: hay distribuciones que trabajan con
servidores NTP para sus usuarios. Si nos encontramos cerca de estos servidores
dento de la red, pueden ser una buena opción.
- El banco de servidores NTP públicos: el subdominio http://www.pool.ntp.org/es/
está dedicado a los servidores que funcionan voluntariamente como servidores
NTP públicos. A ellos se accede en modo round-robin por su nombre de host, lo
que provoca que podamos acabar utilizando un servidor diferente cada vez que se
inicie NTP. El uso de estos bancos suele ser una apuesta arriesgada, pero los
resultados son lo suficientemente buenos para los usuarios ocasionales que no
quieren dedicar tiempo a comprobar y configurar NTP. Para utilizar el banco,
configuraremos nuestro servidor NTP para que utilice el nombre de subdominio
pool.ntp.org o un host numerado dentro de ese dominio, como 0.pool.ntp.org.
El servidor más cercano en términos de red no suele ser el más cercano en términos
geográficos. Por ejemplo, si un ISP nacional redirige todo el tráfico a través de uno o dos
sitios que hagan de concentrador y se encuentren al otro lado del mundo, es probable que
tal desvío incremente el tiempo de round-trip y reduzca la precisión de NTP. Una vez
localizados unos cuantos posibles servidores NTP, podemos emplear ping para
determinar el tiempo round-trip de los paquetes. Si los tiempos de ping son muy elevados,
buscaremos otro servidor.
Configurar servidores NTP
No es necesario que el ordenador sea muy potente para soportar un servidor NTP, pero
debe tener acceso permanente a la red. La mayoría de distribuciones Linux vienen con el
software NTP en un paquete llamado ntp, xntp, ntpd o xntpd. En caso de que no podamos
localizarlo, puede instalarse a través del gestor de paquetes o desde el sitio web que
aloja el código fuente de NTP (www.ntp.org/downloads.html). Si no instalamos el paquete
NTP propio de nuestra distribución, tendremos que crear el script de inicio SysV o iniciar
el demonio NTP de algún otro modo.
Para la distribución de linux que estamos utilizando en el curso debemos realizar los
siguientes comandos para configurar servidor NTP.
Una vez instalado NTP, buscaremos el fichero de configuración ntp.conf, que contiene
varias opciones de NTP, aunque las más importantes son las líneas de servidor:
verificar su estado. Deberíamos ver que sólo hace referencia al servidor o servidores NTP
de nuestra red y que deberían tener un número de estrato superior al de los servidores a
los que se refieren en el cliente.
Hay veces en las que es más sencillo configurar la hora con ntpdate, que forma parte de
la suit de NTP y configura el reloj en un solo paso. Esto se hace escribiendo el comando
seguido del nombre de host o dirección IP de un servidor NTP:
Hay paquetes NTP que incluyen una llamada a ntpdate en los scripts de inicio del
demonio NTP para asegurarse de que el sistema tiene la hora correcta cuando se inicia.
Sin embargo, ntpdate está cayendo en desuso y podría desaparecer del paquete NTP. La
alternativa es iniciar ntpd con la opción -g, que permite configurar el reloj en un solo paso
con un valor totalmente divergente de la hora actual. En condiciones normales, ntpd
finalizará si la hora del servidor difiere de la hora local en algo más que unos pocos
minutos.
Para los clientes de tipo Windows, se ingresa como usuario administrador y se realizan
los siguientes pasos
- Ajustar Fecha y Hora.
- Hora de Internet.
- Cambiar la configuración.
- En la opción “Servidor”, ingresar la dirección IP del servidor de la red local.
- Actualizar Ahora.
El proceso de arranque
Los pasos que sigue un ordenador para arrancar un SO son los siguientes:
1. Se enciende el sistema, un circuito de hardware especial hace que la CPU mire en
determinadas direcciones y ejecute el código de la BIOS.
2. La BIOS hace algunas tareas entre las que se incluyen la comprobación del
hardware, su configuración y la búsqueda un sector de arranque que contenga el
cargador de arranque.
3. Cuando la BIOS le pasa el control al cargador de arranque, éste buscará un
cargador de arranque secundario siempre y cuando exista uno en una partición
marcada como activa.
4. El objetivo final del cargador de arranque es encontrar un kernel, cargarlo en la
memoria y ejecutarlo.
Como un servidor SMTP puede hacer tanto de servidor como de cliente, debemos tratar
con ambos lados de la ecuación en la configuración. Hay veces en las que un sistema
funciona con uno u otro rol, lo que simplifica las cosas; pero entonces debemos tener
cuidado de no configurar el sistema incorrectamente por accidente. Debemos evitar las
configuraciones open relay (de transmisión abierta), en las que un servidor de correo
transmite el correo de cualquier usuario.
El correo está estrechamente ligado a las cuentas de usuario de Linux. El servidor
contiene los mensajes entrantes de cada usuario almacenados en un fichero de
/var/spool/mail, sin embargo, hay servidores que almacenan el correo entrante en
subdirectorios del directorio home del usuario. Este fichero o directorio de correo entrante
se conoce como buzón de correo del usuario. El método tradicional para enviar correos en
Linux es hacer que los programas locales contacten con el servidor de correo local para el
reenvío, entonces, el servidor local contactará con el servidor de correo saliente. La
mayoría de clientes de correo (conocidos como agentes del usuario del correo o MUA),
así como los programas similares de otras plataformas, ofrecen la opción de contactar
directamente con un servidor SMTP remoto al enviar el correo. Esta configuración
simplifica ligeramente la ruta del correo, pero puede hacer que la operación sea poco
fiable si se cae la conexión de la red local. Si el cliente de correo se comunica con un
servidor SMTP local, el correo se podrá encolar para que lo distribuya el servidor SMTP
aunque la red esté caída temporalmente.
Escoger el software del correo electrónico
Es probable que nuestro sistema ya tenga instalado por defecto uno de los principales
servidores de correo, algunos servidores son más fáciles de configurar que otros o
admiten opciones específicas que otros no. Los cuatro servidores de correo más
populares en Linux son:
ejecutemos nuestro propio servidor SMTP y, quizás, nuestro propio servidor POP
o IMAP para el reparto local de correo. Para esto necesitamos un programa que
obtenga el correo utilizando POP o IMAP y que después lo inserte en una cola
SMTP. Esta es la función de fetchmail. La mayoría de los sitios no lo necesitan,
pero hay algunos en los que resulta imprescindible.
- Lectores de correo: es el último eslabón de la cadena de correo. En Linux
tenemos ejemplos como evolution, kmail, pine y mut. La utilidad mail viene
instalada por defecto en la mayoría de los sistemas Linux. La mayoría de los
clientes de correo permiten leer desde una cola de correo local a un servidor POP
o IMAP remoto. Los sistemas multiusuario probablemente tengan instalados varios
clientes de correo para que cada usuario escoja el que desee.
En la práctica, necesitaremos saber cómo configurar estos paquetes dependiendo de las
necesidades de nuestro sitio. Afortunadamente, la configuración de los lectores de correo,
que es la tarea más habitual, suele ser bastante intuitiva, siempre que dispongamos de
información sobre los nombres de host de los servidores de correo saliente (SMTP) y
entrante (POP, IMAP o una cola local).
Administración del correo electrónico
A continuación vamos a describir las tareas administrativas más habituales relativas al
envío y la recepción del correo empleando la utilidad mail, la administración de la cola de
correo, la configuración de alias y el reenvío de correos.
Linux soporta una amplia variedad de clientes de correo que probablemente incluyan
todas las funcionalidades, sin embargo, debemos saber cómo utilizar el programa básico
de la línea de comandos mail. Posee la ventaja de que se puede utilizar desde un script,
por lo que podemos controlar automáticamente algunas tareas del correo. Por ejemplo, el
script podría buscar las contraseñas que estén a punto de expirar y enviar un aviso a los
usuarios para que cambien sus contraseñas.
Algunos sistemas vienen con un programa llamado nail en lugar de mail, que incluye
funcionalidades adicionales como la posibilidad de añadir ficheros adjuntos. Normalmente,
hay un enlace llamado mail que apunta a nail, por lo que podemos llamar a nail como
mail.
La sintaxis más básica de mail, incluyendo sus opciones más útiles es la siguiente:
mail [-s "asunto"] curso_linux@localhost
mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q
FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users
La primera línea se utiliza para enviar correo y la segunda para leerlo. A diferencia de la
mayoría de lectores de correo, mail sólo permite leer la cola de correo local, no los
correos almacenados en servidores remotos que utilizan POP o IMAP. Las opciones de
mail permiten conseguir distintos fines:
- Detalle del funcionamiento: -v genera una salida más detallada, lo que puede
Después de escribir el comando mail, el comando esperará datos por la entrada estándar.
Una vez escribamos el mensaje, se volverá de nuevo al promt. Si utilizamos mail en un
script, podemos pasarle el contenido de un fichero para enviarlo mediante una redirección
de la entrada.
En la práctica se suelen utilizar lectores de correo más sofisticados, mail es más útil para
enviar correos encriptados que para leer el correo o enviar correos personales.
Este ejemplo, tomado de un sistema que ejecuta postfix, muestra un mensaje de la cola
con información relevante para su identificación. El formato exacto varía de un servidor
SMTP a otro. Normalmente escribir mailq equivale a sendmail -bp.
Si la conexión de red se cae temporalmente o si un servidor de correo deja de estar
operativo durante un tiempo, los mensajes se amontonarán en la cola y el servidor SMTP
intentará redistribuirlos más adelante; si nuestra conexión vuelve a funcionar y deseamos
vaciar la cola de inmediato, en la mayoría de servidores SMTP escribiremos senmail q,
otros servidores tienen comandos equivalentes como postqueue en postfix o runq en
exim.
Todos los servidores de correo proporcionan opciones para priorizar el envío de correos,
aceptar mensajes por la línea de comandos, borrar mensajes específicos de la cola,
depurar conexiones de correo, etc. Lamentablemente, los comandos y procedimientos
que utilizan estas funcionalidades varían de un servidor a otro, por tanto, deberíamos
consultar la documentación de nuestro servidor para saber cómo utilizar estas
funcionalidades.
Redirigir el correo
Los alias de correo permiten utilizar una dirección en lugar de otra. Por ejemplo, se
supone que los servidores de correo mantienen una cuenta llamada postmaster, cuyo
correo debería leer la persona que mantiene el sistema. Una manera de hacerlo es
configurar un alias que enlace el nombre postmaster con el nombre de una cuenta real.
Esto se hace editando el fichero aliases que suele estar en /etc o a veces /etc/mail. Su
formato es bastante intuitivo, las líneas de comentario empiezan con almohadilla (#) y el
resto adoptan la siguiente forma:
El nombre es un nombre local, como postmaster. Cada dirección (dir1, dir2, etc) puede
ser un nombre de cuenta local al que reenviar los mensajes, el nombre de un fichero local
en el que guardarlos (denotado por una barra inicial), un comando por el que se
canalizarán los mensajes (denotado por una barra vertical), el nombre de un fichero cuyo
contenido se trata como una serie de direcciones (denotado por una cadena: include:
inicial) o una dirección de correo completa.
La configuración por defecto incluye unos cuantos alias útiles para cuentas como
postmaster. La mayoría de estas configuraciones asocian a root la mayoría de estos alias.
No se recomienda leer el correo como root, ya que incrementa las posibilidades de crear
una fisura en la seguridad u otros problemas debidos a un error de escritura o un bug del
lector de correo; es aconsejable definir una línea de alias como la siguiente:
Este ejemplo muestra que cupsd, el demonio de cups, se está ejecutando, por lo que el
sistema está utilizando cups para la impresión. Si no conseguimos encontrar ningún
demonio de sistema de impresión en ejecución, tendremos que consultar la
documentación de la distribución para saber si hay uno disponible y comprobar si está
instalado. La mayoría de distribuciones incluyen scripts de inicio para ejecutar el demonio
de impresión al arrancar el ordenador.
Configurar cups
Cups tiene varios ficheros de configuración en el directorio /etc/cups y sus subdirectorios.
Podemos modificar estos ficheros directamente y de forma casi segura si deseamos
compartir impresoras o utilizar impresoras compartidas por otros sistemas cups; sin
embargo, el modo más sencillo de agregar impresoras a cups es utilizar la aplicación tipo
web.
Editar los ficheros de configuración de cups
En el fichero /etc/cups/printers.conf podemos añadir o eliminar impresoras a través de
definiciones. Una definición empieza por el nombre de la impresora junto con la cadena
DefaultPrinter (para la impresora por defecto) o Printer (para otra impresora) entre
corchetes angulares (<>):
<DefaultPrinter curso>
Esta línea es el comienzo de la definición de la impresora llamada curso; el final de la
definición sería </Printer>. Las líneas entre ambas definen diversas opciones de la
impresora, como cadenas identificadoras, ubicación de la impresora, estado actual, etc.
Estas opciones se pueden almacenar en ficheros PPD (definición de impresora
PostScript) que reciben el nombre de la cola y se almacenan en /etc/cups/ppd con formato
estándar. Para las impresoras PostScript podemos obtener el fichero PPD del fabricante,
aunque cups y sus paquetes de drivers contienen un gran número de ficheros PPD que se
instalan automáticamente cuando empleamos las utilidades de configuración web.
Es preferible utilizar las herramientas de configuración web de cups para añadir
impresoras en lugar de utilizar los ficheros de configuración. Podemos estudiar y
manipular los ficheros de configuración para no tener que recurrir a la herramienta web
para realizar un cambio menor. Una excepción a esta regla es la configuración de la
interface web de cups y la capacidad de cups para hacer de interfaz entre los demás
sistemas cups. La mayor ventaja es que utiliza IPP (protocolo de internet para impresión),
ademas de LPD y LPRng. La funcionalidad browsing (navegación) permite a los
Podemos añadir, eliminar o modificar colas de impresión a través del control web de cups.
Para añadir una impresora, seguiremos los pasos que se describen a continuación:
1. Desde la pantalla home o administraciónharemos click en Add Printer.
2. Se mostrará una página que solicita el nombre de impresora, su ubicación y su
descripción en los campos name, location y description, totalmente descriptivos,
por lo que podemos introducir lo que queramos. Suele utilizarse el valor del campo
name para acceder a la impresora. Cuando hagamos click en continue cups nos
preguntara por el dispositivo de impresión.
3. El dispositivo de impresión puede ser un puerto de hardware local, una impresora
LPD remota, una impresora SMB/CIFS remota u otro dispositivo; las opciones
disponibles varían según la distribución, seleccionaremos la apropiada de la lista
desplegable y haremos click en continuar.
4. Si hemos introducido una impresora de red, el resultado es una página en la que
tendremos que introducir la ruta completa del dispositivo. Por ejemplo,
lpd://printserv/brother imprime en la cola brother del ordenador printserv. Cuando
hayamos terminado pulsaremos continue.
5. Después de introducir el dispositivo local o de red, veremos una lista de
fabricantes de entre los que seleccionaremos uno para continuar. Podemos
apuntar directamente al fichero PPD, en este caso nos saltaremos el siguiente
paso.
6. Ahora cups muestra una lista completa de modelos de impresora del fabricante
seleccionado. Elegiremos el modelo apropiado y haremos click en continuar o
aportaremos un fichero PPD.
7. Si aún no hemos realizado otras tareas administrativas, cups nos pedirá nombre
de usuario y contraseña, escribiremos root como usuario y nuestra contraseña de
root. cups no encripta los datos y no deberíamos utilizarlo para administrar
impresoras remotamente, ya que las contraseñas quedarían expuestas a los
intrusos.
8. cups informará de que se ha añadido la impresora.
9. Si esperamos unos segundos, esta notificación se sustituirá por una página donde
podremos definir las opciones específicas de la impresora. Ajustaremos las que
necesitemos y haremos click en Set Printer Options.
El elemento printers de la parte superior de la página nos llevara a la lista de impresoras
donde nuestra impresora debería aparecer listada entre las colas existentes. Podemos
imprimir una página de prueba haciendo click en Print Test Page. Si este test no funciona,
tendremos que revisar la configuración de la impresora haciendo click en Modify Printer
que nos llevará a un proceso similar al de añadir una impresora, pero mostrando por
defecto los valores que previamente habíamos introducido, de manera que sólo será
necesario modificar aquellos que contengan errores.
Imprimir en impresoras en red
Si la impresora aloja muchos ordenadores Windows, podemos utilizar SMB/CIFS para
compartirla entre sistemas Windows. El servidor SAMBA de Windows implementa este
protocolo, por lo que podemos utilizarlo para compartir impresoras desde LInux. También
podemos imprimir en una cola de impresión SMB/CIFS desde un sistema Linux: para ello,
en la herramienta de configuración web de cups, en el paso 3, seleccionaremos una
impresora llamada “Windows Printer via SAMBA”, el formato de configuración en la
herramienta web no es obvio:
smb://nombreusuario:contraseña@SERVIDOR/RECURSO
Esto es un identificador uniforme de recursos (URI) para un recurso compartido
SMB/CIFS. Sustituiremos nombre de usuario, contraseña, servidor y recurso por los
valores apropiados, tras lo que deberíamos poder enviar tareas de impresión al recurso
SMB/CIFS. Cuando estas impresoras están configuradas en sistemas Windows, no
suelen ser modelos PostScript, por lo que tendremos que escoger un filtro inteligente
Linux y un driver Ghostscript local. En cambio, si están configuradas en sistemas Linux
que ejecutan SAMBA, con frecuencia se configuran para que hagan de impresoras
PostScript, lo que debería permitirnos escoger un driver PostScript para la impresora.
En términos generales, si los clientes son pocos y están bien protegidos, el uso de
contraseñas puede ser beneficioso mientras el servidor no esté expuesto a internet. Si los
clientes son numerosos y están expuestos a internet, siempre que el servidor de
impresión esté bien protegido, puede ser preferible un sistema de seguridad libre de
contraseñas que se basa en direcciones ip.
Desde la lista de colas de impresión también podemos hacer click en Configure Printer
para definir varias opciones de la impresora, aunque dependerán del tipo de impresora.
Las habituales son: la resolución, las mezclas de colores, el tamaño de papel, la
impresión a doble cara y la presencia de la página de encabezado.
Monitorizar y controlar la cola de impresión
Existen varias utilidades para enviar tareas de impresión, examinar y manipular una cola
de impresión de Linux. Utilizan, lpr, lpq, lprm y lpc, que emplean el parámetro -P para
especificar la cola de impresión.
Imprimir ficheros con lpr
El programa lpr envía las tareas de impresión a la cola de impresión. Acepta muchas
opciones que modifican sus acciones:
- Especificar un nombre de cola: -Pnombredecola permite especificar una cola de
impresión. Es útil si tenemos varias impresoras o si tenemos definidas varias colas
para una impresora.
- Borrar el fichero original: la opción -r permite que LPR elimine el fichero original
tras imprimirlo; de lo contrario, se envía una copia a la cola del fichero a imprimir y
se deja intacto el original.
- Suprimir el encabezado: -h suprime el encabezado para una tarea de impresión.
Las versiones antiguas de cups no incluyen esta opción.
- Especificar un nombre de tarea: las tareas de impresión tienen nombres para
identificarlas tanto en la cola como cuando se imprimen. El nombre suele ser el
nombre del primer fichero de la tarea de impresión, -J nombredetarea permite
cambiar este nombre, -C y -T son sinonimos de -J.
- Notificar a un usuario por correo: -m nombreusuario hace que LPD envie un
correo a nombredeusuario cuando la tarea finalice, las primeras versiones de cups
no incluían esta opción.
- Especificar el número de copias: el número de copias se puede especificar con
la opción -# número, donde número es el número de copias a imprimir.
lpr -Plexmark -m ljones report.txt
Este comando imprime el fichero report.txt en la cola lexmark y una vez terminado el
trabajo, avisa al usuario ljones.
El comando lpr es accesible para usuarios y para root. También recurren a él muchos
programas que necesitan imprimir directamente, como los programas gráficos y
procesadores de texto. Estos programas suelen incluir algún método de ajuste de
impresión. Hay programas que ofrecen un campo de introducción de texto donde
podemos escribir total o parcialmente comandos de lpr. Un programa útil para procesar un
fichero antes de enviarlo es mpage, que lee ficheros en texto plano o PostScript y les
vuelve a dar formato para que cada hoja impresa contenga varias páginas con un tamaño
reducido respecto al documento original. Es un buen modo de ahorrar papel, si no nos
importa reducir el tamaño del documento original. En prinicipio, se emplea igual que lpr:
Este comando imprime el fichero report.ps reducido a 4 páginas por hoja. Las opciones -1,
-2, -4 y -8 permiten especificar 1, 2, 4 u 8 páginas por cada página de salida. mpage
también puede controlar características como el tamaño de papel, la fuente a utilizar y el
rango de páginas del fichero de entrada a imprimir.
lpq -Php400
hp4000 is ready and printing
Rank Owner Job File Total Size
active rodsmit 1630 file:/// 90112 bytes
De particular interés es el número de la cola, 1630 en este ejemplo. Utilizaremos este
número para borrar una tarea de la cola o reordenar las tareas para que se impriman. lpq
lo puede utilizar cualquier usuario.
lprm elimina una o más tareas de la cola de impresión. Podemos ejecutar este comando:
________________________________________________________________________
Los Switch son superiores a los HUB, ya que los HUB redirigen todo el tráfico entre todos
los ordenadores mientras que los Switch son lo bastante inteligentes como para enviar
paquetes sólo al destino pertinente. Los Switch permiten transmisiones Full-Duplex, en las
que ambas partes pueden enviar información al mismo tiempo, los HUB sólo permiten
transmisiones Half-Duplex, en las que los dos ordenadores deben comunicarse por
turnos. Los Switch permiten a dos pares de ordenadores interconectarse para una
transferencia de datos a alta velocidad, con un HUB estas dos transferencias interferirían
entre sí.
Los ordenadores con adaptadores Wi-Fi pueden configurarse para que se comuniquen
entre ellos directamente, aunque lo más común es emplear un Router inalámbrico, que
conecta dispositivos tanto Wi-Fi como Ethernet. Estos Router también proporcionan
conexiones a una red de salida, que suele ser Internet, normalmente a través de una
conexión de banda ancha.
Los paquetes de red
Las redes modernas envían bloques de datos conocidos como paquetes en lugar de
enviar un fichero de una sola vez, el ordenador divide en pedazos dicho fichero y lo envía
al sistema receptor uno a uno. De este modo, si hay un error durante el envío de un
paquete, el ordenador podrá enviar de nuevo sólo dicho paquete en lugar del fichero
entero. Cuando el sistema receptor recibe el paquete, debe recomponer el orden correcto
para volver a crear el fichero recibido. No es raro que la transmisión se retrase o incluso
se pierdan paquetes, los procedimientos de recuperación de errores son críticos en los
protocolos que gestionan grandes transferencias. El hardware de red gestiona algunos
tipos de recuperación ante errores de manera transparente.
Existen diferentes tipos de paquetes y algunos se pueden almacenar dentro de otros. Por
ejemplo, ethernet incluye su propio tipo de paquete (frame), de esta forma los paquetes
generados por protocolos que se ejecutan sobre ethernet se almacenan dentro de frames
de ethernet. Una transferencia de datos puede implicar varias capas en las que se
encapsula y desencapsula la información, cada capa puede fusionar o dividir los paquetes
de la capa anterior.
Las pilas de los protocolos de red
La información sobre la red se puede dividir en varios niveles de abstracción; por ejemplo,
en un nivel una red transporta los paquetes de datos para un tipo de red específico, los
paquetes de datos se dirigen a ordenadores específicos de una red local. Esta descripción
permite entender una red local, pero no sirve de mucho para conocer los protocolos de
red de nivel superior, que se suelen describir en términos de comandos enviados en
ambos sentidos entre ordenadores; las referencias a los paquetes no son habituales. Otra
capa de la pila podría tomar estos paquetes y volver a empaquetarlos en frames. Las
distintas capas de cualquier pila de protocolo interactúan de maneras muy específicas.
Normalmente es posible intercambiar un componente por otro en una capa concreta. Por
ejemplo, podemos pasar de un cliente de correo a otro sin mucha dificultad, ya que ambos
se encuentran en el mismo nivel de la pila.
Cada ordenador de una transacción necesita un protocolo de pila compatible. Durante la
comunicación, los ordenadores transmiten los datos a sus respectivas pilas y después
envían sus datos a su sistema compañero, que a su vez le pasa los datos a su propia pila.
Cada capa del sistema receptor v los datos que ha empaquetado tienen su
correspondencia en el ordenador emisor. Las pilas se suelen representar con diagramas,
la que domina actualmente Internet es la pila del protocolo TCP/IP.
peticiones pasan a través de las capas de transporte, Internet y de enlace del ordenador
cliente y, después, se envían al sistema servidor donde se invierte el proceso con el
programa servidor que se ejecuta en la capa de aplicación. Esta respuesta invierte el
recorrido, descendiendo por la pila del ordenador servidor hasta llegar a la pila del cliente.
Una conexión de red con todas las funcionalidades puede implicar muchas transferencias
de datos en ambos sentidos. Cada capa de las que componen el sistema emisor equivale
a una capa del sistema receptor, aunque no tienen por qué ser absolutamente idénticas.
Por ejemplo, podemos utilizar tipos de hardware de red totalmente diferentes como
ethernet o Token Ring siempre y cuando haya un sistema intermedio que funcione de
transductor entre ambos o podemos tener distintos modelos de tarjeta de red en la capa
de enlace. Los ordenadores pueden ejecutar distintos SO y utilizar pilas de protocolo
diferentes lógicamente equivalentes, lo importante es que las pilas trabajen de maneras
compatibles.
Linux está diseñado con TCP/IP en mente, Internet se creó sobre TCP/IP, aunque es
posible que nos encontremos con otras pilas de protocolo. NetBEUI era la pila de
Microsoft e IBM para Windows, AppleTalk era la pila inicial de Apple e IPX/SPX era la pila
preferente de Novell. Las tres tienen una importancia menor en la actualidad aunque
podemos encontrarlas en algunas ocasiones en entornos muy concretos, Linux admite
AppleTalk e IPX/SPX pero no NetBEUI.
Conocer los tipos de protocolos de TCP/IP
Dentro de TCP/IP existen varios protocolos diferentes que se pueden clasificar en una de
las capas de la pila TCP/IP. Los protocolos más importantes de las capas de Internet y de
transporte son los pilares de los protocolos de la capa de aplicación, que es con la que
interactúan más directamente, entre ellos se incluyen los siguientes:
- IP: el protocolo de Internet es el protocolo central de la red TCP/IP. Se encuentra
en la capa de Internet (capa de red o capa dos), transfiere los paquetes con un
método best effort, lo que significa que no se garantiza que los paquetes alcancen
su destino; además, pueden llegar desordenados o corrompidos. Hay otros
componentes de la pila que se encargan de estos problemas. IP es también la
parte de TCP/IP con la que se asocian las direcciones IP.
- ICMP: el protocolo de mensajes de control de Internet es un sencillo protocolo que
se suele utilizar con frecuencia para enviar mensajes de error entre ordenadores.
Esto se suele hacer modificando un paquete IP y devolviéndolo a su emisor. ICMP
es técnicamente un protocolo de la capa de Internet, aunque se basa en IP.
Normalmente, no usaremos programas que generan paquetes ICMP por
demanda, sino que se crearán automáticamente conforme utilicemos otros
protocolos. Una excepción es el programa ping.
- UDP: el protocolo de datagramas del usuario es más sencillo que los protocolos
TCP/IP habituales de la capa de transporte. No proporciona procedimientos para
corregir los paquetes desordenados, garantizar el envío ni, en general, mejorar las
limitaciones de IP. Esto significa que UDP puede ser más rápido que las
herramientas más sofisticadas que proporcionan tales mejoras a IP. Entre los
protocolos de la capa de aplicación que se construyen sobre UDP se incluyen
DNS, NFS y muchos protocolos de medios streaming.
La llegada de IPv6
Dentro de cada clase de uso general existe un rango de direcciones reservado para el uso
privado. La mayoría de las IP se asignan a ordenadores individuales por uno autoridad
apropiada y así evitar que dos sistemas utilicen la misma dirección en Internet. Por el
contrario, cualquiera puede utilizar las direcciones privadas reservadas. Debemos tener
en consideración que los routers se suelen deshacer de los paquetes enviados a estas
direcciones aislándolas de Internet en bloque. La idea es que las pequeñas redes
privadas puedan utilizar estas direcciones con seguridad. Hoy en día se utilizan tras
routers NAT, permitiendo a un número arbitrario de ordenadores ocultarse tras un único
sistema. El router NAT sustituye su propia dirección IP en los paquetes salientes y dirige
la respuesta al sistema correcto, algo útil para conectar a Internet más ordenadores que
direcciones IP de las que disponemos.
IPv6 posee un equivalente a las direcciones privadas, las locales del sitio se pueden dirigir
dentro de una red pero no hacia fuera. Comienzan con los números hexadecimales fec,
fed, fee o fef. Las direcciones de enlace local están restringidas a un único segmento de
red y comienzan por los números hexadecimales fe8, fe9, fea o feb.
Las clases IPv4 se crearon para simplificar el enrutamiento pero, según Internet fue
creciendo, se volvieron restrictivas. Hoy en día sirven principalmente para definir
máscaras por defecto; la mayoría de herramientas de configuración definen estas
máscaras de red de forma automática. La dirección IP y la máscara de red son
extremadamente importantes para la configuración de la red. Si nuestra red no utiliza
DHCP o algo similar, tendremos que configurar manualmente las direcciones. Un error en
dicha configuración puede provocar un fallo completo de la red o la incapacidad de
comunicarse con algunos ordenadores.
Las pilas que no son TCP/IP tienen sus propios métodos de direccionamiento. NetBEUI
utiliza los nombres de máquina, no posee un método de direccionamiento numérico
independiente. AppleTalk utiliza dos números de 16 bits. Estos esquemas de
direccionamiento son independientes de las direcciones IP.
Multidifusión de datos
La multidifusión es un tipo de transmisión en red que se envía a todos los ordenadores de
la red local, o, a veces, a todos los ordenadores de una red remota. TCP/IP lleva a cabo la
multidifusión especificando valores 1 binarios en todos los bits de máquina de la dirección.
La parte de red de la dirección se configura con el valor normal de la red, algo obligatorio
en las multidifusiones dirigidas, que son las que se envían a una red remota (muchos
routers rechazan este tráfico). En muchos casos, las multidifusiones se especifican
utilizando 255.255.255.255 como dirección IP, los paquetes dirigidos a esta dirección se
envían a todas las máquinas de una red local. Ya que la dirección de multidifusión viene
determinada por la dirección IP y la máscara de red, podemos realizar conversiones entre
la dirección de multidifusión y la máscara de red si conocemos una de ellas y la dirección
IP de un ordenador. Si la máscara de red está compuesta por valores de bytes completos
(0 o 255) la conversión es sencilla: sustituiremos los componentes de la dirección IP que
tengan valores cero en la máscara de red por valores 255 para obtener la dirección de
multidifusión. Por ejemplo, si tenemos la IP 172.24.21.201 y la máscara 255.255.0.0 los
dos últimos elementos de la máscara tienen valor cero, si intercambiamos estos por
valores 255 obtendremos la dirección de multidifusión 172.24.255.255.
En el caso de una dirección CIDR que posee valores distintos a 255 en la máscara de red,
la situación será más compleja porque tendremos que recurrir a números binarios. Por
ejemplo, si tenemos la dirección 172.24.21.201 y la máscara 255.255.128.0 (es decir
172.24.21.201/17), expresado en binario estos números son:
10101100 00011000 00010101 11001001
11111111 11111111 10000000 00000000
Para crear la dirección de multidifusión definiremos los valores superiores (dirección de
red) como 1, cuando los inferiores (mascara de red) sean 0. El resultado es:
10101100 00011000 01111111 11111111
Si realizamos la conversión a notación en base10 la dirección sería 172.24.127.255.
Raramente tendremos que realizar cálculos de este tipo. Al configurar el ordenador
introduciremos la dirección IP y la máscara de red y dejaremos que el ordenador haga los
cálculos binarios.
Puertos de red
Además de la dirección del ordenador a contactar, hace falta otro tipo adicional de
direccionamiento: el emisor debe tener una dirección para un programa específico en el
sistema remoto, por ejemplo, supongamos que tenemos un navegador web, puede que el
ordenador del servidor web esté ejecutando otros servidores, como por ejemplo SMTP o
FTP. Agregaremos otro número a las direcciones IP para dirigir el tráfico al servidor web.
Este número es el puerto de red, los programas que acceden a una red TCP/IP suelen
hacerlo a través de uno o más puertos. Los números de puerto son características de
UDP y TCP, hay protocolos como ICMP que no usan número de puerto.
Los servidores se asocian automáticamente a puertos específicos definidos por
convención y asociados a programas específicos del servidor. Un cliente puede dirigir su
Número TCP o
Uso Servidores Linux de ejemplo
de puerto UDP
TCP y
53 DNS BIND, djbdns
UDP
Protocolo de impresión de
631 TCP CUPS
Internet
6000 –
TCP El sistema XWindow (X) X.org-X11, XFree86
6007
Una diferencia clave de los puertos TCP/IP es la existente entre puertos con y sin
privilegios. Los puertos con privilegios son los inferiores a 1024, puertos que tienen
restringido el acceso, sólo root puede acceder a ellos. La intención es que un cliente se
conecte a un puerto con privilegios con la seguridad de que el servidor que se ejecuta en
ese puerto está configurado por el administrador del sistema. Hoy en día, la confianza no
se puede basar únicamente en el puerto, por lo que esta distinción no resulta muy útil. Los
usuarios pueden acceder a los puertos superiores al 1024.
En un funcionamiento básico no tendremos que hacer nada para configurar los puertos en
un sistema Linux, aunque puede que lo necesitemos si utilizamos servidores poco usuales
que necesitan una configuración para que el servidor pueda enlazarse con los puertos
correctos. Esto implica, a veces, la modificación del fichero /etc/services, que asocia
números de puerto a nombres, permitiendo utilizar dichos nombres en las configuraciones
de servidores y en otros sitios, este fichero contiene líneas que empiezan con un nombre
los tres, pero todas tienen un cliente DHCP por defecto que se instala cuando se le indica
al sistema que se quiere utilizar DHCP durante la instalación. Si la distribución viene con
varios clientes, podremos intercambiarlos sin ningún problema. Lo ideal es que el cliente
DHCP se ejecute en el inicio del sistema, lo que se suele controlar desde su propio fichero
de inicio SysV o como parte del fichero de inicio principal de configuración de la red.
Frecuentemente, el sistema posee una línea en un fichero de configuración para
determinar si debe ejecutar un cliente DHCP, en Red Hat y Fedora esta opción se define
en el fichero /etc/sysconfig/network-scripts/ifcfg-eth0 (el nombre del fichero puede diferir
según el número de interfaz ethernet). La línea en cuestión presenta el siguiente aspecto:
BOOTPROTO= dhcp
Si BOOTPROTO está configurado con algún otro valor y lo modificamos, como en el
ejemplo anterior, el sistema utilizará DHCP, aunque suele ser más fácil utilizar una
herramienta GUI para definir esta opción. Ubuntu utiliza el fichero /etc/network/interfaces
para el mismo fin, aunque los detalles difieren. La línea en cuestión para este archivo es
como la siguiente:
iface eth0 inet dhcp
Una vez configurado el cliente DHCP para ejecutarse durante el arranque del sistema, la
tarea de configuración habrá finalizado, si todo funciona como esperamos. En muy raras
ocasiones tendremos que modificar los parámetros de DHCP para resolver alguna
incompatibilidad entre cliente y servidor o para que el cliente DHCP haga algo inusual.
Para ello, probablemente, tendremos que modificar el script de inicio SysV o el fichero al
que haga referencia para cambiar su funcionamiento.
Si necesitamos ejecutar un cliente DHCP a mano lo haremos escribiendo su nombre
como root, seguido opcionalmente de un identificador de red, como por ejemplo, dhclient
eth0, para hacer que el cliente DHCP intente configurar eth0 con la ayuda del servidor
DHCP que encuentre en la red.
Configuración con una dirección IP estática
NETWORK=192.168.29.0
BROADCAST=192.168.29.255
GATEWAY=192.168.29.1
ONBOOT=yes
La configuración de IP estáticas requiere varios elementos específicos necesarios o que
resultan de utilidad:
- Dirección IP: podemos definir la IP manualmente con el comando ifconfig o a
través del elemento IPADDR del fichero de configuración.
- Máscara de red: podemos definirla manualmente con el comando ifconfig o a
través del elemento NETMASK del fichero de configuración.
- Dirección de la puerta de acceso: se puede definir manualmente con el
comando route. Para definirla permanentement,e ajustaremos el fichero de
configuración, que puede ser el mismo que contiene las demás opciones u otro
fichero. En ambos casos, es probable que la opción se llame GATEWAY. La
puerta de acceso no es necesaria en sistemas que sólo trabajan en una red local
que no contiene routers.
- Parámetros de las DNS: si queremos que Linux realice conversiones entre
direcciones IP y nombres de host, tendremos que especificar al menos un servidor
DNS en el fichero /etc/resolv.conf. La IP del servidor DNS se define precedida de
la palabra clave nameserver. Podemos incluir hasta tres líneas nameserver en
este fichero. Una vez realizada esta configuración, será permanente. También
podemos definir el nombre de dominio local utilizando la opción domain.
El script de configuración de red puede contener opciones adicionales. El ejemplo anterior
tiene una opción que especifica el nombre de la interfaz (DEVICE=eth0), otra que le dice
al ordenador que asigne una IP estática (BOOTPROTO=static) y una tercera que muestra
por pantalla la interfaz cuando arranca el ordenador (ONBOOT=yes). NETWORK y
BROADCAST se obtienen de los elementos IPADDR y NETMASK.
Los detalles de la configuración varían de una distribución a otra, por ejempl,o en Ubuntu
editaremos /etc/network/interfaces y en Fedora /etc/syconfig/network-scripts/ifcfg-ethx. La
distribución y formato de la información difieren en ambos ficheros, puede que
necesitemos consultar la documentación de la distribución para conocer los detalles. Otra
alternativa son las herramientas GUI, cuyo uso es muy intuitivo. No debemos introducir
valores aleatorios o inventados similares a los utilizados por otros sistemas de nuestra
red, ya que es improbable que funcionen y pueden provocar daños enormes.
El programa ifconfig es de una importancia crítica para definir la IP y la máscara de red,
también puede mostrar los parámetros actuales. Su uso básico para mostrar una interfaz
de red presenta el siguiente aspecto:
ifconfig interfaz up dir netmask mascara
Por ejemplo, si queremos configurar eth0 con la dirección IP 192.168.10.10 y la máscara
de red 255.255.255.0 utilizaremos el siguiente comando:
route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
Esto muestra que los datos destinados a 192.168.10.0 pasan directamente por eth0.
127.0.0.0 es un interfaz especial que crea un circuito cerrado con el ordenador de origen.
Se utiliza para ciertos fines internos de la red. La última línea muestra la ruta por defecto,
que describe lo que hacer con todo lo que no coincida con las demás entradas de la tabla
de enrutamiento. En este caso, 192.168.10.1 es la puerta de acceso por defecto de la
ruta. Si no aparece o está mal configurada, el tráfico destinado a redes externas no
pasará del segmento de red local.
Es más fácil utilizar una herramienta GUI para definir direcciones IP para los nuevos
administradores, ya que la ubicación exacta de los ficheros de configuración varía de una
distribución a otra y los ejemplos listados anteriormente pueden no ser válidos para
nuestro sistema actual.
Configuración del enrutamiento
Los routers pasan el tráfico de una red a otra. Cuando configuramos Linux le
suministramos la dirección del router que utilizará como puerta de acceso a Internet. El
tráfico que no esté destinado a la red local se dirigirá a este router, que a su vez se lo
pasará al destinatario. En la práctica, es probable que haya una decena o más routers
entre nuestro equipo y la mayoría de los sitios de Internet, cada router tiene al menos dos
interfaces de red y mantiene una tabla que indica dónde enviar la información según la IP
de destino. Nuestro propio ordenador tiene una tabla de este tipo, pero es muy simple
comparada con las tablas de los principales routers de Internet.
Linux puede funcionar como un router, conectando dos o más redes entre sí y dirigiendo
el tráfico entre ellas en base a su tabla de enrutamiento, lo que se controla, en parte, con
route. Este comando se puede utilizar para mucho más que especificar un único sistema
de puerta de acceso. La sintaxis simplificada de route sería la siguiente:
route {add | del} [-net | -host] destino [netmask nm] [gw gw] [reject] [[dev] interfaz]
Junto a add o del se especifica un destino (ordenador o dirección de red) y otros
parámetros opcionales. La opción -net fuerza a route a interpretar el destino como una red
y -host como una dirección de ordenador. La opción netmask permite definir una máscara
de red y gw permite especificar el router por el que deberían pasar los paquetes hacia el
destino especificado. reject instala una ruta de bloqueo que rechaza el tráfico destinado a
la red especificada, aunque no es un cortafuegos. route puede adivinar por sí mismo el
dispositivo de red aunque se puede forzar a que utilice uno en concreto con la opción dev.
Por ejemplo, una red en la que los paquetes dirigidos a la subred 172.20.0.0/16 deberían
pasar a través del router 172.21.1.1 y no es el sistema de puerto de acceso por directo.
Configuraremos esta ruta con el siguiente comando:
route add -net 172.20.0.0 netmask 255.255.0.0 gw 172.21.1.1
Las tablas de enrutamiento incorrectas pueden causar serios problemas debido a que
algunos o todos los ordenadores no respondan. Podemos examinar la tabla de
enrutamiento escribiendo solo route. Una vez localizadas las entradas incorrectas,
podremos borrarlas y añadir otras nuevas que las sustituyan a la larga. La mejor opción
es cambiar los ficheros de configuración, aunque un par de comandos route solucionaran
el problema a corto plazo.
Si queremos configurar un router en Linux que permita el reenvío de los paquetes entre
redes, debemos activar la funcionalidad modificando un fichero clave del sistema de
ficheros /proc:
echo “1” > /proc/sys/net/ipv4/ip_forward
Este comando activa el reenvío de IP, pero, si queremos activar permanentemente esta
opción, tendremos que modificar un fichero de configuración. En algunas distribuciones es
/etc/sysctl.conf:
net.ipv4.ip_forward = 1
Otras distribuciones utilizan otros ficheros de configuración y opciones, como
/etc/sysconfig/sysctl y su línea IP_FORWARD. Podemos utilizar grep para buscar por
ip_forward o IP_FORWARD si no podemos encontrar el archivo; también podemos
modificar un script de inicio local para añadir el comando que aplique el cambio.
Uso de herramientas GUI de configuración
La mayoría de distribuciones incluyen sus propias herramientas GUI de configuración de
red. Fedora y Red Hat vienen con la herramienta llamada network configuration (system-
config-network) y Suse posee la herramienta de tipo texto llamada YaST. Los detalles de
funcionamiento de estos programas difieren, pero todas proporcionan un medio para
introducir la información anteriormente descrita. Estas herramientas GUI son normalmente
más fáciles de encontrar y utilizar que los ficheros de configuración en los que se guardan
los parámetros, por lo que es recomendable localizarlas y aprender a utilizarlas. Una vez
entendido los principios de la configuración de las redes, no deberíamos tener problemas
para introducir la información en los campos GUI. Los detalles precisos de la
configuración utilizando herramientas GUI difieren de una distribución a otra. Por ejemplo,
YuST no distribuye sus opciones de la misma manera que network configuration, aunque
los principios básicos son los mismos. Debemos escoger entre una asignación de IP
estática o automática e introducir un número de opciones clave dependiendo del método
de configuración que escojamos.
Uso de los comandos ifup e ifdown
ifup y ifdown combinan las Configuración del hardware de red funciones de varios
comandos de red entre los que destacan ifconfig y route. En sus formas más sencillas,
abren interfaces o las cierran en función de la información almacenada en los ficheros de
configuración de red:
ifup eth0
Determining IP information for eth0… done.
Después de ejecutar este comando eth0 estará totalmente configurada, suponiendo que
hayamos configurado adecuadamente la información utilizando las herramientas de
configuración de red de la distribución, o bien manualmente, editando los ficheros de
configuración. Podemos cerrar con la misma facilidad la interfaz escribiendo ifdown eth0.
ifup y ifdown son útiles para verificar que los parámetros de red están correctamente
configurados de cara a la próxima vez que arranque el ordenador. También se utilizan
para tirar o levantar la red rápidamente. Si necesitamos experimentar o depurar un
problema, es preferible utilizar ifconfig y route, ya que proporcionan un control más
preciso sobre el proceso. Los comandos ifup y ifdown se implementan como scripts que
Si inventamos un nombre de host, escogeremos una TLD valida, como .invalid para
garantizar que no le daremos por accidente al ordenador un nombre que ya pertenezca
legítimamente a alguien más. Un conflicto de este tipo puede impedirnos contactar con el
sistema, aparte de causar otros problemas como errores en el direccionamiento de
correos electrónicos.
Resolución de nombres de host
DNS es una base de datos distribuida en ordenadores que realizan conversiones entre
direcciones IP y nombres de host. Cada dominio debe mantener, al menos, dos
servidores DNS; ambos deben proporcionar los nombres de cada ordenador del dominio o
re direccionar una petición DNS a otro servidor DNS que pueda gestionar mejor la
petición.
En la práctica, este proceso está oculto, ya que las empresas mantienen servidores DNS
que hacen todo el trabajo sucio. Bastará con que nuestro ordenador apunte a los
servidores DNS de nuestro ISP. Esto se puede controlar con DHCP o introduciendo la
información manualmente en los ficheros de configuración. A veces necesitaremos
comprobar manualmente las DNS debido a que nuestra configuración DNS está
distribuyendo la dirección errónea o para verificar si el servidor está operativo. Los
programas que nos ayudan a realizar estas comprobaciones son los siguientes:
- nslookup: realiza búsquedas DNS (por defecto, en determinados ordenadores en
particular) y devuelve los resultados. Tiene un modo interactivo con el que
podemos realizar una serie de consultas. El programa está oficialmente obsoleto,
lo que significa que ya no recibe mantenimiento y será eliminado de su paquete
padre (bind-utils o bind-tools). Lo mejor es utilizar host o dig.
- host: es el sustituto para las funciones más sencillas de nslookup, carece de un
modo interactivo y difiere en muchos detalles de funcionamiento. En el caso más
simple, escribiremos host nombre_objetivo donde nombre_objetivo es el nombre
de host o la dirección IP que queremos consultar. Admite varias opciones para
modificar su comportamiento básico.
- dig: realiza búsquedas DNS más complejas que host. Podemos utilizarlo para
localizar la dirección IP de un único nombre de host o el nombre de host de una
única dirección IP, es más flexible que host.
- whois: busca la información de un dominio en conjunto y nos proporciona
información sobre quién es el propietario del dominio, con quién contactar en caso
de problemas, etc. Se suele utilizar junto con la opción -H, que omite las cláusulas
legales que muchos registradores de dominios incorporan a la información de
whois.
Si sólo necesitamos resolver un puñado de nombres de host y no queremos recurrir a las
DNS, utilizaremos el fichero /etc/hosts para definir las asociaciones de direcciones IP con
nombres de host (una por línea). Cada asociación incluye por lo menos un nombre,
aunque puede ser más de uno:
127.0.0.1 localhost
192.168.7.23 apollo.luna.edu apollo
En este ejemplo, el nombre localhost está asociado a la dirección 127.0.0.1; los nombres
apollo.luna.edu y apollo están asociados a 192.168.7.23. El primer vínculo debería
aparecer en cualquier fichero /etc/hosts; el segundo es un nombre de host completo que
incluye la parte del domino. Los siguientes nombres de esta línea son alias (normalmente
el nombre del host sin la especificación del dominio). Una vez configurado este fichero,
podemos hacer referencia a los ordenadores que parecen en él por sus nombres, estén o
no en los servidores DNS que utiliza el ordenador.
La principal desventaja de /etc/hosts es que es un fichero local y la definición de las
asociaciones sólo afecta a las búsquedas de nombre realizadas por el ordenador. Si
queremos hacerlo en toda la red, tendremos que modificar los ficheros de todos los
ordenadores de esta. Linux suele realizar búsquedas en /etc/hosts antes que en las DNS;
para modificar este comportamiento configuraremos el fichero /etc/nsswitch.conf, en su
línea hosts. Esta línea indica el orden de las opciones files y DNS, que corresponden a
/etc/hosts y DNS respectivamente:
hosts: files dns
Invertiremos el orden de las opciones files y dns para obligar al sistema a consultar las
DNS antes que /etc/hosts. El fichero /etc/nsswitch.conf admite opciones como, por
ejemplo, realizar una resolución de nombres utilizando llamadas NetBIOS de Windows, o
un servidor LDAP añadiendo las opciones pertinentes a la línea hosts junto con el
software de apoyo necesario. Las líneas passwd, shadow y group controlan cómo se
autentifican los usuarios y gestionan los grupos Linux. No deberíamos intentar cambiar
estas configuraciones a menos que entendamos los sistemas implicados.
El fichero /etc/networks funciona de un modo similar a /etc/hosts, pero se aplica a las
direcciones de red e invierte el orden de los nombres y las direcciones IP en cada línea:
loopback 127.0.0.0
mynet 192.168.7.0
Este ejemplo define dos vinculaciones: el nombre loopback con la red 127.0.0.0/8 y
mynet para la red 192.168.7.0/24. No tendremos que editar este fichero salvo en contadas
ocasiones.
Configuración de los nombres de host
Los nombres de host se configuran:
- En las DNS: el administrador de la red puede añadir una entrada en el servidor
DNS de la red que convierta el nombre de nuestro ordenador en un objetivo válido
para los demás ordenadores de la red local. Otra alternativa es modificar los
ficheros /etc/hosts de los sistemas remotos para incluir nuestro sistema.
- En el ordenador local: hay varios programas locales que deben conocer el
nombre de nuestro ordenador como, por ejemplo, cuándo queremos que se
muestre nuestro nombre de host como parte del prompt. Para ello debemos definir
localmente nuestro nombre de host, algo totalmente independiente del nombre de
host DNS. Se pueden definir ambos nombres con valores diferentes, pero esto
puede llevar a confusiones e incluso impedir a algunos programas funcionar
correctamente.
La herramienta más básica para definir localmente nuestro nombre de host se llama
hostname. Si escribimos el comando sin ningún parámetro se mostrara nuestro nombre
de host actual; si lo escribimos seguido del nuevo nombre a definir como nombre del host,
hostname sustituirá el antiguo por el que acabamos de escribir.
Hay dos comandos similares domainname y dnsdomainname. domainname define el
nombre de dominio utilizado por NIS (sistema de información de red) y dnsdomainname
define el nombre de dominio utilizado por las DNS. Estos comandos no afectan a los
servidores remotos, sólo al nombre dado a los programas que emplean llamas concebidas
para estos servidores. Linux suele buscar en el fichero /etc/hostname o /etc/HOSTNAME
un nombre de host para configurar durante el inicio. Si queremos configurar el nombre de
host de manera permanente, deberíamos buscar y modificar estos ficheros. Fedora utiliza
/etc/sysconfig/network para este fin, entre otros.
4.2.3 Resolución de problemas sencillos de red
Diagnosticar conexiones de red
La configuración de las redes es compleja, ya que las cosas no siempre funcionan como
se planearon. Existen unos cuantos comandos que ayudan a diagnosticar problemas:
ping, traceroute, tracepath, netstat y tcpdump. Cada comando proporciona una
información concreta que nos puede servir para seguir la pista del origen de un problema.
DNS. Suele ser recomendable conocer los nombres de host, ya que ayudan a determinar
con precisión quien es el responsable de un problema. El ejemplo anterior muestra una
gran variabilidad en los tiempos de respuesta, el dato de 192.168.1.54 es totalmente local:
este router respondió en 1.021, 3.519 y 0.971 ms a las 3 pruebas; es probable que, por la
segunda prueba y su tiempo de respuesta, se puede deducir que el sistema estaba
ocupado en alguna otra tarea. El resto de pruebas se encuentra en el rango de los 8-20
ms. En el último sistema sólo se presentan dos tiempos y en la prueba intermedia se
marca como un asterisco (*) debido a que el paquete nunca regresó.
traceroute permite localizar los problemas de conectividad de la red si tenemos una gran
variabilidad en los tiempos. La ausencia de alguno tiempo indica que el router está
sobrecargado o que tiene una conexión poco fiable con el sistema anterior de la lista. Si
observamos un salto muy grande en los tiempos, suele indicar que hay una enorme
distancia física entre dos de los routers, algo habitual en las conexiones
intercontinentales. Estos saltos no son necesariamente un problema a no ser que los dos
sistemas estén lo suficientemente cerca como para que este salto enorme carezca de
sentido.
La salida de traceroute nos permite determinar si existe un problema en la conectividad de
la red de la que somos responsables. Por ejemplo, la variabilidad del primer dato en el
ejemplo anterior puede indicar un problema en la red local, aunque lo más probable es
que e paquete se perdiera antes de llegar a su destino final, por lo que no se trata de un
problema en la red. Si la conexión problemática esta dentro de nuestra área de
responsabilidad, tendremos que comprobar el estado del sistema problemático, los
sistemas vecinos y el segmento de red. Hay routers que bloquean todos los datos de
traceroute, independientemente de que estén destinados a ellos o sean paquetes de
paso. Si la salida de traceroute contiene una o dos líneas de asteriscos (*) pero todo lo
demás parece estar bien, es probable que nos hayamos topado con uno de estos
sistemas.
tracepath es una alternativa a traceroute. Es similar en su funcionamiento básico, pero
genera una línea de salida por cada paquete de prueba, lo que produce una salida más
larga que traceroute. Además, tracepath dispone de menos opciones que traceroute.
Comprobar el estado de la red
netstat es la navaja suiza de las herramientas de red. Puede devolver información que no
se obtiene fácilmente de otras maneras, por ejemplo:
- Información sobre la interfaz: los parámetros –interface o -i dan información sobre
los interfaces de red similar a la que devuelve ifconfig. Hay versiones de netstat
que utilizan el mismo formato de salida que ifconfig, pero, normalmente, la
muestran de manera diferente.
- Información del enrutamiento: –route o -r permiten obtener un listado de la tabla
de enrutamiento similar al que muestra el comando route.
- Información de enmascaramiento: con los parámetros –masquerade o -M
obtendremos información sobre las conexiones en las que intervengan las
funcionalidades NAT de Linux (enmascaramiento de IP). NAT permite a un router
Linux “ocultar” una red tras una única dirección IP, lo que resulta bueno para