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.
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
Weitere Produkte im Medialinx Shop »
Versandartikel
Onlineartikel
Alle Rezensionen aus dem Linux-Magazin
- Buecher/07 Bücher über 3-D-Programmierung sowie die Sprache Dart
- Buecher/06 Bücher über Map-Reduce und über die Sprache Erlang
- Buecher/05 Bücher über Scala und über Suchmaschinen-Optimierung
- Buecher/04 Bücher über Metasploit sowie über Erlang/OTP
- Buecher/03 Bücher über die LPI-Level-2-Zertifizierung
- Buecher/02 Bücher über Node.js und über nebenläufige Programmierung
- Buecher/01 Bücher über Linux-HA sowie über PHP-Webprogrammierung
- Buecher/12 Bücher über HTML-5-Apps sowie Computer Vision mit Python
- Buecher/11 Bücher über Statistik sowie über C++-Metaprogrammierung
- Buecher/10 Bücher zu PHP-Webbots sowie zur Emacs-Programmierung
Insecurity Bulletin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...





