Capítulo 7
SLIP: IP por línea serie
Los protocolos de línea serie, SLIP y PPP, permiten a los "pobres" tener conexión a Internet. Solo se necesita un módem y un puerto serie con buffer FIFO. Utilizarlo no es mas complicado que usar un buzón, y cada vez existen mas proveedores que le ofrecen acceso telefónico IP a un coste asequible para todos.
En Linux hay controladores tanto de SLIP como de PPP. SLIP es más veterano y por tanto más estable. PPP para Linux ha sido recientemente desarrollado por Michael Callahan y Al Longyear; y se describirá en el próximo capítulo 1.
7.2 Utilización de SLIP
7.3 Utilización de dip
7.4 Funcionamiento en Modo Servidor
Para utilizar SLIP o PPP, hay que configurar algunas características de red que ya se han descrito en capítulos anteriores, por supuesto. Por lo menos, debe tener el interfaz de bucle (loopback) y el sistema de traducción de nombres. Cuando se conecte a Internet, querrá usar, por supuesto, el DNS. Lo más fácil es poner la dirección de algún servidor de nombres en el fichero resolv.conf; este servidor se usará tan pronto como SLIP conecte. Lo mejor es poner el servidor de nombres más cercano.
Sin embargo, esta solución no es la óptima, ya que las búsquedas de nombres seguirán yendo por la conexión SLIP o PPP. Si le interesa consumir menos ancho de banda, puede instalarse un servidor de nombres solo con cache. No requiere un dominio ya que solo actuará como relevo, es decir, pasará a otro servidor las peticiones que Vd. realice. La ventaja es que construirá una cache de modo que al pedir un nombre varias veces seguidas, solo se contactará con el servidor externo la primera vez. Un fichero named.boot que sirva para esto puede ser el siguiente:
; fichero named.boot para un servidor solo con cache
directory /var/named
primary 0.0.127.in-addr.arpa db.127.0.0 ; interfaz "loopback"
cache . db.cache ; servidores raiz
Además debe tener un fichero db.cache con una lista de servidores raíz válidos. Este fichero esta descrito al final del capítulo dedicado a la configuración del servidor de nombres.
_____________________________________________
1 N. del T.: Actualmente, podemos decir que PPP ya es suficientemente estable. De hecho, SLIP cada vez se utiliza menos
Los servidores de IP por teléfono suelen ofrecer servicios SLIP mediante cuentas de usuario especiales. Después de entrar en una cuenta no se entra en un interprete de comandos normal, sino en un programa o shell script que se ejecuta para activar el manejador SLIP del servidor y configurar la interfaz con la red. En ese momento tiene que hacer lo mismo en su máquina.
En algunos sistemas operativos, el manejador de SLIP es un programa de usuario, pero bajo Linux es parte del núcleo, cosa que lo hace mucho más rápido. Requiere, sin embargo, que la línea serie sea explícitamente convertida a modo SLIP. Esto se hace mediante una disciplina de línea especial llamada SLIPDISC. Mientras que un terminal (tty) esta en modo normal (DISC0), intercambiará datos solo con procesos de usuario, mediante las llamadas read(2) y write(2) habituales, y el manejador de SLIP no podrá escribir o leer del terminal.
En el modo SLIPDISC se cambian los papeles: ahora los programas de usuario no podrán acceder a la línea pero todos los datos que lleguen se pasaran al manejador SLIP.
El manejador de SLIP entiende por si mismo varias versiones del protocolo, incluyendo CSLIP, que realiza la llamada compresión de cabeceras de Van Jacobson en los paquetes IP salientes.2 Esto aumenta el rendimiento de las sesiones interactivas. Además, hay versiones de seis bits de estos protocolos.
Una forma fácil de convertir una línea serie a modo SLIP es usar la utilidad slattach. Suponiendo que tenemos un módem en /dev/cua3 y que se ha entrado correctamente en el servidor de SLIP, se deberá ejecutar:
# slattach /dev/cua3 &
_____________________________________________
2 La compresión de cabeceras de Van Jacobson se describe en el RFC 1441.
Esto cambiará el modo de línea de cua3 a SLIPDISC, y la enganchará a uno de los interfaces SLIP disponibles. Si es la única conexión SLIP se enganchará al interface sl1, si es la segunda, a sl2, etc. Los núcleos actuales soportan hasta ocho enlaces SLIP simultáneos.
La encapsulación por defecto que elige slattach es CSLIP. Puede elegirse otra con la opción -p. Para usar SLIP sin compresión deberá ponerse:
# slattach -p slip /dev/cua3 &
Otros modos son cslip, slip6, cslip6 (para la versión de 6 bits) y adaptive para SLIP adaptativo, que deja al núcleo averiguar que encapsulación de SLIP usa el otro extremo de la comunicación.
Observe que debe utilizarse el mismo sistema de encapsulación que use el otro extremo. Por ejemplo, si cowslip usará CSLIP, tendrá que usarlo Vd. también. El síntoma típico de una selección incorrecta es que la orden ping a una máquina remota no tendrá respuesta. Si la otra máquina le hace ping a Vd, recibirá mensajes del tipo "Can't build ICMP header" (no se puede construir la cabecera ICMP) en la consola. Una forma de intentar evitar este tipo de problemas es usar SLIP adaptativo.
De hecho, slattach no solo le permite activar SLIP, sino también otros protocolos serie como PPP o KISS (protocolo que se usa en packet-radio). Para mas detalle, vea el manual en línea de slattach(8).
Después de preparar la línea para SLIP, tendrá que configurar el interfaz de red. De nuevo, se hará esto mediante los programas estándares ifconfig y route. Suponiendo que desde la máquina vlager hemos llamado al servidor cowslip, se debería ejecutar:
# ifconfig sl0 vlager pointopoint cowslip
# route add cowslip
# route add default gw cowslip
El primer comando configura la interface como un enlace a cowslip punto a punto, mientras que el segundo y el tercero sirven para añadir la ruta correspondiente a cowslip como ruta por defecto y configurar esa máquina como pasarela de todos nuestros mensajes.
Cuando se quiera terminar el enlace SLIP, debe empezarse por eliminar todas las rutas a través de cowslip mediante el comando route con la opción del, desactivar el interface y enviar al proceso slattach la señal SIGHUP. Después de esto se deberá colgar el módem usando un programa de terminal de nuevo:
# route del default
# route del cowslip
# ifconfig sl0 down
# kill -HUP 516
Lo visto hasta ahora no es difícil de hacer. Sin embargo, puede que desee automatizar los pasos de modo que solo tenga que invocar un comando. El programa dip hace esto.3 La versión que existe en este momento es la 3.3.7. Ha sido parcheada por mucha gente, con lo que no podremos hablar simplemente del programa dip. Las modificaciones serán incorporadas en futuras versiones.
dip tiene un intérprete de un lenguaje script sencillo que puede manejar automáticamente el módem, convertir la línea a modo SLIP y configurar las interfaces. Es bastante restrictivo por lo simple que es, pero suficiente para la mayoría de los casos. Una nueva versión de este programa podrá traer una versión mas completa del lenguaje.
Para ser capaces de configurar el interfaz SLIP, dip necesita tener permisos de superusuario. Puede hacerse poniendo el programa con el bit setuid y de propiedad del usuario root, de modo que cualquier usuario sin privilegios podrá poner en marcha el programa.
Esto es, sin embargo, muy peligroso, ya que una configuración incorrecta del encaminamiento de dip puede estropear el encaminamiento de su red local. Además, dará a los usuarios la posibilidad de conectarse a cualquier servidor SLIP, y lanzar ataques peligrosos a la red.
Si aun quiere permitir a los usuarios activar conexiones SLIP, escriba pequeños programas para cada servidor de modo que cada uno invoque a dip con el script especifico. Estos programas pueden tener privilegios sin peligro.4
Un script de ejemplo se encuentra en la figura 7.1. Puede utilizarse para conectarse a cowslip invocando a dip de esta forma:
# dip cowslip.dip
DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93)
Written by Fred N. van Kempen, MicroWalt Corporation.
conectado a cowslip.moo.com with addr 193.174.7.129
#
# Script de dip para conectarse al servidor cowslip
# Preparar nombres local y remoto
get $local vlager
get $remote cowslip
port cua3 # selección de puerto serie
speed 38400 # poner velocidad maxima
modem HAYES # poner tipo de modem
reset # reiniciar modem y terminal (tty)
flush # limpiar buffer de respuesta del modem
# Prepararse para marcado.
send ATQ0V1E1X1\r
wait OK 2
if $errlvl != 0 goto error
dial 41988
if $errlvl != 0 goto error
wait CONNECT 60
if $errlvl != 0 goto error
# Ahora ya estamos conectados
sleep 3
send \r\n\r\n
wait ogin: 10
if $errlvl != 0 goto error
send Svlager\n
wait ssword: 5
if $errlvl != 0 goto error
send hey-jude\n
wait running 30
if $errlvl != 0 goto error
# Ahora ya estamos en la cuenta. Lancemos SLIP.print Conectado a $remote
with address $rmtip
default # Hacer que este enlace sea nuestra ruta por defecto
mode SLIP # Pasemos a modo SLIP
# en caso de error se ejecuta lo siguiente
error:
print Fallo de la conexión SLIP con $remote .
Figura 7.1: Un script de ejemplo para dip
_____________________________________________
3 dip significa Dialup IP y fue escrito por Fred van Kempen.
4 diplogin puede (y debe) ser ejecutado como superusuario. Vea la sección
del final de este capítulo.
Después de conectar a cowslip y activar SLIP, dip pasará a ejecutarse en segundo plano. Ahora puede conectarse a través del enlace SLIP mediante los programas habituales de red. Para terminar la conexión, ejecute dip con la opción -k. Esto enviará una señal de colgar al proceso dip, cuyo número se encontrará almacenado en el fichero /etc/dip.pid.5
# dip -k
En el lenguaje que interpreta dip las palabras precedidas con un signo de dólar se corresponden con nombres de variables. dip tiene un conjunto predefinido de variables que se listará a continuación. $remote y $local, por ejemplo, contienen los nombres de máquina local y remoto, respectivamente, involucrados en el enlace SLIP.
Las dos primeras sentencias del ejemplo son los comandos get, que sirven para establecer variables. Aquí, las máquinas local y remota han sido vlager y cowslip, respectivamente.
Las cinco sentencias que siguen preparan la línea serie y el módem. La palabra reset envía una cadena de reinicio al módem; que será el comando ATZ para módems compatibles con Hayes. La siguiente sentencia limpia el buffer de salida del módem, para conseguir que el diálogo de entrada (login y password) funcione correctamente. Este dialogo es extremadamente simple: llama al número 41988, que es el número de cowslip, entra en la cuenta Svlager mediante la clave de acceso hey-jude. El comando wait hace que se espere a la aparición de la cadena que sigue a esta orden, mientras que su segundo argumento especifica el tiempo de espera en segundos. Los comandos if sirven para ir comprobando la corrección del procedimiento de entrada en la cuenta.
Los comandos finales, ejecutados tras entrar en la cuenta, son default, que hace que el enlace SLIP sea la ruta por defecto para todos los destinos y mode, que pone la línea en modo SLIP y configura automáticamente el interface y la tabla de encaminamiento.
7.3.2 Guía de Referencia de dip
Aunque se utiliza mucho, dip aun no esta muy documentado. En esta sección, daremos una pequeña guía de referencia de los comandos de dip. Puede obtenerse un resumen de los comandos ejecutando dip en modo de prueba (opción -t), e introduciendo el comando help. Para obtener ayuda sobre un comando se debe ejecutar sin argumentos; por supuesto esto no funcionará con comandos que no tengan argumentos.
$ dip -t
DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93)
Written by Fred N. van Kempen, MicroWalt Corporation.
DIP> help
DIP knows about the following commands:
databits default dial echo flush
get goto help if init
mode modem parity print port
reset send sleep speed stopbits
term wait
DIP> echo
Usage: echo on|off
DIP> _
_____________________________________________
5 Vea el grupo alt.tla si desea conocer mas abreviaturas en Ingles que sean
palíndromas, como este caso.
En los siguientes apartados, los ejemplos que muestran el prompt DIP> indican como se introduciría el comando en modo prueba, y que salida produciría. Los ejemplos que no muestren este prompt deben tomarse como trozos de scripts.
Comandos del módem
Existe un conjunto de comandos de dip pensados para configurar la línea serie y el módem. Algunos son de uso obvio, como port, que sirve para elegir el puerto serie, y speed, databits, stopbits, y parity, que establecen los parámetros habituales de las líneas serie.
El comando módem selecciona el tipo de módem. Actualmente solo esta soportado el tipo HAYES 6. Debe decirse el tipo, pues si no dip se negará a ejecutar los comandos dial y reset. Este último comando envía la cadena de reinicio al módem, la cual depende del tipo de módem elegido. Para módems compatibles Hayes, esta cadena es ATZ.
La orden flush puede utilizarse para vaciar las respuestas anteriores de la memoria del módem. De otro modo, un script de dialogo con el módem podría fallar, porque lea la respuesta OK que proceda de órdenes anteriormente enviadas al módem.
El comando init selecciona la cadena de inicialización enviada al módem antes de marcar, que para módems Hayes es, por defecto, la cadena "ATE0 Q0 V1 X1", que activa el eco de los comandos, hace que el módem de los códigos de resultado en modo extendido (es decir, por palabras y no números de código) y selecciona marcado a ciegas, sin esperar tono de marcado.
El comando dial envía la cadena de inicialización al módem y llama al sistema remoto. El comando de marcado por defecto en los módems Hayes es ATD.
_____________________________________________
6 Deben respetarse las mayúsculas
Comandos echo y term
El comando echo on se usa con propósitos de depuración, ya que hace que dip copie en la consola todo lo que envíe al puerto serie. Puede desactivarse después con una orden echo off.
dip también puede salirse temporalmente a un modo terminal, de modo que Vd. pueda dialogar manualmente con el módem. Para ello se usa el comando term, y para salir de este modo se pulsa |Ctrl-]|.
Comando get
La orden get sirve para poner valores a las variables internas. Puede usarse como se vio en ejemplos anteriores, o bien de forma interactiva, añadiendo la palabra ask:
DIP> get $local ask
Enter the value for $local: _
Un tercer uso de este comando es intentar obtener el valor de la máquina remota. Aunque extraño pueda parecer, resulta útil en muchos casos: muchas veces el servidor SLIP no permite que nosotros nos pongamos cualquier dirección IP, sino que nos la asignará de un conjunto predeterminado y nos informará de ello mediante una frase tal como "Your address: 193.174.7.202" (Su dirección: 193.174.7.202). De esta frase querremos que dip ajuste automáticamente nuestra dirección IP, para lo que haremos lo siguiente (observar que se usa el parámetro remote):
... diálogo de entrada en la cuenta ....
wait address: 10
get $locip remote
Comando print
Este es el comando para enviar textos a la consola. Cualquier variable puede enviarse a la consola mediante comandos de este tipo, por ejemplo:
DIP> print Utilizando puerto $port con velocidad $speed
Utilizando puerto cua3 con velocidad 38400
Nombres de las variables
dip solo entiende un conjunto predefinido de variables. Un nombre de variable siempre empieza con un símbolo de dólar y debe escribirse en minúsculas.
Las variables $local y $locip contienen respectivamente el nombre de nuestra máquina y su dirección IP. Poniendo el nombre de la máquina, dip guardará dicho nombre en la variable $local, al tiempo que guardará la dirección IP en la variable $locip.
Las variables $remote y $rmtip hacen lo mismo pero con la máquina remota. Por otro lado, $mtu contiene el valor del MTU para la conexión actual.
Esas cinco variables son las únicas que pueden actualizarse mediante un comando get. Otras deben actualizarse mediante comandos específicos, aunque siempre pueden sacarse por pantalla con el comando print. Esas variables son $modem, $port, y $speed.
La variable $errlvl sirve para conocer el resultado del último comando ejecutado, siendo de valor 0 si fue bien, o distinto de 0 si hubo algún problema.
Comandos if y goto
El comando if es un salto condicional. Su sintaxis es
if variable oper número goto etiqueta
donde la expresión puede ser una simple comparación entre una de las variables siguientes: $errlvl, $locip, y $rmtip. El segundo operando debe ser un número entero; el operador oper puede ser uno de los siguientes: ==, !=, <, >, <=, y >=.
El comando goto lanza la ejecución a partir de la situación de la etiqueta, que debe ponerse al principio de una línea seguida de dos puntos.
Comandos send, wait y sleep
Estos comandos ayudan a implementar sencillos scripts de dialogo. send envía su argumento a la línea serie. No pueden ponerse variables, pero entiende secuencias de escape al estilo del lenguaje C, como \n y \b. El carácter de tilde (~) puede usarse como abreviatura del retorno de carro.
El comando wait hace que dip espere a que por la línea serie se reciba la palabra pasada como primer argumento. El segundo argumento, que es opcional, fija un tiempo de espera máximo, en segundos. Si la palabra no se recibe en ese tiempo, el comando fallará actualizando la variable $errlvl con el valor 1.
La orden sleep puede usarse para esperar cierto tiempo, por ejemplo para esperar pacientemente una invitación a entrar en la cuenta. Una vez mas, el tiempo se especificará en segundos.
Comandos mode y default
Se utilizan para cambiar el puerto entre modo SLIP o normal, y configurar la interface.
El comando mode es el último que ejecuta dip antes de pasar al segundo plano (daemon). A menos que suceda un error, de este comando no se retorna.
Este comando tiene un argumento, que es el protocolo. Actualmente se reconocen los protocolos SLIP y CSLIP, es decir, la versión actual de dip no soporta SLIP adaptativo.
Después de poner la línea en modo SLIP, dip ejecutará un comando ifconfig para configurar la interface como enlace punto a punto y otro route para cambiar las tablas de encaminamiento apuntando a la máquina remota.
Si, además, se ejecuta default antes que mode, el programa hará que el camino por defecto de nuestros paquetes vaya al enlace SLIP.
7.4 Funcionamiento en Modo Servidor
Curiosamente, configurar su máquina como servidor SLIP va a ser mucho más sencillo que configurarla como cliente.
Una forma de hacerlo es usar dip en modo servidor, que puede conseguirse si se ejecuta como diplogin. Su configuración principal se encontrará en /etc/diphosts, que asocia nombres de cuenta con direcciones de máquina asignadas. Alternativamente, puede usar sliplogin, una utilidad procedente de BSD que proporciona un esquema de configuración que le permite ejecutar shell scripts cuando las máquinas se conectan y desconectan. Actualmente, su desarrollo esta en fase beta.
Ambos programas necesitan que se tenga una cuenta por cada cliente SLIP. Por ejemplo, si proporcionáramos un servicio SLIP a Arthur Dent en dent.beta.com, debería crearse una cuenta dent añadiendo la siguiente línea al fichero /etc/passwd:
dent:*:501:60:Cuenta SLIP de Arthur Dent:/tmp:/usr/sbin/diplogin
Luego, se pondría la clave usando el programa passwd.
Ahora, cuando dent entre, dip entrará en modo servidor. Para comprobar si está autorizado para usar SLIP, buscará su nombre de usuario en /etc/diphosts. Este fichero detalla derechos de acceso y parámetros de conexión para cada usuario. Una entrada de este fichero será tal como:
dent::dent.beta.com:Arthur Dent:SLIP,296
El primer campo de los separados por dos puntos, es el nombre de la cuenta. El segundo campo puede contener una clave adicional (vea mas adelante). El tercero es el nombre o dirección IP de la máquina llamante. El siguiente es un campo informativo acerca del usuario, por el momento sin utilidad. Por ultimo, se describen separados por comas los parámetros de la conexión: el protocolo (SLIP o CSLIP) seguido del valor de MTU.
Cuando dent entra en su cuenta, diplogin extrae la información acerca de él y si hay clave de acceso en la línea correspondiente de /etc/diphosts, la pedirá como "clave externa de seguridad", que se compara con la existente en el fichero (que no va encriptada). Si no coinciden, el intento de entrada será rechazado.
En otro caso, diplogin procederá a cambiar el modo a SLIP o CSLIP, y preparará la interfaz y el encaminamiento. Esta conexión permanecerá hasta que el módem opuesto cuelgue, momento en que diplogin dejará la línea en modo normal y terminará.
diplogin necesita privilegios de superusuario. Si no tiene puesto el bit setuid, deberá copiar el programa con el nombre diplogin y ponerle a éste los privilegios. A diplogin se le pueden dar sin miedo, sin afectar al estado de dip en sí mismo.