Exkursion: Netzmaske / IPv4 und IPv6

Im IPv4 und IPv6 Adressraum wird im Grunde nur zw. zwei Netzen unterschieden, dem globalen und dem lokalem Netz. Das gloabale Netz (auch als global scope bezeichnet) ist das Internet, das von einem ISP (wiki) administriert und geroutet wird. Das lokale Netz (auch als link-local Netz bezeichnet) ist das Netz, das vom eigenem Netz-Admin administriert und geroutet wird. Im einfachsten Fall ist der eigene Netz-Admin die Plaste-Box, die an dem DSL-Anschluss an der Wand hängt.

Will man nun den Zugriff auf eine Web-Site des Apache (Allow-Direktive) oder das Routing in einem Netzwerk konfigurieren, so nimmt man eine Netzmaske (wiki) zur Hand um Teilbereiche des Netzes in eine Klammer zu fassen, anderen Falls müsste man jede IP-Adresse des Netzes einzeln betrachten. Eine Klammerung in Teilbereiche setzt voraus, dass die Adressen in einem Netz in irgendeiner Form strukturiert sind. Die gröbste Strukturierung ist die Unterscheidung des global scope zum link-lokal Netz. Das ist im IPv6 so, wie es schon im IPv4 war, nur mit dem Unterschied, dass IPv6 differenziertere Unterscheidungen zulässt, über einen größeren Adressraum verfügt und besondere Features hat, die es im IPv4 nicht gibt.

IPv4 Netze und Masken

Die link-lokal Adressen sind nicht irgendwelche zufällig gewählten Adressen, hierfür verwendt man dafür vorgesehene Nummernbereiche. Im IPv4 werden private Adressbereiche (wiki) in der RFC 1918: IPv4 Private Address Space definiert, hier ein Auszug:

  • IPv4 privates Class-A Subnetz: 10.0.0.0/8 (255.0.0.0)

  • IPv4 privates Class-B Subnetz: 192.168.0.0/16 (255.255.0.0)

  • IPv4 privates Class-C Subnetz: 192.168.0.0/24 (255.255.255.0)

  • IPv4 localhost: 127.0.0.0/8 (255.0.0.0)

Klassisch wird eine Netzwerkmaske mit ihren dezimalen Werten notiert, z.B. 255.255.255.0. Die Notation der Netzmaske mit Kürzeln wie /8, /16 oder 24 erweist sich aber als praktischer, sie stammt aus dem CIDR. Eine Netzmaske identifiziert das IP-Präfix (also den Adressbereich) eines Netzes. In der Netzmaske (wiki) 127.0.0.0/8 aus dem obigen Beispiel ist 127. der Adressbereich des localhost (wiki).

Die Netzmaske 192.168.0.0/16 entspricht dem historischen private Class-B Netz des IPv4, das aus max. 256 privaten (Class-C) Netzen mit jeweils 256 Adressen bestehen kann (total 65536 Adressen). Die Netzmaske in den einzelnen Class-C Netzen wäre /24 und reicht von 192.168.0.0/24 bis 192.168.255.0/24. Ein solches Class-B Netz würde für Unternehmen mittlerer Größe mit nicht mehr als ca. 65.000 Devices noch passen. Es mag sich auch noch für den Verbund (z.B. via VPN) von weniger als 256 kleinen Büros mit nicht mehr als 253 Devices in dem größten der kleinen Büros eignen. Für größere Unternehmen mit mehreren Standorten müsste man schon ein Class-A Verbund wählen in dem (bis zu 256) Class-B Netze (mit je max. 65.000 Devices) angeordnet sein könnten / siehe hierzu Exkursion: NAT.

Die IP-Adresse des Hosts und die Netzmaske des Subnetz in dem er sich befindet kann mit dem Kommando ifconfig ermittelt werden:

eth0      Link encap:Ethernet  HWaddr bc:5f:f4:ea:0e:7e
          inet addr:192.168.1.124  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fd00::be5f:f4ff:feea:e7e/64 Scope:Global
          inet6 addr: fd00::6d38:6276:ea39:39de/64 Scope:Global
          inet6 addr: fe80::be5f:f4ff:feea:e7e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
~~~~
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

Das Loppback-Device wird mit lo bezeichnet, die IPv4 Adresse ist 127.0.0.1 und die Netzmaske ist 255.0.0.0, was 127.0.0.0/8 entspricht.

Mit eth0 wird die erste Ethernet-Netzwerkarte gekennzeichnet (Ethernet Divice 0 mit Mac Adresse (wiki) bc:5f:f4:ea:0e:7e) und der erste WLAN Adaper trägt die Bezeichnung wlan0 (oben nicht zu sehen).

Die IPv4 Adresse des eth0 ist 192.168.1.124 die Netzmaske ist mit 255.255.255.0 angegeben, was 192.168.1.0/24 entspricht. Der Host steht also in einem (kleinen) Subnetz in dem max. 256 IPs zur Verfügung stehen (0-255). In dem Bereich sind jedoch folgende Nummern schon reserviert:

  • Die .0 ist immer die Subnetzadresse

  • Die .255 ist immer die Broadcast (wiki) Adresse.

  • Auf der Adresse .1 ist meist der Router / das Gateway zu finden mit dem dieses Subnetz an ein höheres Netz gebunden ist (bei der Plaste-Box zu Hause ist das schon das Internet).

In dem historischen IPv4 Class-C (Subnetz) wird man real also nicht mehr als 253 Devices vorfinden resp. unterbringen können.

IPv6 Netze und Masken

Im IPv4 werden die Adressbereiche in der RFC-1918 definiert, im IPv6 gibt es dafür die RFC 4291: IPv6 Addressing Architecture. Für die unicast link-local Adressen im IPv6 sind folgende Adressbereiche vorgesehen:

  • IPv6 localhost: ::1/128

  • IPv6 Link-Lokal Netz: fe80::/10

  • IPv6 Unique-Local Subnetz: fd00::/8

Bezüglich dem Aufbau einer IPv6-Adresse sei kurz aus einem Artikel des heise-Verlags zitiert – Reservierte und spezielle Adressbereiche im Internet-Protokoll Version 6 (heise Verlag):

Die gesamte Adresse umfasst 128 Bit.  Die ersten 64 sind für den
Subnetz-Präfix reserviert, die verbleibenden 64 Bit bezeichnen den Host.

Die vollständige Adresse schreibt man hexadezimal und unterteilt die
Zahlenfolge mit Doppelpunkten in Blöcke je 16 Bit.

Innerhalb von IPv6-Adressen lässt sich eine Folge von Nullen kürzen und
durch zwei Doppelpunkte ersetzen. Die Adresse

* 2001:0DB8:0000:0001:0000:0000:0010:01FF verkürzt sich damit zu
* 2001:0DB8:0000:0001::0010:01FF.

Führende Nullen in den 16-Bit-Blöcken können ersatzlos wegfallen, sodass die
oben genannte Adresse auf

* 2001:DB8:0:1::10:1FF schrumpft.
~~~

Loopback Adresse ::1

Die Loopback Adresse im IPv6 ist die 0:0:0:0:0:0:0:1: oder etwas kürzer notiert ::1 (siehe RFC 4291: The Loopback Addresses). Anders als im IPv4 ist im IPv6 für das loopback-Device keine ganzes Class-A Netzwerk reserviert (127.0.0.8/8) sondern nur diese eine Adresse (::1/128).

Apache: Die ::1 in einer Apache- Allow-Direktive wie Allow from ::1 ist also das IPv6 Pendant zu der IPv4 Allow localhost Direktive Allow 127.0.0.0/8.

Unique Local fc00::/7 faktisch fd00::/8

Im IPv4 konnte man Class-C Netze 192.168.1.0/24 zu einem Class-D Verbund 192.168.1.0/16 maskieren (vergleiche IPv4 Netze und Masken). Das geht mit den link-local Adressen nicht, den jedes Subnetz steht für sich und trägt den selben Präfix fe80::/10. Das Pendant zu den privaten Adressbereichen des IPv4 sind im IPv6 die Adressbereiche des Unique Local Unicast (wiki).

Eine Unique-Local Adresse – kurz ULA – wird von den ISPs nicht geroutet, sie ist im Internet nicht verfügbar (daher auch der Namensbestandteil Local).

Für ULA steht der Adressbereich fc00::/7 zur Verfügung wovon die Null im achten Bit (von links gezählt) jedoch reserviert ist, siehe Format der ULA: RFC 4193: Local IPv6 Unicast Addresses:

| 7 bits |1|  40 bits   |  16 bits  |          64 bits           |
+--------+-+------------+-----------+----------------------------+
| Prefix |L| Global-ID  | Subnet-ID |        Interface-ID        |

Prefix            FC00::/7 prefix to identify Local IPv6 unicast
                  addresses.

L                 Set to 1 if the prefix is locally assigned.
                  Set to 0 may be defined in the future.

Faktisch ist das Präfix einer lokalen (selbstvergebenen) ULA also immer fd00::/8.

Hinweis

Die Denke im IPv6 ist anders als im IPv4. Man wird IPv6 nur schwer verstehen, wenn man sich nicht kurz mit dem Prinzip der IPv6 Autokonfiguration (wiki) – auch Stateless Address Autoconfiguration (RFC 4862: IPv6 SLAAC) genannt – vertraut macht.

Prefix Delegation

Die Stateless Address Autoconfiguration (SLAAC) hat den Vorteil, daß man keine IP-Adressen mehr konfigurieren muss und mit der Link-Lokal Adresse die bis zum nächsten Router reicht hat man auch immer das Subnetz maskiert (fe80::/10).

Aber man kann diese Subnetze noch nicht als Verbund maskieren. An dieser Stelle soll nun die Unique Local fd00::/8 helfen. Dies ist aber nicht mehr nur mit SLAAC alleine möglich. Um einen Verbund zu bilden, müssen Präfixe für das Unique Lokal Subnetz vergeben werden, wofür es – wie schon im IPv4 – eine Instanz geben muss. Die Vergabe der Präfixe kann man entweder manuell durch Vergabe eines festen Präfix auf allen Hosts erreichen oder besser, man hat einen Router mit einem DHCPv6 Server und Hosts, die DHCPv6 prefix delegation unterstützen. Bei dem Verfahren vergibt der Router (DHCP-Server) das Präfix mit den 40Bit für die Global-ID und den 16-Bit für die Subnet-ID (vergleiche Schaubild Unique Local fc00::/7 faktisch fd00::/8). Z.B.:

ULA des Routers --> 2001::c225:6ff:fea2:c35c/64 Subnetz
Präfix --> 2001::c225:6ff/64

Source Address Selection

Im IPv6 hat ein Netz-Device wie das eth0 im obigen Beispiel immer mehrere IP-Adressen. Es gibt immer mindestens eine im Local-Scope und eine im Global-Scope. Wenn nun ein IP-Paket über das Device versendet wird, muss eine Enstcheidung getroffen werden, welche dieser Adressen als Absender verwendet wird. Die Entscheidungsfindung wird als Source Address Selection bezeichnet. Das Verfahren wird in RFC 3484: Source Address Selection beschrieben, oder etwas abgekürzt formuliert: der Algorythmus versucht zu ermitteln, was zur IP-Zieladresse am besten passt. Wenn die Zieladresse ein Name und keine IP-Adresse ist, dann wird die zum Namen gehörende IP-Zieladresse vom DNS vorgegeben.

Privacy Extensions für SLAAC im IPv6 Global-Scope

Die IPv6 Autokonfiguration (wiki) erzeugt eine IPv6-Adresse auf Basis der MAC-Adresse des Devices. Man kann das auch schon fast mit bloßem Auge sehen. Hier ein kleines Beispiel.:

$ ifconfig
eth0      Link encap:Ethernet  Hardware Adresse 00:0c:29:3f:de:f9
          ...
          inet6-Adresse: 2a02:8109:183f:b2cc:20c:29ff:fe3f:def9/64 Scope:Global

In der obigen ifconfig Ausgabe ist zu sehen, dass der eth0 eine 64 Bit Maske auf dem Scope:Global hat:

inet6-Adresse: 2a02:8109:183f:b2cc:20c:29ff:fe3f:def9/64 Scope:Global

Schreibt man das mal anders auf, dann sieht man, was für den Interface Identifier übrig bleibt:

2a02:8109:183f:b2cc  :  020c:29ff:fe3f:0def9   /64
          ----+----     ---------+---------
              |                  +--> Interface Identifier
              +--> 2a02:8109:183f:b2cc::/62 ist das IPv6 Präfix des Routers

Betrachtet man nur den Interface-Identifier und die MAC-Adresse:

MAC:  00:0c:29:3f:de:f9          --->         000c:293f:def9
auseinander ziehen:                    000c:29__ : __3f:def9
was drauf addieren:                  +      00ff : fe00:0000
Das 7. Bit invertieren:              +  2
                                      ----------------------
                                       020c:29ff : fe3f:def9

Es gibt dafür auch IP-Rechner, mit denen man so was leicht ausrechnen kann (z.B MAC address to IPv6 link-local address online converter).

Der Interface-Identifier in der Global-Scope Adresse ist beim SLAAC also immer konstant der gleiche (eine Kollision der MAC Adresse im Subnetz ist sehr unwahrscheinlich und hätte dann auch andere Problem zur Folge).

Mit diesem Interface-Identifier und dem IPv6 Präfix des ISP, wird nun jedes Device durchs Internet geroutet. Anders als beim IPv4, bei dem es noch NAT gab wird hier im IPv6 keine manipulation an der Absender Adresse vorgenommen. Der IPv6 Router reicht das Datenpaket mit der IPv6-Absenderadresse 1:1 durch. Auch wenn der IPv6 Präfix des ISP evtl. alle 24h Stunden wechselt, kann die Hardware von der die IP Pakete kommen recht gut identifiziert werden.

Hinweis

Nachdem die MAC Adresse in der IPv6 Adresse abgebildet ist, lässt sie sich auch zurückrechnen. Mittels der OUI Herstellerkennungen (wiki) und ggf. noch weiterer Erfahrungswerte in der Vergabe von Nummernbereichen an bestimmte Device-Typen, lässt sich die Hardware:

  • immer eindeutig identifizieren und

  • vom Typ her zumindest grob zuordnen.

Da es sich hierbei immer um eine Identifikation auf der IP-Ebene handelt, ist sie immer möglich. Unabhängig davon, ob verschlüsselte oder unverschlüsselte Datenpakete ausgetauscht werden. Diese Art der Identifikation ist beim IPv4 mit NAT nicht möglich, da ist der Blick ins Subnetz (zumindets auf IP Ebene) verschleiert.

Hinweis

Die Identifizierung von Nutzern ist auf IP Ebene nur indirekt möglich und weniger intressant. Die Nutzer können einfacher an ihrem Verhalten auf der Anwendungsebene identifiziert werden.

Intressanter sind evtl. die Dinger aus dem Internet der Dinge (schrecklicher Begriff). Die über Steuerungen oder Produktionslagen in immer mehr Haushalte und Unternehmen Einzug halten.

Diese Dinge holen sich nicht selten Inforamtionen wie z.B. die aktuelle Uhrzeit von einem Uhren-Server aus dem Internet. Wie gesprächig sie darüber hinaus sind ist immer schwer einzuschätzen und ist wohl nur in den wenigsten technischen Angaben einer Steuerung zu finden.

Kommunizieren diese Dinge mit dem Internet (z.B. Uhr synchronisieren) und machen sie das mit IPv6 und einer SLAAC-IP, dann hat man vermutlich schon nach einem Tag ein recht vollständiges Bild von dem was hinter dem Router an Hardware steht. Einzelne Steuerungen lassen sich ggf. schon Identifizieren, damit ist dann auch die Liste der bekannten Schwachstellen zu der Hardware/Software bekannt (z.B. ein exploit in dem Admin Interface eines Devices).

Um dem zu entgehen kann man – zumindest bei den meisten Betreibsystemen – die IPv6 Privacy Extensions (heise) einschalten. Für die Dinger des Internets der Dinge wird man vermutlich weniger Möglichkeiten haben, die MAC Adresse zu verschleiern (am besten die Dinger können erst gar kein IPv6).