IPV6/xen-route

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

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:

Ipv6-route-xen.png
  • 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:

Gnome-terminal.png
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:

Gnome-terminal.png
 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
Debian-term.png
 dom0:# vi /etc/network/interfaces
  • /etc/network/interfaces
Ascii.png
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
Gnome-terminal.png
dom0:# cat /proc/sys/net/ipv6/conf/all/forwarding
0
  • Per sysctl:
Gnome-terminal.png
 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
Gnome-terminal.png
dom0:# echo 1 >  /proc/sys/net/ipv6/conf/all/forwarding
  • Per sysctl mit Eintragung in die Konfigurationsdatei:
Gnome-terminal.png
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:

Gnome-terminal.png
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
Ascii.png
#!/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
Gnome-terminal.png
 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
Ascii.png
...
(network-script network-route)
(vif-script vif-bridge)
...

Daher wird das neue Script in der DomU Datei direkt angegeben:

  • /etc/xen/domu.cfg
Ascii.png
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
Gnome-terminal.png
 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:

Gnome-terminal.png
 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
Gnome-terminal.png
 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
Debian-term.png
 domu:# vi /etc/network/interfaces
  • /etc/network/interfaces
Ascii.png

[...]
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


--Denny 20:37, 15. Jul. 2010 (UTC)