1 ↑ Einleitung
In diesem Dokument werden die verschiedenen Internetprotokolle (sowohl Low-Level als auch Application-Level) vorgestellt, so dass man nach Studieren dieser Datei (welche man im Übrigen auch in einem beliebigen ASCII-Viewer betrachten kann) in der Lage ist, nur via Telnet zu surfen, Mails zu verschicken und empfangen, usw.
Geschrieben wurde diese Version (2787) mit MyBook (programmiert vom Autor).
Über jegliche Kommentare und Ergänzungen würde ich mich, Ingo Blechschmidt, iblech@web.de, sehr freuen.
1.1 ↑ Bezugsquellen
Die aktuellste Version dieses Buches ist auf http://linide.sf.net/theguide2/ zu finden. Interessant könnte auch die Projektseite auf Freshmeat sein.
1.2 ↑ Schreibkonventionen
Einzelne Befehle oder Programme werden im Fließtext gesperrt gedruckt.
Längere Listings hingegen bekommen immer einen extra Absatz:
Dies ist die erste Zeile. \Dies ist immer noch die erste Zeile, musste aber \aus Platzgründen mit einem "\" umgebrochen werden.
Ein Dialog, etwa zwischen Server und Client, wird wiefolgt dargestellt:
Client (Anfrage)Server (Antwort)
Werden im Fließtext Programme genannt, werden sie gesperrt gedruckt (Beispiel: telnet erwartet als Parameter...). Wenn aber das Konzept oder die Idee hinter dem Programm gemeint ist, wird es normal gedruckt und passt sich auch der Groß-/Kleinschreibung an (Beispiel: Die Idee hinter Telnet...).
Aus Platzgründen müssen in Listings oft einige Details weggelassen werden.
1.3 ↑ Wishlist
Ich kann auch noch andere Protokolle hier erläutern, einfach mir eine Mail schicken und ich arbeite daran...
SMTP: Spam-Abwehrmaßnahmen
Was sind RFCs?
HTTP: Transfer-Encoding gzip?
Web-Services
IPv6
DICT-Automatisierung
EPOP3?
Mehr Protokolle, aber welche... (=bitte Mail an mich)?
2 ↑ Grundlagen
In diesem Kapitel werden die unteren Schichten des Internets, also die Basis, auf der alle folgenden Kapitel aufbauen werden, vermittelt.
2.1 ↑ Das OSI-Schichtenmodell
Man untergliedert die Protokolle des Internets in verschiedene Schichten, definiert schon 1982 durch das OSI-("Open System Interconnection")-Schichtenmodell. Vereinfacht dargestellt, gliedert es alle Protokolle in drei Schichten1:
![digraph osi {
"Application Level" ->
"Transport Level" [ label="baut auf" ]
"Transport Level" ->
"Physical Level" [ label="baut auf" ]
}](.cache/92ec1dee614e85ef1b0c54f6b94f1f6e.png)
Je weiter "oben" ein Protokoll liegt, so abstrakter ist es. Mit diesen Protokollen werden wir uns am meisten beschäftigen. "Unten" liegt zum Beispiel die physikalische Schicht: Das entspräche praktisch dem Netzwerkkabel. Da uns aber nur die Software interessiert, wird hier darauf nicht eingegangen werden.
Auf der Transportschicht ist das Protokoll IP, "Internet Protocol", angesiedelt. IP ist für die grundlegende Kommunikation aller Rechner im Internet zuständig. Eine Schicht höher (nicht abgebildet) liegt TCP, das Transport Control Protocol. Dieses Protokoll sorgt dafür, dass die mit IP versendeten Pakete am Ziel auch ankommen, da IP selbst nicht für die Lieferung der Pakete garantiert. Auf der Anwendungsebene schließlich sind alle "hohen" Protokolle angesiedelt, namentlich SMTP, POP3, HTTP, NNTP und viele andere, denen je ein einzelnes Kapitel gewidment ist.
2.2 ↑ IP
Heute sorgt für die Kommunikationsfähigkeit aller Knoten des Internets die Version 4 des IP.
Sendedaten unterteilt IP in kleinere Pakete, die dann verschickt werden können. Dabei werden Absender und Empfänger durch eine IP-Adresse bestimmt.
Alle IP-Adressen sind vier Byte lang (ein "Word"), untergliedert in vier Zahlen mit je einem Byte. Was sich hier etwas kompliziert anhört ist ganz einfach: 80.81.9.177 ist zum Beispiel eine gültige IP-Adresse. Jede Zahl darf (wegen der 1-Byte-pro-Zahl-Grenze) maximal 255 (die 0 wird mit einbezogen) betragen.
Besondere IP-Adressen sind solche, die
auf
.0enden. Diese IP-Adressen definieren ein ganzes Subnetz. So definiert10.0.0.0zum Beispiel ein Subnetz, mit dem alle Rechner, dessen IP-Adressen mit10.beginnen, gemeint sind. Solche IP-Adressen können also nicht dazu verwendet werden, um einen einzelnen Rechner anzusprechen.Außerdem haben IP-Adressen, die auf
.255enden, sogenannte "Broadcast"-Adressen, eine besondere Bedeutung:Jeder Rechner eines Subnetzes hört auf Pakete, die an diese IP-Adresse geschickt wurden. Schickt man zum Beispiel einen Ping an eine solche Adresse, "pongen" alle anderen Rechner des Subnetzes zurück.
2.3 ↑ Routing
Aber wie kommen die Pakete von einem Rechner A zu B? Da gäbe es jetzt zwei Möglichkeiten:
Man verbindet jeden Rechner des Internets mit jedem anderen. Schlecht.
Man leitet die Pakete über andere Rechner, die dann als Router fungieren, d.h., sie leiten die Pakete nur weiter, verarbeiten sie aber nicht.
![digraph routing {
rankdir = LR;
A -> X -> Y -> B;
X -> Z [ dir = "none" ];
X [ label = "X\n(ISP)" ];
Y [ label = "Y\n(ISP)" ];
A [ shape = "box" ];
B [ shape = "box" ];
X [ shape = "box" ];
Y [ shape = "box" ];
Z [ shape = "box" ];
}](.cache/b8e118a2996ab6e2d9220fcdf3fe392c.png)
Dabei hat jeder Rechner in seiner Routing-Tabelle gespeichert, welche Verbindung zu welchem Rechner führt.
Im Beispiel gilt:
AWenn an
X, direkte Leitung benutzen.Alle anderen Pakete an
X, den Internet Service Provider (ISP), weiterleiten.
XWenn an
A, direkte Leitung benutzen.Wenn an
Z, direkte Leitung benutzen.Wenn an
Y, direkte Leitung benutzen.Alle anderen Pakete an
Yweiterleiten.
YWenn an
B, direkte Leitung benutzen.Wenn an
X, direkte Leitung benutzen.Alle anderen Pakete an
Xweiterleiten.
ZWenn an
X, direkte Leitung benutzen.Alle andere Pakete an
Xweiterleiten.
BWenn an
Y, direkte Leitung benutzen.Alle andere Pakete an
Y, den ISP, weiterleiten.
2.3.1 ↑ Time to Live
Durch z.B. fehlerhafte Routing-Tabellen können nun aber auch Endlosschleifen entstehen: Meint z.B. ein Rechner P, er müsse alle Pakete an Q schicken, und Q meint, alle Pakete sollen an P weitergeleitet werden, so wird das Paeket ewig zwischen den beiden Rechnern weitergeleitet werden.
Eine naive Lösung dieses Problems wäre es, einfach festzulegen: "Schicke niemals ein Paket zu dem Rechner zurück, der es dir zugeschickt hat."
Aber auch dadurch wird das Problem nicht vollständig gelöst, nämlich dann, wenn noch ein weiterer Rechner "in der Schleife festsitzt":
![digraph endlosschleife {
P -> Q -> R;
R -> P [ weight = 2 ];
}](.cache/15224e2d2fa35285458b97a58c0ba10f.png)
Deswegen kommt hier ein intelligenteres Verfahren zum Zug: Jedes Paket gibt in seinem Header nicht nur über Absender und Empfänger auskunft, sondern auch über die sogenannte Time to Live, abgekürzt TTL. Die TTL ist eine ein Byte breite Zahl (mögliche Werte zwischen 0 und 255). Wenn das Paket beim Absender generiert wird, erhält es einen bestimmten Startwert, der sich bei den meisten Betriebssystemen voneinander unterscheidet. Jedesmal, wenn das Paket einen Router passiert, wird dieser Wert um eins dekrementiert. Ist die TTL 0, wird das Paket verworfen und an den Absender wird eine Fehlermeldung über das Protokoll ICMP zugestellt.
2.3.2 ↑ Traceroute
Mit Hilfe der TTL kann man auch herausfinden, wie viele Router ein Paket passieren musste, ehe es sein Ziel erreichte. Dabei sendet man zuerst ein Paket zum Empfänger mit einer Start-TTL von 1. Erhält man keine Fehlermeldung, so besteht eine direkte Leitung zum Empfänger. Andernfalls war die TTL zu niedrig und man sendet erneut ein Paket, aber diesmal mit einer TTL von 2. Dieses Spiel führt man so lange fort, bis man bis zum Ziel durchkommt.
Möchte man diesen Vorgang automatisieren, benutzt man den Shellbefehl traceroute (oder tracert auf schlechten Betriebssystemen), den man als root ausführen muss:
thestars theguide #traceroute irc.lugs.chtraceroute to wigwam.ethz.ch, 30 hops max1 mars (10.0.0.4)2 ascend7.augustakom.net (80.81.6.71)3 router1.augustakom.net (80.81.6.2)4 80.81.7.118 (80.81.7.118)5 A.S-3-eth000-106.de.lambdanet.net (217.71.108.37)6 F-2-pos030-0.de.lambdanet.net (217.71.105.117)7 80.86.163.22 (80.86.163.22)8 swiix1-g2-1.switch.ch (194.42.48.11)9 swiEZ2-G3-2.switch.ch (130.59.36.249)10 rou-rz-gw-giga-to-switch.ethz.ch (192.33.92.1)11 rou-ethz-access-intern.ethz.ch (192.33.92.130)12 rou-hpx-1-mega-transit-2.ethz.ch (129.132.99.199)13 wigwam.ethz.ch (129.132.189.109)thestars theguide #
Traceroute ist oft als Diagnoseprogramm sinnvoll, wenn man eine Fehlermeldung der Art "Time to Live exceeded" zu Gesicht bekommt2. Sind einige Router "leicht fehlerhaft" konfiguriert, kann die Ausgabe z.B. so aussehen:
16 router1.augustakom.net (80.81.6.2)17 router2.augustakom.net (80.81.7.118)18 router1.augustakom.net (80.81.6.2)19 router2.augustakom.net (80.81.7.118)20 router1.augustakom.net (80.81.6.2)21 router2.augustakom.net (80.81.7.118)(...)
traceroute verschickt standardmäßig UDP-Pakete, kann aber auch mit der Option -I ICMP-Echo-Request-Pakete verschicken. Mit dem exzellenten tcptraceroute von Michael Toren können auch TCP-Pakete verschickt werden.
2.3.3 ↑ OS-Fingerprinting mittels der TTL
Wie weiter oben schon kurz angesprochen nehmen viele Betriebssysteme einen anderen Startwert für die TTL her. Umgekehrt bedeutet dies: Kennt man die Start-TTL eines Paketes, kann man auch mit einiger Gewissheit sagen, welches Betriebssystem der Absender benutzt. Dieser Vorgang ist ein Teil des sogenannten "OS-Fingerprintings", dem Identifizieren des eingesetzten Betriebssystems (und evtl. seiner Version).
Bei der praktischen Umsetzung dieser Idee gibt es jedoch noch ein Problem: Über (z.B.) einen Ping erfährt man nur den Wert der TTL am Ende der Reise des Pakets, der Startwert bleibt unbekannt. Aber dank Traceroute kann man ja auch die Anzahl der Hops, die Anzahl der Router, die Pakete auf dem Weg zum Ziel passieren mussten, bestimmen. Addiert man nun also die TTL des Paketes am Ende seiner Reise und die Anzahl der Hops, so erhält man die Start-TTL. Diese kann man dann in Tabellen nachschlagen.
Als Beispiel vergleichen wir die Start-TTLs von www.debian.de und www.suse.de. Wir gehen davon aus, dass sie beide eine ähnliche Version von Linux installiert haben, also müssten ihre Start-TTLs miteinander übereinstimmen.
Zuerst bestimmen wir die TTL, die "übrig bleibt", sobald wir
www.debian.deerreichen:thestars theguide #ping -c1 www.debian.dePING www.de.debian.org (141.76.2.5)64 bytes from 141.76.2.5: ttl=50 time=46.5 ms--- www.de.debian.org ping statistics ---1 packets transmitted, 1 received, 0% packet lossrtt min/avg/max/mdev = 46.528/46.528/46.528/0.000 msthestars theguide #
Die TTL beträgt also
50.Nun bestimmen wir die Anzahl der Hops, die zwischen uns und
www.debian.deliegen:thestars theguide #traceroute www.debian.detraceroute to www.de.debian.org (141.76.2.5)1 mars (10.0.0.4)2 router0.augustakom.net (80.81.6.1)3 router1.augustakom.net (80.81.6.2)(...)
14 cat6k-inf.campus.urz.tu-dresden.de (141.30.1.114)15 www.de.debian.org (141.76.2.5)thestars theguide #
Nun müssen wir noch die Start-TTL errechnen. Dabei ist es wichtig, dass wir für die Anzahl der Hops nicht 15, sonden 14 nehmen: Das Ziel selbst, der 15. Rechner, den uns
tracerouteangezeigt hat, dekrementiert die TTL ja nicht.thestars theguide #echo 50 + 14 | bc64thestars theguide #
Der Startwert der TTL von Paketen, die
www.debian.deversendet, ist also64.Jetzt wiederholen wir den Vorgang mit
www.suse.de.Pingen...
thestars theguide #ping -c1 wwww.suse.dePING turing.suse.de (195.135.220.3)64 bytes from 195.135.220.3: ttl=54 time=42.5 ms--- turing.suse.de ping statistics ---1 packets transmitted, 1 received, 0% packet lossrtt min/avg/max/mdev = 42.558/42.558/42.558/0.000 msthestars theguide #
...die Anzahl der Hops ermitteln...
thestars theguide #traceroute www.suse.detraceroute to turing.suse.de (195.135.220.3)1 mars (10.0.0.4)2 router0.augustakom.net (80.81.6.1)3 router1.augustakom.net (80.81.6.2)(...)
10 * * *11 skylla-router.suse.de (195.135.221.1)thestars theguide #
...und zusammenzählen:
thestars theguide #echo 54 + 10 | bc64thestars theguide #
Die Start-TTLs stimmen miteinander überein, unsere Vermutung, dass www.suse.de und www.debian.de das gleiche Betriebssystem einsetzen, war also korrekt. Wir könnten jetzt auch noch in Tabellen nachschlagen, welches Betriebssystem normalerweise Pakete mit einer TTL von 64 sendet, aber im Fall von Debian und SuSE ist das ziemlich klar... ;-).
2.4 ↑ TCP
Ein gravierender Nachteil von IP ist allerdings die mangelnde Fehlertoleranz: Ist Netzlast hoch, kommen viele Pakete nicht am Ziel an. Deswegen wurde ein weiteres Protokoll entworfen, TCP, das Transmission Control Protocol. TCP sorgt dafür, dass die via "normalem" IP versendeten Pakete auch wirklich am Ziel ankommen.
Dies erreicht TCP vereinfacht gesagt dadurch, dass es die Pakete nummeriert. Empfängt der Zielrechner z.B. die Pakete mit den Nummern 42, 43, 45 und 46, so weiß er, dass Paket 44 fehlt und kann es neu anfordern.
Auch ergänzt TCP IP um sogenannte Ports: Auf jedem der insgesammt 2^{16} Ports (0 bis 655353) kann ein eigener Dienst (HTTP, SMTP, POP3, IMAP, DNS, etc.) "lauschen". Dadurch erst wird die Dienstevielfalt des Internets möglich.
2.4.1 ↑ Telnet
Um zu einem TCP-Port eines Hosts zu connecten, benutzt man unter guten System (Linux, Hurd) den Shellbefehl telnet. Um z.B. eine Verbindung mit dem Rechner mars auf Port 22 herzustellen, benutzt man:
iblech@thestars theguide $telnet mars 22Trying 10.0.0.4...Connected to mars.gnus.Escape character is '^]'.SSH-2.0-OpenSSH_3.8.1p1^](Strg+AltGr+]wird auf diese Weise angezeigt)telnet>qConnection closed.iblech@thestars theguide $
Um eine Verbindung vorzeitig abzubrechen, kann man die Tastenkombination Strg+AltGr+] benutzen. Daraufhin nimmt telnet Befehle entgegen. Mit quit (abkürzbar auf q) kann man die Verbindung schließen.
"Aber Telnet ist doch unsicher!1 Telnet sollte nicht verwendet werden!"
Diese Aussage, für die Google immerhin über 3000 Ergebnisse liefert, ist nur bedingt richtig. Richtig ist, dass bei Telnet alle Daten im Klartext, also unverschlüsselt, übertragen werden. So kann, durch Abhören des Netzverkehrs ("Sniffen"), auch sensible Daten wie Passwörter mitgeschnitten werden. Möchte man Telnet also zur Fernadministration einsetzen, ist diese Aussage zweifellos richtig und man sollte lieber OpenSSH einsetzen. SSH verschlüsselt den Datenstrom bevor er über das Netz gesendet wird.
Aber bei allen anderen Einsatzgebieten von Telnet kann man nicht pauschal von einer Unsicherheit reden. Möchte man z.B. nur die aktuelle Zeit abfragen4, steht die Sicherheit5 im Hintergrund.
2.4.2 ↑ nmap
Möchte man eine Übersicht aller offenen Ports (Ports, an denen ein Dienst lauscht), verwendet man einen Portscanner.
Portscanner verbinden sich praktisch mit jedem möglichen Port des Zielsystems. Wird die Verbindung aufgebaut, ist der Port offen und wird angezeigt. Ein beliebter Portscanner unter Linux und anderen Unix-basierten Systemen ist nmap. nmap erwartet in seiner einfachsten Form nur die Namen der Hosts, die gescannt werden sollen:
iblech@thestars theguide $nmap thestarsStarting nmap 3.50 ( http://www.insecure.org/nmap/ )Interesting ports on thestars.gnus (10.0.0.3):(The 1651 ports scanned but not shown are: closed)PORT STATE SERVICE22/tcp open ssh23/tcp open telnet53/tcp open domain79/tcp open finger1024/tcp open kdm6000/tcp open X116666/tcp open irc-serv6667/tcp open ircNmap run completed -- 1 IP address (1 host up) scannediblech@thestars theguide $
Möchte man schon während dem Scan sehen, welche Ports als offen identifiziert wurden, kann man nmap mit der Option -v aufrufen:
iblech@thestars theguide $nmap -v thestars
2.5 ↑ UDP
UDP, das User Datagram Protocol, ergänzt IP lediglich um die schon von TCP bekannten Ports, nicht aber um die Fehlertoleranz. Pakete, die aus irgendeinem Grund nicht am Ziel ankommen, werden also nicht nochmal geschickt.
Dies ist z.B. bei der Übertragung von Audio- und Video-Streams sinnvoll, da dort eine evtl. häufige Neu-Übertragung von Paketen die verfügbare Bandbreite nur unnötig schmälern würde. Außerdem fallen einige nicht übertragene Pakete nicht ins Gewicht: Das nächste Paket, welches z.B. die nächste zehntel Sekunde eines Audio- oder Videostreams beschreibt, wird schon nach sehr kurzer Zeit abgesendet. Das Fehlen einen Frames wird quasi durch den nächsten "übertönt", es ist höchstens ein kurzes Knacken zu hören bzw. ein kurzer Hänger zu sehen.
Auch gibt es bei UDP nicht das Konzept einer Verbindung zwischen zwei Hosts: Es werden einfach Pakete verschickt und empfangen, aber es gibt keine Zugehörigkeit zu einer Verbindung. Ein Server kann auf ein UDP-Paket in dem Sinne auch nicht antworten, sondern schickt einfach ein neues Paket los.
2.5.1 ↑ Netcat
Möchte man manuell eine "Verbindung" zu einem UDP-Port herstellen, kann man Netcat verwenden, Telnet ist dazu nicht fähig.
Als Beispiel wollen wir ein Paket zum UDP-Port 13 von sombrero.cs.tu-berlin.de schicken:
iblech@thestars theguide $nc -u sombrero.cs.tu-berlin.de 13we be leetTue Aug 10 14:04:49 2004(
Strg+C)iblech@thestars theguide $
Statt we be leet hätten wir auch nur eine Leerzeile oder etwas anderes schicken können: Der Server von sombrero.cs.tu-berlin.de, der auf dem UDP-Port 13 lauscht, ist so programmiert, dass er, immer, wenn er ein Paket empfängt, er ein Paket mit der aktuellen Zeit zurückschickt. Auch mussten wir nc mit Strg+C abbrechen: Da es bei UDP ja keine Verbindungen gibt, konnte der Server auch keine schließen, was für Netcat das Signal gewesen wäre, sich zu beenden. Aber dies ist UDP, nicht TCP, also mussten wir selbst das Programm beenden.
2.6 ↑ ICMP
ICMP, das Internet Control Message Protocol, wird, von einigen kryptographischen Zwecken einmal abgesehen, nur zur Statusübertragung für IP/TCP/UDP eingesetzt, zum Beispiel ob der Zielhost existiert, eine Route verfügbar ist usw. Dies haben wir weiter oben bei Traceroute ausgenutzt: Der Fehler, der Traceroute gemeldet wird (Time-to-Live exceeded), wird über ICMP übertragen.
Wichtig dabei ist, dass Fehler, die bei der Übertragung der Statusmeldungen auftreten, nicht nochmal gemeldet werden. Unter Umständen wäre eine endlose Überschwemmung des Netzes die Folge.
2.6.1 ↑ Ping
Von den verschiedenen Statusmeldungen, die über ICMP übertragen werden können, werden zwei besonders häufig genutzt: "Pings" und "Pongs" (ICMP-Echo-Requests und ICMP-Echo-Replies).
Erhält ein Rechner einen Ping, so sollte er einen Pong zurückschicken. Dies wird oft genutzt, um die Erreichbarkeit von Hosts zu testen.
Das Programm, das Pings versendet, heißt unerwarteterweise ping. Der Aufruf ist simpel, als Argument erwartet ping lediglich den Host, den es pingen soll:
iblech@thestars theguide $ping marsPING mars.gnus (10.0.0.4) 56(84) bytes of data.64 bytes from mars: icmp_seq=1 ttl=64 time=1.02 ms64 bytes from mars: icmp_seq=2 ttl=64 time=0.208 ms64 bytes from mars: icmp_seq=3 ttl=64 time=0.203 ms(
Strg+C)--- mars.gnus ping statistics ---3 packets sent, 3 received, 0% packet loss, time 2011msrtt min/avg/max/mdev = 0.203/0.478/1.024/0.386 msiblech@thestars theguide $
Auf guten System pingt ping bis es manuell abgebrochen wird, auf schlechten Systemen (=MDollar) wird nur einige Male gepingt.
Ist ein Rechner nicht online, erhält man eine Ausgabe der Art
iblech@thestars theguide $ping trinityPING trinity.gnus (10.0.0.6) 56(84) bytes of data.(
Strg+C)--- trinity.gnus ping statistics ---2 packets sent, 0 received, 100% packet lossiblech@thestars theguide $
"Pings sind böse! Auf Pings darf man nicht antworten! Sonst weiß ein böser Hacker, dass man online ist!"
In der Tat kann man "Pings einfach blocken", also keine Antwort auf Pings verschicken. Aber sicherer vor "bösen Hackern" ist man deswegen nicht: Zum einen reagieren die meisten Provider auf einen Ping auf einen Rechner, der offline ist, mit einem ICMP-Destination-Unreachable-Paket. Konfiguriert man nun seine Firewall so, dass keine Pongs verschickt werden, weiß ein Angreifer, dass der online ist: Wäre er es nicht, würde vom Provider ja das besagte ICMP-Destination-Unreachable-Paket kommen.
Zum anderen gibt es noch andere Methoden, um festzustellen, ob ein Rechner online ist: Zum Beispiel könnte man einfach zu irgendeinem (TCP-)Port des Rechners connecten. Schlägt der Versuch sofort fehl (nicht erst nachdem ein Timeout abgelaufen ist), ist klar, dass der Rechner on ist: Sonst hätte er den Versuch eines Verbindungsaufbau ja nicht zurückweisen können.
Besser ist es, die Dienste, die man anbietet, abzusichern, und nicht "Pings zu blocken" und darauf zu hoffen, dass man dann sicher ist.
2.7 ↑ Abschluss
Besonders den Umgang mit telnet sollte man beherrschen, um die Beispiele der nächsten Kapitel auch selbst ausprobieren zu können.
3 ↑ E-Mails
Oft wird dazu geraten, Spam-Mails ("Unerwünschte Werbe-Mails") einer sogenannten Header-Analyse zu unterziehen.
Dabei ist der Ausdruck insbesondere beim Umgang mit Mails nicht ganz korrekt: Bei E-Mails gibt es zwei Header-Typen, einmal den SMTP-"Header" (mehr dazu im Kapitel über SMTP) und dann den Mail-Header, um den es in diesem Kapitel geht.
3.1 ↑ Format
Schaut man sich einmal den vollständigen Quelltext einer Mail an, so stellt man fest, dass die Mail in zwei Abschnitte gegliedert ist.
Zuerst kommt der Header, der Auskunft über Absender, Empfänger, etc. gibt. Die einzelnen Headerfelder werden von den Feldinhalten mit einem : (Doppelpunkt Leerzeichen) voneinander getrennt.
Dann folgt, getrennt durch eine Leerzeile, der Nachrichteninhalt. Eine optionale Signatur wird durch -- (Bindestrich Bindestrich Leerzeichen) vom Text getrennt.
Received: from imap.web.de [217.72.192.135]by localhost with IMAP (fetchmail-6.2.5)for iblech@localhost (single-drop);Thu, 05 Aug 2004 18:55:15 +0200 (CEST)Received: (nullmailer pid 9702 invoked by uid 1000);Thu, 05 Aug 2004 16:54:02 -0000Date: Thu, 5 Aug 2004 18:54:02 +0200From: Ingo Blechschmidt <iblech@web.de>To: Ingo Blechschmidt <iblech@thestars.gnus>Subject: TestMessage-ID: <20040805165402.GA9665@thestars.gnus>Reply-To: iblech@web.deContent-Type: text/plain; charset=us-asciiUser-Agent: Mutt/1.5.6iContent-Length: 190Lines: 7Hier da--(Bindestrich Bindestrich Leerzeichen)Linux, the choice of a GNU | Mathematicians practicegeneration on a dual AMD- | absolute freedom.Athlon! | -- Henry AdamsEncrypted mails preferred. |
3.2 ↑ Typische Header
Die meisten Header sind in RFC 2076 standardisiert. Die mit X- beginnenden Header können frei verwendet werden, auch wenn sich einige X-Header auch schon als de-facto Standard durchgesetzt haben:
| Header | Bedeutung |
|---|---|
Received | SMTP-Server-Stempel |
Date | Zeitpunkt des Versendens |
From | Absender6 |
Reply-To | Adresse, an die Rückantworten gehen sollen |
Message-ID | Weltweit eindeutige ID, oft bestehend aus einem festen und einem zufälligen Teil. Die Eindeutigkeit der Message-ID ist besonders bei NNTP sehr wichtig. |
In-Reply-To | Message-ID, auf die geantwortet wurde |
To, Cc | Empfänger |
Subject | Betreff |
Organization7 | Organisation, Firma, etc. |
Content-Type | MIME-Typ |
User-Agent, X-Mailer | Verwendeter MUA (Mailprogramm) |
X-Operating-System | Zum Verfassen der Mail verwendetes Betriebssystem (Linux, Hurd, ...) |
X-GnuPG-Key | ID des öffentlichen GnuPG/PGP-Schlüssels |
3.3 ↑ SMTP-Server-Stempel
Mails werden, wie im nächsten Kapitel beschrieben, bei SMTP über viele Server geleitet. Jeder Server fügt beim Weiterleiten seinen eigenen Received-Header möglichst weit unten (aber vor den "normalen" Headern wie From usw.) an, zum Beispiel:
Received: from imap.web.de [217.72.192.135]by localhost with IMAP (fetchmail-6.2.5)for iblech@localhost (single-drop);Thu, 05 Aug 2004 18:55:15 +0200 (CEST)
Hier hat also der Server localhost vom Server iblech.dyndns.org eine Mail via dem Protokoll ESMTP erhalten.
So lassen sich manchmal Spam-Versender zurückverfolgen, auch wenn sie ihre Absenderadresse fälschen: Es ist ein leichtes, den From-Header zu fälschen. Aber der (nicht so einfach modifizierbare) erste Received-Header lässt den der Ursprung der Mail trotzdem erkennen.
3.4 ↑ MIME-Typen
Ein anderer wichtiger Header ist Content-Type. Dieses Feld gibt den MIME-Typ ("Multipurpose Internet Mail Extensions") des Inhalts der Mail an. Nur so weiß der Mailreader, welches Format die Mail hat ("Enthält die Mail ausschließlich Text? Oder ist sie vielleicht in HTML verfasst?").
MIME-Typen sind untergliedert in Kategorien:
![digraph mimetypes {
"MIME" -> { "text" "image" };
"text" -> { "plain" "html" };
"image" -> { "png" "xpm" };
"plain" [ label = "text/plain:\nNur-Text-Dokument" ];
"html" [ label = "text/html:\nHTML-Seite" ];
"png" [ label = "image/png:\nPNG-Bild" ];
"xpm" [ label = "image/xpm:\nXPM-Bild" ];
}](.cache/985f390e7418b8224f09cfc94698f12d.png)
MIME-Typen werden heute auch bei HTTP eingesetzt, damit der Browser auch ohne die eher von altmodischen Betriebssystemen (sic) bekannte Dateinamenserweiterung über den Typ einer Datei bescheid weiß.
3.5 ↑ Abschluss
Über den Header kann man also einige wichtige Informationen erhalten. Peinlich ist es natürlich für Firmen, die für ein bestimmtes Produkt per Mail werben, und dann selbst das Konkurrenzprodukt einsetzen (z.B. Werbung für MDollar, geschrieben in Mutt, einem Linux-Mailclient)...
Wer sich noch genauer mit dem Format von Mails beschäftigen möchte, sollte sich den RFC 2076 ansehen (der erste RFC zum Thema war RFC 822, der 1982 eingereicht wurde).
4 ↑ SMTP
Der Mail-Header ist jetzt erklärt, doch eine Frage wurde bisher nur verdrängt: Wie kommen die Mails eigentlich beim Empfänger an?
Diesen Part übernimmt das Send Mail Transport Protocol, SMTP, eines der ersten Protokolle, die es im Internet8, gab. Der erste RFC, der SMTP definierte, RFC 821, wurde bereits 1982 eingereicht.
Um einen Nutzer im Internet eindeutig zu adressieren, entwickelte man ein neues Adressierungsmuster: Man benutzt den Rechner, auf dem der Nutzer meistens anzutreffen ist (also eingeloggt ist), und seinen Login-Namen auf diesem als E-Mail-Adresse. Als Trenner fungiert das @-Zeichen.
Für's Verschicken und Empfangen sind zwei unterschiedliche Protokolle zuständig, beide in der Anwendungsschicht des OSI-Schichtenmodells angesiedelt: SMTP zum Versenden und POP3) zum Empfangen von Mails. Dieses Kapitel erklärt nur SMTP, nicht POP3.
4.1 ↑ Grundlagen
E-Mails wandern bei SMTP i.A. über viele Server ehe sie ihr Ziel erreichen. Dies kommt noch aus der Zeit der vielen Mailboxnetze, wo viele Internetverbindungen nicht permanent aktiv waren und so häufig andere Routen für die Mail-Übertragung genommen werden mussten.
![digraph smtp_netzwerk {
C1 [ label="Client" ];
C2 [ label="Client" ];
S1 [ label="Server" ];
S2 [ label="Server" ];
C1 -> S1 [ label="\nLokal\nSMTP" ];
S1 -> S2 [ label="SMTP" ];
S2 -> C2 [ label="\nPOP3\nIMAP4" ];
rankdir=LR;
}](.cache/9b794e9292f5ffda264acaad38761110.png)
SMTP ist ein sehr einfaches, ASCII-basiertes Protokoll, das heißt, auch Menschen können zum Beispiel mit dem telnet-Befehl das Protokoll nutzen, obwohl in der Praxis Mail-Server diese Aufgabe übernehmen.
4.2 ↑ Envelope-Header
Damit jeder Server weiß, wohin er eine eingegangene Mail weiterleiten soll, muss dieser in den sogenannten Envelope-Header schauen.
Dieser Header hat noch nichts mit der Mail selbst zu tun! Der Server interessiert sich nicht für den Mail-Header wie aus dem vorherigen Kapitel, nur der Envelope-Header ist entscheidend für das Ziel der Mail.
Dies ist vergleichbar mit "traditioneller" Post: Der Briefträger schaut nur auf den Umschlag, nicht aber in den Brief9. Somit kann in dem Brief ein ganz anderer Empfänger angegeben sein, ohne das der Postbote davon erfährt:

4.3 ↑ Typischer Ablauf
Nun zu etwas Praxis: Wir werden eine Mail, die ein foo@A.org geschrieben hat, an bar@B.org weiterleiten. Dabei spielen wir den Mail-Server von A.org.
Also verbinden wir uns zuerst mit dem Standard-Port von SMTP, TCP-Port 25, von Rechner B.org:
iblech@thestars theguide $telnet B.org 25Trying 200.233.42.11...Connected to B.org.Escape character is '^]'.220 B.org Mailserver ready.
Dann authentifizieren wir uns bei B.org mit dem Kommando HELO10:
HELO A.org250 B Hello A.org [199.232.41.10], pleased to meet you
Die 250 am Anfang der Antwort stellt dabei den Statuscode dar. 250C bedeutet dabei "alles in Ordnung", wie man an der englischen Antwort daneben auch erkennen kann.
Als nächstes erwartet B.org den Absender der E-Mail, und zwar den Envelope-Sender.
MAIL FROM: <foo@A.org>250 2.1.0 <foo@A.org>... Sender ok
Damit B.org weiß, an wen er die Mail zustellen soll, kommt jetzt das Kommando RCPT (Abkürzung für Recipient):
RCPT TO: <bar@B.org>250 2.1.5 <bar@B.org>... Recipient ok
Dieser Befehl kann auch mehrmals angewendet werden, um eine identische Mail an viele Empfänger zu schicken, ohne dass man jedesmal den Inhalt der Mail neu übertragen muss. Dies nutzen leider auch Spammer aus...
Nun erst wird mit der Übertragung der eigentlichen Mail begonnen:
DATA354 Enter mail, end with "." on a line by itselfFrom: Mister Foo <foo@A.org>To: Bar Com <bar@B.org>Subject: foobar(Leerzeile)
blabla....(Punkt Enter)250 2.0.0 h6EIf8O08948 Message accepted for delivery
Ab dem eingegebenen DATA kommt die eigentliche Mail, im Format wie im vorhergehenden Kapitel erläutert. Diese Mail-Header können hier beliebig gesetzt werden, ohne dass das irgendeine Software überprüft. Und ja, sie müssen nicht zwingend mit den Envelope-Headern übereinstimmen.
Theoretisch kann der Mail-Header sogar fehlen; Die Mail kommt trotzdem an, dafür sorgt ja der Envelope-Header.
Das Ende der Mail markiert ein einzelner Punkt auf einer Zeile11. Zum Schluss muss die Sitzung dann nur noch geschlossen werden:
QUIT221 2.0.0 B.org closing connection
In einem kleinem Schema zusammengefasst sieht eine typische SMTP-Sitzung also so aus:
![digraph smtp_sitzung {
A1 [ label="A.org" ]; B1 [ label="B.org" ];
A2 [ label="A.org" ]; B2 [ label="B.org" ];
A3 [ label="A.org" ]; B3 [ label="B.org" ];
A4 [ label="A.org" ]; B4 [ label="B.org" ];
A5 [ label="A.org" ]; B5 [ label="B.org" ];
A6 [ label="A.org" ]; B6 [ label="B.org" ];
A7 [ label="A.org" ]; B7 [ label="B.org" ];
A8 [ label="A.org" ]; B8 [ label="B.org" ];
A9 [ label="A.org" ]; B9 [ label="B.org" ];
AA [ label="A.org" ]; BA [ label="B.org" ];
AB [ label="A.org" ]; BB [ label="B.org" ];
AC [ label="A.org" ]; BC [ label="B.org" ];
AC -> BC [ label="\nTCP-Port 25" ];
AB -> BB [ label="Banner:\n220 Ready.", dir=back ];
AA -> BA [ label="Authentifikation:\nHELO hostname" ];
A9 -> B9 [ label="Bestätigung:\n250 Ok.", dir=back ]
A8 -> B8 [ label="Absender:\nMAIL FROM: <absender@hostname>" ];
A7 -> B7 [ label="Bestätigung:\n250 Ok.", dir=back ]
A6 -> B6 [ label="Empfänger:\nRCPT TO: <empfänger@ziel>" ];
A5 -> B5 [ label="Bestätigung:\n250 Ok.", dir=back ]
A4 -> B4 [ label="Mailheader und -body:\nDATA" ];
A3 -> B3 [ label="Bestätigung:\n250 Ok.", dir=back ]
A2 -> B2 [ label="Schließen der\nVerbindung:\nQUIT" ];
A1 -> B1 [ label="Bestätigung:\n221 Good bye.", dir=back ]
rankdir=LR;
}](.cache/ccd0249bec9de9317322846ec7f7ef0e.png)
4.4 ↑ Beispiel
Nun wollen wir die Theorie in die Praxis umsetzen:
Wir wollen eine E-Mail an iblech-ml@gmx.de im Namen von billg@gates.gat12 schicken.
Es gibt zwei Möglichkeiten, zu welchem Mailserver wir connecten: Entweder, wir verbinden uns mit einem sogenannten Open Relay. Ein Open-Relay ist ein SMTP-Server, der jede Mail annimmt und dann entsprechend weiterleitet. Solche Open-Relays waren früher sehr beliebt und legitim, da ein Internetzugang noch sehr viel gekostet hat und so jemand anderes die Mails weiter verschickt hat (zum Beispiel ein Server einer Universität). Es kümmert sich also das Open Relay um den weiteren Transport der Nachricht. Da heutzutage aber auch Spammer Open Relays für ihre Zwecke missbrauchen, sind viele Relays in Blacklists eingetragen weshalb diese Möglichkeit wegfällt.
Aber wir können uns auch gleich mit dem SMTP-Server des Empfängers verbinden, diese Möglichkeit funktioniert immer. Nichts anderes machen nämlich die Mailserver der ISPs. Wie man diesen Server herausfindet, ist im Kapitel über DNS, im Abschnitt über MX-Records beschrieben. Für jetzt soll es einfach genügen, wenn ich sage, dass der SMTP-Server von GMX mx0.gmx.de ist.
Sobald die Verbindung aufgebaut ist, werden wir uns als localhost identifizieren.
Bei der Eingabe des Envelope-Senders ist nun zu beachten, dass viele Mailserver die Syntax des Absenders überprüfen. Als Envelope-Sender ginge also zum Beispiel hallo@-@dd nicht durch. Deswegen müssen wir eine gültig aussehende E-Mail-Adresse als Absender wählen. Welcher Absender im Mail-Header dann steht, ist, wie schon erwähnt, vollkommen egal.
Also geben wir ein:
iblech@thestars theguide $telnet mx0.gmx.de 25Trying 213.165.64.100...Connected to mx0.gmx.de.Escape character is '^]'.220 {mx039} GMX Mailservices ESMTPEHLO localhost250-{mx039} GMX Mailservices250-8BITMIME250 ENHANCEDSTATUSCODESMAIL FROM: <koennte_existieren@realer_host.com>250 2.1.0 {mx039} okRCPT TO: <iblech-ml@gmx.de>250 2.1.5 {mx039} okDATA354 {mx039} Go aheadFrom: The Imperor <billg@gates.gat> $$$To: You! Yes, you! <html>Subject: Hmm...(Leerzeile)
muhahahaha....250 2.6.0 {mx039} Message acceptedQUIT221 2.0.0 {mx039} GMX MailservicesConnection closed by foreign host.iblech@thestars theguide $
Wenn ich nun in mein Postfach schaue, werde ich eine Mail von The Imperor <billg@gates.gat> $$$ an You! Yes, you! <html> in meinem Postfach finden.
Wenn sich Mails also so einfach fälschen lassen -- wie stellt man dann trotzdem eine sichere Kommunikation her? Man muss jede ausgehende Mail digital verschlüsseln und signieren. In Mailclients integrierbare Programme wie GnuPG übernehmen diese Aufgabe. Eine sehr gute Einführung zu GnuPG gibt ein Bericht von Pro-Linux.
4.5 ↑ Befehlsübersicht
| Befehl | Wirkung |
|---|---|
HELO hostname | Authentifizierung (SMTP) |
EHLO hostname | Authentifizierung (ESMTP) |
MAIL FROM: <sender@host> | Envelope-Sender |
RCPT TO: <empfaenger@host> | Envelope-Empfänger |
DATA | Beginn der Mail |
. | Ende der Mail |
QUIT | Terminierung der Verbindung |
5 ↑ POP3
Das Personal Office Protocol, POP3, definiert in RFC 1939, ist praktisch das Gegenstück zu SMTP. Auch auf ASCII basierend, holt es die Mails vom Server ab anstatt sie zu versenden.
Auf Extended POP3, EPOP3, wird hier nicht eingegangen, da es im Wesentlichen nur neue Authentifizierungsmöglichkeiten unterstützt. Es gibt keine fundamentalen Unterschiede zwischen POP3 und EPOP3.
5.1 ↑ Grundlagen
Bei POP3 werden die Mails, welche zuvor via SMTP versendet wurden, auf dem Server so lange gespeichert, bis sie vom Client gelöscht werden13.
Ohne POP3 (oder einem ähnlichen Protokoll) müsste der Client permanent online sein, um E-Mails zu erhalten, was besonders früher wegen der hohen Onlinekosten wirklich nicht erwünscht war...
5.2 ↑ Typische POP3-Sitzung
POP3 ist eines der einfachsten Protokolle. Im Gegensatz zu SMTP, wo es Hunderte von Statuscodes gibt, findet man bei POP3 nur +OK und -ERR vor. Auch gibt es bei POP3 im Gegensatz zu zum Beispiel IMAP wenig Interaktivität; Der Client verlangt etwas (Liste der auf dem Server gespeicherten Mails oder eine gewünschte Mail), und der Server antwortet sofort.
Als Beispiel dient das einfache Abrufen samt anschließendem Löschen der Mails ohne einem Mail User Agent (MUA, z.B. mutt, mailx oder kmail).
Zuerst verbinden wir uns deshalb mit dem POP3-Server, der unsere Mails speichert, auf TCP-Port 110. Da wir meine Mails abholen wollen, ist der entsprechende POP3-Server pop3.web.de:
iblech@thestars theguide $telnet pop3.web.de 110Trying 217.72.192.134...Connected to pop3.web.de.Escape character is '^]'.+OK WEB.DE POP3-Server
WEB.DE POP3-Server ist dabei der sogenannte Banner. In der Banner-Zeile wird oft auch die eingesetze Version des POP3-Servers übertragen.
Dann loggen wir uns ein:
USER iblech+OK Bitte Kennwort eingeben/enter passwordPASS Th1s_1s_4_VeRy_S3cRe7_p4s5w0rd+OK Postfach bereit/mailbox locked and ready
Nun können wir eine Liste der auf dem Server gespeicherten Messages abrufen:
LIST+OK1 18822 5665.
Um jetzt z.B. die zweite Mail herunterzuladen, geben wir ein:
RETR 2+OK Nachricht folgt/message followsFrom: Some Body <some@body.com>To: Ingo Blechschmidt <iblech@web.de>Subject: Buy nowHi man,....
Man erhält also den schon von SMTP bekannten Mail-Header samt Body (wieder mit einer Leerzeile getrennt), als Terminierung wird ein einzelner Punkt auf einer Zeile (.) benutzt.
Jetzt, wo der Client, also wir, die Mail erhalten hat, können wir die Mail löschen:
DELE 2+OK Nachricht wurde geloescht/message deleted
Um dann die Verbindung zu schließen tippen wir:
QUIT+OKiblech@thestars theguide $
5.3 ↑ Protokollablauf
![digraph pop3_sitzung {
A1 [ label="Client" ]; B1 [ label="Server" ];
A2 [ label="Client" ]; B2 [ label="Server" ];
A3 [ label="Client" ]; B3 [ label="Server" ];
A4 [ label="Client" ]; B4 [ label="Server" ];
A5 [ label="Client" ]; B5 [ label="Server" ];
A6 [ label="Client" ]; B6 [ label="Server" ];
A7 [ label="Client" ]; B7 [ label="Server" ];
A8 [ label="Client" ]; B8 [ label="Server" ];
A9 [ label="Client" ]; B9 [ label="Server" ];
AA [ label="Client" ]; BA [ label="Server" ];
AB [ label="Client" ]; BB [ label="Server" ];
AC [ label="Client" ]; BC [ label="Server" ];
AC -> BC [ label="\nTCP-Port 110" ];
AB -> BB [ label="Banner:\n+OK WEB.DE POP3-Server", dir=back ];
AA -> BA [ label="Authentifikation:\nUSER username\nPASS passwort" ];
A9 -> B9 [ label="Bestätigung:\n+OK", dir=back ]
A8 -> B8 [ label="Liste gespeicherter Mails:\nLIST" ];
A7 -> B7 [ label="Bestätigung:\n+OK", dir=back ]
A6 -> B6 [ label="Anzeiger einer Mail:\nRETR id" ];
A5 -> B5 [ label="Bestätigung:\n+OK", dir=back ]
A4 -> B4 [ label="Löschen einer Mail:\nDELE id" ];
A3 -> B3 [ label="Bestätigung:\n+OK", dir=back ]
A2 -> B2 [ label="Schließen der\nVerbindung:\nQUIT" ];
A1 -> B1 [ label="Bestätigung:\n+OK", dir=back ]
rankdir=LR;
}](.cache/709ab62d8d4effccffa33bb6aeaf763f.png)
iblech@thestars theguide $telnet pop3.web.de 110Trying 217.72.192.134...Connected to pop3.web.de.Escape character is '^]'.+OK WEB.DE POP3-ServerUSER iblech+OK Bitte Kennwort eingeben/enter passwordPASS Ultr4 1337 p455w0rd+OK Postfach bereit/mailbox locked and readyLIST+OK1 18822 56653 24304 17905 5079.RETR 1+OK Nachricht folgt/message followsReceived: from [204.126.2.42] (helo=gentoo.org)by mx16.web.de with smtp (WEB.DE 4.99 #401)id 19crxk-0006K8-00for iblech@web.de; Wed, 16 Jul 2003 21:29:16 +0200Received: (qmail 8463 invoked by uid 1002); 16 Jul 200319:28:37 -0000Mailing-List: contact gentoo-user-help@gentoo.org; runby ezmlmPrecedence: bulkList-Id: Gentoo Linux mail <gentoo-user.gentoo.org>Reply-To: gentoo-user@gentoo.orgX-BeenThere: gentoo-user@gentoo.org....DELE 1+OK Nachricht wurde geloescht/message deletedQUIT+OKConnection closed by foreign host.iblech@thestars theguide $
Das war's auch schon. So kann man auch ohne installierten MUA seine Mails abrufen und löschen, zum Beispiel wenn eine 100 MeB große Mail auf dem Server ist und man gerade keine Lust hat, wegen ISDN 243 Minuten zu warten.
5.4 ↑ Befehlsübersicht
| Befehl | Wirkung |
|---|---|
USER benutzername | Login mit Benutzername... |
PASS P455w0r7 | ...und Passwort |
LIST | Liste aller auf dem Server gespeicherten Mails |
STAT | Anzahl der gespeicherten Mails samt ihrer Größe in Bytes |
RETR id | Holt eine Mail |
DELE id | Löscht eine Mail |
QUIT | Beendet die Verbindung |
6 ↑ IMAP4
Wie POP3 dient das Internet Message Access Protocol, IMAP, definiert in RFC 1730 dazu, die auf dem Server gespeicherten Mails abzurufen. Allerdings bleiben bei IMAP die Mails auch üblicherweise auf dem Server, das heißt der Server übernimmt die permanente Speicherung der Mails.
Dies ist besonders für Nutzer, die oft an verschiedenen Computern arbeiten, nützlich, da sie nun auf alle ihrer Mails von jedem Computer aus Zugriff haben.
Auch gibt es bei IMAP (server-seitige) Ordner, ein Fremdwort für POP3.
6.1 ↑ Technische Implementierung
Direkt nach dem Verbinden auf den Standardport 143 (TCP) des IMAP4-Servers (im Beispiel imap.web.de) empfängt man eine Bannermeldung:
iblech@thestars theguide $telnet imap.web.de 143Trying 217.72.192.135...Connected to imap.web.de.Escape character is '^]'.* OK WEB.DE IMAP4-Server
Als nächstes loggen wir uns ein:
A001 LOGIN "iblech" "pa5sword"A001 OK User logged in
Da bei IMAP theoretisch mehrere Befehle gleichzeitig ausgeführt werden können, bedient man sich von IDs, die jedem Befehl voranstehen müssen (hier A001). Die ID kann mehr oder weniger frei gewählt werden, es dürfen nur keine Leerzeichen oder andere Sonderzeichen in der ID enthalten sein. Auch muss die nächste ID nicht unbedingt "höher" (zum Beispiel A002) sein.
Nun können wir einen Ordner auswählen:
A002 SELECT "inbox"* 1 EXISTS* OK [UNSEEN 1] Message 1 is first unseen* OK [PERMANENTFLAGS (\Deleted \Seen \Answered)]* OK [UIDVALIDITY 1]* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)A002 OK Completed [READ-WRITE]
inbox ist der Standard-Ordner, "Posteingang". Aus der Antwort können wir sehen, dass eine Nachricht noch neu ist (UNSEEN 1).
Bevor wir allerdings die Nachricht herunterladen, können wir schauen, wie groß die Mail (wie bei POP3 angegeben in Octets, also Bytes) ist:
A003 FETCH 1 RFC822.SIZE* 1 FETCH (RFC822.SIZE 2247)A003 OK Completed
Nun können wir die Übertragung des Headers der Mail einleiten:
A004 FETCH 1 RFC822.HEADER* 1 FETCH (RFC822.HEADER {1446}Received: from [204.126.2.42] (helo=gentoo.org)by mx22.web.de with smtp (WEB.DE 4.99 #420)id 19iCSL-0008FU-00for iblech@web.de; Thu, 31 Jul 2003 14:22:53 +0200Received: (qmail 1148 invoked by uid 1002); 31 Jul 2003Mailing-List: contact gentoo-user-help@gentoo.orgFrom: "Fellipe Weno" <fellipe@eiconbrasil.com.br>To: <gentoo-user@gentoo.org>Subject: Re: [gentoo-user] winex dont run)A004 OK Completed
Hier wird das Ende, nicht wie bei SMTP, POP3 oder NNTP mit einem Punkt, sondernmit ) (runde Klammer zu) markiert.
Auch der Body der Mail ist schnell geholt:
A005 FETCH 1 BODY.PEEK[TEXT]* 1 FETCH (BODY[TEXT] {873}i dont need notepad i wanna run diablo 2 game... but i getit work i get source from cvs tree and compile it and itswork fine =)thank's--gentoo-user@gentoo.org mailing list)A005 OK Completed
Hätten wir die gesamte Mail auf einmal holen wollen, hätten wir auch
A005 FETCH 1 RFC822
benutzen können.
Nun kann die Mail gelöscht (obwohl das bei IMAP, wie oben erwähnt, eher unüblich ist) werden:
A006 STORE 1 +FLAGS (\Deleted)* 1 FETCH (FLAGS (\Deleted))A006 OK Completed
Mit diesem Befehl setzen wir den Status der Mail auf "zum Löschen bereit". Mit
A007 EXPUNGE* 1 EXPUNGEOK EXPUNGE completed
wird die Mail dann endgültig gelöscht. Nachdem die Mail gelöscht ist, verschieben sich auch die Nummern der Mails nach vorne, das heißt Nachricht Nummer 2 ist nach der Löschaktion die erste Nachricht.
Mit LOGOUT beenden wir die Verbindung:
A008 LOGOUT* BYE LOGOUT receivedA008 OK CompletedConnection closed by foreign host.iblech@thestars theguide $
6.2 ↑ Befehlsübersicht
| Befehl | Wirkung |
|---|---|
LOGIN "name" "pass" | Login |
SELECT "ordner" | In Ordner wechseln |
FETCH nummer RFC822.SIZE | Mailgröße anzeigen |
FETCH nummer RFC822.HEADER | Mailheader anzeigen |
FETCH nummer BODY.PEEK[TEXT] | Mailbody anzeigen |
FETCH nummer RFC822 | Gesamte Mail anzeigen |
STORE nummer +FLAGS (\Deleted) | Mail zum Löschen markieren |
EXPUNGE | Alle als gelöscht markierten Mails löschen |
LOGOUT | Verbindung schließen |
6.3 ↑ Abschluss
Mit IMAP steht Telnettern nun ein weiteres Protokoll zum Abholen von Mails zur Verfügung. Zur Übersicht nochmal eine komplette Beispielsitzung:
iblech@thestars theguide $telnet imap.web.de 143Trying 217.72.192.135...Connected to imap.web.de.Escape character is '^]'.* OK WEB.DE IMAP4-ServerA LOGIN "iblech" "r1cht1g l4ng3s P4ssw0rt"A OK User logged inB SELECT "inbox"* 14 EXISTS* OK [UNSEEN 13] Message 1 is first unseen* OK [PERMANENTFLAGS (\Deleted \Seen \Answered)]* OK [UIDVALIDITY 1]* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)B OK Completed [READ-WRITE]C FETCH 3 RFC822* 3 FETCH (FLAGS (\Seen) RFC822 {4147}Received: from [146.82.138.6] (helo=murphy.debian.org)by mx06.web.de with esmtp (WEB.DE 4.99 #420)id 19iCYx-0007Kd-00for iblech@web.de; Thu, 31 Jul 2003 14:29:43 +0200(...)
To: debian-user-german@lists.debian.orgSubject: Re: history von: "dpkg -i"Date: Thu, 31 Jul 2003 14:21:30 +0200Message-ID: <878yqezy2d.fsf@alhambra.bioz.unibas.ch>User-Agent: Gnus/5.1002 (Gnus v5.10.2) Emacs/21.3 (gnu/linux)Marko Schulz <4mschulz@informatik.uni-hamburg.de> schrieb:(...)
dpkg-reconfigure apt-listchangesGru=DF, Frank)C OK CompletedD LOGOUT* BYE LOGOUT received