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.
sys
: es el fichero principal. Definimos aqui los
interlocutores, los protocolos utilizados, etc...
Una configuración simple (servidor perceval) :
# Lo que va a continuación de los '#' son comentarios. protocol itejgv # No soy difícil, acepto [casi] todo. system latulipe # El identificador del sistema remoto. call-login * # La cuenta UUCP en la máquina remota ('*' reenvia al fichero call). call-password * # Su contraseña (aqui, '*' renvia al fichero call). local-send / # Estos directorios son los accesibles (en función de la transferencia). local-receive /var/spool/uucppublic remote-send / remote-receive /var/spool/uucppublic. time any # Podemos establecer una conexión en cualquier instante. phone 0102030405 # El número a llamar. port ACU # El identificador del puerto, ver fichero port. chat "" \r\c ogin:-BREAK-ogin:-BREAK- \L word: \P # El diálogo para la # conexión. Ver también el fichero dial que se encarga de la parte de # inicialización modem y llamada.En el caso de una configuración algo más compleja (máquina latulipe):
remote-send ~ # Aquí nos limitamos al directorio del usuario de uucp remote-receive ~ local-send ~ local-receive ~ command-path /usr/sbin /usr/bin # Las rutas de las órdenes commands rmail rnews # Las órdenes autorizadas time any # Llamada a cualquier hora. ¡No conectar el teléfono en la misma línea! :-) system excalibur port type TCP # Conexión via TCP/IP sobreel servicio uucp address glou.machine.fr # La máquina remota call-login uutulipe # Mi nombre de usuario call-password ***censurado*** # Mi contraseña system perceval # Identificador port ACU protocol i # Protocolo i, que permite hacer full-duplex y recuperación de errores, interesante para una línea serie. call-login uutulipe call-password ***censurado*** phone 0102030406 alternate # Otra forma de conexión, caso de que la primera fracase port type TCP address perceval.uic.asso.fr protocol t # Protocole t, sin gestión de erroresr (ya controlado por TCP/IP)Podemos ver que, en este último caso, si una conexión via modem con perceval fracasa (por ejemplo el modem esta siendo utilizado para una conexión ppp ;-) ), UUCP intenta conectarse con la segunda solución (sobre TCP/IP). En la parte alternate sólo se especifican las diferencias con la solución principal (en concreto, no es necesario volver a especificar el nombre de usuario, contraseña, etc...) Por otro lado, los guiones de conexión no han sido definidos (habitualmente existe un guiones de conexión por defecto que es adecuado en los casos estándar).
port
: Configuración de los puertos de llamada UUCP
# # Conexión Serie # port ACU type modem # tipo de puerto, opciones principales : modem, direct, tcp. device /dev/ttyS0 # periféricos. dialer hayes # Identificador para el guión de llamada, ver fichero dial. speed 115200 # Velocidad. # # Conexión por TCP # port TCP type tcp seven-bit false reliable true half-duplex false service uucp
dial
: guión de llamada.
dialer hayes # Corresponde a la definición de puerto en el fichero port.
chat "" ATZ\r\c\d\d OK\r ATQ0M0E0\r\c OK\r AT&K1\r\c OK\r ATDT\T\r\c CONNECT \d\d
chat-fail RING\r
chat-fail NO\sCARRIER
chat-fail ERROR
chat-fail NO\sDIALTONE
chat-fail BUSY
chat-fail NO\sANSWER
chat-fail VOICE
complete \d\d+++\d\dATH\r\c
abort \d\d+++\d\dATH\r\c
No hay nada complicado aquí tampoco. Esencialmente hay que readaptar la
segunda línea (chat) para las cadenas de inicialización de su modem.
call
: los nombre-usuario/contraseña para conectarse a los
sistemas remotos.
Configuración de perceval :
latulipe uupercev ***censurado***Explicación: si nos conectamos al servidor latulipe, utilizamos uupercev como nombre de usuario uucp y ***censurado*** como contraseña. Podemos utilizar el fichero
call
para dejar el acceso libre al fichero sys
(ya que ya no
contiene los nombres/contraseñas) pero entonces hay que limitar el acceso a
este fichero.
password
: los nombres/contraseñas de las cuentas UUCP alojadas.
Configuración de perceval :
uutulipe ***censurado***Explicación: existe una cuenta uutulipe que tiene derecho a conectarse (con *** censurado*** como contraseña). Si este fichero no existe, la conexión puede autenticarse con el fichero
/etc/passwd
(para ello hay que
compilar UUCP con las opociones adecuadas... En mi caso, no quería ver las
cuentas UUCP aparecer como usuarios). Los más serios compilarían UUCP
activando la opción HAVE_ENCRYPTED_PASSWORDS para usar las contraseñas
encriptadas en este fichero.
config
Configuración de perceval :
nodename percevalNormalmente el nombre UUCP es el de la máquina. No obstante, puede definir el nombre que quiera. Existen otras opciones, pero sobrepasan el ámbito de un sitio UUCP artesano...
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):
/etc/passwd
Une des manipulations les plus basiques pour mettre en place un feed
uucp est de rajouter une ligne dans le fichier /etc/passwd
(machine latulipe) :
Una de las manipulaciones más básicas para montar un servidor uucp es añadir
una línea al fichero /etc/passwd
(máquina latulipe):
uupercev:JuNKieSPW:1000:1000:Cuenta UUCP Perceval:/var/spool/uucppublic:/usr/sbin/uucicoEsto de aquí arriba presupone que su guión de conexión se parece a algo así:
telnet\slatulipe.freenix.fr ogin: \L word: \PCette configuration est utilisable également avec une connexion modem lorsque ce dernier est géré comme un terminal (cf
agetty
et autres).
Esta configuración se puede usar igualmente con una conexión modem cuando este
último es gestionado como un terminal (rf. agetty
y otros).
/etc/services
contiene la línea:
uucp 540/tcp uucpd # BSD uucpd(8) UUCP servicey que el fichero
/etc/inetd.conf
contiene :
uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -lLa órden
/usr/sbin/tcpd
corresponde a los tcp-wrappers, es
cortocircuitable pero recomiendo mejor guardarla y echar un vistazo a la
configuración de los mencionados tcp-wrappers.
mgetty
, on peut utiliser le fichier
/etc/mgetty/login.config
pour y inserer (ou decommenter) la
ligne :
En el caso de mgetty
, se puede utilizar el fichero
/etc/mgetty/login.config
para insertar (o quitar los comentarios de)
la línea:
# username userid utmp_entry login_program [arguments] U* uucp @ /usr/lib/uucp/uucico -l -u @Así, en lugar de conectarnos via
login
, pasamos directamente a
uucico
(en perceval o latulipe, el U*
es un uu*
correspondiente a uutulipe y otros uuperceval).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.
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. |---------------------- IdentificadorEntonces 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 usrlib
uucp/uuchk/.
Si quieres más información le aconsejo que lea el HOWTO-UUCP.
El objeto de este apartado es la instalación de una conexión PPP.
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 !
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] yAdemá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 :
pppd
el programa de establecimiento del protocolo.chat
que permite correr el chat-script de llamado al sitio PPPPuede 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 mspara 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 0Sobre 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 ppp0Con 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
.
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.170La 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
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
.
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.
ping
y
muchos servicios UDP. "IP masquerading" necesita un núcleo reciente
(2.* o ciertos 1.3.* o un patch del 1.2.*) y esta documentado en
http://www.indyramp.com/masq ou
http://hwy401.com/achau/ipmasq/. Se puede encontrar un COMO
que describe claramente la instalación de "IP masquerading" en
http://www.freenix.org/linux/HOWTO-vo/mini/IP-Masquerade.Firewall-HOWTO
describe esta solución.
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 :
http://www.freebsd.org/FAQ/
;
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.
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
.
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:
mi.propio.dominio
mail.proveedor.pais
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
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
¿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:
/etc/sendmail.cf
en /etc/sendmail.cf.base
con el fin de disponer de una base a partir de la cual ip-up
pueda
trabajar.
gethost
:
gcc -o gethost gethost.cy colóquelo en el directorio
/usr/local/bin
.
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); }
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++] .