sebb.info
"Write programs that handle text streams, because that is the universal interface."
Creadores del sistema Unix.



IPActu.
Una puerta de acceso controlada para servidores sin IP fija. Método casero.


> La problemática
  Muchos tenemos en casa una ADSL con un pequeño firewall y un servidor de acceso público. Nos sirve generalmente para disfrutar de smtp, pop, webmail, ftp, ssh, una cuenta shell (Cómo no), samba, nfs, el entorno web de amule o cualquier otro servicio de red. Como nuestra IP es dinámica (Las fijas son caras, oye), solo queda una solución: acudir a servicios como DynDNS donde se obtiene un servicio de DNS fijo sobre ip dinámica (P. ej. algo.ath.cx). Sin embargo, estos servicios son públicos y a veces un poco lentos, o son de pago, claro. En cuanto a privacidad, si hemos puesto un servidor en las condiciones descritas, usar un redireccionamineto supone que damos a conocer a todo el planeta la ip de casa, lo cual no tiene que ser necesario o útil. Pues si necesitamos algo realmente público, tenemos a disposición servicios gratuitos de alojamiento web, ftp, correo, webmail y una infinidad de servicios más, hasta cuentas shell remotas gratuitas.

  La elección de abrir servicios en la ADSL doméstica no ha de corresponder siempre con el perfil de un servidor público de internet, como geocities entre los gratuitos o cualquier otro de pago. Si se quiere algo realmente público, y no tener un uso casi exclusivamente personal del montaje de casa, tanto DynDSN como IPActu lo permiten, pero si se busca un mínimo de control sobre el acceso a un sistema que no tiene como finalidad servir muchos clientes (O sea, un servidor para mí y allegados), solo IPActu lo permite.

> La propuesta
  Partiendo de esta idea, me propuse escribir un script sencillo para conseguir el objetivo sin depender de nadie, sin retraso, sin publicar nada más de lo que yo desearea. Es decir que tengo acceso al servidor de casa siempre que la web pública funcione (No es una restricción, pues puedo tener páginas publicadas en muchos servidores diferentes a la vez, por si acaso ;-). Así puedo dar o no dar, según me parezca, la URL de la página de acceso, o mejor aún, la clave para entrar a dicha página, manteniendo así la privacidad de los recursos domésticos.

  El esquema se puede presentar así:
  =Inicio=
  =1=> Los usuarios se conectan a una página protegida por contraseña, controlada con sesiones en php y ubicada en un servidor público con IP fija.
  =2=> Si los datos de conexión son válidos, se accede a una página que presenta el link que apunta a la IP dinámica de la ADSL privada.
  =3=> Al cliquear se llega al servidor privativo, a la vez que se desvincula de la pagina de acceso, destruyéndose la sessión php en el servidor público.
  =Fin=


> IPActu
  La primera versión de IPActu se escribió hacia el 2001. Lo he usado durante años para tener acceso a un servidor de correo con webmail que corría en un PII conectado a una ADSL con IP dinámica de terra. En una de mis numerosas mudanzas un disco duro se volvió recalcitrante y perdí el script. Lo he vuelto a escribir, ha quedado más sencillo que el original.

  IPActu se conecta periódicamente a una página fija de internet escrita en php, la cual usa la variable de entorno $REMOTE_ADDR que indica de qué IP viene la petición, es decir, cuál es la ip de la máquina de casa. El script recupera entonces esta IP y crea una página html con un link que apunta a dicha dirección, es decir la suya propia. Finalmente sube por ftp esta página al servidor fijo, sobreescribiendo la anterior. El resultado es que en el servidor público siempre hay un acceso a la máquina detrás de la ADSL, a pesar de los cambios de dirección IP de la ADSL. Ésta es mí página ip.php funcionando, con varios detalles más acerca de la conexión, y este es el contenido de la página:
IP: <? echo ($REMOTE_ADDR); ?>
IP x-forward: <? echo ($HTTP_X_FORWARDED_FOR); ?>
IP inversa: <? echo (gethostbyaddr ("$REMOTE_ADDR")); ?>
Nave: <? echo ($HTTP_USER_AGENT); ?>
Deande: <? echo ($HTTP_SERVER_VARS['HTTP_REFERER']); ?>

  IPActu me fue muy útil durante unos viajes de trabajo a Brasil en el 2001 para acceder a los recursos de mi despacho ubicado en España. El acceso estaba protegido con una clave y el pequeño servidor de la oficina en España (Donde corría IPActu) daba pop, smtp, webmail, apache, ftp y acceso al entorno web de amule. Era un PII 450 Compaq Intellistation Epro con 64MB de memoria y un disco scsi de 8GB, llamado Atalaya. Tenía instalado por entonces samba para guardar los archivos de emule y del ftp en otro disco de 60GB ubicado en un P-III bajo ruindos 98 en la lan de la oficina. Desde Brasil pudimos trabajar con facilidad con los recursos habituales de la oficina casi a mano. Lo utilizamos luego desde Londres y otras ubicaciones. Los usuarios de la oficina entran todavía a diario desde su casa para mirar el webmail gracias a IPActu y Atalaya, ahora un servidor Compaq Proliant ML530.

> ¿Bash?
  Sí, Bash. A parte de ser mi lenguage preferido en el día a día, es lo más sensato en un servidor: Bash siempre está instalado (En Debian por lo menos, y en las demás distribuciones lo instalo cuanto antes ;-), no se requiere nada más. Bash es lo que usa el sistema en la mayor parte de los scripts de arranque y de control o configuración de Linux. IPActu es muy sencillo y come poco recursos, no veo razones para escribirlo en otro lenguage.

  El script de Bash se ve al final de esta página, y está aquí con el resto de los archivos en un tar.

> Instalación
  La instalación es muy sencilla. Se necesita un poco de espacio en un servidor público cualquiera donde colgar el archivo ip.php y meter las páginas de actualización (Unos pocos KB).
  1- Se sube ip.php al servidor.
  2- Se configuran las valores de las variables en IPActu (Frecuencia de conexión, Dirección de correo, usuario del ftp, contraseña, etc)
  3- Se añade al final del archivo /etc/init.d/cron (u otro, pero el runlevel de cron hace que arranque entre los últimos scripts de init.d):
. /ruta/IPActu
  Ojo con el punto delante del comando...
  4- Se mete IPActu en el servidor local que está conectado a Internet por la ADSL en la "/ruta/" elegida y se hace:
~ su
Password:
# chmod 711 IPActu
  Mientras la máquina esté conectada a internet, el script actualizará automáticamente la IP, dándonos el acceso deseado a través de la web fija. Si lynx no está instalado, se puede cambiar en el script "lynx --source --accept_all_cookies" por "wget". Lo tengo con lynx porque es un programa que me gusta mucho. Se necesita también el comando "mail" para poder remitir errores. Tanto mail como wget suelen estar instalados en un servidor. Se puede desactivar el servicio mail quitando la tubería en la función EnCasoDeError:
 | mail -s "Error de actualización de IP. $mail_error
  Si se desea usar at para tener otro tipo de control (fechas o plazos), hay opciones preparadas al final del script.

  La página de acceso se llama acceso.html. IPActu también proporciona un histórico en línea de los cambios de IP en el archivo acceso.log.txt

> Mejoras
  En el tar está el archivo plantilla, que, como indica su elocuente nombre, sirve como plantilla de la página final que se publica con el acceso. Basta con editar el archivo plantilla según gustos, ahora mismo solo tiene el link necesario, no está implementado en este ejemplo el sistema de acceso con php.

> Consejo
  Recomiendo transformar el archivo plantilla para ofrecer primero una entrada más segura, con nombre de usuario y contraseña. Se puede realizar de manera muy sencilla con php. Una vez se hayan introducido los datos correctos, se presenta el link para acceder a la ip dinámica. Este sistema sencillón permite esconder la IP de la ADSL para evitar ataques y conexiones indeseadas, tanto de robots como de humanos. Eso vale también para el log, pues no tenemos porque publicar las diferentes IPs que hemos tenido; pero eso ya depende de cada uno.

> Futuros cambios
  No pienso tocar este script por el momento, hace muy exactamente lo que necesito, ni más ni menos. Si alguién lo usa y le añade funciones, me gustaría conocerlas si es posible. Hay un formulario para enviarme correo. Gracias.

> Licencia
  IPActu está bajo licencia GPL, como todos los demás scripts, programas o trucos de esta web.



  IPActu:
#!/bin/bash

#
# IPActu permite publicar la IP dinámica de
# un servidor sin recurrir a servicios de DNS.
#

# El presente script está cubierto por la licencia GPL.
# Por favor, conserve los encabezados si usa IPActu.

# IPActu suele instalarse en un servidor detrás de una ADSL
# que no tiene IP fija para publicar dicha IP en una página
# web alojada en un servidor público con IP fija. El acceso
# a los servicios alojados detrás de la ADSL se hace a
# través de la página fija.

# El sistema se compone de dos scripts: el presente
# script de Bash IPActu que corre en el servidor de
# la ADSL y el script ip.php alojado en el servidor
# con IP fija. IPActu pide la IP a ip.php, y si ésta
# ha cambiado desde la última solicitud, se prepara
# una página de acceso nueva con dicha IP que se sube
# por ftp al servidor fijo.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
# Copyright (C) Sébastien Braud 2001-2006 sebb@sebb.info

# #######################
# Las Variables
# #######################

# La dirección de correo que recibe los posibles errores.
# Mejor si no está en el mismo servidor que la página de
# actualización ($direccion), ya que en el correo de error
# se da la IP dinámica que no se ha conseguido publicar.
# Permite conocer la IP aunque no se haya publicado, por
# ejemplo si se cayera el servidor público.
mail_error="correo2@servidor2.com"

# La frecuencia (En segundos) con la que se controla la IP.
# Se aconseja entre 30 y 600.
espera=30

# URL del ftp en el servidor fijo
servidor_ftp="ftp.servidor_público.com"

# El nombre de usuario en el servidor fijo
usuario_ftp="mi_nombre_de_usuario"

# La contraseña del usuario en el servidor fijo
contra_ftp="mi_contraseña"

# Dirección y nombre de la página en el servidor
# fijo donde se encontrará el link actualizado
archivoActu="public_html/acceso.html"

# Dirección y nombre de la página en el servidor fijo
# donde se encontrará un histórico de los cambios de IP.
archivoLog="public_html/acceso.log.txt"

# La página fija que se usa para recuperar la IP dinámica.
direccion="http://www.servidor_público.com/ip.php"

# La fecha
ahora=`date`

clear

# Ayuda y GPL.
if [ "$#" -ne "0" ] ; then
  echo " # # # # # # # # # # # # # # #
- IPActu se usa sin ningún parámetro. Se aconseja incluirlo en
  los scripts de arranque de Linux, como /etc/init.d/ssh por ejemplo.

- Más información sobre IPActu en http://www.sebb.info/

- IPActu es código libre y se distribuye bajo licencia GPL.
"
else

# #######################
# Dos Funciones
# #######################

function ActualizaLaIP
{
# Subir las páginas actualizadas
ftp -n $servidor_ftp << deaquinopasas
user $usuario_ftp $contra_ftp
put Archivo_Actual $archivoActu
put log.IPActu.txt $archivoLog
quit
deaquinopasas
echo "La IP ha cambiado. IP Actual: $IPActual
"
}

function EnCasoDeError
{
# Se envía correo avisando del problema
echo "Error subiendo los archivos: $ahora.
Parece que no se puede conectar al servidor.
La IP ha cambiado a $IPActual.
" | mail -s "IPActu - Error de actualización." $mail_error
}
# #######################
# #######################

# Pedir la IP hasta traerla
until [ "$IPActual" != "" ]
do
	IPActual=`lynx --source --accept_all_cookies "$direccion" | grep "IP: " \
        | sed -e 's/<[^>]*>//g' -e 's/IP: //g'`
done

# Mirar si la IP ha cambiado desde la última actualización
grep $IPActual Archivo_Actual &> /dev/null

# Si la IP ha cambiado hay que reflejar el cambio online y hacer un log
if [ "$?" = "1" ] ; then
	# Cambiar la IP en el archivo que se va a subir
	sed -e  "s/.*Acceso:.*/<a href=\"http:\/\/"$IPActual"\">Acceso:<\/a>/g" plantilla > Archivo_Actual

	# Dar cuenta del cambio en el log
	echo "Cambio el $ahora - IP Nueva : $IPActual " >> log.IPActu.txt

	# Realizar cambios online o dar parte
	ActualizaLaIP || EnCasoDeError

# Para usar con "at":
# La frecuencia (En minutos) con la que se controla la IP. Se aconseja entre 1 y 5.
# frecuencia=1
# La unidad por defecto para la frecuencia. Puede ser minutes, hours, days o weeks. Siempre en plural.
# unidad=minutes
# at now + $frecuencia $unidad < ./IPActu
fi

# Se marca la pausa definida y se corre de nuevo IPActu
sleep $espera
./IPActu

fi

# FIN IPActu # #####################################



Primera publicación: 16 de Enero del 2006. Última actualización: 16 de Enero del 2006
El HTML40 cumple con las normas W3   La hoja de estilo CSS cumple con las normas W3