04janv. 2012

Xen vif-route and private lan

Xen_logo.png
J'utilisais depuis quelques années un lan privé entre mes DomU et le Dom0 (le Dom0 génère les graphs Munin) qui fonctionnait sans problème en bridge mais suite à l'allocation de ma plage IPv6 routé, j'ai du modifier ma configuration Xen en mode routé (vif-route).

En mode routé je devais exécuter des commandes manuellement sur le Dom0 afin de modifier le routage de l'interface eth1.

ip route del 10.41.233.XXX dev blog.1  scope link  src 78.41.233.XXX
ip route add 10.41.233.XXX dev blog.1  scope link  src 10.41.233.XXX

Ce fonctionnement me permettait des communications DomU <=> Dom0 mais pas DomU <=> DomU (perte de paquet aléatoire).

Suite à la réinstallation de mon hyperviseur Xen en 64Bits (ca m'aura pris du temps pour trouver la motivation), je me suis décidé à tout remettre au propre. (je traine des patchs homemade depuis Xen-3.2.1)

Voici donc ma nouvelle configuration permettant l'utilisation du vif-route et du vif-bridge simultanément, pour éviter d'éventuel bug j'ai préféré créer une interface dummy plutôt que d'ajouter un alias à l'interface loopback.

  • /etc/conf.d/net
config_dummy0=( "10.41.233.1/24" )
  • /etc/xen/scripts/network-custom
#!/bin/sh
dir=$(dirname "$0")
"$dir/network-route" "$@" netdev=eth0
"$dir/network-bridge" "$@" netdev=dummy0 bridge=private
  • /etc/xen/scripts/vif-custom
#!/bin/sh
dir=$(dirname "$0")
IFNUM=$(echo ${vif}|> | cut -d. -f2)
 
if [ "$IFNUM" = "0" ] ; then
	# Interface 0 = public lan
	"$dir/vif-route" "$@"
else
	# Sinon private lan
	"$dir/vif-bridge" "$@"
fi
  • /etc/xen/xend-config.sxp

On commente l'ensemble des autres scripts réseaux (bridge, route, nat)

(network-script network-custom)
(vif-script     vif-custom)

On relance xend

/etc/init.d/xend restart

A ce stade vous devriez avoir une interface nommée private disposant de l'IP privée assignée.

15: private: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 16:c7:56:f6:4d:3c brd ff:ff:ff:ff:ff:ff
    inet 10.41.233.1/24 brd 10.41.233.255 scope global private
    inet6 fe80::14c7:56ff:fef6:4d3c/64 scope link 
       valid_lft forever preferred_lft forever

Il vous suffit à présent d'adopter cette configuration sur vos DomU.

vif = [ 'mac=XX:XX:XX:XX:XX:XX, ip=78.41.233.XXX', 'mac=XX:XX:XX:XX:XX:XX, ip=10.41.233.XXX, bridge=private' ]


Liens utiles :
- Xen Networking Examples

26juin 2010

Xen utilisation de l'IPv6 vif-route

Xen_logo.png
Mon bloc IPv6 étant enfin routé correctement, je me suis attelé à la configuration de ce dernier sur le Dom0 et DomU Xen.

Ma configuration Xen étant à l'origine en bridge et disposant d'un bloc routé vers mon serveur, j'ai donc dût basculer ma configuration Xen en mode route. (vif-route)

Bien entendu à l'instar du mode bridge, le mode route n'est pas compatible IPv6 ...
Voici deux patch à appliquer (compatible Xen-4) ainsi qu'un exemple de configuration (Gentoo).

1) Dom0


  • vif-common
--- vif-common.sh~      2010-04-07 18:12:04.000000000 +0200
+++ vif-common.sh       2010-06-26 23:08:38.000000000 +0200
@@ -14,7 +14,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #
-
+# IPv6 Patched by Timeuhmeuh
 
 dir=$(dirname "$0")
 . "$dir/xen-hotplug-common.sh"
@@ -135,6 +135,17 @@
   ip addr show "$1" | awk "/^.*inet.*$1\$/{print \$2}" | sed -n '1 s,/.*,,p'
 }
 
+##
+# ip6_of interface
+#
+# Print the IPv6 address currently in use at the given interface, or nothing if
+# the interface is not up.
+#
+ip6_of()
+{
+        ip -6 addr show dev "$1" scope global | awk -F'[ |/]' '/inet6 (([0-9a-f]+:*)+)/ { print $6 } ' | awk '/::/ {print $1}'
+}
+
 
 ##
 # dom0_ip
@@ -156,3 +167,38 @@
   fi
   echo "$result"
 }
+
+##
+# dom0_ip6
+#
+# Print the IPv6 address of the interface in dom0 through which we are routing.
+# This is the IPv6 address on the interface specified as "netdev" as a parameter
+# to these scripts, or eth0 by default.  This function will call fatal if no
+# such interface could be found.
#
+dom0_ip6()
+{
+    local nd=${netdev:-eth0}
+    local result=$(ip6_of "$nd")
+    if [ -z "$result" ]; then
+        echo ""
+    else
+        echo "$result"
+    fi
+}
+
+##
+# is_ip6
+#
+# Verifing IPv6 address
+#
+is_ipv6()
+{
+case "$1" in
+    *:*:*)
+        echo "yes"
+        ;;
+    *)
+        echo ""
+esac
+}
  • vif-route
--- vif-route~	2010-04-07 18:12:04.000000000 +0200
+++ vif-route	2010-06-26 23:12:45.000000000 +0200
@@ -18,17 +18,24 @@
 # Read from the store:
 # ip      list of IP networks for the vif, space-separated (default given in
 #         this script).
+#
+# IPv6 Patched by Timeuhmeuh - http://blog.yacoubi.fr
 #============================================================================
 
 dir=$(dirname "$0")
 . "$dir/vif-common.sh"
 
 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
-        echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
+	if [ ! -z "${main_ip6}" ]; then
+		ip -6 addr add ${main_ip6} dev ${vif}
+	fi
+	echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
         ipcmd='add'
         cmdprefix=''
         ;;
@@ -43,7 +50,16 @@
     # 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
-      ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} src ${main_ip}
+	result=$(is_ipv6 "${addr}")
+	if [ -z "${result}" ] ; then
+		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}"
+	fi
+#      ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} src ${main_ip}
     done 
 fi
  • /etc/conf.d/net
config_eth0=( "192.168.0.1/24" "2001:758:f00:340:192:168:0:12/64" "2001:758:5312::/48" )
  • /etc/xen/domU
vif = [ 'ip=2001:758:5312::2 192.168.0.10' ]

2) Dom0


  • /etc/conf.d/net
config_eth0=( "192.168.0.2/24" "2001:758:5312::2/48" )
routes_eth0=( "default gw 192.168.0.1" "default via 2001:758:5312::" )

Patch :


Lien utile : xen-and-routed-ipv6

15mar. 2010

Xen utilisation de l'IPv6 en bridge

Xen_logo.png
Ayant obtenu un bloc IPv6 tout récemment, j'ai tenté de le configurer sur mon Dom0 Xen pensant que le billet Xen bridge IPv6 support suffirait.

Il n'en fut rien, Xen lors de l"initialisation du bridge ne traite aucunement la partie IPv6, j'ai donc développé un petit patch en m'appuyant sur la partie IPv4.

--- /etc/xen/scripts/network-bridge~	2008-06-03 14:50:29.000000000 +0100
+++ /etc/xen/scripts/network-bridge	2010-03-02 18:15:50.000000000 +0100
@@ -103,6 +103,8 @@
 get_ip_info() {
     addr_pfx=`ip addr show dev $1 | egrep '^ *inet ' | sed -e 's/ *inet //' -e "s/$1//"`
     gateway=`ip route show dev $1 | fgrep default | sed 's/default via //'`
+    addr_pfx_6=`ip -6 addr show dev $1 | egrep '^ *inet' | sed -e 's/ *inet6 //' -e "s/$1//" | egrep -E ^2`
+    gateway_6=`ip -6 route show dev $1 | fgrep default | sed 's/default via //' | cut -d' ' -f1`
 }
 
 do_ifup() {
@@ -113,6 +115,18 @@
             ip addr add ${addr_pfx} dev $1
             ip link set dev $1 up
             [ -n "$gateway" ] && ip route add default via ${gateway}
+	fi
+    fi
+}
+
+do_ifup_6() {
+    if [ $1 != "${netdev}" ] || ! ifup $1 ; then
+       	if [ -n "$addr_pfx_6" ] ; then
+      		# use the info from get_ip_info()
+       		ip -6 addr flush $1
+	        ip -6 addr add ${addr_pfx_6} dev $1
+        	ip -6 link set dev $1 up
+            	[ -n "$gateway_6" ] && ip route add default via ${gateway_6}
         fi
     fi
 }
@@ -245,6 +259,7 @@
     fi
     add_to_bridge2 ${bridge} ${pdev}
     do_ifup ${bridge}
+    do_ifup_6 ${bridge}
 
     if [ ${antispoof} = 'yes' ] ; then
 	antispoofing
@@ -272,6 +287,7 @@
     ip link set ${bridge} name ${tdev}
     ip link set ${pdev} name ${netdev}
     do_ifup ${netdev}
+    do_ifup_6 ${netdev}
 
     brctl delbr ${tdev}
 }



Patch : xen-vif-bridge-ipv6.diff

01mar. 2010

Xen et utilisation du NAT

Xen_logo.png
Un ami ayant eu un besoin urgent de pouvoir gérer des DomU Xen via le NAT et comme la configuration de Xen en NAT ne me plait guère, je me suis alors permis de développer un petit script très simple afin de gérer des règles de routage.

#!/bin/sh
IPTABLES=/sbin/iptables
MORE=/bin/more
GREP=/bin/grep
ECHO=/usr/bin/echo
IP_PUBLIC=XXX.XXX.XXX.XXX
IP_PRIVATE=XXX.XXX.XXX.XXX/XX
 
if ! ${GREP}|> '1' /proc/sys/net/ipv4/ip_forward >/dev/null 2>&1; then
 ${ECHO}|> "1" > /proc/sys/net/ipv4/ip_forward
fi
 
# Routage des requetes sortante DomU
if ! ${IPTABLES}|> -L POSTROUTING -t nat | ${GREP}|> ${IP_PUBLIC}|>  >/dev/null 2>&1; then
	${IPTABLES}|> -A POSTROUTING -t nat -s ${IP_PRIVATE}|> -j SNAT --to ${IP_PUBLIC}|>
fi
 
echo "Rules policy in progress :"
echo "________________________________________________________________________________________________"
${IPTABLES}|> -t nat -L PREROUTING --line-numbers | ${MORE}|> +2
echo "________________________________________________________________________________________________"
echo
echo "Actions :"
echo "+---+-----------------+"
echo "| 1 |    Add Rules    |"
echo "+---+-----------------+"
echo "| 2 |   Delete Rules  |"
echo "+---+-----------------+"
echo "| 3 |    List Rules   |"
echo "+---+-----------------+"
echo -n "  >> "
        read TASK
case ${TASK}|> in
	0)
        	echo "#############"
	        echo "# 28/02/2010 #"
        	echo "#############"
	;;
	1)
		echo "== Add Rules =="
		echo -n "IP Source >> "
			read IPSOURCE
                if ${IPTABLES}|> -t nat -L PREROUTING --line-numbers | ${GREP}|> -w ${IPSOURCE}|> >/dev/null 2>&1; then
                	echo "IP Source is already configured, please remove it before"
			exit
		fi
		echo -n "IP Destination >> "
			read IPDESTINATION
		echo "-------------------------------"
		echo "Apply this Rules, Traffic destined ${IPSOURCE} redirect to ${IPDESTINATION} ? (Y/N)"
		echo -n "  >> "
			read APPLY
		echo
		if ! [ "${APPLY}" = "Y" ]; then
			echo "You have not validated, rules not add"
			exit
		fi
		${IPTABLES}|> -A PREROUTING -t nat -j DNAT -d ${IPSOURCE}|>/32 --to ${IPDESTINATION}|>
		/etc/init.d/iptables save >/dev/null 2>&1
		echo "Success Rules Apply"
	;;
	2)
		echo "== Delete Rules =="
		echo -n "Rules numbers >> "
			read DELRULES
                if ! ${IPTABLES}|> -t nat -L PREROUTING --line-numbers | ${GREP}|> -w ${DELRULES}|> >/dev/null 2>&1; then
			echo "Rules not exist"
			exit
		fi
                echo "Delete this Rules, `${IPTABLES} -t nat -L PREROUTING --line-numbers | ${GREP} -w ${DELRULES} | awk 'BEGIN { FS=" " } { print "Traffic destined to "$6" redirect "$7 }'` ? (Y/N)"
		echo -n "  >> "
                        read APPLY
                echo
                if ! [ "${APPLY}" = "Y" ]; then
                        echo "You have not validated, rules not delete"
                        exit
                fi
		${IPTABLES}|> -t nat -D PREROUTING ${DELRULES}|>
                /etc/init.d/iptables save >/dev/null 2>&1
                echo "Success Rules Apply"
	;;
	3)
		echo "== List Rules =="
		echo "________________________________________________________________________________________________"
		${IPTABLES}|> -t nat -L PREROUTING --line-numbers | ${MORE}|> +2
		echo "________________________________________________________________________________________________"
	;;
	*)
        	echo "---------------------------"
        	echo "Invalid selection"
        	exit
        ;;
esac



Script : xen-nat.sh

25fév. 2010

Xen Allocution memoire superieur à 512Mo

Xen_logo.png
J'ai rencontré un nouveau problème avec l'ensemble du serveur Xen (Dom0/DomU) lors de l'allocution de plus de 512Mo de RAM (1024Mo par exemple).

Le serveur sur lequel était alloué autant de mémoire vive crashé au démarrage. (ce qui est gênant lorsqu'on décide que Dom0 doit avoir plus de mémoire)

Ce bug n'est bien entendu pas présent lors de l'utilisation de HVM (Hardware-Assisted Virtual Machine) mais uniquement en paravirtualisation.

Dans le cas où ce bug se produit, il suffit simplement de désactiver l'option suivante dans le kernel et de le recompiler :

Processor type and features  --->
[ ] Allocate 3rd-level pagetables from highmem

L'option Allocate 3rd-level pagetables from highmem , permet de placer les structures de données du gestionnaire de mémoire virtuelle en mémoire haute. Ces structures ayant une taille proportionnelle à la quantité de mémoire effectivement installée, cette option permet d'éviter qu'elles ne saturent la mémoire basse.

15sept. 2009

Xen bridge IPv6 support

Xen_logo.png
A chaque mise à jour de Xen je me retrouve confronté à un bug causé par le support IPv6 compilé dans le kernel.
Ce petit bug est présent depuis près d'une année il sera peut être un jour corrigé, en attendant voici le patch à utiliser (ça m'évitera d'avoir à le rechercher la prochaine fois)

--- /etc/xen/scripts/network-bridge~	2008-06-03 14:50:29.000000000 +0100
+++ /etc/xen/scripts/network-bridge	2008-06-03 14:50:29.000000000 +0100
@@ -90,7 +90,7 @@
 tdev=tmpbridge
 
 get_ip_info() {
-    addr_pfx=`ip addr show dev $1 | egrep '^ *inet' | sed -e 's/ *inet //' -e "s/$1//"`
+    addr_pfx=`ip addr show dev $1 | egrep '^ *inet ' | sed -e 's/ *inet //' -e "s/$1//"`
     gateway=`ip route show dev $1 | fgrep default | sed 's/default via //'`
 }



Patch : xen-vif-bridge-ipv6-225715.diff
Lien : Gentoo Bug 225715

22juil. 2009

Xen installation de windows avec support VNC

Xen_logo.png
Je dispose d'un processeur supportant la virtualisation matérielle, je vais donc m'atteler à l'utilisation un système Windows en tant que DomU Xen (Je passe volontairement les pré-requis CPU/BIOS). Pour ce faire je vais devoir activer le support VNC pour Xen, le Dom0 Xen ne disposant que d'un accès SSH.

De nombreux how to 's existent sur la toile néanmoins ces derniers sont rarement à jour, le use flag "vnc" ayant par exemple disparu sous Gentoo.

Enfait rien de bien spécial à faire, le support est inclus nativement, voici la configuration que j'ai adopté :

Informations systèmes :

dom0 ~ # equery l xen
[ Searching for package 'xen' in all categories among: ]
 * installed packages
[I--] [ ~] app-emulation/xen-3.3.1-r1 (0)
[I--] [ ~] app-emulation/xen-tools-3.3.1 (0)
[I--] [M~] sys-kernel/xen-sources-2.6.21 (2.6.21)
[I--] [ ~] sys-kernel/xen-sources-2.6.30-r2 (2.6.30-r2)

Fichier de configuration DomU : /etc/xen/win2k3

import os, re
arch = os.uname()[4]
if re.search('64', arch):
    arch_libdir = 'lib64'
else:
    arch_libdir = 'lib'
kernel = "/usr/lib/xen/boot/hvmloader"
builder='hvm'
memory = 256
name = "win2k3"
vif = [ 'type=ioemu, bridge=xenbr0' ]
disk = [ 'phy:/dev/500/windows,ioemu:hda,w','file:/root/win2003.iso,hdc:cdrom,r' ]
boot = 'cd'
device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
vnc=1
vnclisten="IP_Dom0"
vncdisplay=1
vncunused=0
keymap='fr'
usb='1'
usbdevice='tablet'

Fichier de configuration Dom0 : /etc/xen/xend-config.sxp

(xend-relocation-server yes)
(xend-relocation-hosts-allow '^localhost$ ^localhost\\.localdomain$')
(network-script network-bridge)
(vif-script vif-bridge)
(dom0-min-mem 196)
(enable-dom0-ballooning yes)
(dom0-cpus 0)
(vnc-listen '0.0.0.0')
(vncpasswd 'azerty')

L'accès au serveur crée sur le DomU Xen se fera au travers de VNC le temps de l'installation, le port à utiliser sera alors 5900 + vncdisplay soit dans le cas présent IP_Dom0:5901

Il est à noter que le lancement des DomU Xen sous Windows posait des problèmes lors du 2nd boot (après l'étape de formatage et de copie des fichiers d'installation), un upgrade vers le kernel 2.6.30-r2 a pour ma part résolu le problème.

11avr. 2009

Xen creation d'un reseau prive via un bridge

Xen_logo.png
Depuis le début, j'utilise les adresses IPs publique des DomU Xen pour les communications internes comme par exemple Mysql <=> Web.

Je me suis donc enfin penché sur la question de la mise en place d'un réseau privé dédié et facilement déployable entre plusieurs serveurs Dom0.

Voici pour rappel la configuration par défaut en bridge :

dom0: ----------------- bridge -> real eth0 -> the network
                           |
domU: fake eth0 -> vifN.0 -+

En plus du bridge par défaut, le but est de disposer de cette configuration pour eth1 :

dom0: ----------------- bridge -> real eth1 -> Not connect
                           |
domU: fake eth1 -> vifN.1 -+

Ceci me permettra donc en cas d'ajout d'un nouveau Dom0 Xen, de raccorder les interfaces eth1 de mes Dom0 et de laisser mes DomU communiquer entre eux comme si de rien n'était, mais bon je n'en suis pas encore là ;)

Voici donc comment procéder pour la création d'un bridge, c'est très simple :

1) On crée le bridge :

brctl addbr private

2) On ajoute une interface au bridge :

brctl addif private eth1

3) Et enfin on monte cette interface avec une IP :

ifconfig private 192.168.0.1/24 up

Il ne nous reste qu'a configurer le DomU de manière classique et la communication Dom0 <=> DomU ou DomU <=> DomU devrait se faire :)

Cette configuration est par contre volatile, au redémarrage elle sera alors perdu je vous conseil donc de mettre en place un script dans les rc.d ou de modifier le script de démarrage de Xen pour prendre en compte ces commandes au lancement.