Linux und TCP/IP
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.
Formale Notation:
Jedes Byte dezimal kodiert, Bytes durch Punkt voneinander getrennt.
Es gibt einen Netzanteil und einen Hostanteil in der Adresse. Die Größe
von Netz- und Hostanteil ist abhängig von dem höchstwertigen
Bit im 1. Byte der IP-Adresse und der Netzmaske. (z.B.: 255.255.255.0 =
3 Teile von Netz und 1 Teil von Host abhängig)
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.
Erzeuge ein Frame und schicke es an die MAC-Adresse des Gateways
(wenn nicht bekannt: durch ARP-Anfrage rauskriegen)
Erzeuge ein Frame und schicke es an die MAC-Adresse des default
Gateways (wenn nicht bekannt: ARP-Anfrage)
Folge des ping-Befehls
icmp (echo request) Aufforderung an Abgabe eines Lebenszeichens
icmp (echo reply) Abgabe des Lebenszeichens
tracert (windows)
traceroute (unix)
Syntay:
traceroute www.oreilly.com
Listet alle router auf, die ein Datagramm zwischen Quell- und Zielrechner passiert.
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 Transportschicht (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.
Destination adress 4 Byte
Options maximal 40 Byte. In der Regel leer.
Zu diesem Zweck werden im Header der Transportschicht unter anderem die folgenden Felder geführt:
Festlegung durch RFC (request for comments)
Ein Client, der eine Verbindung zu einem Standard-Dienst aufbaut, erzeugt seine Quellport-Nummer in der Regel dynamisch in einem Bereich größer 1023
Reaktion auf fehlerhafte Prüfsummen bei:
udp: keine Weiterreichung an Anwendungsschicht,
aber auch keine Fehlermeldung.
Fehlermeldungen deshalb von ICMP. Von TCP keine ICMP-Fehlermeldungen,
da TCP selbst bereits verbindungsorientiert ist und erst seine Arbeit
aufnimt, wenn gesicherte Verbindung.
Tcp: Verweigerung einer Empfangsbestätigung. Nach Wartezeit schickt Absender erneut. Die Wartezeit ist keine statische Größe, sondern wird je nach Verbindung immer wieder neu ausgehandelt.
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 beliebi gen Stellen
in Dokumenten beliebigen Typs auf belie bigen 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
protocol unreachable (UDP oder TCP)
port unreachable
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.
Per Voreinstellung versetzt tcpdump ein Interface in den promiskuösen Modus.
Aufruf:
Tcpdump -e -x -i eth0 icmp and host gzscsi.gz.de >/tmp/icmp
-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 garantiert, 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. Voreingestellter 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.
Die ersten 3 Byte kennzeichnen den Hersteller (Hier gleich)
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.
Konfigurationsdatei: /etc/protocols
Protokollnummern im IP-H 6 (TCP) und 17 (UDP)
Port Kleiner als 1024 für Standard-Dienste
http 80 tcp
pop3 110 tcp (Abholen von emails)
smtp 25 tcp
domain 53 udp/tcp
Methode ist ein 3-Wege-Handshake:
SYN = Synchronize Sequence Numbers
ACK = Acknowledgement
Netz des Zielrechners wird erreicht
Host wird erreicht
Auf dem Zielrechner muß TCP zur Verfügung stehen
Der Zielrechner muß auf dem angegebenen Port lauschen
Im TCP-Header das Feld »Fenster«
Unbestätigte Sendung möglich, solange die im Feld "Fenster"
angegebene Größe (Anzahl Byte) nicht überschritten
wird.
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:
SYN-Bit gesetzt = Versuch eine Verbindung
zum eigenen host aufzubauen. Beispiel:
SYN-Bit gesetzt, Zielport 80 = von außen wird ein Verbindungsaufbau
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
icmp echo request
icmp echo reply
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:
#
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)
der resolver (Auflöser) wird befragt durch gethostbyname()
(resolver läßt sich konfigurieren in /etc/resolv.conf)
- DNS-Server wird befragt
- /etc/hosts
- NIS (Network Information Services)
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?
der UDP-Port 1234 unerreichbar ist.
#
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;
IO ist ein Unterverzeichnis zu /usr/lib/perl5/5.00503/i586-linux
lokalHost => 'gzagp.gz.de',
LokalPort => 1234,
Proto => 'UDP');
Erzeugung geht schief,
wenn der Port bereits belegt ist, oder
der Kernel UDP nicht unterstützt.
}
Programmende, falls $kommando "ende" war.
system($kommando); versucht den Inhalt von $kommando als Systemaufruf auszuführen.
21 Steuerdaten, auch username und Paßwort
20 Nutzdaten
TCP
Eintrag in der Datei:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
Ein Client versucht einen Verbindungsaufbau am ftp-Port. Was passiert:
inetd startet /usr/bin/tcpd und übergibt in.ftpd als Argument.
Unter bestimmten Voraussetzungen startet tcpd, tatsächlich in.ftpd
tcpd hat 2 Konfigurationsdateien:
/etc/host.allow
/etc/host.deny
Hier kann in Abhängigkeit von IP-Adresse, hostname, ... der Dämon
gestartet oder nicht.
Achtung:
inetd liest seine Konfigurationsdatei -wie die meisten anderen Dämonen
auch- nur einmal beim Start ein. Damit Änderungen in der Konfigurationsdatei
wirksam werden, muß inetd neu gestartet werden, oder es muß
ihm das Signal HUP geschickt werden. (kill -HUP pid_von_inetd)
Hinweis:
Für Start und Stop von inetd beim Hoch- und Runterfahren des Systems
ist das shell-Script /sbin/init.d/inetd. Dieses script kann auch während
des laufenden Betriebs mit einer Reihe von Argumenten aufgerufen werden.
Beispiel:
/sbin/inet.d/inetd reload
anonymous ftp | "normales ftp |
kein Useraccount erforderlich
(username: ftp oder anonymus;
password: email-Adresse) |
Useraccount erforderlich |
Sicht aufs Dateisystem ist eingeschränkt | uneingeschränkte Sicht aufs Dateisystem für diesen User |
in der Regel nur download zulä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 Stammverzeichnis /usr/local/ftp
Dieses Verzeichnis erscheint als root-Verzeichnis. Unterverzeichnis
/usr/local/ftp/pub
ist für Dateien zum downloaden |
cd Verzeichniswechsel auf entferntem Rechner
lcd Verzeichniswechsel auf dem lokalen Rechner
hash Anzeige der Übertragungsgeschwindigkeit
(Ein # pro Übertragenem KB)
open Verbindung zu Host herstellen
close Verbindung zu Host schließen
get holt eine Datei (download)
nget download von mehreren Dateien
put upoad einer Datei
nput upload mehrerer Dateien
ls Anzeige der Dateien auf ftp-Server
ascii Übertragung im Textmodus
binary Übertragung im Binärmodus
bye Beendet die ftp-Sitzung
tcpdump -i eth0 -w /tmp/sniff host 10.... and port ftp
strings /tmp/sniff | egrep 'user|pass'
Protokoll der Transportschicht: TCP
Ein direktes einloggen als root ist in der Regel nicht möglich. (aus Sicherheitsgründen)
Verwendung hauptsächlich für Fernwartung und Ferndiagnose
Schlechtes Verhältnis von Protokoll- zu Nutzdaten
Beispiel:
telnet 10.180.213.56 username password
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
WWW-Client Browser (z. B.: Netscape, Internet Explorer, Opera, StarOffice, Arena, Lynx (textorientiert)
WWW-Server Apache (in der Unix/Linux-Welt)
wird automatisch gestartet beim Hochfahren des Systems
Dämon: http (Anzeige der Dämonen mit ps ax)
Stammverzeichnis, in dem die Web-Dokumente
abgelegt werden:
/usr/local/httpd/htdocs HTML-Dokumente
/usr/local/httpd/cgi-bin cgi-scripts
Test:
Netscape starten
<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
$v3 = 47; Ganzzahl
$v2 = $v3;
@a2 = (47.3,"blabla",380,"gaga");
$a2[3]; # "gaga"
$h1 {"vogel"}; # liefert "bird"
Das Element eines hash wird mit $ angesprochen, das ganze hash mit %
# 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
Das Unix-Kommando wird in einem cgi-Script auf dem Zielrechner ausgeführt; der von dem Kommando erzeugte output auf stdout wird in ein dynamisch erzeugtes HTML-Dokument eingebettet, das dem Browser auf den Quellrechner zurückgeschickt wird.
#!/bin/sh
...
...
read cmd
...
...
# diverse cut und tr
...
...
echo "Content_type: text/html"
echo
echo "<HTML>"
echo "<HEAD>"
echo "<TITLE>"
$cmd
echo "</BODY>"
echo "</HTML>"
Stimmt der Verweis auf das script im Formular überein mit Name und Ort des scripts ? <FORM_METHODE="POST" ACTION="/cgi-bin/comments">
Stimmen Formularmethode von Formularscript und cgi-script überein ? Paßt die Verarbeitungslogik mit der Formularmethode überein ?
Erfüllt das schript die Regeln der gewählten script-Sprache ?
Wird die Benutzereingabe korrekt geparst?
Test eines cgi-scripts auf der Kommandozeile:
POST-Methode
export CONTENT_LENGHT=500
echo "cmd=ls+-l&gagga=blabla" | ./comments
GET-Methode
QUERY_STRING="ls+-l&gagga=blabla"
export QUERY_STRING
./comments
Dynamisch erzeugtes HTML-Dokument in Abhängigkeit
von Benutzereingaben. 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
Alle folgenden Zeilen sollten unbedingt
den folgenden Aufbau haben:
IP-Adresse FQDN Aliases
FQDN = fully qualifed domain name (eindeutiger, kompletter Name)
Top-level-domain
Second-level-domain
primärer/sekundärer Nameserver
Zone
iterative query
rekursive query
resolver
Delegierung
org - kommerzielle Organisationen
gov - Behörden
net - alles was mit Netz zu tun hat
int -
sekundärer: Bezieht die von ihm gelieferten Informationen von einem anderen, primären Name-Server. Der Datentransfer wird als file zone transfer bezeichnet.
Zweck der Unterscheidung von primären, bzw. sekundären Name-Servern:
Lastverteilung, so daß nicht ein Name-Server alle Anfragen beantworten muß.
Ausfallsicherheit, bzw. Redundanz. Wenn ein primärer Name-Server ausfällt kann vorübergehend ein sekundärer Name-Server seine Aufgabe mit übernehmen.
Verwaltung von Informationen zum DNS-Namensraum erfolgt in records. Es gibt 3 Klassen von records:
internet (einziger record, der für uns von Bedeutung ist)
hesiod
chaosnet
Zu jeder record-Klasse gibt es verschiedene record-Typen.
Begriffserläuterungen:
reverse adress mapping = zu einer gegebenen IP-Adresse den oder die hostnamen ermitteln.
Domain - Dateibaum im DNS-Namensraum
Zone - der nicht delegierte Teil (nicht selbst administrierte Teil)einer Domain
Ein und derselbe host kann für bestimmte Zonen primärer und gleichzeitig für andere Zonen sekundärer Name-Server sein.
resolver - Der Teil der Client-Software,
der eine Namensauflösung anfordert.
Aufruf zum Beispiel:
gethostbyname()
gethostbyaddr() (evtl. auch gethostbyadress())
query
iterativ
Es wird lediglich die Adresse eines näher am Ziel liegenden Servers
geliefert.
rekursiv
Es wird solange gefragt, bis die Antwort geliefert werden kann.
Sonstige Leistungen von DNS:
mail-routing-information
Beispiel:
mail hans.binder@t-online.de
--> Information, an welche host(s) diese Mail weiterzuleiten ist, wird
von MX-records geliefert.
Bildung des hostnamens:
nachname.cdi.u1
Für jeden host soll dabei mindestens ein Alias-Name vergeben werden.
root-Name-Server
Verzeichnis, in dem Dateien abgelegt sind
Dateien mit Zonen-Daten
Status und Fehlermeldungen werden von named an den Schluß der Datei /var/log/messages geschrieben. (oder auf anderer Konsole tell -f /var/log/messages eingeben. tell zeigt per Voreinstellung die letzten 10 hinzugekommenen Zeilen an. Mit der Option -f zeigt er jeweils die neu hinzugekommenen Meldungen direkt an.)
Einstellung des primären oder sekundären Name-Servers durch Eintrag in der /etc/resolv.conf
Sekundären Name-Server erst starten wenn primärer ohne Fehlermeldung läuft.
Test: ping hostname (für hostnamen, für die kein Eintrag in /etc/hosts existiert)
Festlegung und Erstellung der Dateien mit Zonen-Daten (primär oder sekundär)
primary cdi.u1 db.cdi.u1
(zuerst hostnamen, dann IP-Adressen)
das gleiche für reverse-adress-mapping
primary 213.180.10.in-addr.arpa db.10.180.213
(zuerst IP-Adressen, dann hostnamen)
Record-Typ (SOA)
SQDN des primären Name-Servers
Bei Problemen: beliebiger Hostname, geführt vom Usernamen
In Klammern verschiedene Parameter
Seriennummer
...
...
Für jeden Name-Server ein NS-record
Für jeden Host in der Domain ein A-record (für die Abbildung von FQDN auf IP-Adressen
Für jeden Alias-Namen eines jeden Hosts
ein CNAME-record
Syntax: Alias-Name IN CNAM kanonischer Name
Ein PTR-record für jeden Host in der Domain
primary 17.168.192.in-addr.arpa db.192.168.17
--> Der named ist primärer Name-Server für die Domain 17.168.192.in-addr.arpa
und sucht alle relevanten Daten in der Datei db.192.168.17 im Verzeichnis
/var/named.
Relevante Daten sind: SOA-records, PTR-records.
Bedeutung von Host in-addr.arpa
Beispiel CDI:
213.180.10.in-addr.arpa.
cache . root.cache
Adressen der root-Name-Server befinden sich in der angegebenen
Datei im Verzeichnis /var/named
A-record
zum voll qualifizierten Namen eine Adresse
CNAME-record
MX-record = mailexchanger
mail gz@gz.de = mail geht erst an Domain
NS-record je Name-Server
ein PTR-record je IP-Adresse
--> ping gzscsi wird automatisch ergänzt zu gzscsi.gz.de
Konfiguration des resolvers
nameserver 192.168.17.42
--> befragter Name-Server
Bis zu 3 Name-Server können angegeben werden, getrennt durch White-Space.
Werden in der Reihenfolge des Eintrags abgefragt.
--> Legt die Reihenfolge fest, in der der resolver Dienste zur Namensauflösung
befragt. Hier: Erst in /etc/hosts nachsehen, dann Name-Server befragen.
Möglich wäre auch: order hosts nis bind
multi on
--> Gibt es zu einem Host-Namen mehr als eine IP-Adresse in /etc/hosts,
so werden bei Eintrag auf on alle Adressen geliefert.
die Subdomains r3.cdi.u1 und r4.cdi.u1 werden delegiert
primary für cdi.u1 ist host1.r1.cdi.u1
telnet www.cdi.de
80 vom telnet-client mit dem Webserver kommunizieren
Sinnvoll bei Batch-Verarbeitungen - Fernwartung von Rechnern.
Hierfür gibt es 2 Möglichkeiten:
Systemweite Rechtevergabe durch den Systemadministrator in der Datei /etc/hosts.equiv
Userspezifische Rechtevergabe. Jeder Benutzer kann in einer Datei .rhosts in seinem home-Verzeichnis die Rechte von Usern in anderen Hosts (Rechnern) festlegen, die auf seinen Account zuzugreifen versuchen.
rcp quellrechner:quelle ziel
rcp quelle zielrechner:ziel
rcp quellrechner:quelle zielrechner:ziel
--> kopiert die Datei /etc/hosts vom Rechner host1.cdi.u1 ins Verzeichnis
/tmp auf den lokalen Rechner, von dem das Kommando abgesetzt wurde.
rcp /etc/hosts host2.cdi.u1:/tmp
--> kopiert die Datei /etc/hosts auf Zielrechner host2.cdi.u1 ins Verzeichnis/tmp
rcp host3.cdi.u1:/etc/hosts host4.cdi.u1:/tmp
--> kopiert die Datei /etc/hosts von entferntem Rechner host3.cdi.u1
nach entferntem Rechner host4.cdi.u1 ins Verzeichnis /tmp
rlogin [-l username] zielrechner
rlogin host5.cdi.u1
--> Unter dem usernamen, unter dem auf dem lokalen Rechner eingeloggt
wurde, wird ein rlogin auf dem Zielrechner durchgeführt. Bei entsprechender
Konfiguration der Rechte muß kein Paßwort angegeben werden.
rlogin -l hennes host6.cdi.u1
--> rlogin auf dem Zielrechner unter dem Usernamen hennes. Das ist
unter bestimmten Voraussetzungen selbst dann möglich, auch wenn auf
dem lokalen Rechner unter einem anderen Namen eingeloggt wurde.
rsh zielrechner kommando [optionen][umlenkung]
rsh host6.cdi.u1 cat /etc/passwd
--> Der Inhalt der Datei /etc/passwd auf Rechner host6.cdi.u1 wird
auf stdout auf dem lokalen Rechner ausgegeben.
rsh host7.cdi.u1 who > /tmp/users
--> Alle auf host7.cdi.u1 angemeldeten User werden in die Datei /tmp/users
auf dem Rechner geschrieben, wo das Kommando abgesetzt wurde.
rsh host8.cdi.u1 who ">" /tmp/users
--> Alle auf host7.cdi.u1 angemeldeten User werden in die Datei /tmp/users
auf dem entfernten Rechner geschrieben.
host11.cdi.u1 hennes
--> User hennes von host11.cdi.u1 hat paßwortfreien Zugriff
auf jeden Account -exclusive root- auf dem lokalen Rechner. (siehe oben:
rlogin -l username)
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
Jede Zeile in dieser Datei muß einen bestimmten Aufbau haben.
Erteilung von Zeitaufträgen erfolgt
mit dem Kommando crontab -e
Es wird ein Editor gestartet und in der editierten Datei müssen
Zeilen, entsprechend dem beschriebenen Format eingetragen werden. Für
jeden Zeitauftrag gibt es einen Eintrag (Zeile)
Aufbau:
min std tag monat wochentag kommando
Beispiel: Jede Minute soll die Datei /tmp/usr um 1 Zeile ergänzt werden, die die Anzahl aller aktuell im System angemeldeten Benutzer enthält.
cksum [optionen]... [datei]...
touch dateiname
X-Client für die eigentliche Logik der Anwender (z.B. Netscape oder StarOffice, bzw. alle KDE-Programme)
Da X ein netzwerkfähiges Protokoll ist, ist es nicht erforderlich, daß X-Server und X-Client auf dem selben Rechner liegen.
X ist ein Plattform unabhängiges Protokoll.
Das heißt jeder beliebige X-Client kann mit einem beliebigen X-Server
kommunizieren.
So gibt es zum Beispiel auch X-Server für WinXX (~ 1.000 DM)
Damit X-Client und X-Server übers Netz miteinander kommunizieren können, müssen zwei Voraussetzungen erfüllt sein.
Der Host, auf dem der X-Server liegt, muß
ausdrücklich bestimmten Hosts die Erlaubnis erteilen, daß dort
gestartete X-Clients sich mit dem lokalen X-Server verbinden.
xhost +hennes.cdi.u1
--> X-Clients von hennes.cdi.u1 dürfen den lokalen X-Server ansprechen.
Der X-Client muß den host spezifizieren, dessen X-Server er kontaktieren möchte. Hierfür gibt es zwei Möglichkeiten:
Die Option -display
Die Umgebungsvariable DISPLAY
Beispiel:
xhost hennes.cdi.u1 (X-Server auf xyz.cdi.u1)
xterm -display xyz.cdi.u1:0.0 (X-Client starten von hennes.cdi.u1
auf xyz.cdi.u1)
Folge:
Sinnvoll:
Ein stark ausgestatteter Rechner mit allen Programmen und ein oder
mehrere schwächere Rechner, auf denen gerade X-Windows läuft.
Sie können dann die Programme des fetten Rechners nutzen.
Hostanteil der IP-Adresse: 3 Byte
Netzanteil der IP-Adresse: 2 Byte
Host-Anteil der IP-Adresse: 2 Byte
Hostanteil der IP-Adresse: 1 Byte
Gründe für die Aufteilung eines Netzes in mehr Teilnetze, als es von der IP-Adreßklasse her eigentlich gegeben wäre.
Beschränkung der Länge eines Segments. (Auch für Verstärkung gibt es eine Obergrenze)
Ausfallsicherheit
Verwaltung, Organisation, Administration vereinfachen
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:
Man erhält den Netzanteil einer IP-Adresse, indem man die Adresse mit der Netzmaske bitweise undiert (UND-Verknüpfung).
Standard-Netzmasken
Klasse A: 255.0.0.0
Klasse B: 255.255.0.0
Klasse C: 255.255.255.0
Subnet-Maske = 255.255.255.0
Ein Netz der Klasse C soll in 4 Teilnetze
aufgeteilt werden
Subnet-Maske = 255.255.255.192
Host1 = 192.168.17.200 Netzmaske: 255.255.255.192
Host2 = 192.168.17.220 Netzmaske: 255.255.255.192
Host1 = 11000000.10101000.00010001.11000100
(Gelb=Netzanteil)
Host2 = 11000000.10101000.00010001.11011100
(Gelb=Netzanteil)
Netz: 200.210.220.0
Netzmaske: 255.255.255.192
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