Copyright © 1996 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux: Wegweiser durch das Netzwerk" dann klicken Sie hier.


Kapitel 18
Eine Einführung in NNTP


Aufgrund der völlig verschiedenen Netzwerk-Transportarten vertritt NNTP (verglichen mit C News) einen ganz anderen Ansatz zum Austausch von News. NNTP steht für »Network News Transfer Protocol«. Es ist kein bestimmtes Software-Paket, sondern ein Internet-Standard. Es basiert auf einer Stream-orientierten Verbindung -- üblicherweise über TCP -- zwischen einem Client irgendwo im Netzwerk und einem Server auf einem Host, der die Netnews auf Platte hält. Die Stream-Verbindung erlaubt es dem Client und dem Server, interaktiv den Transfer von Artikeln zu vereinbaren, wobei es nahezu keine Verzögerungen gibt. Auf diese Weise wird die Anzahl doppelt übertragener Artikel klein gehalten. Zusammen mit den hohen Übertragungsraten des Internet ergibt sich so ein News-Transport, der dem jener ursprünglichen UUCP-Netzwerke bei weitem überlegen ist. Während es vor einigen Jahren nicht unüblich war, daß ein Artikel zwei Wochen benötigte, um bis in die letzte Ecke des Usenet zu gelangen, sind es heute weniger als zwei Tage. Im Internet selbst ist es nur noch eine Frage von Minuten.

Verschiedene Befehle erlauben es Clients, Artikel zu empfangen, zu versenden und zu posten. Der Unterschied zwischen dem Versenden und dem Posten liegt darin, daß bei letzterem auch Artikel mit unvollständigen Header-Informationen auftauchen können.(1) Der Abruf von Artikeln kann sowohl über News-Transferclients als auch von Newsreadern erledigt werden. Das macht NNTP zu einem ausgezeichneten Werkzeug, mit dem vielen Clients in einem lokalen Netzwerk der Zugriff auf News gewährt werden kann, ohne daß die beim Einsatz von NFS üblichen Klimmzüge vonnöten wären.

NNTP bietet auch einen aktiven und einen passiven Weg der News-Übertragung, die allgemein als »Pushing« (Schieben) und »Pulling.« (Ziehen) bekannt sind. Pushing ist grundsätzlich dasselbe wie das ihave/sendme-Protokoll von C News. Der Client bietet dem Server einen Artikel über den Befehl »IHAVE <msgid>« an, und der Server liefert einen Antwort-Kode zurück, der angibt, daß er den Artikel bereits hat oder daß er ihn haben möchte. Hat er ihn noch nicht, überträgt ihn der Client und schließt den Vorgang durch einen Punkt auf einer separaten Zeile ab.

Dieses Schieben der News hat den einzigen Nachteil, daß es zu einer starken Belastung des Server-Systems führt, weil dieser seine history-Datenbank für jeden einzelnen Artikel durchsuchen muß.

Die andere Technik ist das Ziehen, oder Pulling, von News. Dabei fordert der Client eine Liste aller (verfügbaren) Artikel aus einer Gruppe an, die nach einem bestimmten Datum angekommen sind. Diese Anfrage wird durch den Befehl NEWNEWS durchgeführt. Aus der zurückgegebenen Liste von Message-IDs wählt der Client jene aus, die er noch nicht besitzt, wobei auf jeden einzelnen Artikel der ARTICLE-Befehl angewendet wird.

Das Problem beim Ziehen von News besteht darin, daß der Server eine strenge Kontrolle darüber ausüben muß, welche Gruppen und Distributionen ein Client anfordern darf. Beispielsweise muß sichergestellt sein, daß kein vertrauliches Material aus lokalen News-Gruppen der Site an nicht autorisierte Clients übertragen wird.

Es existiert eine Reihe weiterer Befehle, mit denen Newsreader den Artikel-Header und die eigentliche Nachricht (den Body) separat lesen. Sogar einzelne Header-Zeilen aus einer Reihe von Artikeln können gelesen werden. Auf diese Weise können alle News auf einem zentralen Host gehalten werden, während alle Benutzer eines (vermutlich lokalen) Netzwerks über NNTP-basierte Clients News lesen und posten können. Dies ist eine Alternative zum in Kapitel 17 beschriebenen Export von News-Verzeichnissen über NFS.

Ein allgemeines Problem von NNTP ist, daß es gut informierten Personen die Möglichkeit bietet, Artikel mit falschen Absenderdaten in den News-Stream einzufügen. Das wird als Fälschen von News (news faking) bezeichnet.(2) Eine Erweiterung von NNTP erlaubt die Verwendung von Benutzer-Authentizierungen für bestimmte Befehle.

Es sind eine ganze Reihe von NNTP-Paketen verfügbar. Eines der bekanntesten Pakete ist der NNTP-Daemon, der auch als Referenz-Implementation bekannt ist. Er wurde ursprünglich von Stan Barber und Phil Lapsley geschrieben, um die Details von RFC 977 zu verdeutlichen. Die aktuellste Version ist nntpd-1.5.11, die nachfolgend besprochen wird. Sie können sich entweder die Quellen besorgen und es selbst kompilieren, oder Sie können nntpd aus dem Netkit-Paket nutzen. nntpd wird nicht als vorkompilierte Binary angeboten, weil verschiedene Site-spezifische Werte einkompiliert werden müssen.

Das nntpd-Paket besteht aus einem Server und zwei Clients, mit denen News geschoben bzw. gezogen werden können. Außerdem gibt es einen Ersatz für den inews-Befehl. Sie sind für eine B News-Umgebung konzipiert, mit wenigen Anpassungen aber auch mit C News zu verwenden. Wenn Sie aber mit dem Gedanken spielen, NNTP für mehr einzusetzen, als nur Newsreadern den Zugriff auf Ihren News-Server zu ermöglichen, ist die Referenz-Implementierung nicht wirklich geeignet. Aus diesem Grund behandeln wir an dieser Stelle nur den im nntpd-Paket enthaltenen NNTP-Daemon und lassen die Client-Programme außen vor.

Es existiert auch ein Paket namens InterNet News, kurz INN, das von Rich Salz geschrieben wurde. News können damit sowohl über NNTP als auch über UUCP transportiert werden, und es ist für größere News-Hubs besser geeignet. Wenn es um den News-Transport über NNTP geht, ist es definitiv besser als nntpd. INN ist momentan in der Version inn-1.4sec verfügbar. Es existiert ein Kit von Arjan de Vet, mit dem Sie es auf einer Linux-Maschine zum Laufen bringen können. Dieses Kit steht auf sunsite.unc.edu im Verzeichnis system/Mail zur Verfügung. Wenn Sie INN einrichten wollen, halten Sie sich bitte an die den Quellen beiliegende Dokumentation und an die regelmäßig in news.software.b gepostete INN-FAQ.

Installation des NNTP-Servers

Der NNTP-Server heißt nntpd und kann, abhängig von der erwarteten Auslastung des News-Systems, auf zwei Arten kompiliert werden. Kompilierte Binärversionen sind nicht verfügbar, weil einige Site-spezifische Standardwerte fest im ausführbaren Programm integriert sind. Die gesamte Konfiguration wird über in common /conf.h definierte Makros erledigt.

nntpd kann als selbständiger Server konfiguriert werden, der während der Boot-Phase aus rc.inet2 heraus gestartet wird. Alternativ kann er als Dämon konfiguriert werden, der von inetd verwaltet wird. Im letzeren Fall müssen Sie die folgende Zeile in Ihre /etc/inetd.conf aufnehmen:

nntp    stream  tcp nowait      news    /usr/etc/in.nntpd    nntpd
Wenn Sie nntpd als eigenständigen Server konfigurieren, müssen Sie sicherstellen, daß eine solche Zeile in inetd.conf auskommentiert ist. In beiden Fällen müssen Sie dafür Sorge tragen, daß die folgende Zeile in /etc/services auftaucht:
nntp    119/tcp   readnews untp    # Network News Transfer Protocol
Um alle eingehenden Artikel temporär zwischenspeichern zu können, benötigt nntpd auch ein .tmp-Verzeichnis in Ihrem News-Spool. Sie können es mit den folgenden Befehlen einrichten:
# mkdir /var/spool/news/.tmp
# chown news.news /var/spool/news/.tmp

NNTP-Zugriff beschränken

Der Zugriff auf NNTP-Ressourcen wird durch die Datei nntp_access im Verzeichnis /usr/lib/news geregelt. Die Zeilen in dieser Datei beschreiben die fremden Hosts zugestandenen Zugriffsrechte. Jede Zeile verwendet das folgende Format:
site   read|xfer|both|no    post|no      [!ausser_diesen_gruppen]
Stellt ein Client die Verbindung über den NNTP-Port her, versucht nntpd den voll qualifizierten Domain-Namen des Host anhand der IP-Adresse über einen Reverse-Lookup zu ermitteln. Der Host-Name und die IP-Adresse des Client werden in der Reihenfolge ihres Auftretens in der Datei mit dem site-Feld verglichen. Vergleiche können exakt oder teilweise übereinstimmen. Bei exakter Übereinstimmung wird der Eintrag verwendet, bei teilweiser Übereinstimmung wird er nur verwendet, wenn nicht noch ein besserer Eintrag folgt. site kann in folgender Form angegeben werden:
Host-Name
Der voll qualifizierte Domain-Name eines Host. Stimmt dieser mit dem kanonischen Host-Namen des Client exakt überein, wird der Eintrag verwendet und die nachfolgenden Einträge werden ignoriert.

IP-Adresse
Die IP-Adresse in Dotted Quad Notation. Stimmt sie mit der IP-Adresse des Client überein, wird der Eintrag verwendet und die folgenden Zeilen werden ignoriert.

Domain-Name
Der als *.domain angegebene Domain-Name. Enthält der Host-Name des Client den Domain-Namen, wird der Eintrag verwendet.

Netzwerkname
Der Name eines in /etc/networks spezifizierten Netzwerks. Der Eintrag wird verwendet, wenn die IP-Adresse des Client mit der dem Netzwerknamen zugewiesenen Netzwerknummer übereinstimmt.

Default
Der String default gilt für jeden Client.

Allgemeinere Einträge in der Datei sollten früh in der Datei eingetragen sein, weil alle Übereinstimmungen durch später folgende genauere Übereinstimmungen überschrieben werden.

Das zweite und dritte Feld beschreiben die dem Client zugebilligten Zugriffsrechte. Im zweiten Feld wird bestimmt, ob News gepullt (read) oder durch Pushen (xfer) übertragen werden dürfen. Wird both als Wert verwendet, ist beides möglich; no unterdrückt den Zugriff komplett. Im dritten Feld wird festgelegt, ob der Client Artikel posten, d. h. Artikel mit unvollständigen Header-Informationen ausliefern darf, die durch die News-Software vervollständigt werden. Steht im zweiten Feld der Wert no, wird das dritte Feld ignoriert.

Das vierte Feld ist optional und enthält eine durch Kommata aufgeteilte Liste von Gruppen, auf die der Client nicht zugreifen darf.

Nachfolgend ein Beispiel für eine nntp_access-Datei:

#
# Standardmäßig darf jeder News übertragen, aber nicht lesen oder posten.
default                 xfer            no
#
# public.vbrew.com bietet öffentlichen Zugang über Modem.
# Wir erlauben das Lesen und Posten in alle(n) Gruppen außer local.*
public.vbrew.com        read            post    !local
#
# Alle anderen Hosts in der Brauerei dürfen lesen und posten.
*.vbrew.com             read            post

NNTP-Autorisierung

Durch Großschreiben der Zugriffs-Tokens wie xfer oder read in der nntp_acces-Datei verlangt nntpd für die Durchführung der entsprechenden Operationen eine Autorisierung. Geben Sie beispielsweise Xfer oder XFER als Zugriffsrecht an, verweigert nntpd dem Client so lange die Übertragung von Artikeln zu Ihrer Site, bis die Autorisierung erfolgreich abgeschlossen wurde.

Die Autorisierungs-Prozedur wird über einen neuen NNTP-Befehl namens AUTHINFO abgewickelt. Bei diesem Befehl überträgt der Client einen Benutzernamen und ein Paßwort an den NNTP-Server. nntpd vergleicht diese mit seiner /etc/passwd-Datei und prüft gleichzeitig, ob der Benutzer der Gruppe nntp angehört.

Die aktuelle Implementierung der NNTP-Autorisierung befindet sich in einem experimentellen Stadium und ist aus diesem Grund nicht besonders portabel gehalten. Daher funktioniert sie nur mit einfachen Paßwort-Datenbanken, Shadow-Paßwörter werden nicht erkannt.

Interaktion von nntpd und C News

Bei der Auslieferung eines Artikels muß nntpd ihn an das News-Subsystem weiterleiten. Abhängig davon, ob der Artikel als Ergebnis eines IHAVE- oder eines POST-Befehls empfangen wurde, wird er an rnews oder inews übergeben. Statt rnews zu starten, können Sie es (während des Kompilierens) so konfigurieren, daß die eingehenden Artikel gesammelt und die daraus resultierenden Batches in /var/spool /news/in.coming gespeichert werden. Dort werden sie dann von relaynews beim nächsten Queue-Lauf benutzt.

Um das ihave/sendme-Protokoll ordnungsgemäß durchführen zu können, muß nntpd in der Lage sein, auf die history-Datei zugreifen zu können. Sie müssen daher beim Kompilieren darauf achten, daß der Pfad korrekt gesetzt ist. Sie müssen weiterhin sicherstellen, daß C News und nntpd sich über das Format Ihrer history-Datei einig sind. C News verwendet für den Zugriff darauf die Hashing-Funktionen von dbm. Allerdings gibt es eine Reihe unterschiedlicher und leicht inkompatibler Implementierungen der dbm-Bibliothek. Wurde C News mit einer anderen dbm-Library gelinkt als der in der Standard-libc enthaltenen, muß auch nntpd mit dieser Bibliothek gelinkt werden.

Typische Anzeichen dafür, daß nntpd und C News im Datenbankformat nicht übereinstimmen, sind Fehlermeldungen im System-Log, wonach nntpd sie nicht korrekt öffnen kann. Auch mehrfach über NNTP empfangene Artikel sind ein Indiz. Ein guter Test besteht darin, einen Artikel aus Ihrem Spool-Bereich auszuwählen, Ihren nntp-Port über Telnet anzusprechen und den Artikel dann, wie im nachfolgenden Beispiel gezeigt, nntpd anzubieten. Natürlich müssen Sie <msg@id> durch den Message-ID des Artikels ersetzen, den Sie erneut an nntpd übergeben wollen.

$ telnet localhost nntp
Trying 127.0.0.1...
Connected to localhost
Escape characters is '^ ]'.
201 vstout NNTP[auth] server version 1.5.11t (16 November 1991) ready at
Sun Feb 6 16:02:32 1194 (no posting)
IHAVE <msg@id>
435 Got it.
QUIT
Die Konversation zeigt die korrekte Reaktion von nntpd: Die Nachricht »Got it« sagt Ihnen, daß der Artikel bereits empfangen wurde. Erhalten Sie statt dessen die Meldung »335 Ok«, ist der Lookup in der history-Datei aus irgendeinem Grund fehlgeschlagen. Beenden Sie die Konversation durch Eingabe von Ctrl-D. Was schiefgelaufen ist, können Sie im Systemlog ermitteln. nntpd schreibt alle Meldungen in die daemon-Einrichtung von syslog. Eine inkompatible dbm-Bibliothek ist üblicherweise an einer Meldung zu erkennen, die besagt, daß dbminit fehlschlug.

Fußnoten

(1)
Wird ein Artikel über NNTP gepostet, fügt der Server mindestens ein Header-Feld, nämlich Nntp-Posting-Host:, hinzu. Es enthält den Host-Namen des Client.
(2)
Dasselbe Problem existiert auch bei SMTP, dem Simple Mail Transfer Protocol.

Inhaltsverzeichnis Kapitel 17 Kapitel 19