Linux und TCP/IP

                                                                                                    http://www.sirius-net.de
 
 

Inhaltsverzeichnis

Exkurs: ping 3

Vermittlungsschicht im Internet 4

IP-Header 4

Prinzip: 4

Transportschicht 5

Erste Analyse eines Hexdumps vom Netzverkehr 7

Optionen: 7

Ausgabe: 7

Transportschicht 8

Einige wichtige Ports (Buch Seite 565) 8

Das Protokoll tcp 8

Vergleich UDP / TCP 9

Perl-Script 11

Programm zum Empfangen von Paketen auf UDP-Port 1234 12

Die wichtigsten Dienste der Anwendungsschicht 13

ftp (file transfer protokoll) 13

1.Die wichtigsten Kommandos: 14

Der Dienst telnet 15

Der Dienst http (hypertext transfer protcol) 15

HTML Seite mit Formular 15

Grunddaten in Perl 17

Fehlermeldung des gi-script: internal server error 19

Proxy-Server - 2 Bedeutungen: 20

DNS Domain Name Server 20

Einrichtung des primären Name-Servers 22

Konfiguration eines Name-Servers 23

Delegierung 24

Aufgabe: 24

r-Befehle (remote-Befehle) 24

Die wichtigsten r-Befehle 25

Konfiguration der Rechte 26

Periodische Zeitaufträge 26

cksum 27

touch 27

Verteilung von X-Server und X-Client übers Netz 27

IP-Adressen, Netzklassen und Netzmasken 27

Funktioniert über ein 4-Schichtenmodell zur Kommunikation zwischen Anwendungen auf einem Rechner und Anwendungen auf einem anderen Rechner, bzw. 4-Schichtenmodell zur Kommunikation zwischen Anwendungen auf verschiedenen Hosts über beliebig viele nNetzwerke hinweg.
 
 

Exkurs: ping

Was passiert alles, wenn folgendes Kommando auf Host 10.10.30.211 abgesetzt wird:
ping 10.10.31.200

 
 

Frage: Liegt der Zielrechner im selben Teilnetz?
Das heißt, der Netzanteil der eigenen IP-Adresse und der Netzanteil in der IP-Adresse des Zielrechners sind gleich.

Nun kann die eigentliche Kommunikation ablaufen:
(ICMP = internet control message protocol)
Zusammenfassung:

Folge des ping-Befehls

Vermittlungsschicht im Internet

IP-Header

Jede Zeile ist 32 Bit bzw. 4 Byte bzw. 1 Wort lang

 
 

tracert (windows)

traceroute (unix)

Syntay:

traceroute www.oreilly.com

Listet alle router auf, die ein Datagramm zwischen Quell- und Zielrechner passiert.

Prinzip:
IP sorgt dafür, dass transportiert wird. Es interessiert nicht, ob FTP oder HTTP-Sitzung. Dafür ist TCP oder UDP zuständig.

 
 

Version: 4 ()

IHL: 5 (theoretisch möglicher max. Wert: 15, entspricht 60 Byte)

TOS: theoretisch: routing preferences angeben, faktisch ignoriert.

Total length: theoretische Obergrenze 2^16 KB, entspr. 64 KB

Fragmentierung erforderlich, wenn MTU (maximum transfer unit) eines Teilnetzes zu klein ist. (MTU bei ethernet ist 1.500 Byte)

Identification

Fragment offset ermöglichen Defragmentierung im Empfänger

TTL (time to live) - von jedem Router decrementiert

- falls der Wert 0 erreicht wird: ICMP- meldung

(TTL exceeded) an Absender

Verwendet u.a. von traceroute (tracert bei windows) zur Wegebestimmung von Datagrammen.

Protocol Nummer des Protokolls der Transport­schicht (tcp oder udp). Nummer ist festgelegt in RFC 1700

(in Unix abgelegt in Konfigurationsdatei
/etc/protocols)

header checksum Prüfsumme wird nur über Header gebildet, aber nicht über die Nutzdaten.

--> IP ist unzuverlässig ! (Soweit gewünscht, kann Zuverlässigkeit durch die Transport­ schicht geleistet werden.
Source adress 4 Byte

Destination adress 4 Byte

Options maximal 40 Byte. In der Regel leer.

Transportschicht

Aufgabe:
Durchreichen von Datagrammen an den betroffenen Dienst der Anwendungsschicht (ftp, telnet, http, dns, ...)

Zu diesem Zweck werden im Header der Transportschicht unter anderem die folgenden Felder geführt:

Es gilt:
Obergrenze für Port-Adressen ist 2^16, entspricht 65535
IP Internet Protocol (Vermittlungsschicht - Zustellung von Datagrammen auf der Basis von logischen/physikalischen Adressen.

ICMP Internet Control Message Protocol

ARP Adress Resolution Protocol (Aufgabe: Abfrage nach der MAC-Adresse auf Grundlage der bekannten IP-Adresse durch Broadcasting)

TCP Transport Control Protocol

UDP User Datagram Protocol

FTP File Transfer Protocol

DNS Domain Name Server (Services, System) Aufgabe: Hostadressen auf IP-Adresse abbilden, Bereitstellung von Mail-routing Informationen

HTTP Hypertext Transfer Protocol

RFC Request For Comments (Sammlung von detaillierten Spezifikationen von im Internet verwendeten Protokollen)

MAC Media Accesss Control

URL Uniform Resource Locator = Weltweit eindeutige Spezifikation eines Dokuments, oder einer Sprungmarke in einem Dokument, und des Protokolls, über das es bezogen werden kann. (Bsp.:
http://www.suse.de/index.html
ftp://ftp.sunside.edu/pub/dns/dns.tar.gz
telnet://....
mailto://....
news://.....
.....(weiter Dienste)

www World Wide Web = Gesamtheit des über Port 80 im Internet abgewickelten Datenverkehrs

Hypertext Von beliebigen Stellen in Dokumenten beliebigen Typs auf beliebigen Rechnern ausgehend, kann auuf beliebige Stellen in beliebigen Dokumenten auf beliebigen Rechnern verwiesen werden, die über beliebige geeignete Protokolle bezogen werden können.

Hypermedia Erweiterung von Hypertext um Multimedia. Von belie­bi­ gen Stellen in Dokumenten beliebigen Typs auf belie­ bi­gen Rechnern ausgehend, kann auuf beliebeige Stel­ len in beliebigen Dokumenten auf beliebigen Rechnern verwiesen werden, die über beliebige geeignete Proto­ kolle bezogen werden können.
 
 

Frame Ebene der Netzzugangsschicht

Datagramm Ebene der Internet- bzw. Vermittlungsschicht
 
 

Aufgabe der Transportschicht:

Durchreichung von Datagrammen an betroffene Dienste der Anwendungsschicht
 
 

ICMP-Meldung:destination unreachable

/etc/protocols

Enthält Nummern und Namen von Protokollen der Transportschicht und vom Protokoll ICMP
 
 

IP-Adressen: 4 Byte Größe, dezimal kodiert, getrennt durch Punkt

ethernet-Adressen: 6 Byte, hexadezimal kodiert, getrennt durch Doppelpunkt
 
 

ARP liefert zu einer gegebenen IP-Adresse die entsprechende MAC Adresse

RARP Reverse Adress Resolution Protocol (liefert IP-Adresse zu gegebener MAC-Adresse. Sinnvoll, wenn IP-Adressen von zentralem Rechner zugewiesen werden sollen.)
 
 

Router schaut in der Regel nur nach IP-Header. Bei falscher Prüfsumme wird Datagramm kommentarlos weggeschmissen.

Erste Analyse eines Hexdumps vom Netzverkehr

Werkzeug: tcpdump (Analyse von Netzverkehr des ethernet)
ethernet ist ein Broadcast-Netz
Hinweis: Falls erforderlich, vor dem Abhören von anderen Stationen das ethernet-interface ausdrücklich in den promiskuösen Modus versetzen. Mit dem Kommando: ifconfig eth0 promisc (ab SuSE 6.3, vorher war das voreingestellt)

 
 

Aufruf:

Tcpdump -e -x -i eth0 icmp and host gzscsi.gz.de >/tmp/icmp

Optionen:
-e Es wird auch der link-level-header ausgegeben (in unserem Fall die 14 Byte für ethernet --> je 6 MAC Absender/Empfänger, 2 für Typfeld
(header der Netzzugangsschicht. Hier: je 6 Byte für MAC-Adresse von Absender- und Zielrechner, 2 Byte für Typfeld. Insgesamt 14 Byte)

-w datei Schreibt Output in eine Datei, die angegeben werden muß

-r datei Wenn mit -w in eine Datei geschrieben wurde, kann jetzt als Input statt dem Interface die angegebene Datei angezeigt.

-n IP-Adressen werden nicht auf host-Namen abgebildet. (Vorsicht: bei ISDN sinnvoll)

-x Die durch snaplen vorgegebene Anzahl von Bytes (exklu­ sive link-level-header) wird Hexadezimal angezeigt (von jedem Frame!).

Voreingestellter Wert von snaplen ist 68 Byte. Dies garan­tiert, daß auf den gesamten Header zugegriffen werden kann, ohne daß jeder auf die Nutzdaten (egal ob berechtigt oder nicht) zugreifen kann.

-s nn Setzt den Wert von snaplen auf den in nn eingegebenen Wert. -s 1500 würde z.B. den Wert auf 1500 Byte setzen, die von jedem Frame abgegriffen werden sollen. Sinvoll ist maximal 1500, weil maximale Größe eines Frame bei ethernet. Vorein­gestell­ter Wert von snaplen ist 68.

-i eth0 spezifiziert das abzuhorchende Interface (Hier: das erste ethernet-interface)

icmp and host gzscsi.gz.de

protokolliert wird ausschließlich icmp-Verkehr, an dem der host gzscsi.gz.de als Sender oder als Empfänger beteiligt ist.

Ausgabe:
    link-level-header
MAC-Adresse des Absenders: 0:80:ad:ab:8c:6f
MAC-Adresse des Zielrechners: 0:80:ad:74:1c:2

Die ersten 3 Byte kennzeichnen den Hersteller (Hier gleich)

    IP-Header
4 Version 4
5 IHL 5 (5 Wörter: 4 Byte: 20 Byte)

00 Type of Service (keine routing preferences)

0054 Total Lenght (Hex 0054 = 84 Byte, aufgezeichnet wurden nur 68 Byte, da die default snaplen 68 Byte ist)

(war bis hierhin erstes Wort - Erste 4 Byte)

0126 Identification

0000 Fragment Offset = Datagramm wurde nicht fragmentiert, DF (und MF wurden nicht gesetzt (00000000 00000000 - das zweite ist DF, das dritte ist MF, die restlichen 13 sind für Fragment Offset, wenn das erste gesetzt ist, dann ist klar, daß DF und MF gesetzt sind)

4000 (DF Bit ist gesetzt)

40 TTL - Hexadezimal kodiert (Hier 40 = 64 Stationen)

01 Protocol - laut /etc/protocol : icmp

d5df Header Checksum

c0a8 1129 Source Adress: 192.168.17.41 (gzatapi.gz.de)

c0a8 112a Destination Adress: 192.168.17.42 (gzscsi.gz.de)

Die 5 Wörter a 4 Byte des IP-Headers sind erledigt.

Jetzt folgt der Header des ICMP-Protokolls:

Type 00 echo reply
 
 

--> Host gzatapi.gz.de antwortet mit einem icmp echo-reply auf ein icmp echo request von gzscsi.gz.de

Also mit anderen Worten ein Antwort auf ein ping.

Transportschicht

Einige wichtige Ports (Buch Seite 565)
ftp 21 tcp
telnet 23 tcp

http 80 tcp

pop3 110 tcp (Abholen von emails)

smtp 25 tcp

domain 53 udp/tcp

Das Protokoll tcp

Große Informationsmengen werden in kleinere Einheiten (Datagramme) aufgeteilt und unabhängig voneinander auf Reisen geschickt. Es werden Informationen mitgeliefert, die auf Empfängerseite ein Zusammensetzen in der ursprünglichen Reihenfolge gestatten.


Im TCP-Header das Feld »Fenster«
Unbestätigte Sendung möglich, solange die im Feld "Fenster" ange­gebene Größe (Anzahl Byte) nicht überschritten wird.

Es wird nicht schneller gesendet, als empfangen werden kann.
Vergleich UDP / TCP
 

 
 
 

UDP TCP
unzuverlässig zuverlässig
verbindungslos verbindungsorientiert
keine Flußkontrolle Flußkontrolle
paketorientiert (Paket) streamorientiert (Segment)
geringer Verwaltungsoverhead hoher Verwaltungsoverhead
schnell und unzuverlässig langsam und zuverlässig

 
 

Übung2:
 
 

    Greift alle Frames ab, die über das Segment laufen und nicht nur die, die an die eigene MAC-Adresse gerichtet sind oder nicht.
    Ifconfig eth0 promisc

    SYN-Bit gesetzt = Versuch eine Verbindung zum eigenen host aufzubauen. Beispiel:
    SYN-Bit gesetzt, Zielport 80 = von außen wird ein Verbindungs­auf­bau zu Webserver auf dem eigenen Rechner versucht.
    SYN- und ACK-Bit gesetzt = Bestätigt den Versuch, eine Verbindung aufzubauen.
    ACK-Bit gesetzt = Verbindungsaufbau hat geklappt und Datenübertragung ist im Gange

    Verbindungsaufbau mit 3-Wege-Handshake erfolgreich und Datenübertragung im Gange.

    Flußkontrolle
    Feld »Fenster« im TCP-Header

    TCP ist zuverlässig
    Segment gilt nur dann als zugestellt, wenn nach angemessener Zeit eine Empfangsbestätigung eingeht. Nicht bestätigte Segmente gelten als verloren und werden nochmal gesendet.

    Verbindungsorientiert. Zuverlässiger Verbindungsauf- und Abbau. 3-Wege-Handshake. Übertragung erst, wenn sichere Verbindung.

    Streamorientiert - große Infomenge in kleine Häppchen mit Infos, die ihre Zusammensetzung in der richtigen Reihenfolge wieder erlauben.

    Auf der Transportschicht:
    Pakete - UDP
    Segmente - TCP: große Infomenge in kleine Häppchen mit Infos, die ihre Zusammensetzung in der richtigen Reihen­ .folge wieder erlauben

    Im ungünstigsten Fall wird jedes Byte in einen eigene Frame gepackt mitsamt eigenem Header = 150 Byte Protokolldaten zu 1 Byte Nutzdaten.

    UDP sinnvoll, wenn Sicherheit gegenüber Geschwindigkeit nicht so wichtig. Z.B. beim Telefonieren.

    Anzeige der arp-Tabelle des Kernels:
    arp -a Alle Adressen
    cat /proc/net/arp

    ICMP Meldung destination unreachable/prot unreachable:
    Typ 3 (S. 235), Code 3 (S. 237)
    Erkennbar im IP-Header im Feld protocols ist die 1 gesetzt.

    ICMP = time to live exceeded
    0b Hex = Typ 11

    arp-Cache ist leer. Kennt noch nicht die MAC-Adressen. Sendet arp-Broadcast. Wenn die Antwort da ist geht echo request und es kommt echo reply

    ifconfig eth0 liefert Konfiguration, also auch MAC-Adresse der ethernet-Karte an.
    Vermittlungsschicht kümmert sich um (De-)Fragmentierung des IP-Datagramms. Transportschicht bekommt nichts davon mit.

    Nein

    arp-Verkehr, weil neue MAC-Adresse bekannt werden muß. Sonst ändert sich nichts.

    ICMP echo reply = Im ICMP-Header, Typ 8
    ICMP echo request = Im ICMP-Header, Typ 0

    Voreingesteltes snaplen bei tcpdump:
    14 Byte link-level-header
    20 Byte IP-Header
    20 Byte TCP-Header (bzw. 8 bei UDP)

    Quintessenz:

Perl-Script
#!/usr/bin/perl

 
 

# udpsend.pl
 
 

use IO::Socket;
 
 

$socket = new IO::Socket::INET(

PeerAddr => 'gzagp.gz.de',

PeerPort => 1234,

Proto => 'UDP');
 
 

die "Fehler beim Anlegen von UDP-Socket: $!" unless $socket;
 
 

print $socket "$ARGV[0]"\n";
 
 

close(socket);
 
 

#!/usr/bin/perl erzwingt die Ausführung der nachfolgenden Anweisungen durch den angegebenen Interpreter.

# Udpsend.pl Kommentar: Scriptname
 
 

use IO::Socket; Modul Socket.tm in IO eingebunden. = Einbindung eines Moduls, daß in Perl Netzwerkfunktionalität zur Verfügung stellt.

$socket = new IO::Socket::INET(

PeerAddr => 'gzagp.gz.de',

PeerPort => 1234,

Proto => 'UDP');

Klasse Socket wird instanziert, für die dynamischer Speicher angefordert wird.

= Ein Socket wird erzeugt (Socket ist IP-Adresse und Portnummer. Eine Verbindung im Internet zwischen 2 Rechnern ist weltweit eindeutig identifiziert durch 2 Sockets)

PeerPort Zielport
Proto Protokoll: UDP

Quellport wird dynamisch erzeugt (Im Beispiel 1026)

die "Fehler beim Anlegen von UDP-Socket: $!" unless $socket;

Wenn das Socket nicht erzeugt werden konnte (unless $socket), dann wird eine Fehlermeldung ausgegeben. $! enthält dabei einen Fehlertext und das Programm wird beendet mit einem exit-Status ungleich 0. Die Meldung geht nach stderr (standardmäßig also auf den Bildschirm)
Die anderen Anweisungen werden nicht mehr ausgeführt.

print $socket "$ARGV[0]\n";

Der Wert des 1. Aufrufparameters wird in das Socket geschrieben. (print schreibt standardmäßig nach stdout hier jedoch nach ARGV)

close($socket)

Schließt das Socket ordnungsgemäß.
 
 

Wann schlägt das Erzeugen eines Sockets fehl?

Das Erzeugen des Sockets schlägt nicht fehl, selbst wenn:
Programm zum Empfangen von Paketen auf UDP-Port 1234
#!/usr/bin/perl

 
 

# udpreceive.pl
 
 

use IO::Socket;
 
 

$socket = new IO::Socket::INET (

LocalHost => "gzagp.gz.de", # eigener Hostname / IP-Adresse

LocalPort => 1234,

Proto => "UDP" );
 
 

die "Fehler beim Anlegen des Sockets: $!" unless $socket;
 
 

$received = 0; # Anzahl der empfangenen Pakete

for(; ($zeile = < $socket >) ne "ende\n"; $received++) {

print $zeile;

}
 
 

close($socket);
 
 

print "Erhaltene Pakete: $received\n";
 
 

Modifikation:

Der übertragene String soll als Kommando interpretiert und auf dem Zielrechner ausgeführt werden.
 
 

use IO::Socket;

$socket = new::Socket::INET (

lokalHost => 'gzagp.gz.de',

LokalPort => 1234,

Proto => 'UDP');

die "Fehler bei Anlegen des Socket: $!" unless $socket;
$received;
for(;($kommando = <$socket>) ne "ende\n";$received++) {
system($kommando);

}

close($socket);
print "Erhaltene Pakete: $received\n";

Die wichtigsten Dienste der Anwendungsschicht

ftp (file transfer protokoll)
2 Arten von ftp:

 
 
 

anonymous ftp "normales ftp
kein Useraccount erforderlich
(username: ftp oder anonymus;

password: email-Adresse)

Useraccount erforderlich
Sicht aufs Dateisystem ist ein­ge­schränkt uneingeschränkte Sicht aufs Dateisystem für diesen User
in der Regel nur download zu­lässig download und upload entsprechend den zugestandenen Rechten.
Bitte installieren:
Paket ftpdir aus der Serie n
Nach Installation von ftpdir gibt es dafür ein Stamm­ver­zeichnis /usr/local/ftp
Dieses Verzeichnis erscheint als root-Verzeichnis. Unterver­zeichnis /usr/local/ftp/pub ist für Dateien zum downloaden

 
 

tcpdump -i eth0 -w /tmp/sniff host 10.... and port ftp

strings /tmp/sniff | egrep 'user|pass'
 
 

Der Dienst telnet
Aufgabe:

Analysieren den Datenstrom, der während einer telnet-Sitzung übertragen wird. Suchen nach der Benutzereingabe: su[RETURN]
 
 

Formatierter Ausdruck von man-pages:

man -t befehl | lpr
 
 

Der Dienst http (hypertext transfer protcol)
Das Protokoll, das das World Wide Web (WWW) zusammenhält.
HTML Seite mit Formular
<HTML>
<HEAD>

<TITLE>Crocodile Action Plan Feedback Form</Titel>

</HEAD>

<BODY>

<IMG SRC="crocodile-thump.gif">

<H1>Crocodile Action Plan Feedback Form</H1>

//H1 heißt großes Überschriftenformat

<EM>Please send us your comments!</EM>

// EM = hervorgehoben, hier kursiv. Ist Browserhersteller freigestellt, wie.

<P>

// Paragraph = Absatz

<HR>

// horizontal rule = horizontale Linie

<P>

<FORM METHOD="POST" ACTION="cgi-bin/comments">

// FORM = Formular; METHOD="Post"; Action="/cgi-bin/comments" = Programm comments nimmt die Eingaben entgegen und verarbeitet sie. Nach klicken des senden-Buttons wird Eingabe an dieses script übergeben.

POST = Benutzereingaben werden vom cgi-script von stdin entgegen genommen.

GET = Benutzereingaben stehen in der Umgebungsvariablen $QUERY_STRING

Name: <INPUT TEXT NAME="feed_name" size=36><BR>

// Name: = Text, der vom Browser angezeigt wird.
Texteingabefel = feed_name ; Länge 36 Zeichen
BR erzwingt Zeilenumbruch

Email: <INPUT TEXT NAME="feed_email" size=36>

<P>

<TEXTAREA NAME="feed_comments" ROWS=8 COLS=40>

// Texteingabefeld, Größe 8 Zeilen, 40 Spalten, da aber scrollbar, gehen auch mehr wie 8 Zeilen.

</TEXTAREA>

<P>

<INPUT TYPE="submit" VALUE="Send Comments">

<INPUT TYPE="rest" VALUE="Clear Form">

VALUE = Festlegen der Beschriftung des Buttons

submit = versenden

reset = löschen

</FORM>

<P>

<HR>

<P>

Creation Date: <EM>Jun 18, 1994</EM>

<P>

<ADDRESS><A HREF="rjones.html">DRJ</A></ADDRESS>

// ADDRESS = Stilattribut ("Formatvorlage")

HREF = Hyper referce

DRJ = wird angezeigt als Link aud Dokument rjones.html

A .... /A Verweis, bedeutet, jetzt kommt ein Hyperlink

</BODY>

</HTML>
 
 

Format der eingetragenen Daten:

name=eingabe&name=eingabe&....

name=Wert&name=Wert&... name steht für Namen des Eingabefeldes, Wert, bzw. eingabe für die Benutzer­ eingabe im jeweiligen Feld.

Spaces werden als Pluszeichen übertragen.

Sonderzeichen werden als 2 Hexadezimalziffern übertragen, nach einem Prozentzeichen.
 
 

Beispiel für die Übertragung der Daten:
 
 

feed_name=Uwe+M%aeller&feed_email=um%abcdi.de
 
 

cgi ist eine Spezifikation, die dafür sorgt, wie Browser mit ... kommuniziert.
 
 

Methoden bei der Formulareingabe

POST lesen von stdin. Datenvolumen unbegrenzt,

GET wird in Umgebungsvariable QUERY_STRING geschrieben. Volumen daher begrenzt auf circa 2-3 kb
 
 

Assoziatives array (hash) = index über den auf ein beliebiges Array zugegriffen werden kann.
 
 

%ENV

Ein hash, in dem die Schlüssel die Namen von Umgebungsvariablen sind, und die dazugehörigen Werte dieser Umgebungsvariablen.

Beispiel:

HOME hat den Wert /home/gz1

PS2 hat den Wert >

TZ hat den Wert GMT

EDITOR hat den Wert vi
 
 

Bei hash ist der Zugriffsoperator bei Perl ein Paar geschweifte Klammern { }

Beispiel:

$ENV {'HOME'} liefert /home/gz1

$ENV {'EDITOR'} liefert

Grunddaten in Perl
    Skalar
    Array
    hash
if (%ENV{'REQUEST_METHODE'} eq 'POST'){

# Zugriff auf das hash %ENV mit dem Schlüssel REQUEST_METHODE, der zugehörige Wert ist POST oder GET. Abhängig vom Eintrag FORM_METHODE = ... im HTML Dokument

==> Wenn die Formular-Methode nicht POST ist, wird dynamisch ein HTML Dokument erzeugt, daß eine Fehlermeldung im Browser des Absenders anzeigt. (= dynamic html)

==> Der Typ der Daten wird dem Browser bekannt gegeben mit der Zeile:

print "Content-type: text/html\n\n";

Unbedingt exaktes Format beachten, auch den Zeilenumbruch und die folgende Leerzeile !!!

==> Alles, was das cgi-schript auf stdout schreibt, wird auto­ matisch an den Browser weitergeleitet.

read(STDIN, $buffer, $ENV{'CONTENT_LENGHT'});

# Gibt an woher gelesen werden soll (stdin)

# Es werden CONTENT_LENGHT Byte von stdin in die Variable

# $buffer eingelesen.

@pairs = split(/&/, $buffer);

# Auf der Basis des Trennzeichens & wird ein Array erzeugt, dessen Elemente Strings der Form name=Wert sind.

foreach $pair (@pairs) {

($name, $value) = split(/=/, $pair, 2);

$value =~ tr/+/ /;

$value =~ s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;

$FORM($name) 0 $value

}

# $pair durchläuft nacheinander alle Elemente von @pairs

# $name enthält nacheinander die Namen aller Formularelemente

# $value enthält die zugehörigen Benutzereingaben

# $value =~tr/+/ / jedes + wird durch ein Space ersetzt.

# ~s (Substitut = ersetze)

# [ ] Bereichsangabe, [a-fA-F0-9] liefert genau ein Zeichen, muß ein hexadezimaler Ausdruck sein, genau 2 mal{2}

# In $1 steckt der Wert der ersten runden Klammer

# erste Paar runder Klammer bedeutet, daß der Treffer in $1 abgelegt wird.
 
 

# /eg g = global (nicht nur der erste, sondern jeder Ausdruck wird ersetzt.
e = evaluate oder execute (Ausdruck wird ausgeführt), sonst würde ab /pack alles als Ersetzungszeichen für den ersten Ausdruck genommen. Bezieht sich auf alles, was zwischen den beiden /../ steht.

# Quintessenz:
In $value wird jede Folge von %-Zeichen und zwei hexadezimalen Ziffern durch das entsprechende Byte ersetzt.

# $FORM{$name} 0 $value = Es wird ein hash namens FORM aufgebaut, dessen Schlüssel die Eingabefelder im HTML-Dokument sind, und dessen Wert die dazu gehörigen Benutzereingaben sind.

if ($FORM{feed_email} !~ /^[\-a-zA-Z0-9_\+ \.\t\/\@%]+$/) {

&evil_charakters;

exit;

}

# email-Adresse wird geprüft:

# !~ = entspricht nicht

# ^[...]+$ = beliebig oft mindestens einmal eines der angegebenen Zeichen.

# Quintessenz: Die email-Adresse darf nur Zeichen enthalten, die in den eckigen Klammern stehen.

open (MESSAGE, "| mail $webmaster $FORM{feed_email}");

# Jeder Schreibzugriff auf das Filehandle MESSAGE wird direkt an das Unix-Kommando mail gepiped.

# Quintessenz:
Schickt email an die in §webmaster und in $FORM definierten Typen, also rjones und an den Absender des Formulars.

print MESSAGE "To: $webmaster\n";

# Schreibt in das angegebene Filehandle, also Übergabe an Unix-Kommando mail

if ($FORM{feed_email}ne ""){

print MESSAGE "Reply-To: $FORM{feed_email}\n";

}
 
 

print MESSAGE "Subject: Comments from $ENV{'REMOTE_HOST'}\n\n";

print MESSAGE "Name: $FORM: {feed_name}\n\n";

print MESSAGE "";

close (MESSAGE);
 
 

&thank_you;

}
 
 

Standard-Verzeichnis für HTML-Dokumente:

/usr/local/httpd/htdocs
 
 

Standard-verzeichnis für cgi-scripts:

/usr/local/httpd/cgi-scripts
 
 

Effektive Rechte eines cgi-scripts

Aufgabe:
    Formular mit Texteingabefeld und submit-Button als HTML-Dokument im verzeichnis /usr/local/httpd/htdocs erstellen
    Ein cgi-Script im Verzeichnis /usr/local/httpd/cgi-bin erstellen. Der Name des Scripts muß zum METHODE=... Eintrag im HTML-Dokumente passen. X-Recht für das Script vergeben.
Fehlermeldung des gi-script: internal server error
Fehlersuche:
Dynamic HTML

Dynamisch erzeugtes HTML-Dokument in Abhängigkeit von Benutzer­eingaben. Das Dokument wird zum Zeitpunkt seiner Abholung erst erzeugt.
 
 

ps -ax zeigt an, ob der Webserver apache läuft, wenn dort die Zeile httpd angegeben ist.
 
 

Start und Stop des Web-Servers apache wird über das script /sbin/init.d/apache geregelt.

Ob Web-Server apache automatisch beim Start des Rechners hochgefahren wird hängt davon ab, ob die Variable START_HTTP in /etc/rc.config gesetzt ist.
 
 

Abbildung von hostnamen auf IP-Adressen

    Eintrag in /etc/hosts
Aufbau der Datei /etc/hosts:
    DNS
    NIS (nur UNIX)
Proxy-Server - 2 Bedeutungen:

DNS Domain Name Server

Fragen:
root-domain

Top-level-domain

Second-level-domain

primärer/sekundärer Nameserver

Zone

iterative query

rekursive query

resolver

Delegierung
 
 

Praktikum
Hinweise:

Einrichtung des primären Name-Servers

    Konfigurationsdatei erstellen, die bei starten von named eingelesen wird (/etc/named.boot)
    Die Datei db.cdi.u1 in /var/named erstellen
    Datei db.213.180.10 für das revers adress mapping
Konfiguration eines Name-Servers
    Dämon: named
    Einträge in der Datei /etc/named.boot:
    Datei /var/named/db.gz.de
    Datei /var/named/db.192.168.17
    Datei /var/named/bd.127.0.0
    Datei /var/log/messages
    Datei /etc/resolv.conf
    Datei /etc/hosts.conf
Delegierung
Aufgabe:

 
 

telnet www.cdi.de 80 vom telnet-client mit dem Webserver kommunizieren
 
 

r-Befehle (remote-Befehle)
Zweck:
Voraussetzungen:
Die wichtigsten r-Befehle
    rcp
    rlogin
    rsh
Konfiguration der Rechte
    /etc/hosts.equiv
    Die Datei .rhosts im home-Verzeichnis eines Users
Aufgabe:

Jeden Werktag zwischen 8.00 und 17.00 Uhr soll stündlich überprüft werden, ob sich der Inhalt der Datei /tmp/boerse.org auf einem Rechner geändert hat. Wurde die Datei geändert, soll sie auf den lokalen Rechner kopiert werden.

Hinweis:

Für eine Datei kann eine Prüfsumme gebildet werden mit dem Kommando cksum

Periodische Zeitaufträge
cksum
Legt eine Prüfsumme für eine Datei an.
Syntax:

cksum [optionen]... [datei]...

touch
Ändert den Zeitstempel einer Datei auf die aktuelle Zeit. Wird kein Dateiname angegeben, so erzeugt touch eine Datei mit dem angegebenen Namen.
Syntax:

touch dateiname
 
 

Verteilung von X-Server und X-Client übers Netz

IP-Adressen, Netzklassen und Netzmasken

Damit gibt es 2^7 Netze der Klasse A, also 128, mit jeweils 2^24 Hosts. Bei Netzen der Klasse A liegt das erste Byte der IP-Adresse im Bereich von 0 bis 127
Damit gibt es also 2^14 Netze der Klasse B, also 16.384, mit jeweils 2^16, also 65536 Hosts. Bei Netzen der Klasse B liegt das erste Byte im Bereich von 128 bis 191.
Sehr häufig ist es erforderlich, ein Netz einer gegebenen Klasse in weitere Teilnetze aufzuteilen, also dafür zu sorgen, daß der Netzanteil der IP-Adresse größer (und der Hostanteil der IP-Adresse entsprechend kleiner) wird, als es von der Netzklasse her der Fall wäre.

Gründe für die Aufteilung eines Netzes in mehr Teilnetze, als es von der IP-Adreßklasse her eigentlich gegeben wäre.

Beispiel:
CDI hat Adreßklasse A, dieses Netz wird in viele weitere Teilnetze unterteilt.

 
 
 

10.180.213.56 10.180.130.131
(10) Netz der Klasse A (10) Netz der Klasse A
--> 180.213.56 = Host --> 180.131.130 = Host

Ein Netz einer gegebenen Klasse kann durch Setzen einer geeigneten Netzmaske (Subnet-Mask) in weitere Teilnetze aufgeteilt werden. Dabei gilt:

Beispiele:
Übung:
Ein Netz der Klasse C soll in 4 Teilnetze aufgeteilt werden.

Netz: 200.210.220.0

Netzmaske: 255.255.255.192

    Teilnetz 200.210.220.0 letztes Byte: 00000000


    Broadcast-Adresse: 200.210.220.63 letztes Byte: 00111111
    Gültige Host-Adressen: 200.210.220.1 bis 200.210.220.62

    Teilnetz: 200.210.220.64 letztes Byte: 01000000
    Broadcast-Adresse: 200.210.220.127 letzt. Byte: 01111111
    Gültige Host-Adressen: 200.210.220.65 bis 200.210.220.126

    Teilnetz: 200.210.220.128 letztes Byte: 10000000
    Broadcast-Adresse: 200.210.220.191 letzt. Byte: 10111111
    Gültige Host-Adressen: 200.210.220.129 bis 200.210.220.190

    Teilnetz: 200.210.220.192 letztes Byte: 11000000
    Broadcast-Adresse: 200.210.220.255 letzt. Byte: 11111111
    Gültige Host-Adressen: 200.210.220.193 bis 200.210.220.254