IPV6/xen-route
Inhaltsverzeichnis
IPV6 Routing unter Xen
Die Topologie
Bei Providern wie z.B. Hetzner kann aufgrund der "fremden" MAC Adressen keine virtuelle Maschine über eine Bridge direkt angeschlossen werden. Daher bedient man sich zumeist DNAT/SNAT um die MAC Adresses der Gäste auf die des Wirts umzuschreiben. Da es (offiziell) für IPv6 kein NAT gibt, werden die Gäste direkt angeschlossen. Da das Problem der Bridge nach wie vor bestand hat, muss auf reguläres Routing gesetzt werden. Auch dies ist mit Xen möglich. In diesem Beispiel verwende ich eine Bridge für den IPV4 Teil sowie IPv6 Routing. Die Grafik zeigt folgenden Aufbau:
- Eine interne Bridge xenintbr mit der IP 192.168.1.1
Sie wird als Verbindungsbrücke zwischen den Gästen untereinander und zur Dom0 verwendet. Die Gäste habe die Bridge IP als Gateway eingetragen und die Firewall sorgt für das Umsetzen der Internen IP in die Externe (hier ..45.3/28) und zurück. Die IP Adresse der Eth0 wird vom Provider per DHCP zugewiesen.
- Für IPv6 besitzt die eth0 des Wirts eine statisch zugeordnete IPv6 Adresse. Sie wird einem vom Provider mitgeteilt. Im Falle von Hetzner erhält der Kunde ein /64'er Netz, welches genügend Adressen bereitstellt.
- Ein Beispiel:
- IPs: 2001:DB8:4309:2388:: /64
- Gateway: 2001:DB8:4309:2389::1 /59
- Erste nutzbare IP Adresse: 2001:DB8:4309:2388::2
- Letzte nutzbare IP Adresse: 2001:DB8:4309:2388::ffff:ffff:ffff:ffff
Temporäres setzen
Wird eine weitere IP Adresse benötigt, so genügt es diese per /sbin/ip hinzuzufügen, oder sie statisch per Distribution zu konfigurieren. Dieses Beispiel zeigt, wie es temporär funktioniert:
dom0:# ip -6 addr add 2001:DB8:4309:2388::2/64 dev eth0 dom0:# ip -6 route add 2001:DB8:4309:2389::1 dev eth0 dom0:# ip -6 route add default via 2001:DB8:4309:2389::1 |
In der ersten Zeile wird die erste nutzbare IP Adresse der Eth0 hinzugefügt. Damit das System weiß, wohin IPv6 Adressen gesendet werden, für die es selbst nicht verantwortlich ist, müssen wir ein Gateway angeben. Da aber das Gateway selbst schon in einem anderen Subnetz liegt, müssen wir dem Hostsystem sagen, wie es dieses Gateway erreichen kann, dafür ist die zweite Zeile verantwortlich. Nun da er weiß, wie das Gateway zu erreichen ist, können wir das Standard Gateway festlegen. Dies übernimmt die dritte Zeile. Ist alles ohne Fehler durchgelaufen, können nun IPv6 fähige Adressen angepingt werden:
dom0:# ping6 -c 2 ipv6.google.com PING ipv6.google.com(2a00:1450:8007::68) 56 data bytes 64 bytes from 2a00:1450:8007::68: icmp_seq=1 ttl=56 time=54.2 ms 64 bytes from 2a00:1450:8007::68: icmp_seq=2 ttl=56 time=43.2 ms --- ipv6.google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 43.236/48.741/54.247/5.509 ms |
Statisch konfigurieren
Möchte man dies statisch konfigurieren, sähe dies so aus:
- Debian/Ubuntu
dom0:# vi /etc/network/interfaces |
- /etc/network/interfaces
iface eth0 inet6 static address 2001:DB8:4309:2388::2 netmask 64 up ip -6 route add 2001:DB8:4309:2389::1 dev eth0 up ip -6 route add default via 2001:DB8:4309:2389::1 |
Ein ifup eth0 od. ein Reboot führt dann hoffentlich zum Erfolg. Damit wäre die generische Unterstützung für IPv6 gegeben.
Xen Routing
Nun kommt Xen ins Spiel. Wir müssen nun dafür sorgen, dass die Pakete von' einer DomU und zur DomU gesendet werden. Dazu benötigen wir die Basisfunktion forwarding für den IPv6 Netzwerkstack.
- Derzeitiger Stand
dom0:# cat /proc/sys/net/ipv6/conf/all/forwarding 0 |
- Per sysctl:
dom0:# sysctl net.ipv6.conf.all.forwarding net.ipv6.conf.all.forwarding = 1 |
Es genügt nicht, diese nur für die jeweilige Netzwerkschnittstelle zu aktivieren, sondern es muss für alle sein.
- Temporär
dom0:# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding |
- Per sysctl mit Eintragung in die Konfigurationsdatei:
dom0:# sysctl -w net.ipv6.conf.all.forwarding=1 dom0:# echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.conf |
Ein weiteres Problem welches sich ergibt, im Beispiel von Hetzner ; eine automatische Adress- Konfiguration für die DomUs ist ohne weiteres nicht möglich. Für das Routing ist man selbst verantwortlich. Darunter fällt unter anderem, dass das Hetzner Gateway nicht weiß, wohin es die Antwort- Pakete adressieren soll. Dies geschieht normalerweise über das ND (der Nachfolger für ARP) Protokoll. In der jetzigen Konstellation dringt dieses jedoch nicht bis zum Gateway durch, sodass die Dom0 die ND Anfragen beantworten muss. Die Alternative wäre die Bridge, die Hetzner jedoch nicht (mehr) erlaubt. Daher kommt die Funktion proxy_ndp zum Einsatz:
dom0:# sysctl -w net.ipv6.conf.all.proxy_ndp=1 dom0:# echo ' net.ipv6.conf.all.proxy_ndp = 1' >> /etc/sysctl.conf |
Die Aufgabe von Xend ist es nun, beim erzeugen der DomU eine Route zur DomU zu legen, als auch das Aktivieren der Proxy Funktion für die jeweilige Vif Schnittstelle. Dies geschieht über das Script /etc/xen/scripts/vif-route. Da dies aber von hause aus kein IPv6 versteht, muss dieses angepasst werden. Da das Patchen der bestehenden Datei nicht jedermanns Sache ist, hier die vollständige Datei: (Bitte von der Original Datei eine Kopie erzeugen)
- /etc/xen/scripts/vif-route
#!/bin/bash # Read from the store: # ip list of IP networks for the vif, space-separated (default given in # this script). IPv6 should also work. #============================================================================ dir=$(dirname "$0") . "$dir/vif-common.sh" ip6_of() { ip -6 addr show "$1" | perl -wane '/scope global/ && /inet6 (([0-9a-f]+:*)+)/ && print $1;' } dom0_ip6() { local nd=${netdev:-eth0} local result=$(ip6_of "$nd") if [ -z "$result" ] then "" else echo "$result" fi } is_ipv6() { echo "$1" | perl -wane '/:/ && print "yes"' } main_ip=$(dom0_ip) main_ip6=$(dom0_ip6) case "$command" in online) log info "[vif-route] online request, ip ${ip} with main_ip ${main_ip} and main_ip6 ${main_ip6} for $vif." ifconfig ${vif} ${main_ip} netmask 255.255.255.255 up if [ ! -z "${main_ip6}" ]; then ip -6 addr add ${main_ip6} dev ${vif} echo 1 >/proc/sys/net/ipv6/conf/${vif}/proxy_ndp fi echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp ipcmd='add' cmdprefix='' ;; offline) do_without_error ifdown ${vif} ipcmd='del' cmdprefix='do_without_error' ;; esac if [ "${ip}" ] ; then # If we've been given a list of IP addresses, then add routes from dom0 to # the guest using those addresses. for addr in ${ip} ; do result=$(is_ipv6 "${addr}") if [ -z "${result}" ] ; then log info "[vif-route] Adding IPv4 address ${addr} with src ${main_ip} for $vif." result=`${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} src ${main_ip} 2>&1` log info "[vif-route] Result: ${result}" else log info "[vif-route] Adding IPv6 address ${addr} with src ${main_ip6} for $vif." result=`${cmdprefix} ip -6 route ${ipcmd} ${addr} dev ${vif} src ${main_ip6} 2>&1` log info "[vif-route] Result: ${result}" log info "[vif-route] Adding IPv6 proxy ${addr} on ${netdev:-eth0}." result=`${cmdprefix} ip -6 neighbor ${ipcmd} proxy ${addr} dev ${netdev:-eth0} 2>&1` log info "[vif-route] Result: ${result}" fi done fi handle_iptable log debug "Successful vif-route $command for $vif." if [ "$command" = "online" ] then success fi |
- Script ausführbar machen
dom0:# chmod 755 /etc/xen/scripts/vif-route |
DomU Konfiguration
Ist dies geschehen, kann die DomU.cfg Konfiguration angepasst werden. Da ich die bestehende Bridge mit IPv4 weiternutzen möchte, ist die Dom0 xend-config.cfg nicht verändert worden:
- /etc/xen/xend-config.sxp
... (network-script network-route) (vif-script vif-bridge) ... |
Daher wird das neue Script in der DomU Datei direkt angegeben:
- /etc/xen/domu.cfg
vif = ['bridge=xenintbr,vifname=domu1.1,mac=00:16:3E:44:33:22','script=vif-route,vifname=domu6.1,mac=00:16:3E:55:66:77,ip=2001:DB8:4309:2388::50']
|
In diesem Beispiel ist die Eth0 des Gastes in der Bridge xenintbr und Eth1 ist per Routing an IPv6 angeschlossen. Damit die Dom0 weiß, wie sie den Proxy Eintrag für ND setzen soll, schreiben wir die IPV6 Adresse hinzu. Damit sie auch wirklich nutzbar ist, muss sie natürlich auch in der DomU (z.B Debian) selbst hinzugefügt und eingetragen werden. Nach dem Start des Gastes zeigt sich auf der Dom0 folgendes Bild:
- Dom0
dom0:# ip -6 a show dev domu6.1 48: domu6.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 32 inet6 2001:DB8:4309:2388::2/128 scope global valid_lft forever preferred_lft forever inet6 fe80::fcff:ffff:feff:ffff/64 scope link valid_lft forever preferred_lft forever |
Wie zu erkennen ist, hat das Script die IPv6 Adresse der Eth0 noch einmal der Vif Schnittstelle der DomU hinzugefügt, aber mit einem /128 als Präfix. Damit ist dies eindeutig kein Netz mehr, sondern eine Hostadresse. Des weiteren wurde auch neue Routen hinzugefügt:
dom0:# ip -6 r ... 2001:DB8:4309:2388::2 dev domu6.1 metric 256 mtu 1500 advmss 1440 hoplimit 4294967295 2001:DB8:4309:2388::50 dev domu6.1 metric 1024 mtu 1500 advmss 1440 hoplimit 4294967295 fe80::/64 dev domu6.1 metric 256 mtu 1500 advmss 1440 hoplimit 4294967295 |
Für NDP werden die Proxy Einträge gesetzt, leider weiß ich derzeit keine Methode diese Einträge aufzuzeigen. Daher bleibt nur die alte Methode für die temporären Einträge:
- Neighbours
dom0:# ip -6 nei 2001:DB8:4309:2388::50 dev domu6.1 lladdr 00:16:3e:55:66:77 REACHABLE fe80::216:3e55:fe66:b177 dev domu6.1 lladdr 00:16:3e:55:66:77 REACHABLE |
Gast anpassen
Wurde der Gast hochgefahren, gilt es ihm die neue Adresse mitzuteilen:
- Debian
domu:# vi /etc/network/interfaces |
- /etc/network/interfaces
[...] auto eth1 iface eth1 inet6 static address 2001:DB8:4309:2388::50 netmask 64 gateway 2001:DB8:4309:2388::2 |
Nach einem ifup eth1 steht die IPv6 Adresse zur Verfügung und kann verwendet werden.
Für Hinweise aller Art, bitte eine Mail an linuxmail ät 4lin PUNKT net
Hinweise
Kernel Panic
- Aus dem Hetzner Forum:
... Das Problem hatte ich auch, hatte aber mit IPv4 nichts zu tun sondern war eine vom proxy_ndp ausgelöste Kernel-Panic die bei >2.6.32 <2.6.35 auftritt.
Quellen
- Proxy ARP /NDISC - http://www.ipsidixit.net/2010/03/24/239/
- Hetzner Wiki - http://wiki.hetzner.de/index.php/Zusaetzliche_IP-Adressen
- Hetzner Forum (nur für Hetzner Kunden) http://forum.hetzner.de/wbb2/thread.php?threadid=14757
- IPv6 and Xen on a Hetzner hosted system - http://wnagele.com/2010/07/13/ipv6-and-xen-on-a-hetzner-hosted-system/
- Xen and routed IPv6 - http://notes.benv.junerules.com/all/software/xen-and-routed-ipv6/
--Denny 20:37, 15. Jul. 2010 (UTC)