Página siguiente Página anterior Índice general

14. Comunicar

14.1 UUCP y modem

UUCP (UNIX to UNIX CoPy) permite transmitir ficheros y ejecutar ciertas órdenes en una máquina remota en forma de lotes. Este sistema permite también transmitir correo, noticias y ficheros.

De hecho, este protocolo permite efectuar una transferencia de ficheros y ejecutar ciertas órdenes en función del tipo de fichero (por ejemplo rmail y rnews). Esto permite a una máquina no conectada permanentemente a Internet tener acceso a la mensajería y a los grupos de discusión.

Aunque este protocolo tiene más de veinte años, siempre está bien adaptado. Un ejemplo: aunque esté en estos momentos en los E.E.U.U., recibo todas mis noticias así como la mayoría de mi correo via UUCP desde Francia (sobre una conexión TCP/IP).

Antes de continuar, supongo que ha instalado el paquete Taylor UUCP, un lector de correo electrónico (elm, mutt, etc.), sendmail. Para las noticias, inn como servidor de noticias y un lector de noticias.

Bueno, UUCP necesita varios archivos de configuración que se encuentran en /etc/uucp (las rutas de acceso pueden variar de una instalación a otra). Si tiene una configuración basada en HDB, el paquete Taylor contiene una herramienta que permite efectuar una conversión automática de los ficheros. Funciona muy bien.

Ahora el sistema está configurado. Solo resta probarlo... Para visualizar la configuración puede utilizar la órden uuchk.

Solo nos queda configurar el servidor para que acepte las conexiones UUCP (demonio uucico):

Bien entendido, nada impide una mezcla de todas las formas.... En todo caso, si necesita referencias más amplias, consulte la documentación proporcionada con el paquete Taylor. Existe además un excelente libro de O'Reilly sobre UUCP. Es un poco la biblia del género, no dude pues en enfrascarse en su lectura.

14.2 Llamadas entrantes

Bueno. En el punto en que estamos, puede llamar; Ahora, vamos a configurar la máquina para que pueda ser llamada. Todo se configura en el archivo /etc/inittab.

Quitar los comentarios a una línea, por ejemplo :

s1:45:respawn:/sbin/agetty -h -t 60 9600 modem
|   |    |                  |    |    |     |--- Puerto a utilizar
|   |    |                  |    |    |--------- Velocidad del modem
|   |    |                  |    |--- Tiempo al cabo del cual cuelga
|   |    |                  |-------- Activa el control de flujo rts/cts
|   |    |------------- Relanzar cuando se termine
|   |------------------ Runlevels.
|---------------------- Identificador
Entonces la próxima vez que se arranque, un sistema de login estará preparado en el puerto /dev/modem (el puerto serie al cual está conectado el modem). El último problema es configurarlo. En efecto, esto depende del modem (configuración de la velocidad). Si puede posicionar algunos switch, haga que el modem se vuelva mudo (ATQ2) y sobre todo, póngalo en auto-respuesta (ATS0=1).

Si no tiene switches haga un AT&W para salvaguardar los parámetros.

Para verificar la configuración utilice usrlibuucp/uuchk/.

Si quieres más información le aconsejo que lea el HOWTO-UUCP.

14.3 PPP

El objeto de este apartado es la instalación de una conexión PPP.

Introducción

PPP (Point to Point Protocol) permite establecer una conexión IP en una línea serie de manera más eficaz que SLIP (Serial Line Internet Protocol). Una vez la conexión establecida todos los protocolos superiores a IP ((TCP, UDP, ICMP y todos los servicios asociados: FTP, telnet, NFS, http, X ...) están disponibles. Es también posible utilizar IPX.

Para establecer una conexión PPP, se necesita :

PPP es comprendido por un gran número de sistemas ( hasta MS-Windows) y normalmente nos podemos conectar de un sistema al otro. ¡ Sin embargo esta documentación solo trata el caso de Linux !

Acceso a un servidor PPP

Par acceder a un servidor PPP instalado, el núcleo debe ser compilado con la opción TCP/IP. Para esto, cuando haga make config tiene que responder así :

  Networking support (CONFIG_NET) [y] y
  TCP/IP networking (CONFIG_INET) [y] y
  IP forwarding/gatewaying (CONFIG_IP_FORWARD) [y] n
  Network device support? (CONFIG_NETDEVICES) [y] y
  PPP (point-to-point) support (CONFIG_PPP) [y] y
Además tiene que cargar las fuentes de los programas de acceso a PPP (en el archivo ppp-2.1.2a.tar.gz, ver b, c o d) para poder instalar los siguientes programas :

Puede por ejemplo instalar pppd y chat en el directorio /usr/sbin.

Luego, tiene que configurar los shell-scripts de arranque para configurar la capa TCP/IP (por ejemplo en un archivo /etc/rc.d/rc.net que será lanzado por /etc/rc.d.rc.local). He aquí un ejemplo :

echo -n "/etc/rc.net: "
INETD=/sbin/inetd
PORTMAP=/sbin/portmap

# loopback
/sbin/ifconfig lo 127.0.0.1 up netmask 255.255.255.0
/sbin/route add 127.0.0.1 lo

# demarrage des demons

if [-x $PORTMAP ]; then
        echo-n ", `basename $PORTMAP`"
        $PORTMAP
fi

if [-x $INETD ]; then
        echo -n ", `basename $INETD`"
        $INETD
fi

echo ""

Luego hay que agregar la dirección IP de la máquina en el archivo /etc/hosts :

       127.0.0.1          loopback localhost      # alias útiles
       199.103.124.170    pcpf.lectra.fr pcpf    # Mi lindo PC en PPP

La dirección IP de la máquina es aquella que el administrador del servidor PPP le ha asignado para la conexión asociada a un numero de teléfono dado. Esto significa que el amigo que se conecta 10 minutos después utilizará la misma dirección que nosotros.

Finalmente, debe configurar el dominio en el archivo /etc/resolv.conf :

   domain lectra.fr
   nameserver 192.1.2.1

La segunda linea sirve para utilizar un servidor de nombres, cacharro que envía la dirección IP correspondiente a un nombre de máquina dado. Si no posee un servidor de nombres, solamente podrá utilizar direcciones numéricas (199.103.124.x) sino deberá poner en /etc/hosts todas las máquinas a las cuales quiere acceder con sus direcciones IP...

Igualmente puede poner su nombre de dominio en el archivo /etc/ppp/options que debe existir aunque sea vacío (si no quiere que pppd pida /etc/ppp/options, tiene que compilarlo con la opción-DREQ_SYSOPTIONS=0)

Ahora puede febrilmente hacer un test de la conexión utilizando un shell-script de este estilo (Cuidado : todo esto es una sola línea) :

  /usr/sbin/pppd connect '/usr/sbin/chat -v ABORT ERROR ABORT "NO CARRIER" \
  ABORT BUSY "" ATB0 OK ATDTxxxxxxxx CONNECT "" ogin: ppp \
  word: ppp0' /dev/modem 9600 -detach debug crtscts modem \
  defaultroute 199.103.124.170:

La orden chat permite efectuar la conexión llamando al número de su servidor. Cuidado no olvide la segunda línea, en particular modem y defaultroute.

La especificación de la velocidad (9600) así como el chat-script utilizado (ABORT ERROR ABORT "NO CARRIER" ABORT BUSY "" ATB0 OK ATDTxxxxxxxx CONNECT) dependen de su modem y de la configuración del servidor (ver igualmente el login y el password).

La dirección IP debe ser aquella declarada como dirección IP de la máquina en PPP, en /etc/hosts (igualmente puede poner el nombre de la máquina en PPP)

La información de depurado debe salir en la consola (si ha configurado el fichero /etc/syslog.conf para esto)

A partir de ese momento, estas conectado a la red remota y puede hacer por ejemplo :

    $ ping 199.103.124.50
    PING 199.103.124.50 (199.103.124.50): 56 data bytes
    64 bytes from 199.103.124.50: icmp_seq=0 ttl=255 time=268 ms
    64 bytes from 199.103.124.50: icmp_seq=1 ttl=255 time=247 ms
    64 bytes from 199.103.124.50: icmp_seq=2 ttl=255 time=266 ms
para hacer un test de la conexión. Si el ping funciona y la red está conectada a Internet entonces ya tiene Internet.

Si eso no funciona, puede hacer un test escribiendo /sbin/ifconfig y el resultado debe parecerse a esto :

  lo        Link encap Local Loopback
            inet addr 127.0.0.1  Bcast 127.255.255.255  Mask 255.0.0.0
            UP LOOPBACK RUNNING  MTU 2000  Metric 1
            RX packets 0 errors 0 dropped 0 overrun 0
            TX packets 0 errors 0 dropped 0 overrun 0

  ppp0      Link encap Serial Line IP
            inet addr 199.103.124.170  P-t-P 199.103.124.50  Mask 255.255.255.0
            UP POINTOPOINT RUNNING  MTU 1500  Metric 1
            RX packets 33 errors 0 dropped 0 overrun 0
            TX packets 42 errors 0 dropped 0 overrun 0
Sobre todo tiene que tener una línea que comience por ppp0 sino, hay algún problema. Igualmente puede hacer un test con netstat -nr que debe dar una cosa así mas o menos :
  Kernel routing table
  Destination     Gateway         Genmask         Flags Metric Ref Use    Iface
  199.103.124.50  0.0.0.0         255.255.255.255 UH    0      0        6 ppp0
  127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
  0.0.0.0         199.103.124.50  0.0.0.0         UG    0      0     6298 ppp0
Con una linea 0.0.0.0 que tenga la dirección IP del servidor PPP. Si no tiene esta linea, puede que haya olvidado la opción defaultroute.

Configuración de un servidor PPP

Para eso, debe instalar los mismos programas del capitulo anterior (configurar el núcleo, instalar pppd). Ademas de esto, debe crear un login especial para las conexiones PPP en /etc/passwd, por ejemplo :

  ppp::61:60:Conexión PPP:/:/usr/bin/ppp_login

El script /usr/bin/ppp_login es :

  #!/bin/sh
  # Conexión PPP --> dirección IP = 199.103.124.170
  exec /usr/sbin/pppd -d -detach -ip modem proxyarp :199.103.124.170
La opción proxyarp permite a la máquina conectada tener acceso a toda la red :
 199.103.124.170                   199.103.124.50
+-----------+      PPP link       +----------+
|   pcpf    |-------------------- |  ondee   |
+-----------+                     +----------+
                                       |           Ethernet
               ----------------------------------- 199.103.124.x

Bibliografía

Para más información ver el archivo README.linux del ppp-2.1.2a.tar.gz. Nota : este archivo se encuentra normalmente en el directorio /usr/doc.

14.4 Una red detrás de una sola dirección

Una pregunta común es : " Tengo un acceso Internet pero una sola dirección IP y quisiera conectar varias máquinas".

El NET3-HOWTO responde a esta pregunta pero olvida una posibilidad. Esta nota tiene por objetivo, explicar las cuatro maneras de resolver el problema.

14.5 Sendmail

La configuración de sendmail es siempre algo particularmente trabajoso y difícil. Sin embargo, ciertas herramientas facilitan enormemente las cosas. Las distribuciones poseen ciertos archivos, que pueden ser una solución. De todas maneras es más sano reinstalar el archivo de configuración basándose en los siguientes documentos :

14.6 Configuración del correo durante una conexión con un proveedor

Los proveedores reciben los mensajes y los ponen a disposición del usuario via un servidor POP (en general mail.proveedor.pais o pop.proveedor.pais ) Tiene que recuperar los mensajes recibidos por ese servidor hacia la máquina Linux en /var/spool/mail/usuario.

Para esto puede utilizar el programa fetchmail

He aquí un ejemplo de fichero .fetchmailrc :

# Recuperación  de mi correo desde mi proveedor 1
poll mail.proveedor.pais protocol POP3:
        user UsuarioServidorPop has password ContraseñaServidorPop is NomLocal here
        fetchall

# Recuperación  de mi correo desde mi proveedor 2
poll mail.proveedor2.pais protocol POP3:
        user UsuarioServidorPop2 has password ContraseñaServidorPop2 is NomLocal here
        fetchall

Puede utilizar también el programa gwpop de Stephane Bortzmeyer. Se encuentra en : ftp://ftp.pasteur.fr/pub/Network/gwpop.

En este script, definir :

  $mailhost = "mail.proveedor.pais";
  $deliver= "deliver NombreUsuarioLocal ";

Una vez esté conectado, lance via un script (para que no tenga que escribir todo cada vez) :

  gwpop -p ContraseñaServidorPop UsuarioServidorPop

Una vez recibido el correo, la cuestión es saber como enviarlo.

Deux méthodes sont couramment utilisées dans le monde unix pour créer le fichier sendmail.cf nécessaire.

Se utilizan normalmente dos métodos en el mundo unix para crear el fichero sendmail.cf necesario.

14.7 Uso del Kit de Jussieu

Recompile e instale la última versión de sendmail

He aquí el archivo de reglas que hay que indicar con el kit sendmail de Jussieu :

  #!/bin/sh
  #
  # Reglas para el dominio lolonet
  #
  Domaine="MiNombredeDominioConUnPunto"
  AdressesInternes=RIEN
  V8="o"
  Aliases="/etc/aliases"
  SendmailSt="/etc/sendmail.st"
  SendmailHf="/usr/lib/sendmail.hf"
  Mqueue="/var/spool/mqueue"
y el archivo de config. :
  #!/bin/sh
  Host="NombreDeMimáquina"
  AdressesLocales=TOUT_DOMAINE
  RelaisExterieur="smtp.[mail.provedor.pais] "
  ReecritureadressesLocales=$Domaine
  RevAliases="hash -N /etc/revaliases"
  MailerLocal='/usr/bin/procmail lsSDFMhPfn procmail -Y -a $h -d $u'

Se utiliza el programa procmail como lector de correo local. Este programa permite a cada usuario filtrar automáticamente los mensajes recibidos por medio de reglas especificadas en el fichero .procmailrc de su $HOME.

Luego sólo necesita quitarle el comentario a la línea siguiente :

  CPP="$CPP -traditional"

Y luego generar el archivo de config :

./configurateur regles.lolonet Maquina.config >sendmail.cf.Maquina

y copiar el archivo generado a /etc/sendmail.cf.

14.8 Uso de m4

Puede conservar el sendmail suministrado en su distribución, pero le recomiendo encarecidamente que compile usted mismo la última versión disponible.

Encontrará en el directorio sendmail-ver/cf/cf una lista de ficheros .mc predefinidos... Puede basarse en ellos, en el fichero sendmail-ver/cf/README y en el fichero sendmail-ver/doc/op/op.me para crearse un fichero linux.mc a su conveniencia.

He aquí un ejemplo comentado basado en la siguiente configuración:

Este documento presenta una de las posibilidades de sendmail que permite definir un agente de correo particular como costoso. Otra opción para decirle a sendmail que guarde en espera los mensajes utilizando tales medios es definir el agente de correo smtp como costoso para ver como todos los mensajes con destino el exterior se quedan en cola hasta que los cazamos explícitamente con un sendmail -q, colocado por ejemplo en el guión /etc/ppp/ip-up para una conexión PPP.

divert(-1)
#   linux.rtc.mc, version dialup
#   Copyright (C) 1998 Jean Charles Delépine
#
#   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
#   (at your option) 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.
#
divert(0)
include(`../m4/cf.m4')dnl Carga de macros generales...
dnl
VERSIONID(`@(#)linux.rtc.mc, 0.6 (Delépine) 14/08/1998')dnl
dnl
dnl ********************************************************************
OSTYPE(linux)dnl
dnl
dnl A priori activaremos esta linea bajo Linux, que únicamente define
dnl un agente de correo local que nos apresuraremos a redefinir, pero es mejor
dnl dejarlo en caso de que las futuras versiones de sendmail añadan
dnl nuevas funcionalidades.
dnl
dnl ********************************************************************
DOMAIN(generic)dnl
dnl
dnl el dominio 'generic' define los nombres de .forward, la característica 'redirect'
dnl y el uso de sendmail.cw
dnl
GENERICS_DOMAIN(mi.propio.dominio midominio)
dnl
dnl define la clase de dominios influenciadas por las genericstables
dnl utilizadas más abajo. Introducir todos los nombres que nuestro servidor
dnl pueda utilizar según las herramientas utilizadas (pine, netscape, mail...)
dnl
dnl ********************************************************************
dnl
FEATURE(always_add_domain)dnl
dnl
dnl me gusta recibir mi correo local con la dirección reescrita.
dnl
FEATURE(masquerade_envelope)dnl
dnl
dnl para que el 'from' de la cabecera sea correcto... es esta dirección
dnl la que será usada por los servidores smtp que enlazan con nuestros
dnl destinatarios para prevenirnos en caso de problemas (user unknown, ...)
dnl
dnl ********************************************************************
FEATURE(local_procmail)dnl
dnl
dnl Por defecto el agente de correo local para Linux es mail.local, prefiero
dnl procmail dado que mail.local no es suministrado generalmente con
dnl las distribuciones actuales de Linux (puede encontrarse en los paquetes
dnl de fuentes de sendmail).
dnl
dnl ATENCION, procmail está ubicado en /usr/local/bin pero si no lo ha
dnl compilado usted mismo estará en /usr/bin... si
dnl este es su caso, quite el comentario de la línea siguiente.
dnl
dnl FEATURE(local_procmail,``/usr/bin/procmail'')dnl
dnl
dnl ********************************************************************
FEATURE(genericstable,``hash -N /etc/revaliases'')dnl
dnl
dnl un FEATURE(genericstable) sería suficiente pero quiero ser coherente
dnl con la solución "Kit de Jussieu" proporcionada anteriormente,
dnl renombro pues /etc/genericstable como /etc/revaliases
dnl Es en este fichero donde definiremos las reglas de transcripción
dnl de direcciones entre dirección local -> dirección proveedor.
dnl ej: fulano@mi.propio.dominio -> nombre.apellidos@proveedor.pais
dnl
dnl ********************************************************************
FEATURE(nocanonify)dnl
dnl
dnl No queremos canonizar los dominios de los mensajes a enviar.
dnl
dnl
dnl ********************************************************************
dnl define(`confDOMAIN_NAME',`ppp.proveedor.pais')dnl
dnl
dnl DEfine el nombre que anunciará sendmail por EHLO a los otros
dnl servidores SMTP...
dnl Puede poner lo que quiera aquí pero considero más limpio
dnl anunciar su verdadero nombre (que los servidores serios
dnl indicaran de todas formas en las cabeceras).
dnl Si dispone de una dirección IP fija, ponga aquí el nombre DNS
dnl asociado a esta dirección en una conexión PPP.
dnl
dnl Si su proveedor de acceso utiliza direcciones dinámicas,
dnl remítase a la sección
dnl "Que hacer en caso de asignación dinámica de la dirección IP"
dnl
dnl ********************************************************************
define(`confDEF_CHAR_SET', `ISO-8859-1')dnl
dnl
dnl para que el destinatario sepa como leer nuestros 8bit
dnl
dnl ********************************************************************
define(`confCON_EXPENSIVE',`True')dnl
dnl
dnl Lo que cuesta caro debe esperar un 'sendmail -q'
dnl
dnl ********************************************************************
define(`confCOPY_ERRORS_TO', `Postmaster')dnl
dnl
dnl Se debe enviar una copia de los mensajes de error al Postmaster
dnl
dnl ********************************************************************
define(`confME_TOO', `True')dnl
dnl
dnl Para que los mensajes enviados a una lista local sean tambien
dnl enviados al autor
dnl
dnl ********************************************************************
define(`SMART_HOST', `smtp8:[mail.proveedor.pais]')dnl
dnl
dnl No es a mi a quien le toca negociar con la otra punta del mundo.
dnl Delego pues esta tarea al servidor de mi FAI.
dnl Se utiliza smtp8 para enviar los acentos en 8 bits sin pasar por
dnl el quoted unreadable. Atención, consideramos aquí que
dnl mail.proveedor.pais dispone de un MTA correcto que acepta los mensajes
dnl en 8 bits (osea la mayoría, si no todos los proveedores de acceso)
dnl
dnl ********************************************************************
define(`SMTP_MAILER_FLAGS', `e')dnl
dnl
dnl El indicador 'e' indica 'expensive' (caro) : smtp cuesta caro !
dnl
dnl ********************************************************************
dnl
MAILER(local)dnl
MAILER(smtp)dnl
dnl
dnl Definición de los agentes de correo que serán utilizados.
dnl
dnl ********************************************************************

coloque su linux.rtc.mc modificado en el directorio sendmail-ver/cf/cf y lance la orden :

m4 < linux.rtc.mc > sendmail.cf

14.9 Una vez generado sendmail.cf...

Copiarlo en /etc.

Es necesario definir la dirección IP del servidor SMTP en el fichero /etc/hosts.

A partir de las versiones 8.7 de sendmail (si su versión es anterior : ¡cámbiela!) sendmail utiliza los service switch sobre los sistemas que lo soportan (Ultrix, Solaris, OSF/1, linux-libc6...) e implanta el mismo estos servicios via el fichero /etc/service.switch sobre los demás sistemas (SunOS, HP-UX, BSD, Linux-libc5, ...)

Si sus sistema utiliza la Glibc2 (RedHat 5.x, Debian 2.0,...) deberá utilizar un fichero /etc/nsswitch.conf como el que sigue:

     # /etc/nsswitch.conf
     #
     # Name Service Switch configuration file.
     # Atencíon: si utiliza los servicios NIS o NIS+,
     # deberá adaptar el contenido de este fichero.

     passwd:     files
     shadow:     files
     group:      files

     # Queremos que el fichero /etc/hosts sea visitado el primero
     # Ponga especial cuidado de dejar una referencia al servicio de nombres (DNS)
     # o no podrá seguir utilizando las herramientas de red compiladas con libc6 !

     hosts:      files dns

     networks:   files

     ethers:     files
     protocols:  files
     rpc:        db files
     services:   files

Si utiliza aún la libc5, el fichero /etc/host.conf no es tenido en cuenta por sendmail y deberá utilizar un fichero /etc/service.switch que contenga como única línea:

hosts files

De esta forma, cuando sendmail busque nuestro relé smtp, irá directamente a mirar al fichero /etc/hosts si preocuparse del DNS.

Finalmente, hay que reescribir la dirección local para que los mensajes enviados tengan un campo From correspondiente a la dirección suminstrada por el proveedor. Es suficiente añadir en /etc/revaliases una línea de este estilo:

NomLocal:       NombreProveedor@roveedor.pais

Le recomiendo añadir también las distintas direcciones que su servidor pueda utilizar para comunicar con el resto del mundo:

root:           NombreProveedor@roveedor.pais
news:           NombreProveedor@roveedor.pais
postmaster:     NombreProveedor@roveedor.pais
Le-chat:        NombreProveedor@roveedor.pais
...

y seguidamente generar la base con:

/usr/sbin/sendmail -bi -oA/etc/revaliases

Si se estaá ejecutando actualmente un demonio sendmail, mátelo con:

    # kill `head -1 /var/run/sendmail.pid`

Y reláncelo con :

    # /usr/sbin/sendmail -bd -os

Edite sus ficheros de arranque (a menudo en /etc/rc.?d o /etc/init.d) con el fin de modificar, si es necesario, la línea que ejecuta sendmail al arrancar, reemplazándola por /usr/sbin/sendmail -bd -os'.

¡Ya está! Los mensajes son almacenados en /var/spool/mqueue. Cuando esté conectado por PPP y desee enviar todos los mensajes, es suficiente hacer

/usr/sbin/sendmail -q

14.10 ¿Qué hacer en caso de asignación dinámica de la dirección IP?

¿Cual es el problema?

Cuando sendmail se comunica con otro MTA, se presenta (orden HELO ou EHLO) utilizando el contenido de la macro $j que es generalmente el resultado de la orden hostname sobre el sistema anfitrion.

En el caso de una máquina enganchada de forma intermitente a Internet, este resultado no es generalmente una dirección oficial declarada, y por tanto conocida por el servicio de nombres (DNS).

Hemos visto que la solución cuando disponemos de una direccción IP fija y válida consistía en forzar la definición de la macro $j mediante la orden del kit m4 :

    define(`confDOMAIN_NAME',`ppp.proveedor.pais')dnl

Pero es necesario, para utilizar esta solución, conocer de antemano el nombre que será asignado a nuestra máquina en una futura conexión... no es por tanto factible en el caso que nos ocupa.

En el fichero /etc/sendmail.cf que acabamos de generar, podemos ver:

# my official domain name
# ... define this only if sendmail cannot automatically determine your domain
#Dj$w.Foo.COM

Es aquí donde tiene eventualmente lugar la definición de la macro $j que nos interesa.

En una conexión PPP, el guión /etc/ip-up/, lanzado al principio de la conexió, recibe como argumento la dirección IP que nos ha sido asignada. Es por tanto posible, en este guión, preguntarle al servidor de nombres (el nuestro o el del proveedor) que traduzca esta dirección IP a un nombre de dominio plenamente cualificado, modificar /etc/sendmail.cf y relanzar sendmail con esta nueva definición.

Hay diferentes métodos y programas que permiten hacer esto pero la mayoría son expresivos y necesitarían de un filtro awk o grep para extraer el nombre que nos interesa... he escrito por tanto una pequeña utilidad muy simple, gethost, con este único propósito.

Para poder utilizar el guión ip-up que proporciono más adelante:

Le resta modificar su fichero /etc/ppp/ip-up integrando el mío.

Un ejemplo de script ip-up :

#!/bin/sh
#   /etc/ppp/ip-up   script que permite configurar correctamente
#                    sendmail en el caso de asignación dinámica
#                    de direccin IP
#
#   Copyright © 04/1998 Jean Charles Delépine
#
#   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
#   (at your option) 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.

# Los parámetros pasados a ip-up por pppd (man pppd) :
# $1 = nombre del interfaz (ppp0)
# $2 = dispositivo utilizado (/dev/modem)
# $3 = velocidad de transmisión
# $4 = dirección IP local (la que nos interesa)
# $5 = dirección IP remota (El servidor de modem del proveedor, será
#      nuestra pasarela al resto del mundo)
# $6 = ipparam (opción dada por el usuario via la opción ipparam
#      de pppd)

HOST=`/usr/local/bin/gethost $4`

sed s/'#Dj.*'/"Dj$HOST"/ /etc/sendmail.cf.base >/etc/sendmail.cf

kill -1 `head -1 /var/run/sendmail.pid`

/usr/sbin/sendmail -q&

exit 0

El programa gethost.c :

/*
    gethost.c, obtiene el nombre canónico de una máquina
               a partir de su dirección IP.

    Copyright © 04/1998 Jean Charles Delépine

    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
    (at your option) 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.
*/

#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>

int main(argc,argv)
char argc;
char *argv[];
{
  struct hostent *host;
  struct in_addr ia;

  if (argc < 2) {
    fprintf(stderr,"Uso: %s addr\n",argv[0]);
    exit(1);
  }
  if (!inet_aton (argv[1],& ia)) {
      fprintf(stderr,"Error: dirección no válida\n");
      exit(1);
  }

  host=gethostbyaddr((char *) & ia, sizeof(ia), AF_INET);

  if (!host) {
    fprintf(stderr,"Error: dirección no encontrada o no hay DNS\n");
    exit(1);
  }
 printf("%s\n",host->h_name);
  exit(0);
}

14.11 netstat -s

Una opción de netstat quew existe en ciertas plataformas no existe en Linux (option -s). No importa: el guión Perl 5 que sigue ¡resuelve el problema! Es suficiente guardarlo bajo el nombre netstat, y ponerlo junto al auténtico en el PATH. Perl hace el resto.


#!/usr/local/bin/perl
# Se necesita perl 5
require 5.003;

$stats = "/proc/net/snmp";

if ($ARGV[0] eq '-s') {
    open (STATS, "< $stats") || die "Cannot open $stats: $!";
    while (<STATS>) {
        chop;
        undef $i;
        ($category, @fields) = split;
        chop $category;
        print "\n$category statistics:\n";
        $_ = <STATS>;
        ($category, @values) = split;
        $~ = "STAT";
        foreach $field (@fields) {
            write;
        }
    }
    close (STATS);
}
else {
    system ($0, join (' ', @ARGV));
}

format STAT =
@<<<<<<<<<<<<<<<<<:@>>>>>>>
$field,       ,$values[$i++]
.


Página siguiente Página anterior Índice general