%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                               %
%                       Legal Notice                            %
%                                                               %
% This document is copyright (C) Olaf Kirch, okir@monad.swb.de  %
%                                                               %
% For copying conditions, please refer to the file COPYING.	%
%                                                               %
% The author is not liable for any damages, direct or indirect, %
% resulting from the use of information provided in this        %
% document.                                                     %
%                                                               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                               %
% Revisado en 21-Abril-1998 por:                                %
%   Juan Jose Amor <jjamor@ls.fi.upm.es>                        %
%                                                               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% When viewing this document with vi on an 80-columns screen,   %
% do a ':se nonumber' first.                                    %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definitions local to this chapter.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Warning!! These paths occur literally in a few verbatim
%% environments!!
%%
\def\newslib{\file{/usr/lib/news}}
\def\newsbin{\file{/usr/lib/news/bin}}
\def\newsspool{\file{/var/spool/news}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                               %
%               S T A R T   O F   C H A P T E R                 %
%                                                               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Una descripci\'on de NNTP}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\label{nntp}
\index{configuraci\'on!NNTP|(}
\index{protocolo!NNTP}
\index{noticias!nntpd@\prog{nntpd}}
\index{servidor!NNTP}
\index{NNTP}

\section{Introducci\'on}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% It is based on a stream-oriented connection~-- usually over TCP~--
% cutrada: ``conexi\'on orientada al flujo'' por stream-oriented connection


El NNTP proporciona una forma de intercambio de noticias totalmente
diferente de \cnews, para adaptarse a los protocolos de transporte usados
en la Red. NNTP son las siglas de ``Network News Transfer Protocol''
(Protocolo de Transferencia de Noticias de Red), y no consiste en un paquete de
programas en particular, sino que es un est\'andar de Internet\footnote{
 Especificado formalmente en la RFC~977.
} Est\'a basado en una comunicaci\'on orientada a la conexi\'on~--
generalmente sobre
TCP~-- entre un cliente en alg\'un lugar de la red, y un servidor que
almacena las noticias en disco. La conexi\'on de flujo permite al cliente y
al servidor negociar la transferencia de art\'{\i}culos interactivamente, sin
apenas retrasos, manteniendo bajo el n\'umero de art\'{\i}culos duplicados.
Junto con los altos ratios de transferencia de Internet, esto supone un
transporte de noticias que supera ampliamente a las redes UUCP originales.
Mientras que hace algunos a\~nos no era extra\~no que un art\'{\i}culo tardase
dos semanas o m\'as en llegar hasta el \'ultimo rinc\'on de Usenet, ahora
suele tardar menos de dos d\'{\i}as; en la propia Internet, es incluso
cuesti\'on de minutos.\footnote{N. del T.:
  Parece ser que el autor tiene la fortuna de no conocer los servidores
  espa\~noles.
}

Varios comandos permiten a los clientes obtener, enviar y publicar
art\'{\i}culos. La diferencia entre enviar y publicar es que esto \'ultimo
puede incluir a art\'{\i}culos con cabeceras incompletas.\footnote{
  Cuando se publica un art\'{\i}culo mediante NNTP, el servidor siempre a\~nade
  como m\'{\i}nimo un campo en la cabecera: \mhdr{NNTP-Posting-Host:}, que
  contiene el nombre del sistema del cliente.
} La obtenci\'on de art\'{\i}culos puede ser usada por clientes de transporte
de noticias o por lectores de noticias. Esto hace del NNTP una excelente
herramienta para proporcionar acceso a muchos clientes de una red local
sin tener que pasar por las dificultades que implica usar NFS.

\index{noticias!empujar}
\index{noticias!tirar}
El NNTP tambi\'en proporciona una forma activa y otra pasiva de transmitir
las noticias, llamadas coloquialmente ``empujar'' y ``tirar''. Empujar
es b\'asicamente lo mismo que el protocolo {\it ihave/sendme} de \cnews. El
cliente ofrece un art\'{\i}culo al servidor a trav\'es del comando
``\keyword{IHAVE $<$\var{msgid}$>$}'', a lo que el servidor responde con
un c\'odigo que indica si ya tiene el art\'{\i}culo o si lo quiere. En el
\'ultimo caso, el cliente env\'{\i}a el art\'{\i}culo, terminado en un solo punto en
una l\'{\i}nea separada.

Empujar las noticias tiene la \'unica desventaja de que consume muchos
recursos del servidor, ya que \'este tiene que buscar en su archivo hist\'orico
para cada art\'{\i}culo.

La t\'ecnica opuesta es tirar de las noticias, en la que el cliente
solicita una lista de todos los art\'{\i}culos disponibles en un grupo que
hayan llegado despu\'es de una fecha especificada. La consulta es llevada
a cabo por el comando \keyword{NEWNEWS}. De la lista de identificativos
de mensaje obtenida, el cliente selecciona aqu\'ellos que a\'un no tenga,
usando el comando \keyword{ARTICLE} para obtener cada uno de ellos.


El problema de esta t\'ecnica es que necesita un estricto control por
parte del servidor, que debe tener en cuenta qu\'e grupos y distribuciones
permite solicitar al cliente. Por ejemplo, debe asegurarse de que ning\'un
material confidencial de sus grupos locales sea enviado a clientes no
autorizados.

Existe tambi\'en cierto n\'umero de comandos convenientes para los lectores
de noticias que permiten obtener la cabecera del art\'{\i}culo y el cuerpo
del mismo separadamente, o incluso s\'olo ciertos campos de la cabecera de
un rango de art\'{\i}culos. Esto permite mantener todas las noticias en un
servidor central, con todos los usuarios de la red (presumiblemente
local) utilizando programas clientes basados en el NNTP para leer y
publicar. Esto es una alternativa a exportar los directorios mediante
NFS tal como se describe en el cap\'{\i}tulo~\ref{cnews}.



\index{noticias!falsificaci\'on}
Un problema extendido en NNTP es que permite a gente con los
conocimientos suficientes insertar art\'{\i}culos con remitentes falsos en el
flujo de noticias. Esto se conoce como {\em falsificar las
noticias}.\footnote{
El mismo problema existe con el SMTP, el {\it Simple Mail Transfer
Protocol} (Protocolo Simple para Transferencia de Correo).
} Una extensi\'on del NNTP permite requerir autentificaci\'on del usuario
para ciertos comandos.

\index{nntpd@\prog{nntpd}}
\index{Lapsley, Phil}
\index{Barber, Stan}
Hay cierto n\'umero de paquetes NNTP disponibles. Uno de los m\'as conocidos
es el demonio NNTP, tambi\'en conocido como la {\em implementaci\'on de
referencia}. Fue escrito originalmente por Stan Barber y Phil Lapsley
para ilustrar los detalles de la RFC~977. Su versi\'on m\'as reciente es
\prog{nntpd-1.5.11}, que se describir\'a a continuaci\'on. Usted puede obtener
el c\'odigo fuente y compilarlo por su cuenta, o usar el \prog{nntpd} del
paquete binario \file{net-std} de Fred van~Kempen. No se proporcionan
ejecutables del \prog{nntpd} listos para funcionar, ya que varios valores
espec\'{\i}ficos de cada sistema deben ser introducidos antes de la compilaci\'on.


El paquete \prog{nntpd} consiste en un servidor y dos clientes para
empujar y tirar de las noticias, respectivamente, as\'{\i} como un sustituto
para \prog{inews}. Est\'an pensados para trabajar en el entorno de Bnews,
pero trabaj\'andoselo un poco lo har\'an con \cnews{}  sin demasiada dificultad. Sin
embargo, si planea Vd. usar el NNTP para algo m\'as que ofrecer acceso a
su servidor a los lectores de noticias, la implementaci\'on de referencia
no es realmente una opci\'on. Por tanto, discutiremos solamente el demonio
NNTP contenido en el paquete \prog{nntpd}, dejando de lado los programas
clientes.


\index{Salz, Rich}
\index{INN}
Tambi\'en hay un paquete llamado ``InterNet News'', o INN para abreviar,
escrito por Rich Salz. Este paquete proporciona tanto transporte NNTP como UUCP, y es
el m\'as adecuado para grandes servidores. En lo que a transporte NNTP se
refiere, es definitivamente mejor que \prog{nntpd}. La versi\'on actual de
INN es \file{inn-1.4sec}. Existe un paquete de Arjan de Vet para
construir INN en una m\'aquina \linux{}; est\'a disponible en
\host{sunsite.unc.edu} en el directorio \file{system/Mail}. Si quiere
configurar INN, por favor rem\'{\i}tase a la documentaci\'on que acompa\~na al
c\'odigo fuente, as\'{\i} como al FAQ de INN, publicado
regularmente en \ngrp{news.software.b}.


\section{Instalaci\'on del servidor NNTP}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\label{nntp.nntpd}

El servidor NNTP se llama \prog{nntpd}, y puede ser compilado de dos
maneras, seg\'un el tr\'afico que se espera que soporte el sistema de
noticias. No hay versiones compiladas disponibles, ya que algunos
valores por defecto dependientes del sistema en que se vaya a instalar
deben ser especificados antes de la compilaci\'on. Toda la configuraci\'on
se hace a trav\'es de macros {\tt \#define} en \file{common/conf.h}.


\prog{nntpd} puede ser configurado como un servidor independiente que se
inicie desde \file{rc.inet2} al arrancar, o como un demonio controlado
por \prog{inetd}. En el \'ultimo caso se tendr\'a que a\~nadir la siguiente
entrada en \file{/etc/inetd.conf}:

\begin{tscreen}
\begin{verbatim}
nntp    stream  tcp nowait      news    /usr/etc/in.nntpd    nntpd
\end{verbatim}
\end{tscreen}


Si configura Vd. \prog{nntpd} como servidor independiente, aseg\'urese de que
la l\'{\i}nea anterior est\'a comentada en \prog{inetd.conf}. En cualquier
caso, tendr\'a Vd. que asegurarse de que existe la siguiente l\'{\i}nea en
\file{/etc/services}:


\begin{tscreen}
\begin{verbatim}
nntp    119/tcp   readnews untp    # Network News Transfer Protocol
\end{verbatim}
\end{tscreen}


Para almacenar temporalmente los art\'{\i}culos que llegan al sistema, etc,
\prog{nntpd} tambi\'en necesita un subdirectorio \file{.tmp} en el
directorio de almacenamiento de noticias. Puede Vd. crearlo usando


\begin{tscreen}
\# mkdir \newsspool/.tmp\\
\# chown news.news \newsspool/.tmp
\end{tscreen}



\section{Restricciones de acceso NNTP}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\label{nntp.access}
\index{NNTP!acceso restringido}
\index{nntpaccess@\file{nntp\_access}}
\index{acceso!NNTP}

El acceso a los recursos NNTP se rige por el fichero \file{nntp\_access}
en \newslib. Las l\'{\i}neas del fichero describen los derechos de acceso
para ordenadores ajenos. Cada l\'{\i}nea tiene el siguiente formato:


\begin{tscreen}
 {\sl site}   read|xfer|both|no    post|no      [!{\sl exceptgroups}]
\end{tscreen}

Si un cliente se conecta al puerto NNTP, \prog{nntpd} intenta obtener su
nombre completo en la red a partir de su direcci\'on IP. El nombre del
ordenador del cliente y su direcci\'on IP son contrastados con el campo
\var{site} de cada entrada, en el mismo orden en el que aparecen en el
fichero. Las coincidencias pueden ser parciales o exactas. Si una
entrada coincide exactamente, se aplica; si la coincidencia es parcial,
s\'olo se aplica si no hay otra entrada posterior igual o mejor.
\var{site} puede especificarse de una de las siguientes formas:


%
% Ojo, no me entero de c\'omo hay que traducir esta tabla
%

\begin{dispitems}
%\ditem[\var{hostname}]
\ditem[\var{nombre del ordenador}]
        Este es el nombre completo del ordenador. Si coincide literalmente
	con el nombre can\'onico del cliente, se aplica directamente esta entrada
        ignor\'andose las siguientes.

%\ditem[\var{IP address}]
\ditem[\var{direcci\'on IP}]
        Esta es la direcci\'on IP representada por cuatro n\'umeros
        separados por puntos. Si la direcci\'on IP del cliente coincide
	con ella, se aplica la entrada ignor\'andose las siguientes.

%\ditem[\var{domain name}]
\ditem[\var{nombre del dominio}]
        Esto es un nombre de dominio, especificado como
        \host{*.}\var{dominio}. Si el dominio del cliente coincide con \'el,
	se aplica la entrada.

%\ditem[\var{network name}]
\ditem[\var{nombre de la red}]
        Esto es el nombre de una red tal y como se especifica en
	\file{/etc/networks}. Si el n\'umero de red de la direcci\'on IP del
	cliente coincide con el n\'umero de red asociado al nombre de la
	red, se aplica la entrada.

%\ditem[\var{subnet name}]
%        This is the name of a subnet of the local network as specified in
%        the \file{/etc/networks} file. The subnet mask is obtained by querying
%        the network interfaces.
%        This option is only enabled if {\tt -DSUBNET} has been defined as
%        compile-time option.
%
%        If the network number of the client's IP~address matches the
%        network number associated with the network name, the entry matches.

\ditem[\keyword{default}]
        Es la entrada por omisi\'on; se aplica a cualquier cliente.

\end{dispitems}

Las entradas con especificaciones m\'as generales deber\'{\i}an ser
introducidas al principio del fichero, ya que despu\'es pueden ser
descartadas al encontrarse mejores coincidencias en entradas posteriores.

Los campos segundo y tercero describen los derechos de acceso que se
otorgan al cliente. El segundo detalla los permisos de lectura
(\keyword{read}) y transmisi\'on por empuje (\keyword{xfer}) de noticias.
El valor \keyword{both} habilita ambos, el valor \keyword{no} niega el
acceso a los dos.  El tercer campo detalla si el cliente puede publicar
art\'{\i}culos, es decir, enviar art\'{\i}culos con informaci\'on incompleta en la
cabecera que ser\'a completada por los programas de noticias. Si el
segundo campo contiene \keyword{no}, el tercero es ignorado.


El cuarto campo es opcional. Contiene una lista de grupos separados
por comas a los que el cliente no puede acceder.

A continuaci\'on se muestra un fichero \file{nntp\_access} de ejemplo:

%
%  Ojo, al ser un ``verbatim'' no s\'e si los acentos habr\'a que pasarlos
%  a latex o no
%

\begin{tscreen}
\begin{verbatim}
#
# por defecto, cualquiera puede transferir noticias, pero no
# leerlas o publicarlas
default                 xfer            no
#
# public.vbrew.com ofrece acceso publico via modem, asi que les
# dejamos leer y publicar en cualquier grupo menos en los local.*
public.vbrew.com        read            post    !local
#
# el resto de ordenadores de vbrew.com puede leer y publicar
*.vbrew.com             read            post
\end{verbatim}
\end{tscreen}


\section{Autorizaci\'on NNTP}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\label{nntp.authorize}
\index{NNTP!authorization}
%\index{NNTP!restricting access}
\index{NNTP!acceso restringido}
%\index{access!NNTP}
\index{acceso!NNTP}
%\index{authorization!with NNTP}
\index{autorizaci\'on!con NNTP}

%\keyword{XFER}, \prog{nntpd} will not let the client transfer articles
%to your site unless it passes authorization.

Al poner en may\'usculas los elementos del fichero \file{nntp\_acces},
tales como \keyword{xfer} o \keyword{read}, \prog{nntpd} exige que el
cliente est\'e autorizado para realizar dichas operaciones. Por ejemplo,
si se especifica el permiso \keyword{Xfer} o \keyword{XFER},
\prog{nntpd} no dejar\'a transmitir art\'{\i}culos al cliente a menos que \'este
acredite que est\'a autorizado.


El proceso de autorizaci\'on se lleva a cabo por un nuevo comando del NNTP
llamado \keyword{AUTHINFO}. Usando este comando, el cliente transmite un
nombre de usuario y una contrase\~na al servidor NNTP. \prog{nntpd} los
validar\'a comprobando el fichero \file{/etc/passwd}, y verificando que el
usuario pertenece al grupo \user{nntp}.


Lo actual implementaci\'on de la autorizaci\'on NNTP es s\'olo experimental,
por lo que no se ha hecho muy portable. Por ello s\'olo funcionar\'a con
ficheros \file{/etc/passwd} normales; el {\it shadow password} no est\'a
soportado.


\section{Interacci\'on de \prog{nntpd} con \cnews}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\label{nntp.interact}
%\index{C News!NNTP support}
\index{C News!soporte NNTP}
%\index{NNTP!and C News}
\index{NNTP!y C News}

Cuando recibe un art\'{\i}culo, \prog{nntpd} debe pasarlo al sistema de
noticias. Dependiendo de si lo recibi\'o mediante el comando
\keyword{IHAVE} o el \keyword{POST}, lo enviar\'a a \prog{rnews} o
\prog{inews}, respectivamente. En vez de llamar a \prog{rnews},
\prog{nntpd} tambi\'en puede configurarse (antes de la compilaci\'on) para
empaquetar los art\'{\i}culos entrantes, y dejar los paquetes resultantes en
el directorio \newsspool\file{/in.coming}, donde ser\'an procesados por
\prog{relaynews} la pr\'oxima vez que se le invoque.

Para llevar a cabo con \'exito el protocolo ihave/sendme, \prog{nntpd}
tiene que poder acceder al fichero hist\'orico \file{history}. Por tanto,
antes de la compilaci\'on hay que asegurarse de que la ruta a dicho
fichero est\'a correctamente especificada. Tambi\'en hay que asegurarse de
que \cnews y \prog{nntpd} usen el mismo formato de fichero hist\'orico.
\cnews usa funciones \file{dbm} para acceder al fichero; sin embargo hay
bastantes implementaciones ligeramente incompatibles de la librer\'{\i}a
\file{dbm}. Si \cnews est\'a enlazado con una librer\'{\i}a \file{dbm} distinta
a la de \file{libc}, tambi\'en deber\'a enlazarse \prog{nntpd} con dicha librer\'{\i}a.

%\index{checking!NNTP}
\index{comprobaciones!NNTP}
Un s\'{\i}ntoma t\'{\i}pico de que \prog{nntpd} y \cnews discrepan en el formato
del fichero hist\'orico son los mensajes de error de que \prog{nntpd} no
puede abrirlo, o la recepci\'on de art\'{\i}culos duplicados por NNTP. Una
prueba conveniente es coger un art\'{\i}culo del sistema, hacer telnet por el
puerto del \prog{nntpd}, y ofrec\'erselo a \prog{nntpd} tal como se
muestra en el ejemplo de abajo. Por supuesto, deber\'a reemplazarse
\var{$<$msg@id$>$} con el identificativo del art\'{\i}culo que quiera
ofrecerse a \prog{nntpd}.

\begin{tscreen}\small\tt
\$ \var{telnet localhost nntp}		\\
Trying 127.0.0.1...			\\
Connected to loalhost			\\
Escape characters is '\car ]'.		\\
201 vstout NNTP[auth] server version 1.5.11t (16 November 1991) ready at
Sun Feb 6 16:02:32 1194 (no posting)	\\
\var{IHAVE $<$msg@id$>$}		\\
435 Got it.				\\
\var{QUIT}
\end{tscreen}


Este di\'alogo muestra la reacci\'on correcta de \prog{nntpd}: el mensaje
``\term{Got it}'' indica que ya tiene dicho art\'{\i}culo. En cambio, si se
obtuviese un mensaje como ``\term{335 Ok}'', significar\'{\i}a que
\prog{nntpd} no ha podido acceder adecuadamente al fichero hist\'orico.
Cierre la sesi\'on telnet con Ctrl-D. Puede comprobar qu\'e ha ido mal
revisando el archivo de registro ({\it log}) del sistema; \prog{nntpd} env\'{\i}a todo tipo
de mensajes a \prog{syslog}. El uso de una librer\'{\i}a \file{dbm}
incompatible suele reflejarse en un mensaje que indica que
\func{dbminit} ha fallado.

%\index{configuring!NNTP|)}
\index{configuraci\'on!NNTP|)}
