Nachdem der letzte Blog-Eintrag schon etwas her ist, möchte ich dieses Mal etwas über (einfaches) Netzwerk-Debugging mit und unter Linux schreiben.
Die typischen Kommandos ping, netstat lasse ich dabei mal außen vor, sondern gehe auf "etwas" speziellere Kommandos bzw. Alternativen ein.
Prüfung auf aktive Hosts/Erreichbarkeit
Ich nutze dafür fping:
Vorteile: Ip-Ranges (Range oder CIDR Notation!), Statistiken und parallele Verarbeitung!
Nachteile: muss meist nachinstalliert werden
1. Single Host
$ fping -s 172.16.1.91
172.16.1.91 is alive
1 targets
1 alive
0 unreachable
0 unknown addresses
0 timeouts (waiting for response)
1 ICMP Echos sent
1 ICMP Echo Replies received
0 other ICMP received
0.98 ms (min round trip time)
0.98 ms (avg round trip time)
0.98 ms (max round trip time)
0.011 sec (elapsed real time)
2. mit IP-Range und Statisktik
$ fping -s -g 172.16.1.90 172.16.1.100 -r 1
172.16.1.91 is alive
172.16.1.92 is alive
172.16.1.93 is alive
172.16.1.94 is alive
172.16.1.95 is alive
172.16.1.97 is alive
172.16.1.90 is unreachable
172.16.1.96 is unreachable
172.16.1.98 is unreachable
172.16.1.99 is unreachable
172.16.1.100 is unreachable
11 targets
6 alive
5 unreachable
0 unknown addresses
10 timeouts (waiting for response)
16 ICMP Echos sent
6 ICMP Echo Replies received
0 other ICMP received
0.38 ms (min round trip time)
0.75 ms (avg round trip time)
1.45 ms (max round trip time)
2.808 sec (elapsed real time)
Verbindungen/Sessions anzeigen
Die meisten werden wahrscheinlich netstat nutzen, ich nehme dafür "ss".
"ss" ist schneller und bietet mehr Möglichkeiten in den Abfragen.
Alle Verbindungen anzeigen
$ ss -a | less
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 0 *:6080 *:*
LISTEN 0 0 172.16.0.250:5667 *:*
LISTEN 0 0 *:5668 *:*
LISTEN 0 0 *:11301 *:*
LISTEN 0 0 127.0.0.1:smux *:*
LISTEN 0 0 *:mysql *:*
LISTEN 0 0 *:sunrpc *:*
LISTEN 0 0 *:http *:*
LISTEN 0 0 *:ssh *:*
LISTEN 0 0 *:smtp *:*
LISTEN 0 0 *:iscsi *:*
TIME-WAIT 0 0 172.16.0.250:http 172.16.0.1:14653
TIME-WAIT 0 0 172.16.0.250:http 172.16.0.14:58166
TIME-WAIT 0 0 172.16.0.250:http 172.16.0.14:58167
TIME-WAIT 0 0 172.16.0.250:http 172.16.0.14:58164
TIME-WAIT 0 0 172.16.0.250:http 172.16.0.1:14654
TIME-WAIT 0 0 172.16.0.250:http 172.16.0.14:58165
<snip>
Lauschende Ports
Alle offenen Ports auflisten
$ ss -l | less
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 127.0.0.1:netbios-ssn *:*
LISTEN 0 128 *:59532 *:*
LISTEN 0 128 :::sunrpc :::*
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 128 *:http *:*
LISTEN 0 128 :::38386 :::*
LISTEN 0 128 :::ssh :::*
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 127.0.0.1:6010 *:*
LISTEN 0 128 ::1:6010 :::*
LISTEN 0 50 127.0.0.1:microsoft-ds *:*
LISTEN 0 50 127.0.0.1:mysql *:*
Nur TCP auflisten
$ ss -lt | less
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 127.0.0.1:netbios-ssn *:*
LISTEN 0 128 *:59532 *:*
LISTEN 0 128 :::sunrpc :::*
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 128 *:http *:*
LISTEN 0 128 :::38386 :::*
LISTEN 0 128 :::ssh :::*
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 127.0.0.1:6010 *:*
LISTEN 0 128 ::1:6010 :::*
LISTEN 0 50 127.0.0.1:microsoft-ds *:*
LISTEN 0 50 127.0.0.1:mysql *:*
Nur UDP auflisten
$ ss -lu | less
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:bootpc *:*
UNCONN 0 0 *:sunrpc *:*
UNCONN 0 0 172.16.0.75:ntp *:*
UNCONN 0 0 127.0.0.1:ntp *:*
UNCONN 0 0 *:ntp *:*
UNCONN 0 0 172.16.255.255:netbios-ns *:*
UNCONN 0 0 172.16.0.75:netbios-ns *:*
UNCONN 0 0 *:netbios-ns *:*
UNCONN 0 0 172.16.255.255:netbios-dgm *:*
UNCONN 0 0 172.16.0.75:netbios-dgm *:*
UNCONN 0 0 *:netbios-dgm *:*
UNCONN 0 0 *:37222 *:*
UNCONN 0 0 127.0.0.1:746 *:*
UNCONN 0 0 *:858 *:*
UNCONN 0 0 :::sunrpc :::*
UNCONN 0 0 ::1:ntp :::*
UNCONN 0 0 fe80::250:56ff:feb2:6063:ntp :::*
UNCONN 0 0 :::ntp :::*
UNCONN 0 0 :::858 :::*
UNCONN 0 0 :::38139 :::*
Prozess-IDs zu den jeweiligen Diensten mit anzeigen
ss -lp
Anzeige mit Filterung
Die Filter können im iproute(2)-doc nachgeschlagen werden.
Nach Port:
Alle SSH Verbindungen:
$ ss -t src :22
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.16.0.75:ssh 172.16.0.12:62708
Alle HTTP oder HTTPS Verbindungen
$ ss -t '( src :80 or src: 443 )'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.16.0.250:80 172.16.0.239:59538
Nach Adresse in CIDR Notation, nur TCP (-t!)
$ ss -t dst 172.16.0.0/24
oder single Host:
$ ss -t dst 172.16.0.123
oder mit Host und Port
$ ss -t dst 172.16.0.123:80
Aktive (state established) TCP-Sessions
$ ss -t state established | less
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 172.16.0.75:58739 172.16.0.2:microsoft-ds
0 0 172.16.0.75:51709 172.16.0.3:microsoft-ds
0 0 172.16.0.75:39253 172.16.0.3:1025
0 0 172.16.0.75:ssh 172.16.0.123:62708
Mögliche weitere States:
established
syn-sent
syn-recv
fin-wait-1
fin-wait-2
time-wait
closed
close-wait
last-ack
closing
all - Alle..
connected - Alle verbundenen Sessions
synchronized - Alle verbundenen Sessions, ohne syn-sent
bucket - minisockets, z.B. time-wait und syn-recv.
big - „Normale“ sockets
Statistiken
$ ss -s
Total: 364 (kernel 449)
TCP: 1272 (estab 19, closed 1240, orphaned 1, synrecv 0, timewait 1238/0), ports 825
Transport Total IP IPv6
* 449 - -
RAW 0 0 0
UDP 11 11 0
TCP 32 32 0
INET 43 43 0
FRAG 0 0 0
Verbindungen mitschneiden
Bei Netzwerk/Verständnis-Problemen können Verbindungen mitgeschnitten werden, dazu wird TCPdump genutzt. Die geschriebene Datei kann dann mit WireShark verarbeitet/gelesen werden.
Format:
$ tcpdump -n -i $INTERFACE -s$MAXIMALEPAKETGRÖßE -w $AUSGABEDATEI $FILTER
-s = maximale Paketgröße, 0 => 65535 Bytes (empfehlenswert)
-n = keine DNS Auflösung
-i = Interface
-w = Ausgabedatei
Filter
Alles was einen bestimmten Host betrifft (IP oder
DNS-Name)
$ tcpdump -ni lanbond0 -w ~/http_mitschnitt.pcap -s0 host 172.16.0.5
Alles was HTTP betrifft, ohne SSH Verbindungen
$ tcpdump -ni lanbond0 -w ~/http_mitschnitt.pcap -s0 port not ssh and port http
Beispiel
Welche Daten werden bei einem Request mittels HTTP und Host 172.16.0.5 übertragen:
$ tcpdump -ni lanbond0 -w ~/http_mitschnitt.pcap -s0 host 172.16.0.5 and port http