24 Administrationstools
Manchmal gibt es unscheinbare Programme, die bei näherer Betrachtung sehr nützlich sind. Dieses Kapitel nimmt sich deshalb bekannten, aber leider selten im Detail betrachteten Tools an, die Ihnen Ihren Arbeitsalltag vereinfachen können.
Viele Administratoren verwenden zur Problemlösung meist nur einen Weg – und zwar den, der ihnen bekannt ist. Viele Tools auf Linux-Systemen haben aber mehr drauf, als viele wissen. Ein paar dieser Tools haben wir Ihnen im Verlauf dieses Buches bereits vorgestellt. In diesem Kapitel wollen wir Ihnen die gängigsten Tools zeigen, die viele von Ihnen vermutlich bereits kennen, aber nicht in der vorgestellten Art oder in der vorgestellten Funktionsweise.
24.1 Was kann dies und jenes noch?
In diesem Abschnitt stellen wir Ihnen die üblichen Verdächtigen vor – das eine oder andere Tool wird aber sicherlich in einem neuen Licht erscheinen. Nützliche Tools sind meist nicht nur eine Arbeitserleichterung, sondern schaffen auch ungeahnte Möglichkeiten.
24.1.1 Der Rsync-Daemon
Während der Rsync-Client wohl für jeden Sysadmin vertrautes Terrain ist, ist der Rsync-Daemon (RsyncD) weniger populär. Dabei ist er eine erstklassige Alternative zu anderen Filetransferdiensten wie z.B. FTP. Im folgenden Beispiel konfigurieren Sie einen Rsync-Server, der das Verzeichnis /srv/backup/ exportiert. In diesem Verzeichnis kann der Client später auf bequeme Weise Dateien sichern. Der Rsync-Daemon wird mit der Datei rsyncd.conf konfiguriert. Sie finden diese Datei je nach Distribution unter /etc/ oder /etc/rsync/. Unter Umständen gibt es auch nur eine Beispieldatei im doc-Verzeichnis, die Sie nach /etc/ kopieren und anpassen können. Eine funktionierende Konfigurationsdatei für unser Backupbeispiel sieht wie folgt aus:
read only = false
use chroot = true
transfer logging = true
log file = /var/log/rsyncd.log
hosts allow = 50.60.70.0/24
[backup]
path = /srv/backup
auth users = alice, bob, carl
secrets file = /etc/rsyncd.secrets
Listing 24.1 Konfigurationsdatei des Rsync-Daemons
Das bedeuten die einzelnen Einträge:
-
read only = false
Die Clients dürfen nicht nur die Datei lesen, sondern auch schreiben. -
use chroot = true
Mit dieser Option wird verhindert, dass Clients aus der Verzeichnisstruktur des Rsync-Servers ausbrechen können. -
transfer logging = true, log file = /var/log/rsyncd.log
Die Zugriffe der Clients werden in der Datei /var/log/rsyncd.log protokolliert. -
hosts allow = 50.60.70.0/24
Es werden nur Zugriffe aus dem Netz 50.60.70.0/24 zugelassen. -
[backup]
Dies ist der Name der Verzeichnisfreigabe. -
path = /srv/backup
Hier wird der Pfad konfiguriert, in dem die Daten abgelegt werden, die die Clients hochladen. -
auth users = alice, bob, carl
Nur Benutzer aus dieser Liste dürfen die Freigabe nutzen. -
secrets file = /etc/rsyncd.secrets
In der Datei /etc/rsyncd.secrets stehen Paare aus Benutzername und Passwort, mit denen die Clients sich anmelden müssen. Der Inhalt der Datei kann etwa so aussehen:alice:geheim
bob:meinpw
carl:nocheinpasswortListing 24.2 Inhalt: »rsyncd.secrets«
Wenn der Benutzer bob sein Homeverzeichnis auf dem Serverlaufwerk sichern möchte, gibt er dazu folgenden Befehl ein:
rsync -avz /home/bob/ bob@server.example.com::backup/bobshome/
Listing 24.3 Backup des Homeverzeichnisses auf einer Rsync-Freigabe
Entscheidend ist in Listing 24.3 die Adressierung mit zwei Doppelpunkten, da so der RsyncD angesprochen wird.
24.1.2 Wenn's mal wieder später wird: »screen«
Eine Terminalsitzung endet normalerweise, wenn Sie das Terminal schließen oder, falls Sie auf einem entfernten Server arbeiten, sobald Ihre SSH-Sitzung endet. Screen ist ein Terminal-Multiplexer, mit dem Sie das verhindern können. Rufen Sie einmal screen ohne weitere Parameter auf. Sie erhalten eine kurze Begrüßungsmeldung, die Sie mit einem Tastendruck bestätigen. Danach sehen Sie ein normal aussehendes Terminal. Rufen Sie nun den Systemmonitor top auf. Wenn er gestartet ist, schließen Sie das Terminal. Wenn Sie nun auf der Kommandozeile screen -dr eingeben, erhalten Sie Ihr eben geschlossenes Terminal zurück, und top läuft darin noch.
Wenn Sie mehrere persistente Terminalsitzungen haben möchten, können Sie innerhalb Ihrer Screen-Session weitere »Fenster«, also neue Terminalsitzungen, öffnen. Auch sie werden von Screen verwaltet. Das Öffnen, Schließen und Wechseln zwischen den Fenstern geschieht mit Tastenkombinationen, die alle mit (Strg) + (A) beginnen. In Tabelle 24.1 sehen Sie eine Liste der wichtigsten Kombinationen.
Kombination | Funktion | Bedeutung |
---|---|---|
(Strg) + (A) , (W) | windows | gibt eine Liste aller offenen Fenster aus |
(Strg) + (A) , (C) | create | erzeugt ein neues Fenster |
(Strg) + (A) , (N) | next | wechselt zum nächsten Fenster |
(Strg) + (A) , (D) | detach | hängt den Screen und die Session ab |
(Strg) + (A) , (K) | kill | schließt das aktuelle Fenster |
(Strg) + (A) , (ª) + (S) | split | teilt das Terminalfenster horizontal (Splitscreen) |
(Strg) + (A) , (ÿ) | focus | wechselt den Fokus im Splitscreen |
(Strg) + (A) , (ª) + (Q) | only | hebt den Splitscreen und die Einteilung wieder auf |
(Strg) + (A) , (ª) + (A) | title | weist dem aktuellen Fenster einen Namen zu |
(Strg) + (A) , (ª) + (ß) | help | zeigt alle Kombinationen und deren Funktion an |
Tabelle 24.1 Tastenkombinationen von »screen«
24.1.3 Anklopfen mit »nmap«
nmap (network mapper) ist ein Scanner zum Untersuchen von Netzwerken. Es ist das Standardwerkzeug für Portscans. Das Tool hat einen riesigen Funktionsumfang und kann sowohl für simple Portchecks als auch für groß angelegte Security Audits verwendet werden. Im Folgenden werden die wichtigsten Funktionen zum Scannen der eigenen Infrastruktur gezeigt. Beim Aufruf von nmap müssen Sie das Ziel des Scans angeben. Das kann ein einzelner Host sein, ein Netz oder ein Adressbereich. Wenn außer dem Ziel keine weiteren Optionen angegeben werden, führt nmap einen TCP-SYN-Scan[ 39 ] (Option -sS) auf die 1000 am häufigsten verwendeten Ports durch. Bei einem SYN-Scan wird nur ein TCP-Paket mit gesetztem SYN-Flag gesendet. Das ist der erste Teil des sogenannten Three-Way-Handshakes. Danach antwortet der Server bei einem geöffneten Port mit einem SYN/ACK-Paket oder bei einem geschlossenen Port mit einem RST-Paket. Um den normalen Verbindungsaufbau fortzuführen und den Handshake abzuschließen, müsste nmap nun korrekterweise auf das SYN/ACK-Paket mit einem ACK antworten. Das tut er aber nicht, denn das Ziel ist bereits erreicht. Anhand der Serverantwort wird klar, ob der Port offen (open) oder geschlossen (closed) ist.
root@example:~# nmap scanme.nmap.org
Starting Nmap 7.60 ( https://nmap.org ) at 2018-09-12 17:17 UTC
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.18s latency).
Not shown: 990 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
554/tcp closed rtsp
7070/tcp closed realserver
9929/tcp closed nping-echo
31337/tcp open Elite
Nmap done: 1 IP address (1 host up) scanned in 184.67 seconds
Listing 24.4 TCP-SYN-Scan mit »nmap«
Von den 1.000 gescannten Ports sind drei offen, vier geschlossen und die restlichen filtered. Als filtered werden alle Ports eingestuft, von denen entweder gar keine Antwort oder eine ICMP-Fehlermeldung kam. Näheres zu ICMP-Meldungen finden Sie in Abschnitt 22.6.7, »Das erste Firewallskript«.
Das Scannen von UDP-Ports ist nicht ganz so trivial, da es verbindungslos ist. Während sich TCP wie ein Einschreiben mit Rückschein verhält, wäre UDP eher eine Postkarte. Sie kann ankommen, muss es aber nicht. Normalerweise antworten offene UDP-Ports daher auch nur, wenn im UDP-Paket das Protokoll der Anwendung gesprochen wird. nmap schickt standardmäßig jedoch immer leere Pakete, weil es nicht wissen kann, welche Applikation hinter dem zu scannenden Port lauscht. Dementsprechend selten ist auch eine positive Antwort (open). Wenn nmap als Antwort jedoch eine ICMP Port unreachable-Nachricht erhält, bedeutet das, dass der Port eindeutig geschlossen ist (closed). Wenn andere ICMP-Fehlermeldungen kommen, wird das als gefilterter Port interpretiert (filtered). Beim Ausbleiben einer Antwort wird open|filtered angezeigt, weil nicht eindeutig gesagt werden kann, ob das falsche Protokoll gesprochen wurde oder ob das Paket von einer Firewall verschluckt wurde. Um einen UDP-Scan durchzuführen, verwenden Sie die Option -sU:
root@example:~# nmap -sU 127.0.0.1
Starting Nmap 7.60 ( https://nmap.org ) at 2018-09-12 17:28 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000011s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
68/udp open|filtered dhcpc
161/udp open snmp
514/udp open|filtered syslog
Nmap done: 1 IP address (1 host up) scanned in 1.28 seconds
Listing 24.5 UDP-Scan mit »nmap«
Etwas genauere Angaben über den Zustand der Ports erhalten Sie mit der Option -sUV (siehe Listing 24.6). Dieser Versionsscan probiert nämlich verschiedene Applikationsprotokolle auf den Ports aus, die als open und open|filtered gelten. Dadurch dauert der Scan aber auch sehr viel länger.
root@example:~# nmap -sUV 127.0.0.1
Starting Nmap 7.60 ( https://nmap.org ) at 2018-09-12 18:01 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000070s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
68/udp open|filtered dhcpc
161/udp open snmp SNMPv1 server (public)
514/udp open|filtered syslog
Service Info: Host: ubuntu
Service detection performed. Please report any incorrect results at \
http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 78.94 seconds
Listing 24.6 Detail-UDP-Scan mit »nmap«
Der Versionsscan ist übrigens auch mit TCP möglich. Damit kann man zum Teil herausfinden, welche Software hinter welchem Port arbeitet. Das funktioniert aber nicht mit einem SYN-Scan, sondern nur mit einem TCP-Connect-Scan (siehe Listing 24.7). Ohne einen vollständigen Verbindungsaufbau ist es schließlich nicht möglich, die Software direkt anzusprechen.
root@example:~# nmap -sV 127.0.0.1
Starting Nmap 7.60 ( https://nmap.org ) at 2018-09-12 18:47 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000050s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu1 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at […]
Nmap done: 1 IP address (1 host up) scanned in 8.48 seconds
Listing 24.7 TCP-Connect-Scan mit »nmap«
Um die Erreichbarkeit Ihrer Dienste zu testen oder Ihre Firewallkonfiguration zu überprüfen, brauchen Sie noch weitere Optionen:
-
-p
Mit -p können Sie Ports und Portbereiche angeben, die überprüft werden sollen. Beispiel: nmap -p 22,25,100-150 scanme.nmap.org -
-sP
Diese Option führt einen Ping-Scan aus. Es wird also nicht geprüft, welche Ports offen sind, sondern lediglich, ob der Host online ist. Das ist sehr nützlich, um alle erreichbaren Rechner im lokalen Netz zu ermitteln. Beispiel: nmap -sP 192.168.2.0/24 -
-PN
Normalerweise prüft nmap vor dem eigentlichen Portscan, ob der Host überhaupt online ist. Das wird mit einem Ping überprüft. Wenn der Host aber wegen einer Firewall nicht auf Pings reagiert, kann diese Prüfung mit der Option -PN deaktiviert werden. -
-T
Mit dieser Option kann ein Timing Template für den Scan ausgewählt werden. Ohne Angabe des Parameters wird -T 3 (normal) genutzt. Bei sehr schnellen lokalen Netzen können Sie aber auch schnellere Scans durchführen. Erlaubte Werte sind 0 (sneaky) bis 5 (insane). -
-O
Diese Option aktiviert die OS-Detection. Anhand des Antwortverhaltens auf die Scans probiert nmap, das benutzte Betriebssystem des Zielrechners zu erraten. Die Ergebnisse sind allerdings nicht absolut zuverlässig. -
-F
Der Fast Mode scannt nur die 100 gebräuchlichsten Ports und nicht 1000 wie es in der Voreinstellung festgelegt ist.
Neben den genannten Optionen bietet nmap noch Dutzende weitere. Ein Blick in die Manpage lohnt sich auf jeden Fall. Viele Einstellungsmöglichkeiten setzen aber ein fundiertes Netzwerkwissen voraus.
24.1.4 Netzwerkinspektion: »netstat«
Auf einen Blick sehen, auf welchem Interface ein Dienst lauscht, welche Ports geöffnet sind oder mit welchem System eine Netzwerkverbindung besteht – all das bietet netstat (NETwork STATistic). Das Programm listet die aktuellen Netzwerkinformationen Ihres Systems tabellarisch gegliedert auf. Der wohl bekannteste Aufruf, allein schon aufgrund der sprechenden Parameterart, lautet netstat -tulpen. Mittlerweile ist netstat aber abgekündigt. Der würdige Nachfolger hört auf den unschönen Namen ss (socket statistics). Er gibt Ihnen die gleichen Informationen aus und versteht (überwiegend) die gleichen Parameter. Tabelle 24.2 zeigt die Bedeutung der Parameter -tulpen von netstat und deren Pendant bei ss, und Listing 24.8 zeigt eine Beispielausgabe:
root@ubuntu:~# ss -tulpa
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 23040 0 127.0.0.53%lo:domain 0.0.0.0:* users:(("syst[…]
udp UNCONN 0 0 10.0.0.6%enp0s3:bootpc 0.0.0.0:* users:(("syst[…]
tcp LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:* users:(("syst[…]
tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* users:(("sshd[…]
tcp ESTAB 0 0 10.0.0.6:ssh 10.0.0.3:64155 users:(("sshd[…]
tcp LISTEN 0 128 [::]:ssh [::]:* users:(("sshd[…]
[…]
Listing 24.8 Übersicht der Netzwerkstatistiken mit »ss« (Pendant zu »netstat -tulpen«)
netstat / ss | Bedeutung |
---|---|
-t|---tcp | zeigt TCP-Protokolle |
-u|---udp | zeigt UDP-Protokolle |
-l|---listing | Darstellung von lauschenden Sockets |
-p|---programs | zeigt auch die PID und den Programmnamen |
-e|---extend | gibt zusätzliche Informationen zur User ID und zum Inode mit aus |
-n|---numeric | unterbindet die Namensauflösung (deutlich schnellere Ausgabe) |
Tabelle 24.2 »netstat«-Parameter
Eine so erzeugte Ausgabe enthält in der tabellarischen Auflistung folgende Informationen:
-
Proto
Protokoll (TCP, UPD, ICMP etc.) -
Recv-Q
die Anzahl von Bytes, die die Anwendung noch nicht vom Socket abgeholt hat -
Send-Q
die Anzahl von Bytes, die von der Gegenseite noch nicht bestätigt wurden -
Local Address
lokale Adresse -
Foreign Address
entfernte Adresse -
State
Status der Verbindung, dabei sind folgende Status möglich:-
ESTABLISHED
bestehende Verbindung -
SYN_SENT
Der Verbindungsaufbau auf dem Socket ist im Gange. -
SYN_RECV
Die Verbindungsanfrage wurde von der Gegenseite empfangen. -
FIN_WAIT1
Der Socket wurde geschlossen, und die Verbindung wird beendet. -
FIN_WAIT2
Die Verbindung ist geschlossen – Warten auf die Beendigung der Gegenseite. -
CLOSE
Der Socket wird nicht benutzt. -
CLOSE_WAIT
Die Gegenseite hat die Verbindung beendet – das Schließen des Sockets wird erwartet. -
TIME_WAIT
Der Socket ist geschlossen und im Wartezustand (noch nicht beendete Verbindung). -
LAST_ACK
Die Gegenseite hat die Verbindung beendet, und der Socket ist geschlossen. Eine abschließende Bestätigung wird abgewartet. -
LISTEN
Der Socket wartet auf eingehende Verbindungen. -
CLOSING
Beide Sockets (der lokale und der entfernte) sind geschlossen. Es wurden aber noch nicht alle Daten geschickt. -
UNKNOWN
Der Zustand des Sockets ist unbekannt.
-
-
User
Eigentümer des Sockets -
Inode
Inode-Nummer des Sockets -
PID/Program name
PID und der Programmname des Programms, das den Socket geöffnet hat
Die Programme netstat und ss verfügen noch über viele weitere Parameter, die Sie den Manpages und den Infopages entnehmen können.
24.1.5 Zugreifende Prozesse finden: »lsof«
lsof steht für list open files und macht genau das, was der Name verspricht. Es zeigt an, welche Prozesse auf welche Dateien zugreifen. Da unter Linux so gut wie alles eine Datei ist, werden auch Sockets, Pipes, Netzwerkressourcen und vieles mehr angezeigt. Mit lsof lässt sich so sehr einfach ermitteln, welcher Prozess gerade welche Ressourcen benutzt. Ruft man lsof ohne Parameter auf, so werden alle zurzeit benutzten Dateien angezeigt. Bei einem normalen Linux-System sind das eine ganze Menge. Mit verschiedenen Optionen können Sie aber auch gezielt nach Informationen suchen.
Prozesssuche: »lsof -p PID«
Gibt alle geöffneten Ressourcen des Prozesses mit der angegebenen PID aus.
root@example:~# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,0 4096 2 /
systemd 1 root rtd DIR 252,0 4096 2 /
systemd 1 root txt REG 252,0 1573136 921775 /lib/systemd/systemd
[…]
Listing 24.9 Ausgabe für den Prozess mit der ID »1«
Netzwerkressourcen: »lsof -i«
Alle genutzten Netzwerkressourcen können Sie mit lsof -i anzeigen lassen. Über die zusätzliche Angabe eines Protokolls, Hostnamens und Ports kann die Anzeige eingeschränkt werden. Um beispielsweise alle IMAP-Verbindungen zu sehen, können Sie lsof -i tcp:143 aufrufen. Über die Optionen -Pn können Sie das Auflösen von Port- und Hostnamen unterbinden:
root@example:~# lsof -Pni
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dhclient3 798 root 4u IPv4 7033 0t0 UDP *:68
sshd 833 root 3u IPv4 7469 0t0 TCP *:22 (LISTEN)
sshd 833 root 4u IPv6 7471 0t0 TCP *:22 (LISTEN)
sshd 849 root 3r IPv4 7491 0t0 TCP 192.168.2.16:22\
->192.168.2.10:39975 (ESTABLISHED)
[…]
Listing 24.10 Ausgabe der aktiven Netzwerkverbindungen
Dateizugriffe: »lsof /path/file«
Wenn Sie lsof gefolgt von einer Datei oder einem Verzeichnis aufrufen, werden Ihnen alle Prozesse angezeigt, die aktuell darauf zugreifen. Angewendet auf einen Mountpoint, erhalten Sie die Ausgabe aller geöffneten Dateien auf dem Dateisystem.
root@example:~# lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1089 daniel txt REG 9,2 917888 130050 /bin/bash
bash 1118 root txt REG 9,2 917888 130050 /bin/bash
Listing 24.11 Ausgabe der Zugriffe auf die Datei »/bin/bash«
Die einzelnen Spalten der Ausgabe werden wir uns am Beispiel der geöffneten Dateien des rsyslog-Daemons ansehen:
root@example:~# lsof -p 5441
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 5441 syslog cwd DIR 9,2 4096 2 /
rsyslogd 5441 syslog rtd DIR 9,2 4096 2 /
rsyslogd 5441 syslog txt REG 9,2 287928 8294 /usr\
/sbin/rsyslogd
rsyslogd 5441 syslog mem REG 9,2 88384 857 /lib\
/libgcc_s.so.1
rsyslogd 5441 syslog mem REG 9,2 43552 1005 /lib\
/libnss_nis-2.12.1.so
[…]
rsyslogd 5441 syslog 0u unix 0x… 0t0 123319 /dev/log
rsyslogd 5441 syslog 3u IPv4 123313 0t0 UDP *:syslog
rsyslogd 5441 syslog 4u IPv6 123314 0t0 UDP *:syslog
rsyslogd 5441 syslog 5r REG 0,3 0 4026532018 /proc/kmsg
[…]
rsyslogd 5441 syslog 8w REG 9,2 2691 138857 /var/log\
/syslog
[…]
Listing 24.12 Beispiel: Zugriffe des »rsyslogd«
Dabei haben die Spalten nachstehende Bedeutung:
-
COMMAND
der Name des Prozesses, der auf die angegebene Ressource zugreift -
PID
die Prozess-ID des Prozesses -
USER
der Benutzername, unter dem der Prozess läuft -
FD
Mit FD wird entweder die Nummer des File Descriptors der Ressource oder der Ressourcentyp angegeben. Die wichtigsten Werte für FD sind folgende:-
cwd
Mit cwd (current working directory) wird das aktuelle Arbeitsverzeichnis des Prozesses ausgegeben, also in der Regel das Verzeichnis, aus dem heraus der Prozess gestartet wurde. -
rtd
gibt das Wurzelverzeichnis (root directory) des Prozesses an. Bei den meisten Prozessen ist das /, in einer chroot-Umgebung kann es aber auch ein beliebiges anderes Verzeichnis sein. -
txt
steht für program text und zeigt das ausgeführte Programm an. -
mem
Der Typ mem zeigt an, dass die angegebene Datei in den Speicher »gemappt« wurde. Das geschieht in der Regel bei Bibliotheken. -
0u, 5r, 8w …
Bei Zahlen, auf die die Buchstaben u, r oder w folgen, handelt es sich um die Nummern des File Descriptors (FD). Beim Öffnen von Dateien wird der Datei ein für den Prozess eindeutiger FD zugewiesen. Alle weiteren Operationen (wie das Lesen, Schreiben und Schließen der Datei) erfolgen dann nur über die Nummer des FD und nicht über den Namen. Diese Nummern kennen Sie schon von der Shell. Die File Descriptors 0, 1 und 2 Ihrer Shell sind STDIN, STDOUT und STDERR. Mit der Umleitung KOMMANDO 2> DATEI biegen Sie letztendlich das Ziel des FDs 2 um. Die Buchstaben nach dem File Descriptor geben den Zugriffsmodus an: r steht für lesenden Zugriff, w für schreibenden und u für beides. In Listing 24.12 sehen Sie beispielsweise, dass /var/log/syslog gerade für einen schreibenden Zugriff unter der Nummer 8 zur Verfügung steht.
-
-
TYPE
gibt die Art der Datei an. Es gibt sehr viele verschiedene Typen. Die wichtigsten sind REG für eine reguläre Datei, DIR für ein Verzeichnis, CHR und BLK für Character bzw. Block Devices und IPv4/6 für geöffnete IP-Verbindungen. -
DEVICE
Device enthält bei »normalen« Dateien die Major und Minor Number des Geräts. Die Datei /usr/sbin/rsyslogd aus dem Beispiel in Listing 24.12 liegt auf Gerät 9,2. Das entspricht /dev/md2. Neben der Gerätenummer kann die DEVICE-Spalte auch eine Referenznummer des Kernels enthalten, unter der das Gerät adressiert wird. -
SIZE/OFF
In dieser Spalte wird die Größe der Datei angezeigt. Einträge, die mit 0t oder 0x beginnen, zeigen den Offset an. -
NODE
Unter Node finden Sie entweder die Inode-Nummer der Datei oder den verwendeten Protokolltyp, wie beispielsweise TCP oder UDP. -
NAME
Die letzte Spalte gibt den Dateinamen an oder bei Netzwerkressourcen die lokale sowie gegebenenfalls entfernte Adresse und den Verbindungszustand.
Mit lsof lassen sich viele Fragestellungen rund um belegte Ressourcen leicht beantworten. Um beispielsweise herauszufinden, welcher Prozess das Aushängen eines Dateisystems blockiert, reicht der Aufruf von lsof /mountpoint. Sehr praktisch ist auch die Möglichkeit, auf gelöschte, aber noch aktive Dateien zuzugreifen. Solange ein Prozess eine Datei noch geöffnet hat, ist sie über den File Descriptor nämlich noch zu erreichen, auch wenn sie im Dateisystem nicht mehr zu sehen ist. Wenn Sie beispielsweise die Log-Datei /var/log/syslog löschen, während der Syslog-Daemon noch läuft, erhalten Sie folgende Ausgabe von lsof:
root@example:~# rm /var/log/syslog
root@example:~# ls /var/log/syslog
ls: Zugriff auf /var/log/syslog nicht möglich: No such file or directory
root@example:~# lsof -p 5441
[…]
rsyslogd 5441 syslog 8w REG 9,2 2786 138857 /var/log/syslog (deleted)
Listing 24.13 Zugriffe auf gelöschte Dateien
Über den FD 8 und mithilfe des proc-Dateisystems können Sie die Daten aber noch einsehen und bei Bedarf wiederherstellen (Näheres zum proc-Dateisystem finden Sie in Abschnitt 3.4, »Alles virtuell? ›/proc‹«):
root@example:~# cat /proc/5441/fd/8
Listing 24.14 Ausgabe der gelöschten Dateien
24.1.6 Was macht mein System? »top«!
top ist eines der Standardwerkzeuge, wenn es darum geht, den aktuellen Systemzustand zu prüfen. Bei den meisten Administratoren, die wir kennen, ist es das erste Kommando, das ausgeführt wird, wenn es auf einer Maschine zu Problemen kommt. Das Programm zeigt in den ersten Zeilen einige allgemeine Informationen über den Systemzustand an. Der größte Teil des Bildschirms wird aber für die Anzeige der Prozesse genutzt, die aktuell die meiste Rechenzeit verbrauchen. Die Ansicht aktualisiert sich in der Standardeinstellung alle drei Sekunden selbst.
Die Ausgabe von top lässt sich relativ frei konfigurieren. So lassen sich beispielsweise zusätzliche Spalten mit Detailinformationen zu den Prozessen ein- und ausblenden. Auch die Sortierreihenfolge kann geändert werden, um beispielsweise auf einen Blick die größten Speichersünder zu identifizieren.
top - 10:03:57 up 4 days, 11:31, 2 users, load average: 2.36, 2.14, 1.86
Tasks: 179 total, 3 running, 176 sleeping, 0 stopped, 0 zombie
Cpu(s): 23.9%us, 6.4%sy, 0.0%ni, 63.1%id, 6.1%wa, 0.1%hi, 0.3%si, 0.0%st
Mem: 4838500k total, 4790276k used, 48224k free, 117576k buffers
Swap: 1951888k total, 48312k used, 1903576k free, 1733664k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1711 www-data 16 0 282m 44m 5140 S 31 0.9 0:03.75 apache2
1537 www-data 15 0 291m 52m 7124 S 14 1.1 0:01.31 apache2
1622 www-data 16 0 289m 49m 7632 S 11 1.0 0:01.85 apache2
1162 www-data 15 0 311m 73m 7496 S 11 1.6 0:05.13 apache2
1168 www-data 15 0 296m 57m 7400 S 10 1.2 0:02.98 apache2
1718 www-data 15 0 299m 63m 5316 R 9 1.3 0:00.82 apache2
Listing 24.15 Die Ausgabe von »top«
top bietet eine ganze Reihe von Kommandozeilenoptionen an:
-
-b
aktiviert den Batchmodus. top startet dann im nicht interaktiven Modus und gibt im Standardintervall Prozessinformationen aus. Der Batchmodus eignet sich hervorragend, um die Ausgabe von anderen Programmen weiterverarbeiten zu lassen. -
-n <ZAHL>
gibt die Anzahl der Updates an, die ausgeführt werden sollen, bevor sich top beendet. Die Option macht am meisten Sinn in Kombination mit dem Batchmodus. -
-u <USER>
zeigt nur Prozesse vom angegebenen Benutzer an. top -u www-data zeigt beispielsweise nur die Prozesse des Webservers an. -
-d <SEKUNDE>.<ZEHNTEL>
setzt das Aktualisierungsintervall. -
-p <PID1>,<PID2>,<...>
zeigt nur ausgewählte Prozesse an.
Die wichtigsten Informationen in den oberen Zeilen von Listing 24.15 sind folgende:
-
load average
gibt die durchschnittliche Systemlast an. Die drei Zahlen sind ein exponentiell geglätteter Wert, der die durchschnittliche Anzahl von Prozessen in der run queue über einen Zeitraum von 1, 5 und 15 Minuten angibt. Das heißt, es wird angezeigt, wie viele Prozesse zurzeit laufen oder gerne laufen würden. Die load ist übrigens ein Wert, der äußerst subjektiv bewertet werden muss. Ein System mit einer load von 3 muss nicht langsamer oder überlasteter sein als eines mit einer load von 1,8. Sie müssen selbst sehen, ab wann ein System zu träge reagiert, und so die maximale load ermitteln. Abhängig von der Anzahl der CPU-Kerne und der Aufgabe des Systems kann das sehr unterschiedlich sein. Das Auswerten der load average macht aber dennoch Sinn. Durch das Monitoring dieses Werts können Sie Lastspitzen leicht erkennen und Kapazitätsplanung betreiben. -
us
gibt an, wie viel Prozent der Rechenzeit für Benutzerprozesse verwendet wird. Auf einem ausgelasteten System ist dieser Wert sehr hoch. -
sy
die benutzte Zeit in Prozent, die der Kernel selbst für interne Aufgaben benutzt hat. Wenn die system time sehr hoch ist, ist das oft ein Hinweis auf eine Fehlfunktion. Die user time sollte normalerweise um ein Vielfaches höher sein als die system time. Auf nicht korrekt funktionierenden Virtualisierungsumgebungen sieht man häufig den umgekehrten Fall, beispielsweise bei Linux-Gästen in einer VMware-Umgebung, die ohne die VMware-Tools laufen. Eine hohe system time sagt aus, dass sich das System mehr mit sich selbst als mit den eigentlichen Aufgaben beschäftigt. -
ni
ist die Zeit, die genicete Prozesse verbraucht haben, also user time-Prozesse, die höher oder niedriger priorisiert sind. -
id
zeigt an, wie viel Prozent der Zeit das System nichts tut. -
wa
gibt an, wie lange anteilig auf das Fertigstellen von I/O-Operationen gewartet werden muss. Dieser Wert sollte möglichst gering sein. Ein hohes iowait bedeutet meistens, dass das Storage-System nicht mit den nötigen Lese- und Schreiboperationen mithalten kann. -
hi
verbrauchte Zeit für das Ausführen von Hardware-Interrupts -
si
verbrauchte Zeit für das Ausführen von Software-Interrupts -
Mem
In dieser Zeile sieht man, wie viel RAM insgesamt zur Verfügung steht, wie viel verbraucht ist und wie viel noch übrig ist. Der Wert für den freien Speicher muss mit Vorsicht genossen werden. Denn alles, was nicht direkt für Applikationen genutzt wird, benutzt der Kernel für das Caching. Bei Bedarf kann der Kernel diese Speicherbereiche wieder freigeben. Man muss daher die Werte von cached und buffers noch zu dem freien Speicher addieren, um einen realistischeren Wert zu bekommen. free -m zeigt genau das an. Mit slabtop kann man sich übrigens anzeigen lassen, wofür der Cache genutzt wird. -
Swap
zeigt an, wie groß der Swap-Bereich ist und wie viel belegt ist.
Die angezeigten Spalten in der Prozessübersicht können frei gewählt werden. Durch Drücken von (F) können zusätzliche Spalten ein- und ausgeblendet werden. Hier sehen Sie die wichtigsten Felder im Überblick:
-
PID
die Prozess-ID. Bei Bedarf kann auch die PPID – Parent Process PID – eingeblendet werden. -
USER
der effektive Benutzer des Prozesses. Alternativ kann auch der echte angezeigt werden. -
PR
gibt die Priorität des Tasks an. Je höher der Wert ist, desto länger hat der Prozess bereits auf die Zuteilung von Rechenzeit gewartet. -
NI
zeigt den Nice-Wert an. Je höher die Zahl ist, desto geringer ist die Priorität. -
VIRT
steht für virtual image und sagt aus, auf wie viel Speicher der Prozess aktuell Zugriff hat. Dieser Wert beinhaltet auch ausgelagerten Speicher im Swap-Bereich und shared libraries. -
RES
heißt resident image und gibt im Gegensatz zu dem virtual image den reellen physikalischen Speicherverbrauch an, allerdings ohne shared libraries. Dieser Wert ist am wichtigsten, um den Speicherverbrauch von Prozessen zu analysieren. -
SHR
ist die shared memory size und gibt an, wie viel RAM für shared libraries genutzt wird. Dieser Speicher kann mit anderen Prozessen geteilt werden. -
S
gibt Aufschluss über den Prozesszustand:-
D
uninterruptable sleep – der Prozess schläft und kann nicht aufgeweckt werden. -
R
ein laufender oder lauffähiger Prozess -
S
Der Prozess schläft. -
T
traced or stopped – der Prozess wurde durch ein Signal angehalten. -
Z
zombie – der Prozess ist tot, wurde vom Elternprozess jedoch nicht sauber beendet.
-
-
%CPU
zeigt an, wie viel Prozent der zur Verfügung stehenden Rechenleistung gerade von dem Prozess verwendet wird. -
%MEM
zeigt den prozentualen Speicherverbrauch des Prozesses an. -
TIME+
gibt an, wie viel CPU-Zeit der Prozess schon verbraucht hat. -
COMMAND
zeigt das ausgeführte Kommando an
Mit »iotop« die Festplattenaktivität analysieren
Wenn die Festplatten in hektische Aktivität ausbrechen, ist es oft nicht einfach, den dafür verantwortlichen Prozess ausfindig zu machen. iotop ist dabei eine große Hilfe. Wenn Sie iotop ohne weitere Parameter aufrufen, präsentiert es Ihnen in der Kopfzeile der Ausgabe die kumulierten Datenraten aller schreibenden und lesenden Zugriffe. Darunter sehen Sie eine Prozesstabelle, in der Sie die Zugriffsraten pro Prozess ablesen können (siehe Listing 24.16). So finden Sie schnell und einfach einen Prozess, der durch außergewöhnlich häufige Festplattenzugriffe auffällt.
Total DISK READ : 0.00 B/s | Total DISK WRITE : 5.76 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
5322 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.02 % [kworker/u2:1]
5687 be/4 daniel 0.00 B/s 5.76 M/s 0.00 % 0.00 % dd if=/dev/[…]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]
7 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh]
9 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
10 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
11 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]
12 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
13 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [perf]
14 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khungtaskd]
15 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [writeback]
Listing 24.16 Ausgabe von »iotop« (Auszug)
iotop erlaubt es zusätzlich, die Datenraten in Intervallen zu messen und in eine Datei zu schreiben. So können Sie die Entwicklung der Plattenaktivität über einen längeren Zeitraum beobachten. Dazu starten Sie iotop zum Beispiel mit dem folgenden Befehl:
iotop -o -b -d10 -n100 > hdd.txt
Listing 24.17 Langzeitmessung der Plattenaktivität mit »iotop«
iotop schreibt die Messwerte nun einhundert Mal, jeweils im Abstand von zehn Sekunden, in die Datei hdd.txt.
24.1.7 Wenn gar nichts mehr geht – Debugging mit »strace«
strace ist ein ziemliches Schwergewicht unter den Analysetools und manchmal die letzte Möglichkeit, um herauszufinden, was ein Prozess gerade tut oder woran er scheitert. Mithilfe von strace lassen sich alle Systemaufrufe (system calls) ausgeben, die ein Prozess gerade durchführt. Ein Systemaufruf ist eine Anweisung an den Kernel, um auf Ressourcen zuzugreifen. Aus Sicherheitsgründen darf kein Prozess direkt Dateien öffnen, schließen oder Speicheradressen manipulieren. Letztendlich wird also alles außer prozessinternen Berechnungen über Systemaufrufe erledigt. Dementsprechend umfangreich ist auch die Ausgabe von strace. Eine Liste von system calls finden Sie in der Manpage von syscalls. Jeder Systemaufruf ist wiederum in einer eigenen Manpage dokumentiert.
[+] Es gibt sehr viele system calls, und viele kann man als Nicht-Programmierer kaum verstehen. In Kombination mit der riesigen Informationsflut, die selbst bei kleinen Programmen durch strace ausgegeben wird, wird die Fehleranalyse schnell zur Suche nach der Nadel im Heuhaufen. Mit etwas Übung und Geduld kann man durchaus zu einem brauchbaren Ergebnis kommen.
Es gibt zwei Möglichkeiten, wie Sie strace einsetzen können. Bei der ersten Variante, strace PROGRAMM, wird das Programm direkt gestartet und sofort »getracet« (also der Spur des Programms gefolgt). Wenn Sie einen bereits laufenden Prozess untersuchen möchten, dann können Sie strace -p PID aufrufen. In diesem Fall dockt sich strace an den Prozess an und gibt fortlaufend die aufgerufenen system calls aus. Weitere nützliche Optionen sind -o DATEI und -f. Mit -o können Sie die Ausgabe von strace in eine Datei schreiben lassen. Die Option -f ist notwendig, um auch Unterprozesse zu verfolgen. Sehr hilfreich ist die Option -e. Mit ihr können Sie die Ausgabe von strace auf eine Liste von system calls beschränken oder gezielt einige ausschließen. strace -e open,read,write … gibt nur open-, read- und write-system calls aus. strace -e \!mmap,brk,mprotect würde alle system calls außer den aufgezählten ausgeben.
Im Folgenden werden wir strace am Beispiel des Befehls true untersuchen. Der einzige Zweck des Kommandos ist es, den Exit-Status 0 zurückzugeben. Es ist damit eines der einfachsten Programme überhaupt.
root@example:~# strace true
execve("/bin/true", ["true"], [/* 15 vars */]) = 0
brk(0) = 0x2059000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or \
directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \
= 0x7f9d9bfe9000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or \
directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21206, ...}) = 0
mmap(NULL, 21206, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9d9bfe3000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or \
directory)
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\356\1\0\0\0\0" \
..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1572232, ...}) = 0
mmap(NULL, 3680296, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) \
= 0x7f9d9ba48000
mprotect(0x7f9d9bbc2000, 2093056, PROT_NONE) = 0
mmap(0x7f9d9bdc1000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED| \
MAP_DENYWRITE, 3, 0x179000) = 0x7f9d9bdc1000
mmap(0x7f9d9bdc6000, 18472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED| \
MAP_ANONYMOUS, -1, 0) = 0x7f9d9bdc6000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \
= 0x7f9d9bfe2000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \
= 0x7f9d9bfe1000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \
= 0x7f9d9bfe0000
arch_prctl(ARCH_SET_FS, 0x7f9d9bfe1700) = 0
mprotect(0x7f9d9bdc1000, 16384, PROT_READ) = 0
mprotect(0x604000, 4096, PROT_READ) = 0
mprotect(0x7f9d9bfeb000, 4096, PROT_READ) = 0
munmap(0x7f9d9bfe3000, 21206) = 0
exit_group(0) = ?
Listing 24.18 Ausgabe der Aktionen des Programms »true« durch »strace«
Wie Sie sehen, werden für eine eigentlich recht simple Aufgabe sehr viele system calls ausgeführt. Sie können sich also leicht vorstellen, was beim Tracen eines Webservers ausgegeben wird. Zum Glück sind für die meisten Analysen aber nur wenige Systemaufrufe wirklich relevant. Die wichtigsten Aufrufe aus Listing 24.18 werden im Folgenden beschrieben:
-
execve
Dieser Systemaufruf führt das Programm mit dem nachfolgenden Namen aus. Zusätzlich sehen Sie die Aufrufparameter und die Anzahl der für den Prozess gesetzten Umgebungsvariablen. Sie können sich auch die Variablen selbst anzeigen lassen, indem Sie strace zusätzlich mit der Option -v aufrufen. Der letzte Eintrag jeder Zeile ist der Rückgabewert des Systemaufrufs. Negative Werte zeigen einen Fehler an. -
access
Der Systemaufruf access prüft, ob auf eine Datei mit den gewünschten Rechten (Lesen, Schreiben etc.) zugegriffen werden kann. In Listing 24.18 können Sie sehen, dass auf /etc/ld.so.nohwcap nicht zugegriffen werden kann, da die Datei nicht existiert, was mit einer Fehlermeldung quittiert wird: (-1 ENOENT (No such file or directory) ). -
open
open dient zum Öffnen von Dateien. Der Rückgabewert des Systemaufrufs ist der zugewiesene File Descriptor. Beim open-Aufruf wird mit angegeben, wie auf die Datei zugegriffen werden soll. Im Beispiel wird /etc/ld.so.cache lesend (O_RDONLY) geöffnet und ist fortan mit dem File Descriptor 3 ansprechbar. -
read
Mit read werden Daten aus dem angegebenen File Descriptor gelesen. Die ersten gelesenen 32 Bytes werden mit ausgegeben. Wenn Sie mehr Daten angezeigt haben möchten, können Sie mit der Option -s eine andere Größe setzen. -
fstat
Gibt Informationen über die Datei mit dem angegebenen File Descriptor zurück. -
close
Geöffnete Dateien werden mit close wieder geschlossen. Als Argument wird der File Descriptor angegeben. -
exit_group
Dieser system call liefert endlich das gewünschte Ergebnis. Er gibt uns den Exit-Status 0 zurück.
Um ein Gefühl für einen typischen Programmablauf zu bekommen und die Systemaufrufe näher kennenzulernen, sollten Sie einfach ein paar Dienste und einfache Tools tracen. Das folgende Beispiel zeigt den rsyslog-Daemon bei der Arbeit.
Diesmal sollen nur write-Systemaufrufe protokolliert werden (-e write). Dabei sollen die ersten 1024 Byte mit ausgegeben werden (-s 1024) sowie sämtliche Unterprozesse (-f):
root@example:~# strace -s 1024 -f -e write -p 6151
[…]
[pid 6283] write(8, "Nov 3 19:20:40 example stefan: Hallo Leser\n", 43) = 43
[pid 6283] write(13, "Nov 3 19:20:40 example stefan: Hallo Leser\n", 43) = 43
[pid 6283] write(21, "Nov 3 19:20:40 example stefan: Hallo Leser\n", 43) = 43
[…]
Listing 24.19 »rsyslogd«-Systemaufrufe
Das Ergebnis zeigt, wie auf die File Descriptors 8, 13 und 21 jeweils die gleiche 43 Byte große Log-Meldung geschrieben wurde. Die FDs gehören zu den Dateien /var/log/syslog, /var/log/user und /var/log/messages.
Im nächsten Beispiel schauen wir uns einige Elemente einer FTP-Sitzung an. Bei größeren Programmen sollten Sie die Ausgabe mit der Option -o immer in eine Datei schreiben.
root@example:~# strace -o /tmp/ftp.trace ftp ftp.gwdg.de
[…]
Listing 24.20 »ftp«-Systemaufrufe
Der Aufruf erzeugt einen Output von mehr als 500 Zeilen. Zunächst betrachten wir nur einige open-Systemaufrufe:
[…]
open("/lib/libreadline.so.6", O_RDONLY) = 3
open("/lib/libncurses.so.5", O_RDONLY) = 3
open("/lib/libc.so.6", O_RDONLY) = 3
open("/lib/libdl.so.2", O_RDONLY) = 3
[…]
open("/lib/tls/x86_64/libnss_db.so.2", O_RDONLY) = -1 ENOENT (No such \
file or directory)
open("/lib/tls/libnss_db.so.2", O_RDONLY) = -1 ENOENT (No such file or \
directory)
open("/lib/x86_64/libnss_db.so.2", O_RDONLY) = -1 ENOENT (No such file or \
directory)
open("/lib/libnss_db.so.2", O_RDONLY) = -1 ENOENT (No such file or \
directory)
open("/usr/lib/tls/x86_64/libnss_db.so.2", O_RDONLY) = -1 ENOENT (No such \
file or directory)
[…]
open("/etc/resolv.conf", O_RDONLY) = 3
open("/etc/host.conf", O_RDONLY) = 3
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libnss_dns.so.2", O_RDONLY) = 3
open("/lib/libresolv.so.2", O_RDONLY) = 3
[…]
Listing 24.21 Auszug aus »/tmp/ftp.trace«
In der Ausgabe von Listing 24.21 sehen Sie, wie zunächst einige wichtige Bibliotheken geladen werden. Sie können auch sehen, dass eine ganze Menge open-Operationen scheitern, weil die gewünschten Dateien einfach nicht existieren. Das ist völlig normal und muss nicht zwangsläufig ein kritischer Fehler sein. Beim Starten von Prozessen wird oft probiert, optionale Konfigurationsdateien oder Bibliotheken zu laden. Es ist manchmal schwierig, zu beurteilen, ob das Fehlen einer Datei problematisch ist oder nicht. Aus dem Dateinamen kann man aber erste Schlüsse zu Funktion und Wichtigkeit ziehen. Der letzte Block des Listings zeigt eine typische Auswahl an Komponenten, die für die Namensauflösung gebraucht werden. Mit der Zeit werden Sie feststellen, dass sich bei fast jedem Programmaufruf die gleichen Schritte immer wiederholen.
Interessanter wird der Netzwerkteil:
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
[…]
connect(3, {sa_family=AF_INET, sin_port=htons(21), \
sin_addr=inet_addr("134.76.12.3")}, 16) = 0
[…]
dup(3) = 5
[…]
Listing 24.22 Fortsetzung von »/tmp/ftp.trace«
Mit socket wird ein Socket geöffnet, der unter dem File Descriptor 3 zur Verfügung steht. Dieser File Descriptor wird dann mit per connect mit dem Endpunkt 134.76.12.3 auf dem TCP-Port 21 verbunden. Danach wird der File Descriptor mit dup dupliziert und kann ab sofort zusätzlich mit 5 angesprochen werden.
[…]
read(3, "220-============================"..., 4096) = 74
write(1, "220 ftp.gwdg.de FTP server (Vers"..., 104) = 104
[…]
write(1, "Name (ftp.gwdg.de:stefan): ", 27) = 27
read(0, "ftp\n", 1024) = 4
write(5, "USER ftp\r\n", 10) = 10
[…]
Listing 24.23 Fortsetzung von »/tmp/ftp.trace«
Die vom Socket (FD 3) mit read gelesenen Daten werden mit write auf die Standardausgabe (FD 1), also unser Terminal, geschrieben. Mit read wird dann der Benutzername, in diesem Fall ftp, von der Standardeingabe (FD 0) eingelesen und dann per write an den duplizierten Socket (FD 5) gesendet.
strace ist zweifelsohne ein mächtiges Werkzeug. Man darf sich aber nicht der Illusion hingeben, damit alle Probleme erkennen und beseitigen zu können. Es ist aber hervorragend geeignet, um Startprobleme von Programmen oder das Sterben von Prozessen zu analysieren, insbesondere dann, wenn keine brauchbaren Log-Meldungen ausgegeben werden.
Mithilfe von strace stellt man dann oft fest, dass einfach die Zugriffsrechte nicht korrekt gesetzt sind, Dateien fehlen, die Konfigurationsdatei doch anders heißt, als in der Manpage beschrieben wurde, oder dass das Programm einfach an den falschen Stellen nach Bibliotheken sucht.
24.1.8 Prüfung der Erreichbarkeit mit »my traceroute«
Das Programm mtr (my traceroute) ist ein wahrer Segen. Damit ist es möglich, nicht nur die Erreichbarkeit von Systemen, sondern gleichzeitig auch den Routenverlauf zu verfolgen.
Dieses Programm sollte zum Standardrepertoire gehören, da es so ungemein praktisch ist. Leider ist es standardmäßig nicht installiert, aber dafür in den Paketquellen enthalten.
Das Programm erwartet als Parameter analog zu traceroute einen Namen oder eine IPAdresse. Rufen Sie es zum Beispiel mit mtr 8.8.8.8 auf, erhalten Sie die Ausgabe aus Listing 24.24:
My traceroute [v0.92]
example (192.168.178.76) 2018-09-12T18:01:57
Keys: Help Display mode Restart statistics Order of fields quit
Packets Pings
Host Loss% Snt Last Avg Best Wrst StDev
1. 192.168.0.1 0.0% 4 0.4 0.4 0.4 0.5 0.0
2. 10.131.64.1 0.0% 4 9.6 7.4 6.5 9.6 1.4
3. 1413g-mx960-01-ae10-1310.dui.uni 0.0% 4 8.4 8.5 6.5 10.9 1.7
4. de-fra01b-rc1.fra.unity-media.ne 0.0% 4 12.9 13.7 12.8 14.7 0.6
5. 1411g-mx960-01-ae3.nss.unity-med 0.0% 3 19.4 19.6 19.3 19.9 0.0
6. google.dus.ecix.net 0.0% 3 19.0 20.2 19.0 22.1 1.6
7. 209.85.253.244 0.0% 3 19.2 19.4 18.8 20.1 0.0
8. 72.14.236.19 0.0% 3 20.1 19.9 19.4 20.2 0.0
9. 209.85.254.114 0.0% 3 20.6 23.6 19.2 30.9 6.4
10. google-public-dns-a.google.com 0.0% 3 18.9 19.1 18.9 19.5 0.0
Listing 24.24 Ausgabe von »mtr«
Die Ausgabe aus Listing 24.24 wird pro Durchlauf aktualisiert. Neben dem Routenverlauf werden pro Routing-Hop die dazugehörigen Statistiken angezeigt. Verändert sich der Routenverlauf, wird dies durch Fettschrift gekennzeichnet.
Mit mtr haben Sie alle notwendigen Prüfungen im Blick: sowohl die Erreichbarkeit als auch das Routing. Ein wunderbares Stück Software!
24.1.9 Subnetzberechnung mit »ipcalc«
Die Berechnung von Subnetzen und Netzwerkmasken stellt auch einen geübten Administrator schon mal vor eine große Herausforderung. Aber Hilfe ist nicht weit, sie erfolgt in Form von ipcalc. Dieses kleine findige Tool nimmt Ihnen die komplexe Berechnung ab. Das Programm ist bei (fast) allen Distributionen Bestandteil der Paketquellen und kann daher über die gewohnten Mechanismen installiert werden.
Nach der Installation ist ipcalc direkt einsatzbereit. Zum Aufruf erwartet es nur die Angabe eines Netzes in CIDR-Schreibweise mit ausgeschriebener Netzwerkmaske oder einen Adressbereich. In Listing 24.25 haben wir für Sie die Ausgabe von ipcalc anhand des Netzes 172.31.253.0/21 dargestellt:
daniel@example:~$ ipcalc 172.31.253.0/21
Address: 172.31.253.0 10101100.00011111.11111 101.00000000
Netmask: 255.255.248.0 = 21 11111111.11111111.11111 000.00000000
Wildcard: 0.0.7.255 00000000.00000000.00000 111.11111111
=>
Network: 172.31.248.0/21 10101100.00011111.11111 000.00000000
HostMin: 172.31.248.1 10101100.00011111.11111 000.00000001
HostMax: 172.31.255.254 10101100.00011111.11111 111.11111110
Broadcast: 172.31.255.255 10101100.00011111.11111 111.11111111
Hosts/Net: 2046 Class B, Private Internet
Listing 24.25 Ausgabe von »ipcalc«
Aus dem übergebenen Netzwerk rechnet ipcalc alle notwendigen Informationen aus. Im oberen Teil (vor der Trennung durch =>) werden Informationen zur Netzmaske ausgegeben. Im unteren Teil befinden sich weitere Informationen, wie die Netzwerkadresse (Network), die erste und letzte Clientadresse (HostMin und HostMax), die Broadcast-Adresse und die maximale Anzahl an Clients im Netz (Host/Net). Dabei agiert ipcalc äußerst intelligent. Auch wenn Sie nicht die Netzwerkadresse (also die erste gültige Adresse im Netzwerk) angeben oder Ihnen die Netzwerkmaske nicht im CIDR-Format, sondern im Dezimalpunkt-Format vorliegt, gibt Ihnen ipcalc eine vernünftige Ausgabe zurück.
In Listing 24.26 werden ipcalc eine IP-Adresse und, durch ein Leerzeichen getrennt, eine Subnetzmaske im Dezimalpunkt-Format übergeben. Dies bringt ipcalc nicht aus dem Tritt; es liefert Ihnen trotzdem die korrekten Werte zurück:
daniel@example:~$ ipcalc 192.168.100.17 255.255.255.248
Address: 192.168.100.17 11000000.10101000.01100100.00010 001
Netmask: 255.255.255.248 = 29 11111111.11111111.11111111.11111 000
Wildcard: 0.0.0.7 00000000.00000000.00000000.00000 111
=>
Network: 192.168.100.16/29 11000000.10101000.01100100.00010 000
HostMin: 192.168.100.17 11000000.10101000.01100100.00010 001
HostMax: 192.168.100.22 11000000.10101000.01100100.00010 110
Broadcast: 192.168.100.23 11000000.10101000.01100100.00010 111
Hosts/Net: 6 Class C, Private Internet
Listing 24.26 Die Vielfältigkeit und Intelligenz von »ipcalc«
Falls Sie nicht wissen, wie Sie einen Netzbereich am besten in Subnetze verpacken können, hilft Ihnen der Parameter -r dabei:
daniel@example:~$ ipcalc 172.31.0.0 172.31.17.0 -r
deaggregate 172.31.0.0 - 172.31.17.0
172.31.0.0/20
172.31.16.0/24
172.31.17.0/32
Listing 24.27 Berechnung von optimalen Subnetzen: »ipcalc -r <START> <END>«
Wie Sie Listing 24.27 entnehmen können, berechnet ipcalc anhand der übergebenen Netze die optimale Verteilung der Subnetze – dies kann ein wahrer Segen sein.