Open Source im professionellen Einsatz

Ein kleiner Client

Das erste Beispielprogramm ist ein kleines Python-Skript (Listing 5), das über »getaddrinfo()« die vorhandenen Adressen für einen Host anzeigt und eine Verbindung zu diesen Adressen aufzubauen versucht. Damit lässt sich beispielsweise prüfen, ob ein bestimmter Webserver über IPv6 erreichbar ist. Der Code funktioniert sowohl mit Python 2.7 als auch mit 3.1.

Listing 5

getaddrinfo.py

01 #!/usr/bin/env python
02 import sys
03 from socket import *
04
05 host = sys.argv[1]
06 port = 80 if len(sys.argv)<3 else sys.argv[2]
07
08 for addrinfo in getaddrinfo(host, port,AF_UNSPEC, SOCK_STREAM):
09     family, socktype, proto, canonname, sockaddr = addrinfo
10     socketObject = socket(family, socktype, proto)
11     #socketObject = socket(*addrinfo[:3])
12     if socketObject is None: continue
13     haveConnection = False
14     try:
15         socketObject.connect(sockaddr)
16         socketObject.close()
17         haveConnection = True
18     except:
19         pass
20     familyString = "IPv6" if family==AF_INET6 else "IPv4"
21     args = familyString, sockaddr[0], haveConnection
22     print("{0} address {1}, connect = {2}".format(*args))

Als ersten Parameter erwartet das Skript einen Hostnamen, den es unverändert an »getaddrinfo()« weitergibt. Der zweite Parameter, falls vorhanden, kommt als Port-Argument für »getaddrinfo()« zur Verwendung (Zeile 8). Der Standardwert ist 80. Das Skript versucht nun zu jeder gefundenen Adresse eine Verbindung aufzubauen, indem es zunächst ein Socketobjekt mit den Family-, Socktype- und Proto-Parametern erzeugt, die zurückgeliefert wurden. Dann versucht es einen »connect()« auf »sockaddr« (Zeile 15). Wenn dies gelingt, wird es in »haveConnection« vermerkt.

Abbildung 2: Google ist unter IPv6 und IPv4 erreichbar, wie das Python-Beispielprogramm zeigt.

Abbildung 2: Google ist unter IPv6 und IPv4 erreichbar, wie das Python-Beispielprogramm zeigt.

Google liefert die IPv6-Adresse nur an ausgewählte Provider, die einen IPv6-Test bestanden haben. Man sieht an der Ausgabe, dass es zu einer Adressenfamilie durchaus mehrere Einträge geben kann (Abbildung 2). Über den Hostnamen [ipv6.google.com] erhält man jedoch stets eine IPv6-Adresse. Wie Facebook zeigt, kann man mit kreativer Rechtschreibung auch noch Schleichwerbung in einer IPv6-Adresse unterbringen:

$ python getaddrinfo.py www.facebook.com
IPv6 address 2620:0:1c08:4000:face:b00c:0:1,connect = True
IPv4 address 69.171.224.41,connect = True

Wie sieht das auf der Server-Seite aus? Für eine Ipv6-fähige Serverapplikation genügt es, als Host »None« , als Family »AF_UNSPEC« sowie bei den Flags »AI_PASSIVE« anzugeben, um Parameter und Adressen für Serversockets zu erhalten, die auf allen Netzwerkinterfaces auf ankommende Verbindungen lauschen. Normalerweise werden das zwei Sockets sein.

IPv4 und IPv6 in Konkurrenz

Das erste Problem besteht darin, ob sich ein IPv4- und ein IPv6-Socket zum selben Port gleichzeitig mit »bind« binden lassen. Die Antwort lautet: Es kommt darauf an – und zwar auf die Socketoption »IPV6_V6ONLY« , die ebenfalls in RFC 3493 beschrieben ist. Sie lässt sich in Python mit der Socketmethode »setsockopt()« setzen:

socket.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 1)

Leider ist es so, dass die Standardeinstellung dieser Option vom Betriebssystem und sogar von dessen Distribution abhängig ist. Auf einigen BSD-Systemen ist sie im Standardfall aktiv und auf Linux-Systemen kann der Administrator sie zur Laufzeit aktivieren:

# sysctl net.ipv6.bindv6only=1

Für den Programmierer empfiehlt es sich, diese Option immer explizit zu setzen, denn dann ist es in jedem Fall möglich, einen IPv6-Port zu binden, auch wenn der Port bereits über IPv4 gebunden ist.Ist »IPV6_V6ONLY« nicht aktiviert, werden auch ankommende IPv4-Verbindungen über eine V4-mapped-Adresse auf einen IPv6-Socket weitergeleitet.

So praktisch V4-mapped-Adressen sind, besitzen sie jedoch auch Nachteile: Zum einen haben sie eine andere textuelle Darstellung, was insbesondere in Log-Ausgaben zu veränderten Zeichenketten führt. Das kann Probleme in automatischen Analysewerkzeugen verursachen, die beispielsweise mit regulären Ausdrücken nach IPv4-Adressen suchen und die neuen Strings nicht erkennen. Zum anderen gibt es eine Reihe potenzieller Sicherheitsprobleme im Zusammenhang mit V4-mapped-Adressen [5], die daher rühren, dass die Applikation nicht unterscheiden kann, ob eine IPv4-Verbindung vorliegt oder eine IPv6-Verbindung mit manipulierter Adresse.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook