SkillGridInformatik durch Machen lernen

Fehlersuche statt Raten

Eine Methode statt einer Vermutung: die Schichten in fester Reihenfolge durchgehen, mit der billigsten Pruefung beginnen, jeweils einen Verdaechtigen isolieren und genau wissen, was jedes Werkzeug beweist.

17 Min. · 55 XP

Bei der Fehlersuche in einem Netzwerk geht es nicht darum, mehr Befehle zu kennen. Es geht darum, Vermutungen durch eine Abfolge von Fragen zu ersetzen, deren Antworten nicht bestreitbar sind. Die Methode hat drei Regeln. Beginne mit der Pruefung, die am wenigsten Zeit kostet und am meisten ausschliesst. Aendere immer genau eine Sache auf einmal. Und frage nach jedem Test, was das Ergebnis beweist und was es nicht beweist — ein Test, der aus zwei verschiedenen Gruenden haette bestehen koennen, hat dir nichts gesagt.

Das Billigste zuerst heisst: Bevor du eine Konfiguration anfasst, frage, ob die Sache von hier ueberhaupt funktioniert und ob sie von woanders aus funktioniert. Zwei Blickpunkte zu vergleichen kostet einen Befehl und halbiert den Problemraum. Den Nutzer zu bitten, ein anderes Netzwerk zu versuchen, oder dieselbe Anfrage von einem anderen Rechner aus auszufuehren, ist meist mehr wert als eine Stunde Log-Lektuere.

Die Leiter der Fragen, von unten her: Hat der Rechner ueberhaupt eine Adresse und eine Default-Route? Loest der Name zu einer Adresse auf? Antwortet die Adresse auf der IP-Ebene? Ist der Port offen, und antwortet der Dienst darauf? Liefert die Anwendung eine korrekte Antwort? Jede Frage wird von einem anderen Werkzeug beantwortet, und jede Antwort grenzt den Verdaechtigen weiter ein, bis nur noch eine Schicht uebrig bleibt. Der Sinn der Leiter ist, dass sie irgendwann endet: Eine gute Fehlersuche verkleinert die Menge der moeglichen Ursachen, statt sie zu vergroessern.

ClientResolverRouterServerdig api.example.org93.184.216.34, TTL 300ping 192.168.1.1reply 1.2 msping 93.184.216.34reply 104 msTCP SYN to port 443SYN-ACKTLS ClientHelloTLS alert: handshake failureDNS and routing are fine, the failure is inside TLS

Jedes Werkzeug beweist etwas Enges, und wer es fuer mehr als das haelt, kommt zu falschen Schluessen. ping beweist, dass ein Host auf ICMP antwortet und dass ein Pfad in beide Richtungen existiert; es beweist nicht, dass ein Webserver laeuft. dig beweist, was ein Resolver geantwortet hat und wie lange die Antwort zwischengespeichert wird; es beweist nicht, dass die Adresse erreichbar ist. curl beweist, was der gesamte Stack fuer eine konkrete Anfrage tut; es beweist nicht, dass andere Clients dieselbe Antwort erhalten. ss beweist, was auf dieser Maschine tatsaechlich lauscht und auf welcher Adresse; es beweist nicht, dass eine Firewall jemanden hereinlaesst.

$ dig api.example.org +short
198.51.100.20

$ dig api.example.org +short
198.51.100.20

$ dig api.example.org @1.1.1.1 +short
203.0.113.7

$ dig api.example.org @8.8.8.8 +short
203.0.113.7Zwei Resolver, zwei verschiedene Antworten — ein Cache und ein veralteter Record, kein kaputtes Netzwerk.
$ curl -v https://api.example.org/health
*   Trying 198.51.100.20:443...
* connect to 198.51.100.20 port 443 failed: Connection timed out
* Failed to connect to api.example.org port 443: Connection timed out

$ curl -sv https://api.example.org/health -o /dev/null
*   Trying 93.184.216.34:443...
* Connected to api.example.org (93.184.216.34) port 443
* Server certificate: CN=*.example.org
< HTTP/2 200
< content-type: application/jsonDerselbe Befehl mit einem Timeout auf dem Port und mit der Adresse, die tatsaechlich funktioniert.

ss verdient besondere Aufmerksamkeit, weil es zwei Fehler trennt, die von aussen identisch aussehen: Es lauscht nichts, oder es lauscht etwas, aber nur auf der Loopback-Adresse. Ein Server, der an 127.0.0.1 gebunden ist, nimmt Verbindungen von derselben Maschine an und lehnt jede Verbindung von aussen ab, egal was die Firewall sagt. Genau diese eine Unterscheidung erklaert einen grossen Teil der Faelle, in denen der Dienst lokal funktioniert und von ueberall sonst nicht erreichbar ist.

$ ss -tlnp
State   Local Address:Port   Process
LISTEN  127.0.0.1:8080       users:(("node",pid=4127,fd=21))
LISTEN  0.0.0.0:22           users:(("sshd",pid=880,fd=3))

$ curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/
200Ein Dienst ist aus dem Netzwerk erreichbar, der andere nur von dieser Maschine.

Praxis

  1. Baue die Isolationsleiter auf: ordne die Pruefungen fuer eine Seite, die sich nicht oeffnet, von der ersten Sache, die du testen kannst, bis zur letzten.

    Klicke den Ausgangsknoten, dann den Zielknoten. Erneutes Klicken auf ein Paar entfernt die Verbindung.

    Hinweise
    • Jeder Schritt fragt eine andere Schicht ab, also ordne sie von der einfachsten Frage bis zur spezifischsten.
    • Ein Name muss erst zu einer Adresse werden, bevor es etwas zu erreichen gibt, und ein Port laesst sich erst testen, wenn die Adresse antwortet.
    • Die Antwort der Anwendung ist das Letzte, was du ueberhaupt beobachten kannst, also gehoert sie ans Ende der Kette.
  2. Eine Kollegin sagt, die API sei ausgefallen. Auf ihrem Rechner liefert dig 198.51.100.20 und curl auf Port 443 laeuft in einen Timeout. Auf deinem Rechner liefert dasselbe dig 203.0.113.7 und curl gibt 200 zurueck. Was ist die wahrscheinlichste Erklaerung?

    Hinweise
    • Ihr ping ueber den Namen beweist bereits zwei getrennte Dinge: Der Name wurde aufgeloest und Pakete kommen durch.
    • Vergleiche die beiden dig-Antworten: Die eine kommt vom lokalen Resolver, die andere von einem oeffentlichen.
    • Frage, was an den beiden Maschinen unterschiedlich ist, statt danach, was mit dem Server nicht stimmt.
  3. Ordne die ersten vier Schritte fuer die Untersuchung einer Seite, die fuer manche Nutzer in einer Stadt langsam laedt.

    1. 1curl -v ausfuehren, um die aufgeloeste Adresse zu sehen und zu erkennen, welche Phase langsam ist
    2. 2von einem zweiten Standort aus wiederholen, um die Entfernung von einem lokalen Problem zu unterscheiden
    3. 3dieselbe Anfrage auf einer warmen Verbindung wiederholen, um die Kosten des Handshakes von den Kosten der Uebertragung zu trennen
    4. 4die Langsamkeit vom betroffenen Standort aus reproduzieren und die Zeitwerte notieren
    Hinweise
    • Beginne mit der Frage, die nichts kostet und bei einem Fehlschlag eine ganze Schicht ausschliesst.
    • curl -v nennt den Host, die aufgeloeste Adresse und den Port, den es gleich benutzen wird, und zwar in dieser Reihenfolge.
    • Wiederhole dieselbe Anfrage zweimal von dem betroffenen Ort aus und vergleiche die beiden Zeiten, bevor du etwas anderem die Schuld gibst.

Fragen zu dieser Lektion

Warum überhaupt Netzwerke lernen?

Fast alles, was du baust, spricht irgendwann mit etwas anderem. Wer weiß, wie Daten wirklich wandern, macht aus „es funktioniert nicht“ eine Liste von Dingen, die man der Reihe nach prüfen kann.

Was ist der echte Unterschied zwischen TCP und UDP?

TCP sorgt dafür, dass alles ankommt, in der richtigen Reihenfolge, und wiederholt Verlorenes — das kostet Zeit. UDP sendet und schaut nicht zurück, deshalb bevorzugen Video und Spiele es: Ein verspätetes Bild ist schlechter als ein fehlendes.

Was ist DNS in einfachen Worten?

Es ist das Telefonbuch des Internets. Du kennst den Namen, der Rechner braucht die Nummer. DNS macht aus einem Namen wie example.org eine IP-Adresse und merkt sich die Antwort, damit nicht jedes Mal gefragt wird.

Ist das kostenlos?

Ja. Die erste Ebene jedes Fachs ist kostenlos und braucht kein Konto. Tiefere Ebenen und die höheren Stufen sind kostenpflichtig — genau das hält das Projekt am Leben.

Für welches Alter ist das gedacht?

Für neugierige Jugendliche ab etwa 12 Jahren und für Erwachsene, die bei null anfangen. Programmiererfahrung wird nicht vorausgesetzt; die Lektionen zu Netzwerken und Physik brauchen keine Mathematik über Schulniveau.

Muss ich schon programmieren können?

Nein. Logik, Physik und Netzwerke beginnen bei null. Code schreibst du im Bereich Programmiersprachen — und auch der fängt vorne an.

Muss ich etwas installieren?

Nein. Alles läuft im Browser: Theorie, Übungen und die interaktiven Simulationen. Es gibt nichts herunterzuladen und nichts einzurichten.

Wie lange dauert ein Fach?

Eine Lektion dauert 10 bis 15 Minuten. Eine Junior-Stufe umfasst etwa 12 bis 20 Lektionen, also einige Wochen regelmäßiger Übung statt eines Abends.

Muss ich der Reihenfolge folgen?

Innerhalb einer Stufe öffnen sich die Ebenen nacheinander, weil jede auf der vorherigen aufbaut. Zwischen den Fächern bist du frei: beginne mit Logik, Physik oder Netzwerken.