2 Pakete und Protokolle
Transcription
2 Pakete und Protokolle
15 2 Pakete und Protokolle In diesem Kapitel werden die unteren Schichten der IP-Familie im Detail betrachtet. NFS NIS Application TFTP SNMP DNS Presentation portmapper FTP LPD SMTP TELNET RPC Session XDR UDP Transport Network ICMP IP Data Link TCP ARP RARP IEEE 802.3 Ethernet andere Physical 2.1 Ethernet und IEEE 802.3 0 1 2 3 preamble 8 receiver sender 20 protocol (ip 0x800) data, 46 to 1500 bytes CRC, all but preamble and CRC Ethernet-Pakete haben 64 bis 1518 Bytes (ohne preamble). Am protocol wird der Inhalt unterschieden. Die Adresse ff:ff:ff:ff:ff:ff dient als Broadcast, wird also von allen Netzkarten erkannt. IEEE 802.3 enthält die Länge an Stelle der Protokoll-Nummer und muß daher noch ein logical link control-Paket enthalten. Gebräuchliche Protokoll-Nummern sind groß, damit man sie nicht mit Längen verwechseln kann. 16 2.2 ARP 0 1 2 3 hardware type (ethernet 1) hardware bytes 4 protocol (ip 0x800) protocol bytes 8 operation (1/2 ARP, 3/4 RARP) sender hardware, sender protocol receiver hardware, receiver protocol ARP (RFC 826) setzt Ethernet Protocol 0x8086, Broadcast ff:ff:ff:ff:ff:ff und die gesuchte IP-Adresse. Wenn ein Rechner seine IP-Adresse erkennt, füllt er seine HardwareAdresse aus. Es gibt Probleme, wenn zwei Rechner die gleiche IP-Adresse haben, weil sie sich im Lauf der Zeit immer wieder widersprechen. 2.3 RARP RARP (RFC 903) setzt Ethernet Protocol 0x8035, Broadcast und die gesuchte HardwareAdresse. Wenn ein Server(!) die Hardware-Adresse kennt, füllt er die IP-Adresse aus. 2.4 IP 0 1 version hd words priority 2 packet/fragment unique id, to rejoin fragments 4 time to live 8 3 D T R C N M protocol length in bytes fragmentoffset in bytes/8 header checksum 12 sender 16 receiver options, filled to complete word ... IP (RFC 791) verwendet einige type of service Bits, die die Priorität von Nachrichten festle- gen, sowie Hinweise an die Router: D T R C low delay high throughput high reliablity low cost IP kann Pakete fragmentieren, um sie durch Netze mit geringen MTU-Werten (maximum trans- fer units) zu bringen. Sie müssen dann auch wieder rekombiniert werden: N M don't fragment more to come Wenn N gesetzt ist und ein Paket nicht in ein Netz paßt, wird es verworfen. Die Fragmente werden anhand ihrer id erkannt und anhand von offset zusammengesetzt, bis M nicht mehr gesetzt ist. time to live wird in jedem Router um 1 reduziert, bis ein Paket verworfen wird — dann erfolgt eine ICMP-Meldung. options sind Bytes, die zur Diagnose dienen. 17 2.5 ICMP ICMP (RFC 792) sind Meldungen, die in IP-Paketen als Daten mit protocol 1 verschickt wer- den. Sie bestehen mindestens aus 4 Bytes: Typ, Code und 2 Bytes mit einer Prüfsumme. ping schickt als Typ 8, als Code 0, und fügt zwei Bytes mit einer id, zwei Bytes mit einer Sequenznummer und einige Datenbytes hinzu. Die Antwort erhält den Typ 0. Mit ICMP-Fehlermeldungen, zum Beispiel Typ 3 (destination unreachable), Typ 4 (source quench) oder Typ 11 (ttl exceeded) kann man Netzprobleme untersuchen. traceroute sendet Pakete mit fortschreitend größerer time to live und bestimmt aus den ICMPMeldungen die wahrscheinliche Route zum Ziel. 2.6 UDP 0 1 4 2 3 sender port receiver port length, UDP header and data checksum UDP (RFC 768) ist ein verbindungsloses, unsicheres Datagram-Protokoll auf Benutzer(Prozeß-) Ebene. Zum IP-Paket kommen Port-Nummern für Sender und Empfänger sowie eine Daten-Prüfsumme hinzu, die allerdings die IP-Adressen auch berücksichtigt: 0 1 2 3 sender receiver 0 protocol (udp 0x11) length, UDP header and data 0 sender port receiver port 4 length, UDP header and data checksum UDP hat verschiedene, wichtige Anwendungen: TFTP DNS SNMP RPC NFS RFC RFC RFC RFC RFC 1350 1034 1157 1831 1813 trivial file transfer protocol domain name service simple network management protocol remote procedure call network file system Start von Rechnern ohne Platte IP-Adressen für Namen Rechnerbetrieb via Datenbank auch über TCP wesentlichste RPC-Anwendung 18 2.7 TCP 0 1 2 3 sender port 4 8 12 receiver port sequence number acknowledgment hd words number U A P R S F 16 window checksum urgent pointer options, filled to complete word ... data ... TCP (RFC 793) ist ein verbindungsorientiertes, sicheres Byte-Strom-Protokoll auf Benutzer(Prozeß-) Ebene. Zum IP-Paket kommen Port-Nummern für Sender und Empfänger, Informa- tionen zur Absicherung der Übertragung und für vorrangige Daten sowie eine Daten-Prüfsumme hinzu, die allerdings die IP-Adressen auch berücksichtigt: 0 1 2 3 sender receiver 0 protocol (tcp 0x6 ) length, TCP header and data sender port 4 sequence number acknowledgment 8 12 16 receiver port hd words number U A P R S F checksum window urgent pointer options, filled to complete word ... data ... Man bezeichnet ein TCP-Paket als Segment. Vorrangige Informationen liegen vor, wenn URG gesetzt ist. Sie befinden sich dann am Anfang der Datenfläche und urgent pointer ist die Anzahl der vorrangigen Bytes. sequence number ist ein vom Sender über Verbindungen hinweg fortlaufender Byte-Zähler, der die Position des ersten, nicht-vorrangigen Bytes im Datenstrom bezeichnet. acknowledgment number ist gültig, wenn ACK gesetzt ist, und ist dann die nächste sequence number, die vom Sender erwartet wird, bezeichnet also die Position des ersten Bytes im Strom, das noch nicht empfangen wurde. PUSH wird gesetzt, damit der Empfänger die Daten nicht puffert, sondern sofort der Applikation liefert. RESET wird im Notfall gesetzt, um eine Verbindung brutal abzubrechen. SYN wird in Segmenten gesetzt, die zur Verbindungsaufnahme dienen. FIN wird in Segmenten gesetzt, die zum Abbau der Verbindung dienen. window teilt mit, wieviel Bytes maximal zwischen sequence und acknowledgment liegen können. Diese Größe wird zur Flußkontrolle variiert. Es gibt eine einzige option, mit der die maximale Größe für ein Segment mitgeteilt wird. 19 Verbindungen Das Quadrupel aus Sender- und Empfänger-Adresse und -Port-Nummer ist per Verbindung eindeutig (und deshalb Teil der Prüfsumme). Das heißt, zwei verschiedene Verbindungen können auf einem Rechner durchaus die gleiche Port-Nummer verwenden. TCP- und UDP-Port-Nummern bilden voneinander verschiedene Adreßräume. Aufbau und Abbau einer Verbindung werden durch das folgende (bezüglich Fehlern und Abbrüchen nicht vollständige) Zustandsdiagramm beschrieben: closed bind connect close close SYN listen SYN SYN+ACK send syn received SYN ACK ACK SYN syn sent SYN+ACK ACK close FIN close established FIN fin wait 1 ACK fin wait 2 FIN ACK FIN ACK close wait FIN ACK close FIN closing last ack ACK ACK time wait closed timeout 2MSL Die Pfeile sind Zustandsänderungen, die durch Anforderungen an die Transportschicht (fett) oder durch Empfang von ACK-, SYN- oder FIN-Segmenten (rot) ausgelöst werden. In der Regel werden dann entsprechende Segmente (blau) verschickt. ACK wird anhand der acknowledgment number zugeordnet. ACK darf nur sequentiell verschickt werden — ein fehlendes Segment unterbindet weitere ACK. Gehen ACK verloren, können deshalb Löcher akzeptiert werden. 20 Verbindungsaufbau Beim Aufbau einer Verbindung müssen Sender und Empfänger ihre nächste sequence number bekanntgeben. Dies geschieht mit insgesamt zwei SYN- und einem ACK-Segment: syn 123 syn 456 ack 124 ack 457 Bleiben Antworten mit ACK-Segmenten zu lange aus, muß erneut übertragen werden. Der three way handshake dient dazu, vielfaches Hin und Her zu vermeiden: syn 123 syn 123 syn 456 ack 124 syn 456 ack 124 ack 457 syn 456 ack 124 ack 457 Ein einfaches SYN/ACK könnte sehr leicht zu unendlich vielen Wiederholungen führen. Dies wird unter anderem durch die Nummern vermieden. 21 Übertragung Im Zustand established werden dann (bei Bedarf in beiden Richtungen!) Daten und ACK übertragen: 123 data abcd 127 data xyz 456 ack 127 456 ack 130 ACK muß innerhalb einer Zeitschranke empfangen werden. Zu deren dynamischer, variabler Bestimmung gibt es komplizierte Algorithmen, unter anderem von Phil Karn (KA9Q). Bis zu window Bytes können ohne Empfang von ACK geschickt werden. Jedes ACK schiebt dann dieses Fenster weiter (sliding window), wobei innere ACK nicht gesendet werden brauchen. Der Empfänger teilt bei ACK das verbleibende Fenster mit, damit der Sender entsprechend weniger schickt — dies gilt allerdings nur, wenn gültige Daten übertragen wurden. Hat der Empfänger wieder Platz, schickt er ein ACK mit einer neuen Fenstergröße — allerdings erst, wenn der Puffer zu 25% leer ist oder wenigstens ein maximales Segment empfangen kann (silly window algorithm). Beim Start einer Verbindung wird das Fenster langsam vergrößert (slow start algorithm) und später wird das Fenster bei zu vielen Wiederholungen verkleinert, um Netzüberlastung zu vermeiden (congestion avoidance). Kleine Datenpakete werden nach Möglichkeit beim Sender gepuffert, um die weiteren Schichten weniger zu belasten (Nagle algorithm). Echo Eine wichtige Anwendung ist das Netz-Terminal-Protokoll TELNET. Dabei muß inbesondere ein zeichenweises Echo möglichst effizient verschickt werden: 123 push data c 123 push data c 456 ack 124 data c 456 ack 124 124 ack 457 456 ack 124 data c 124 ack 457 Je nach Geschwindigkeit des Servers (rechts) benötigt man für ein Echo drei oder vier Segmente. 22 Verbindungsabbau Zum ordentlichen Abbau der Verbindung muß jede Seite ein FIN-Segment verschicken und ein ACK dafür empfangen. Je nach Zustand wird dann noch die doppelte maximale SegmentLebensdauer (MSL) abgewartet. 123 fin 456 fin ack 124 124 ack 457 Mit netstat kann man relativ häufig unvermittelt abgebrochene Verbindungen im Zustand time wait entdecken. Fazit TCP hat sehr viele wichtige Anwendungen: FTP HTTP SMTP TELNET X11 RFC RFC RFC RFC RFC 959 2616 821 854 1013 file transfer protocol hypertext transfer protocol simple mail transfer protocol network terminal X Window System protocol Datei-Übertragung World Wide Web elektronische Post remote login Fenster-System Die einzige Fehlerkorrektur erfolgt end to end, ist aber wegen relativ verläßlicher Übertragungen trotzdem recht effizient — insbesondere wegen der dynamisch änderbaren Fenster. 23 2.8 tcpdump tcpdump erlaubt der Netzkarte, alle Pakete einzulesen, und läßt sich vom Kern ausgewählte Pakete liefern, die dann dargestellt werden. Aus Sicherheitsgründen ist tcpdump nur für den Super-User verfügbar. tcpdump optionen filter-expression Wesentliche Optionen kontrollieren die Art der Ausgabe: -dd -e -s len -t -v -x filter-expression darstellen; sonst nichts Ethernet- (statt IP-) bezogen Paketlänge kein Zeitstempel mehr Information Hex-Dump der Paketdaten Ohne filter-expression wird alles berichtet. Eine filter-expression wird als PseudoCode in den Kern geladen und dort bezüglich eines Pakets interpretiert: $ tcpdump -dtxv host molly and udp port domain (000) ldh [12] 12: ethernet type code (001) jeq #0x800 jt 2 jf 160x800: IP (002) ld [26] 26: ip sender (003) jeq #0x83ad0dd1 jt 6 jf 4131.173.13.209 molly (004) ld [30] 30: ip destination (005) jeq #0x83ad0dd1 jt 6 jf 16 (006) ldb [23] 23: ip protocol (007) jeq #0x11 jt 8 jf 160x11: udp (008) ldh [20] 20: ip flags (fragmenting) (009) jset #0x1fff jt 16 jf 10fragmented? (010) ldxb 4*([14]&0xf)14: ip header length (wds) (011) ldh [x + 14] udp 0: sender port (012) jeq #0x35 jt 15 jf 130x35: DNS (013) ldh [x + 16] udp 2: receiver port (014) jeq #0x35 jt 15 jf 16 (015) ret #68 (016) ret #0 filter-expression kann sich also auf die Felder der verschiedenen Header beziehen und diese und/oder/nicht verknüpfen und auch arithmetisch prüfen. Dies ist hinter einer Vielzahl von symbolischen Namen und relativ verwirrenden Abkürzungen versteckt: term: C-constant PROTOCOL [ offset : size ] len product: term * term ... term / term ... sum: product + product ... product - product ... bit-and: sum & sum ... bit-or: bit-and | bit-and ... primitive: bit-or RELOP bit-or Literal ether ip icmp arp rarp udp tcp 1, 2, oder 4 Bytes Paketlänge < <= > >= != = Bis hierher kann man mit einer C-ähnlichen Syntax Bytes in den Protokoll-Schichten bit-weise untersuchen. 24 Als Abkürzungen, die syntaktisch ebenfalls als primitive gelten, kann man die interessanten Felder symbolisch abfragen, zum Beispiel: primitive: ether proto NAME \ip \arp \rarp ip proto NAME \icmp \tcp \udp ether src NAME Ethernet-Host ether dst NAME ether host NAME ether broadcast Ethernet Broadcast src host NAME IP-Host dst host NAME host NAME ip broadcast IP Broadcast (0 oder 1) PROTOCOL dst port NUMMBER \udp \tcp Port-Nummer PROTOCOL src port NUMMBER PROTOCOL port NUMMBER Man kann viel weglassen, denn Angaben werden auch von primitive zu primitive kopiert. Es gibt auch Tests für Pakete, die das lokale Netz verlassen. primitive schließlich werden verknüpft, wobei fehlende Angaben zu Feldern immer als Wildcard interpretiert werden: negation: not primitive primitive ( union ) intersection: negation and negation ... union: intersection or intersection ... Beispiele clark molly penny venus 0:a:27:e2:ef:46 0:30:65:b0:15:da 0:a0:cc:20:bb:2f 0:60:8:26:17:79 131.173.13.200 131.173.13.209 131.173.13.205 131.173.13.210 Assigned Numbers findet man zum Beispiel im RFC 1700. ARP: Beim Start von venus versucht penny, venus zu finden; venus antwortet selbst. Außerdem versucht venus, den (nicht-existenten) Router zu finden: $ tcpdump -tev host 131.173.13.210 and arp tcpdump: listening on en0 0:a0:cc:20:bb:2f Broadcast arp 64: arp who-has venus tell 131.173.13.205 0:60:8:26:17:79 0:a0:cc:20:bb:2f arp 64: arp reply venus is-at 0:60:8:26:17:79 0:60:8:26:17:79 Broadcast arp 64: arp who-has 131.173.13.254 tell venus 25 Führt man auf venus $ ping clark aus, muß venus clark finden: $ tcpdump -texv host 131.173.13.210 and arp tcpdump: listening on en0 0:60:8:26:17:79 Broadcast arp 64: arp who-has 131.173.13.200 tell venus 0001 0800 0604 0001 0060 0826 1779 83ad 0dd2 0000 0000 0000 83ad 0dc8 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 44d4 0d39 0:a:27:e2:ef:46 0:60:8:26:17:79 arp 68: arp reply 131.173.13.200 is-at 0:a:27:e2:ef:46 0001 0800 0604 0002 000a 27e2 ef46 83ad 0dc8 0060 0826 1779 83ad 0dd2 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 c8c8 44d4 0d39 3457 5e14 ping selbst findet in IP-Paketen statt (ist aber ICMP): $ tcpdump -txv host 131.173.13.210 tcpdump: listening on en0 venus > 131.173.13.200: icmp: echo 4500 003c 83ad 0dc8 6566 6768 7576 7761 131.173.13.200 > venus: icmp: echo 4500 003c 83ad 0dd2 6566 6768 7576 7761 and icmp request (ttl 32, id 37376) 9200 0000 2001 e5cc 83ad 0dd2 0800 415c 0300 0900 6162 6364 696a 6b6c 6d6e 6f70 7172 7374 6263 reply (ttl 255, id 14654) 393e 0000 ff01 5f8e 83ad 0dc8 0000 495c 0300 0900 6162 6364 696a 6b6c 6d6e 6f70 7172 7374 6263 Auf molly kann man mit nslookup direkt DNS-Anfragen bearbeiten. Der DNS-Server muß erreichbar sein, sonst finden ARP-Anfragen zwecks Routing statt: $ tcpdump -txv host molly and tcpdump: listening on en0 molly.1055 > venus.53: 15645+ 4500 83ad 0001 01 udp port domain A? foo. (21) (ttl 64, id 0031 09e8 0000 4011 4dd7 0dd2 041f 0035 001d 256f 0000 0000 0000 0366 6f6f 2536) 83ad 0dd1 3d1d 0100 0000 0100 Macht man das auf venus, muß man völlig anders filtern: $ tcpdump -txv host 131.173.13.210 and ip broadcast tcpdump: listening on en0 venus.137 > 131.173.13.255.137: udp 50 (ttl 128, id 60160) 4500 004e eb00 0000 8011 2c73 83ad 0dd2 83ad 0dff 0089 0089 003a 8110 00c2 0110 0001 0000 0000 0000 2045 4745 5045 5043 4143 4143 4143 Hier wird UDP auf Port 137 verwendet -- das ist Windows' Netbios. 26 SYN- und FIN-Pakete beim TCP-Verbindungsauf- und -abbau kann man beobachten, indem man die relevanten Flaggen filtert und zum Beispiel einen TELNET-Anruf (rot) tätigt: $ tcpdump -t 'host venus and tcp[13:1] & 3 != 0' & tcpdump: listening on en0 $ telnet venus molly.1143 > venus.telnet: S 3305751711:3305751711(0) win 32768 <mss 1460,nop,wscale 0,nop,nop,timestamp[|tcp]> (DF) [tos 0x10] venus.telnet > molly.1143: S 3550809343:3550809343(0) ack 3305751712 win 32120 <mss 1460,nop,nop,timestamp 7325201[|tcp]> (DF) venus.1032 > molly.auth: S 3548526334:3548526334(0) win 32120 <mss 1460,sackOK,timestamp 7325203[|tcp]> (DF) telnet> q molly.1143 > venus.telnet: F 75:75(0) ack 122 win 33304 <nop,nop,timestamp 124467 7325216> (DF) [tos 0x10] venus.telnet > molly.1143: F 122:122(0) ack 76 win 32120 <nop,nop,timestamp 7329858 124467> (DF) Man sieht, daß eine Reihe von Optionen übermittelt werden und daß der TELNET-Server ohne Erfolg versucht, eine Verbindung zurück zu einem Authentication-Server (RFC 931) aufzubauen, der ihm die Benutzer-Identität mitteilen soll. Das abschließende ACK des three way handshake wird durch die Filterung unterdrückt. 27 2.9 ethereal ethereal ist ein grafisches Frontend für tcpdump, das zum Beispiel unter Linux verfügbar ist: Unter Capture kann man in einem Panel einen Filterausdruck eintragen und dann Pakete sammeln: Im Hauptfenster wählt man oben ein Paket. In der Mitte kann man mehr Informationen zu den einzelnen Schichten aufklappen und unten sieht man die Rohdaten. 28