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
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:
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