Iproute2
Das Paket iproute2 enthält eine Sammlung von Kommandos, mit denen Infos über das Netzwerk angezeigt und Einstellungen verändert werden können. Dabei handelt es sich um diese Kommandos:
- arpd
- bridge
- ctstat (Netzwerkstatistiken unter Linux. Ist nur ein Link auf lnstat)
- devlink
- ip
- lnstat (Netzwerkstatistiken unter Linux)
- nstat (Anzeige von SNMP-Statistiken)
- routef (löscht die Routing-Tabelle. Vorsicht! Das bedeutet, dass alle Routen gelöscht werden und das Netzwerk unbrauchbar wird bis die Routing-Tabelle wieder von Hand aufgebaut wird, z.B. mit route add ...)
- routel (zeigt die Routing-Tabelle in einem gut lesbaren Format an. Kann anstelle von ip route benutzt werden)
- rtacct
- rtmon (Routingtabelle protokollieren)
- rtstat (Netzwerkstatistiken unter Linux. Ist nur ein Link auf lnstat)
- ss (ersetzt netstat)
- tc
- tipc
Diese ersetzen die älteren Kommandos arp, ifconfig, ipmaddr, iptunnel, nameif, netstat und route.
arpd[Bearbeiten | Quelltext bearbeiten]
arpd ist ein Kommando das im Hintergrund läuft (als Dämon) und sich um sogenannte "gratuitous ARP Informationen" (gratuitous=unaugefordert) kümmert. Da man damit in normalen kleinen Netzen eher nicht in Berührung kommt, wird hier nur kurz auf die allgemeinen Zusammenhänge eingegangen ohne ins Detail zu gehen.
Um Daten im Netzwerk zu versenden und zu empfangen braucht man drei Adressen, die IP-Adresse, die Netzmaske (z.B. 255.255.255.0 oder kurz /24) und die Hardware-Adresse (MAC) der Netzwerkkarte. Für die IP und die Netzmaske ist in der Regel der Router und/oder das DHCP-Protokoll zuständig. Dieses hat in seinen Infos aber keinen Platz für die MAC-Adressen vorgesehen, so daß dafür ein weiteres Protokoll, das Address Resolution Protocol (dt. „Adressauflösungsprotokoll“) kurz ARP notwendig ist. Dieses baut eine Tabelle mit den Zuordnungen von MAC- zu IP-Adressen auf, den sogenannten ARP-Cache. Da steht dann z.B. drin, daß die IP 192.168.178.21 zur Ethernet-Karte eth0 mit der MAC c9:0d:15:31:90:2b gehört. Wer sich das selbst ansehen will, kann im Teminal diesen Befehl eingeben
ip neigh
oder das alte Kommando
arp -a
Jetzt kann es aber passieren, daß sich diese Zuordnung ändert, weil z.B. die Netzwerkkarte ausgetauscht wurde. Da zumindest theoretisch jede MAC-Adresse auf der Welt einmalig ist, stimmt diese vorher im Beispiel erwähnte Zuordnung 192.168.178.21 <-> c9:0d:15:31:90:2b nicht mehr und muss im ARP-Cache korrigiert werden. Genau dies veranlasst der betroffene Host, indem er seine IP-Adresse und die neue MAC "unaufgefordert" als "gratuitous ARP Information" ins Netzwerk schickt, der Dienst arpd merkt dies und sammelt diese neuen Infos, um sie bei Bedarf an den Kernel weiterzugeben, damit der ARP-Cache korrigiert werden kann.
arpd kann auch vom Administrator benutzt werden um Fehler im Netzwerk (speziell doppelt vergebene IP-Adressen) zu entdecken.
Wie gesagt sind dies nur die groben Hintergründe zu arpd, die nur andeuten sollen, wozu arpd gut ist.
Wer aus Neugierde doch mal arpd bei der Arbeit zusehen möchte, kann ja die arpd-Datenbank zumindest temporär anlegen lassen und anschliessend betrachten:
sudo arpd -b /var/tmp/arpd.db # startet arpd und legt die Datenbank im Verzeichnis /var/tmp/ an (Default /var/lib/arpd/arpd.db) arpd -lb /var/tmp/arpd.db # auslesen der DB /var/tmp/arpd.db (Option -b) und Ausgabe im Terminal (Option -l)
ip[Bearbeiten | Quelltext bearbeiten]
ip ist das vielfältigste Kommando aus der Sammlung iproute2. Welche Kommandos es ersetzt zeigt diese Tabelle
altes Kommando | ip Kommando |
---|---|
arp | ip neigh |
ifconfig | ip addr, ip link, ip -s |
ipmaddr | ip maddr |
iptunnel | ip tunnel |
nameif | ip link set name |
netstat | ip -s, ip route |
route | ip route |
Befehle zur Adressanzeige mit ip[Bearbeiten | Quelltext bearbeiten]
ip address show [link] # Anzeige aller IP-Adressen, bzw. eines bestimmten Devices ip route show # Routen anzeigen ip neighbour # Anzeige der "arp"-Tabelle ip link show [link] # Zustand aller/eines Links (Schnittstellen) anzeigen
Die Befehle können verkürzt werden, solange sie eindeutig bleiben. Mit der Option -s kann zusätzlich eine Paketstatistik ausgegeben werden:
ip -s addr
Bedeutung der angezeigten Flags[Bearbeiten | Quelltext bearbeiten]
Bei den Ausgaben von ip addr oder ip link steht in spitzen Klammern eine Zusammenfassung der Schnittstellenkennzeichen (Flags):
Flag | Bedeutung |
---|---|
UP | das Interface ist eingeschaltet und bereit Pakete zur Übertragung über das Netzwerk zu akzeptieren und es kann Pakete von anderen Knoten im Netzwerk empfangen |
LOWER_UP | signalisiert, daß ein Kabel eingesteckt ist |
LOOPBACK | das Interface hat keine Möglichkeit Nachrichten an andere Hosts zu senden (alles geht zurück an den Absender) |
BROADCAST | das Interface hat die Möglichkeit Nachrichten an alle anderen Hosts im Netzwerk zu senden |
POINTOPOINT (PPP) | Diese Verbindung hat nur zwei Enden mit zwei angeschlossenen Knoten (Nodes). Alle an den Link gesendeten Pakete erreichen den Peer-Link, und alle empfangenen Pakete stammen vom Peer. Man kann sich diese Verbindung als eine Art serielle Leitung vorstellen. Die häufigste Anwendung ist die Verbindung vom Computer zum Provider, mittels derer der PC vom Provider eine IP-Adresse erhält |
MULTICAST | ein rein informelles Kennzeichen, das darauf hinweist, dass die Schnittstelle das Multicasting-Protokoll beherrscht. Im Prinzip ist diese Angabe redundant, da sowohl Broadcasting als auch PPP Multicasting-fähig sind |
NOARP | zeigt in der Regel an, dass das Gerät keine Adressauflösung benötigt und dass die Software oder Hardware weiß, wie Pakete ohne Hilfe der üblichen Protokolle zugestellt werden können |
Befehle zum setzen und ändern von Schnittstellen mit ip[Bearbeiten | Quelltext bearbeiten]
dafür werden Root-Rechte benötigt (sudo benutzen). Diese Änderungen gehen jedoch bei einem Reboot verloren.
ip link set eth0 down # Interface eth0 deaktivieren ip link set eth0 up # Interface eth0 aktivieren ip link set eth0 address 00:11:22:33:44:55:66 # neue MAC-Adresse für Interface eth0 setzen ip link set eth0 name extern # Name des Interfaces von eth0 nach "extern" ändern ip address del <adr> dev <link> # Löschen der Adresse auf Device link ip address add <adr> brd <broadcast-adr> dev <link> # Hinzufügen der adr zum Link (adr in CIDR-Notation, z.B. 192.168.8.100/24, Broadcast-Adresse muss ebenfalls angegeben werden, es kann auch + oder - angegeben werden, um alle Hostbits auf 1 oder 0 zu setzen)
lnstat[Bearbeiten | Quelltext bearbeiten]
lnstat ist ein Ersatz für das alte rtstat-Programm, da es mehr Funktionen enthält. Es wird üblicherweise verwendet, um periodisch eine Auswahl der vom Kernel exportierten statistischen Werte auszugeben. Zusätzlich zu den Routing-Cache-Statistiken unterstützt es jede Art von Statistiken, die der Linux-Kernel über eine Datei in /proc/net/stat/ exportiert.
Jede Datei in /proc/net/stat/ enthält eine Kopfzeile mit den Spaltennamen. Diese Namen werden von lnstat als Schlüssel zur Auswahl der zu druckenden Statistiken verwendet. Für jede im System vorhandene CPU folgt eine Zeile, die die tatsächlichen Werte für jede Spalte der Datei auflistet. lnstat summiert diese Werte (die in Wirklichkeit Zähler sind) vor der Ausgabe auf. Nach jedem Intervall wird nur die Differenz zum letzten Wert gedruckt.
Standardmäßig werden alle Spalten aller Dateien gedruckt. Da man dies meist nicht braucht (sehr unübersichtlich, es sei denn, man wertet dies mit Skripten aus) sollten die interessierenden Dateien und Spalten mit Hilfe der Parameter -f und -k ausgewählt werden. Zur Verarbeitung der Daten empfiehlt sich auch die Option -j, die die Datenausgabe im JSON-Format veranlasst.
Einen Überblick über die verfügbaren Werte erhält man durch die Option -d
Optionen[Bearbeiten | Quelltext bearbeiten]
Option | Bedeutung |
---|---|
-h, --help | Hilfe |
-V, --version | Programmversion |
-c, --count <n> | es sollen <n> Zyklen ausgegeben werden |
-d, --dump | Ausgabe der möglichen Dateien in /proc/net/stat/ und ihrer Werte (Keys) |
-f, --file <Datei> | Die Werte welcher Datei(en) sollen ausgegeben werden. Es können mehrere Dateien angegeben werden, diese müssen aber immer mit der vorangestellten Option -f angeführt werden: lnstat -f nf_conntrack -f ndisc_cache
Default ist die Ausgabe der Werte aller Dateien |
-i, --interval <n> | Ausgabe der Werte aller <n> Sekunden |
-j, --json | Ausgabe der Werte im JSON Format |
-k, --keys k,k,k,... | zeigt nur die angegeben Werte (Keys). Den Keys kann ein Dateiname in dieser Form Datei:Key vorangestellt werden, dann wird nur nach Werten aus der angegeben Datei gesucht. Ohne diesen Dateinamen werden die Werte der ersten Datei ausgegeben, in der dieser Key gefunden wird |
-s, --subject [0-2] | Ob und wie oft eine Kopfzeile ausgegeben werden soll. 0 = keine Kopfzeile, 1 = Kopfzeile nur beim Start, 2 = aller 20 Zeilen Ausgabe einer Kopfzeile |
-w, --width n,n,n,... | Angabe der Breite für jedes Ausgabefeld |
nstat[Bearbeiten | Quelltext bearbeiten]
nstat liefert Statistiken über den Netzwerkverkehr im SNMP (Simple Network Management Protocol). Es ist gewissermassen ein Ersatz für das ältere netstat -s, ohne jedoch direkt die gleiche Ausgabe zu haben. snstat liefert z.B. keine absoluten, sondern nur inkrementelle Werte, also den Zuwachs seit dem letzten Aufruf. Werte = 0 werden per default nicht angezeigt. Beides kann durch Angabe der Optionen -a (absolute Werte) bzw. -z (auch Nullwerte anzeigen) verändert werden.
Die Ausgabe erfolgt normalerweise in drei Spalten:
- Spalte 1: Name des Wertes
- Spalte 2: Wert
- Spalte 3: Durchschnitt über einen definierbaren Zeitraum (Option -d, default = 60 Sekunden)
Durch die Option -j kann aber auch eine Ausgabe im JSON-Format erfolgen.
Die Namen der Werte erscheinen auf den ersten Blick etwas kryptisch, sie sind jedoch logisch aufgebaut:
Der erste Teil des Namens bezeichnet das Protokoll bzw. Klasse (IP, TCP, UDP usw.), dann folgt eine näherere Klassifizierung (In, Out, Active, Passive usw.) gefolgt von einer weiteren Beschreibung (Fails, Opens, Reset usw.)
$ nstat #kernel IpInReceives 12 0.0 IpInDelivers 12 0.0 IpOutRequests 15 0.0 TcpInSegs 12 0.0 TcpOutSegs 13 0.0 TcpRetransSegs 2 0.0 TcpExtTCPHPHits 6 0.0 TcpExtTCPTimeouts 1 0.0 TcpExtTCPLossProbes 1 0.0 TcpExtTCPOrigDataSent 7 0.0 TcpExtTCPDelivered 6 0.0 IpExtInOctets 4701 0.0 IpExtOutOctets 3090 0.0 IpExtInNoECTPkts 12 0.0
mit etwas Übung und englisch-Kenntnissen kann man also die Bedeutung der Namen herauslesen, z.B.:
IpInReceives = Anzahl der von der IP-Schicht empfangenen Pakete.
Für ganz hartgesottene bietet sich dazu auch das Nachschlagen bzw. Studium der englischsprachigen Dokumentation über SNMP counter an, in der die Bedeutung dieser Namen näher erläutert wird.
Optionen[Bearbeiten | Quelltext bearbeiten]
Option | Bedeutung |
---|---|
-h, --help | Hilfemeldung |
-a, --ignore | Ausgabe von absoluten Werten |
-d, --scan=n | Intervall innerhalb dessen Werte gesammelt werden sollen (aller n Sekunden) |
-j, --json | Ausgabe im JSON-Format |
-n, --nooutput | keine Ausgabe |
-p, --pretty | "schöne" Ausgabe, zumindest laut Handbuch. Habe aber keinen Unterschied festgestellt, ist also vermutlich default |
-t, --interval=n | Durchschnitt der letzten n Sekunden |
-V, --version | Ausgabe der Version |
-z, --zeros | auch Anzeige von Aktivitäten deren Wert gleich Null war (nicht aktiv) |
rtmon[Bearbeiten | Quelltext bearbeiten]
rtmon protokolliert Änderungen an der Routingtabelle in einer Datei.
Der einfachste Aufruf sieht so aus
sudo rtmon file <DATEI>
dies schreibt die Ausgaben in die Datei <DATEI>. Welche Werte dabei ausgegeben werden, kann durch die Angabe von Parametern gesteuert werden:
sudo rtmon file <DATEI> [PARAMETER]
als Parameter sind diese Werte zulässig, mehrere werden durch Leerzeichen getrennt:
link # Network Device address # IP-Adresse route # Eintrag der Routingtabelle all # = link address route
Optionen[Bearbeiten | Quelltext bearbeiten]
sudo [OPTION] rtmon file <DATEI> [PARAMETER]
mit diesen Optionen kann die Protokollierung auf bestimmte Internet-Protokolle beschränkt werden:
-4 # nur IPv4 protokollieren -6 # nur IPv6 protokollieren -0 # kein Netzwerkprotokoll
Auswertung[Bearbeiten | Quelltext bearbeiten]
Bei der erzeugten Ausgabedatei <DATEI> handelt es sich um eine Binärdatei. Sie kann also nicht mit cat oder einem Editor geöffnet werden, sondern muß mit diesem Befehl angezeigt werden:
ip monitor file <DATEI>
Der Inhalt könnte z.B. so aussehen:
Timestamp: Sat Jun 13 21:19:36 2020 266639 us 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default link/ether db:0d:a1:b1:90:7d brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 45:6d:57:d8:79:50 brd ff:ff:ff:ff:ff:ff Timestamp: Sat Jun 13 21:19:45 2020 841713 us 3: wlan0: <BROADCAST,MULTICAST,UP> link/ether Timestamp: Sat Jun 13 21:19:45 2020 851054 us 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default link/ether 45:6d:57:d8:79:50 brd ff:ff:ff:ff:ff:ff Timestamp: Sat Jun 13 21:19:45 2020 851201 us Deleted 3: wlan0 inet6 fe70::b2ce:736d:f01a:4e9a/64 scope link valid_lft forever preferred_lft forever
ss[Bearbeiten | Quelltext bearbeiten]
ss ist ein Tool zum Auslesen von Netzwerkstatistiken und ein Ersatz für das ältere netstat, da es schneller ist und mehr TCP-Zustände abgefragt werden können als mit netstat.
Optionen[Bearbeiten | Quelltext bearbeiten]
Wenn keine Option verwendet wird, zeigt ss eine Liste der offenen nicht lauschenden Sockets (z.B. TCP/UNIX/UDP) an, die eine Verbindung hergestellt haben. Da diese Liste im allgemeinen sehr lang wird, empfiehlt sich eine Umleitung in eine Datei
ss > sockets.txt
- -h # Liste aller Optionen und Filter
- -H # unterdrückt die Ausgabe der üblichen Titelzeile. Erleichtert die Weiterverarbeitung in Skripten
- -s # Gesamtstatistiken der Verbindungen, geordnet nach Transportprotokoll
- -l # Liste aller lauschenden Sockets
- -t # nur TCP-Sockets
- -u # nur UDP-Sockets
- -x # Unix domain sockets
- -4 # nur IP Version 4 sockets
- -6 # nur IP Version 6 sockets
- -r # löst IP-Adressen nach Namen auf (z.B. statt 192.168.8.1 -> meine.maschine.lokal)
- -a # bei den Optionen -t, -u oder -x werden per default nur laufende Verbindungen aufgelistet. Option -a in Verbindung mit -t, -u oder -x sorgt dafür, daß auch die lauschenden gelistet werden.
- -e # ausführlichere Ausgaben, z.B. uid des Prozessbesitzers
- -p # zusätzliche Angaben zum Prozess (z.B. pid)
- -Z # zeigt Sicherheitsinformationen zum Prozess. Dazu muss SELinux aktiviert sein.
- -z # wie -Z aber zuätzliche Sicherheitsinformationen zu den Sockets
- -i # zusätzliche Angaben zur TCP-Verbindung
Zustände abfragen[Bearbeiten | Quelltext bearbeiten]
mit dem Kommando state können die Zustände der Verbindungen abgefragt werden. Meistens empfiehlt es sich diese mit den oben angeführten Optionen zu filtern. Beispiel:
ss -4 state established # zeigt alle TCP4-Verbindungen an
Die allgemeine Syntax für ss state lautet
ss [Option] state <Zustand>
folgende Zustände können abgefragt werden:
Zustand | Bedeutung |
---|---|
listen | Socket wurde durch ein Prozess geöffnet und wartet (lauscht) auf Signale der Gegenstelle |
established | ordnungsgemäße Verbindung (Normalzustand) |
syn-sent | Anfrage des lokalen TCP-Sockets bei der Gegenstelle, um eine Verbindung aufzubauen |
syn-recv | lokales TCP hat von der Gegenstelle eine Antwort bekommen, aber noch nicht darauf reagiert |
fin-wait-1 | Applikation will die Verbindung beenden, die Gegenstelle hat aber noch nicht darauf reagiert |
fin-wait-2 | Applikation will die Verbindung beenden, wartet aber noch auf ein Ok (FIN-Signal) der Gegenstelle |
close-wait | Socket hat von der Gegenstelle ein Signal zum Schliessen bekommen (FIN) und wartet, ob die Applikation den Socket schliesst oder doch weiter sendet |
closing | Der lokale Socket wartet auf eine Bestätigung der Gegenstelle zum Schliessen, um daraufhin in den Status TIME_WAIT zu gehen. |
last-ack | Socket hat die Meldung zum Schliessen (FIN) von der Gegenstelle erhalten, muss aber noch eigene Abschlussarbeten abwarten (flush und close), damit sie ihrereits ein bestätigendes FIN-Signal zur Gegenstelle senden kann |
time-wait | Socket ist vor kurzem geschlossen wurden und wartet eine gewisse Zeitspanne bis er wieder geöffnet werden darf. In der Regel handelt es sich dabei mindestens um die zweifache Zeit, die ein Signal vom lokalen Rechner bis zur entfernten Gegenstelle und zurück benötigt (Round-Trip-Zeit = RTT oder Round Trip Delay = RTD). Die RTT erhält man auch bei einem ping-Kommando. |
closed | Verbindung und Socket wurden geschlossen, keine Verbindung |
Neben diesen detaillierten Zustandsabfragen gibt es noch die Möglichkeit, nach mehreren Zuständen gleichzeitig zu filtern:
Zustand | Bedeutung |
---|---|
all | alle Zustände |
connected | alle Zustände außer listen und closed |
synchronized | alle Verbindungen außer syn-sent |
bucket | alle Zustände die als Mini-Socket definiert sind, z.B. time-wait |
big | alle Zustände außer den Mini-Sockets |
Beispiele für ss[Bearbeiten | Quelltext bearbeiten]
Kommando | Bedeutung |
---|---|
ss -s | zeigt Gesamtstatistiken der Verbindungen, geordnet nach Transportprotokoll (RAW, UDP, TCP, INET u. FRAG) an. |
ss -t | Anzeige aller aktiven TCP-Verbindungen |
ss -lt | Anzeige aller lauschenden Sockets |
ss -4 state listening | Anzeige aller lauschenden IPv4 Sockets |
ss -ltn | Anzeige aller lauschenden Sockets (m. Ports statt Service-Namen) |
ss state all sport = :ssh | Anzeige aller ssh-Verbindungen |
ss state connected sport = :ssh | wie oben, aber nur die aktiven Verbindungen |
ss '( sport = :ftp or dport = :http )' | Anzeige der FTP- und HTTP-Verbindungen |
ss state all dst 192.168.8.0/24 | Anzeige aller Verbindungen zu 192.168.8.0/24 |
ss -s state all dst 192.168.8.0/24 | wie oben, aber mit Verbindungsstatistiken (vgl. ss -s) |
ss src 192.168.178.0/24 | alle Verbindungen vom Netzwerk 192.168.178.0 |