La Gaceta de Linux ...¡ haciendo a Linux un poco más divertido !

Hey Amigo, ¿Dónde está mi Sistema?

Por Lew Pitcher

Traducción al español por Gustavo Conturzo
el día 27 de Marzo de 2005, para La Gaceta de Linux

Recientemente, cambié a una conexión ADSL[1] "siempre conectada" de una de marcado manual "a petición", y ahora tengo la oportunidad de hospedar un número de servicios de Internet desde mi servidor hogareño. El único problema que tengo es que, mientras mi Internet está "siempre conectada" mi ISP ocasionalmente renegocia la dirección IP de mi conexión ADSL, haciendo difíciles de encontrar mis servicios de Internet. Hasta ahora, he jugado a las "escondidas" con mi servidor, buscándolo entre una multitud de direcciones alternativas cada vez que mi ISP cambia la dirección.

Ahora, podría gastar un poco de dinero contratar mi propio nombre de dominio, y suscribirme a unos de esos servicios de "DNS dinámicos" que te permiten apuntar tu nombre de dominio en una dirección IP que nunca cambia, pero no necesito un dominio permanente por ahora, y tengo otras opciones.

Mi ISP provee alojamiento de sitios web para sus suscriptores, con los usuales topes de volúmenes de carga y descarga para poner freno al hospedaje de extensas webs. No necesito su hospedaje para mi contenido, pero esto hace un sitio de encuentro práctico para lograr acceder a mi sistema. Todo lo que hago es preparar mi cliente[3] PPPoE[2] para  volver a escribir mi página web personal en el servidor de mi ISP cada vez que mi ISP me da una nueva dirección IP. Si PPPoE puede poblar esa página web con mi nueva dirección IP del sistema, siempre seré capaz de encontrar mi sistema desde el exterior al mirar mi página web en el servidor de mi ISP.

Simple, si?

Simple, si!

La primera cosa que necesité hacer fue preparar mi cliente PPPoE  para que pueda pasar cada nueva dirección IP activa a algo que pudiera actualizar mi página web externa.

Para hacer esto, modifiqué mi script /etc/ppp/ip-up[4] para que ejecute un nuevo scritp  (/etc/ppp/ip-up.webpage), pasándole la dirección PPP 'local' asignada por mi ISP al final de mi conexión ADSL PPPoE. El script /etc/ppp/ip-up luego escribiría la página web y luego llegaría a mi ISP.

Esto fue un simple cambio (un "trazador de una línea" literal) in /etc/ppp/ip-up

#!/bin/sh
#
# ip-up interface-name tty-device speed local-IP remote-IP ipparm
# $1 $2 $3 $4 $5 $6
#
# (NB: ipparm es una cadena del parámetr ipparm en las opciones de pppd)
#
# El archivo /etc/ppp/ip-up es ejecutado por pppd cuando hay una
# conexión ppp satisfactoria.
#
# El entorno se limpia antes de ejcutar este script
# de modo que la ruta debe ser reiniciada.
#
PATH=/usr/bin:/usr/sbin:/usr/local/bin:/sbin:/bin
export PATH
#
umask 033
echo "$4" >/var/run/$1.ip
#
#
# Construir la página web redirigida, ponerla en el servidor web del ISP
/etc/ppp/ip-up.webpage "$4"
#

/usr/bin/logger -i -t /etc/ppp/ip-up "$1 [$4] connected to ISP [$5]"
# Done...

La Parte más Difícil

Ahora que preparé mi cliente PPPoE para ejecutar un script, tuve que construir el script que lo ejecutaría. El script tendría que construir un documento HTML que redireccionara al lector a la dirección IP de mi servidor, y transfiriera ese documento al servidor web de mi ISP. Tendría que conservar la seguridad interna de mi sistema al abstenerse de exponer mi identificador de usuario y contraseña de ISP a usuarios locales, y debería hacer esto con herramientas simples y un mínimo de programación.

Los aspectos de seguridad fueron satisfechos al hacer al script 'solamente ejecutable'[5], de modo que ningún usuario local pueda leer el contenido de éste, y al asegurar que ninguna contraseña sea expuesta a ps(1)[6,7] como un argumento de la línea de comandos. El HTML se construyó mediante un simple "documento aquí" (here document)[8] suministrado en un comando cat(1)[9] que creó un archivo HTML temporal. La nueva dirección IP se escribió en el HTML meidante el proceso de sustitución de variables del shell que ocurre con el procesamiento del "documento aquí". Finalmente, el archivo temporal se transmitió a mi ISP usando un comando ftp(1)[10] de la línea de comandos, con todos sus parámetros pasados a través de otro "documento aquí". Este segundo "documento aquí" me permitió pasar el nombre de usuario y contraseña en el cliente FTP sin exponerlos en una línea de comandos.

El script /etc/ppp/ip-up.webpage (abajo) es primitivo y no muy elegante, pero logra hacer el trabajo.

#!/bin/bash

# Validar que recibimos 1 y sólo 1 parámetro
case $# in
1) ;;
*) /usr/bin/echo Usage: $0 ip-address-or-dns-name
exit 1 ;;
esac
# el parámetro $1 es la dirección IP asignada a nuestro sistema

# Establecer la fecha de hoy (para el html)
DATE=`/usr/bin/date`

# asignar un archivo temporal vacío, terminar si no se puede asignar
TEMPFILE=`/usr/bin/mktemp /tmp/$1=XXXXXX` || exit 2

# construir la página web html (redireccionar) en el archivo temporal
# NB: $1 es nuestra dirección IP local, pasada adentro de ip-up
# $DATE es la fecha y hora actual
# Con el "documento aquí", estas variables serán
# sustituidas dentro del flujo por el shell
/usr/bin/cat >$TEMPFILE <<END
<html>
<head>
<!-- $DATE -->
<meta http-equiv="refresh" content="0;url=http://$1/">;
</head>
</html>
END

# enviar la página web (redirigir el html) al servidor web
# ISP_ADDRESS es la dirección FTP del servidor web del ISP
# ISP_USERID es mi identificador de usuario en el servidor FTP del ISP
# ISP_PASSWD es mi contraseña en el servidor FTP del ISP
# NB: ISP_USERID, ISP_PASSWD puestas como variables de entorno local
# de modo que no aparecen como parámetros
# en listados 'ps ax' locales
# Con el "documento aquí", estas variables serán
# sustituidas dentro del flujo por el shell
ISP_ADDRESS=webserver.isp.com
ISP_USERID=username
ISP_PASSWD=password

/bin/ftp -n <<STOP
open $ISP_ADDRESS
user $ISP_USERID $ISP_PASSWD
ascii
put $TEMPFILE index.htm
bye
STOP

# eliminar el archivo temporal
/bin/rm -f $TEMPFILE

# terminar
exit 0

Olé-olé, piedra libre!

Ahora, cuando mi ISP cambia mi dirección IP, mi servidor PPPoE invoca a /etc/ppp/ip-up, dándole mi nueva dirección IP. Este script invoca mi script /etc/ppp/ip-up.webpage, que construye e instala una página web redirigida al servidor web de mi ISP que apunta a mi nueva dirección IP. Todo lo que yo tengo que hacer es navegar una página web específica del servidor web de mi ISP, y seré redirigido a mi página web en mi servidor.

Así, con un pequeño script, y la automatización residente en mi sistema Linux, tengo ahora una forma de encontrar mi servidor desde el exterior, sin importar qué dirección IP le da mi ISP. Supongo que podrías decir que mi servidor ha dejado el juego de las "escondidas", y está jugando otro juego ahora.


Notas a pié de página

[1] - ADSL
ADSL (o "Asymmetrical Digital Subscriber Line" - "Línea Asimétrica del Suscriptor Digital") es una tecnología que permite a un ISP ofrecer conectividad a Internet de alta velocidad sobre líneas de teléfonos regulares sin impactar el uso regular de la línea telefónica. En otras palabras, puedo navegar por Internet mientras mi esposa charla con sus amigas por teléfono.

[2] - PPPoE
PPPoE (o "PPP over Ethernet") es un protocolo de bajo nivel que algunos ISPs utilizan para repartir conectividad  TCP/IP en líneas ADSL. Puesto que PPPoE utiliza PPP (el servicio 'dial up' regular) para administrar la conexión ADSL, todas las facilidades y herramientas de administración trabajan con una línea ADSL que permite PPPoE. Esto incluye cosas como el script /etc/ppp/ip-up.

[3] - mi cliente PPPoE
es el demonio PPPoE "Roaring Penguin" que se puede encontrar en http://www.roaringpenguin.com/penguin/open_source_rp-pppoe.php. En la distribución de Linux Slackware 9.0 que ejecuto, el demonio PPPoE Roaring Penguin PPPoE está contenido en el paquete  rp-pppoe-3.5-i386-1.tgz. Sin embargo, para usar este demonio PPPoE, también necesitas un demonio PPP; Slackware 9.0 utiliza el demonio ANU PPP que se encuentra en ftp://cs.anu.edu.au/pub/software/ppp/, y en el paquete de Slackware ppp-2.4.1-i386-2.tgz.

[4] - /etc/ppp/ip-up
El script /etc/ppp/ip-up es ejecutado por el demonio PPP siempre que éste establece un entorno TCP/IP sobre el enlace PPP. Varios parámetros se dan al script ip-up, incluyendo la dirección IP asignada al final de nuestra conexión PPP. Yo uso este script para disparar la construcción de la página web que logra ubicarse en el servidor de mi ISP, y uso la dirección IP proporcionada en los contenidos de la página web.

[5] - "sólo ejecución"
Los scripts, al igual que otros archivos ejecutables, pueden ser establecidos para que sean ejecutables sin ser de lectura al usar el comando "chmod ug=x nombre_del_script". Quiero esto porque no quiero que los usuarios en mi sistema puedan husmear a través del texto para encontrar mi usuario y contraseña.

[6] - notación xx(y)
La notación antigua de Unix que indica que la documentación para el tópico xx se puede encontrar en la sección y del manual impreso o en línea. La mayoría de los usuarios de Linux pueden leer esta documentación usando la sintaxis "man y xx" desde la línea de comandos, como en "man 1 ps".

[7] - ps(1)
ps lista las particularidades de todos los procesos en ejecución. Si se dan las opciones correctas, mostrará la línea de comandos completa usada para invocar al proceso. Yo evito poner nombres de usuarios y contraseñas en las líneas de comandos ya que alguien podría husmear al ejecutar ps en el momento adecuado. Llámenme paranoico, pero incluso los paranoicos tienen enemigos. ;-)

[8] - "documento aquí"
Un "documento aquí" es una forma especial de redirección que enruta texto incrustado en un script directamente dentro de la entrada de un programa. El shell puede ejecutar expansión de parámetros, sustitución de comandos, y sustitución aritmética sobre los contenidos del "documento aquí" antes de que el texto resultante sea dado al programa. Esto hace al "documento aquí" ideal para mi uso, porque puede tener el shell hecho a la medida del texto cuando sea necesario sin depender de complejos comandos de editor.

[9] - cat(1)
cat es una utilidad que concatena archivos juntos, y saca al acrhivo resultante a stdout (la salida estándar). Si ningún archivo de entrada es nombrado, cat leerá su entrada desde stdin (la entrada estándar). Esta característica hace que cat sea un práctico, pero mudo, editor de textos, y es como lo uso aquí.

[10] - ftp(1)
El cliente FTP de la línea de comandos trabaja en su entorno, pero habría sido mejor si tuviese algo de aptitud para los scripts. Yo uso un "documento aquí" para pasar en los comandos FTP, así es como evito exponer la contraseña de acceso de mi ISP en la línea de comandos. Sin embargo, con el acceso del "documento aquí", el cliente ftp(1) no abortará la interacción si un comando FTP es erróneo, y no hay forma de detectar o actuar sobre la falla de un comando desde adentro del "documento aquí". Así que tomo la opción de que el script FTP trabajará todas y cada una de las veces sin fallar.

 


[BIO]Canadiense de nacimiento, y viviendo en Brampton, Ontario, soy un profesor de carrera que trabaja en un importante banco de Canadá. Por más de 25 años, he programado en todos las especies de sistemas, desde el Z80 CP/M hasta OS/390. Principalmente, desarrollo aplicaciones OS/390 MVS para servicios bancarios, y he incorporado Linux en mi desarrollo.

Copyright © 2004, Lew Pitcher. Publicado bajo los términos de la Open Publication license

Publicado en el Número 105 de la Gaceta de Linux, Agosto de 2004