Menú principal

Init script para crear un swith virtual de vde2

17 Feb
Published by antonio.hernandez in

Dejo a continuación un script para iniciar/reiniciar/detener un switch virtual creado mediante vde2 (http://vde.sourceforge.net) en Slackware Linux.

Desde hace como 2 años que vengo usando vde2 para crear una LAN virtual (no, no una VLAN) e interconectar mis máquinas virtuales (KVM) así como darles acceso a la red en la cual este conectado mi equipo. Me basé en el ejemplo dado por Eric Hameleers (http://alien.slackbook.org/blog/) en su wiki (http://alien.slackbook.org/dokuwiki/doku.php?id=slackware:vde) sin embargo he realizado modificaciones que me han sido útiles.

/etc/rc.d/rc.vde2

#!/bin/sh
# /etc/rc.d/rc.vde2
 
# Start/stop/restart a vde2 switch
# Copyright (c) 2012 Antonio Hernández Blas <hba.nihilismus@gmail.com>
 
#
#            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#                    Version 2, December 2004
#
# Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
#
# Everyone is permitted to copy and distribute verbatim or modified
# copies of this license document, and changing it is allowed as long
# as the name is changed.
#
#            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
#
#  0. You just DO WHAT THE FUCK YOU WANT TO.
#
 
########## EDIT THE FOLLOWING VARIABLES
 
# VDE Switch name
SWITCH_NAME=vde_switch1
# Directory for the control socket
CTL_DIRSOCKET="/var/run/${SWITCH_NAME}.ctl"
# Management socket
MGMT_SOCKET="/var/run/${SWITCH_NAME}.mgmt"
 
# Interface name to use for the TAP device
# If you want to disable the use of tap0, comment out the next line.
TAP_IF="tap0"
# IP Address/Subnet in CIDR Notation for the Virtual Network
TAP_NET="172.16.16.1/24" 
 
########## DO NOT EDIT BELOW THIS LINE
 
# VDE Switch, with control and manegement socket.
TAP_CMD=""
if [ ! -z "$TAP_IF" ]; then
	TAP_CMD="-t ${TAP_IF}"
fi
 
CMMD="/usr/bin/vde_switch \
${TAP_CMD} \
-s ${CTL_DIRSOCKET} --mode 660 --dirmode 770 -g netdev \
-M ${MGMT_SOCKET} --mgmtmode 660 --mgmtgroup netdev \
-d"
CMMD=$(echo $CMMD | sed 's/ \+/ /g')
 
start(){
	echo "Starting VDE Switch ${SWITCH_NAME}:"
 
	if [ -S ${CTL_DIRSOCKET}/ctl ]; then
		echo "  Error: ${CTL_DIRSOCKET}/ctl already in use."
		exit 1
	fi
	if [ -S ${MGMT_SOCKET} ]; then
		echo "  Error: ${MGMT_SOCKET} already in use."
		exit 1
	fi 
 
	if [ ! -z "$TAP_IF" ]; then
		if [ ! -c /dev/net/tun ]; then
			echo "  Error: device /dev/net/tun does not exist."
			echo "    Please load tun module: /sbin/modprobe -v tun"
			exit 1
		fi
	fi
 
	echo "  $CMMD"
	$CMMD
	sleep 1
 
	if [ ! -z "$TAP_IF" ]; then
		ip link show "${TAP_IF}" >/dev/null 2>&1
		if [ $? -ne 0 ]; then
			echo "  Error, device ${TAP_IF} does not exist."
			exit 1
		else
			# Bring tap interface up
			ip addr add ${TAP_NET} dev ${TAP_IF} 
			ip link set ${TAP_IF} up
		fi
	fi
}
 
stop(){
	PIDOF=$(pgrep -f "$CMMD")
	if [ ! -z "$PIDOF" ]; then
		echo "Stopping VDE Switch ${SWITCH_NAME}:  /usr/bin/vdecmd -s ${MGMT_SOCKET} shutdown"
		/usr/bin/vdecmd -s ${MGMT_SOCKET} shutdown
 
		if [ ! -z "$TAP_IF" ]; then
			ip link show "{TAP_DEV}" >/dev/null 2>&1
			if [ $? -eq 0 ]; then
				ip addr flush dev ${TAP_IF}
				ip link set ${TAP_IF} down
			fi
		fi
	else
		echo "Error, VDE Switch '${SWITCH_NAME}' is not running."  
	fi
}
 
status(){
	PIDOF=$(pgrep -f "$CMMD")
	if [ ! -z "$PIDOF" ]; then
		echo "VDE switch '${SWITCH_NAME}' is running."
	else
		echo "VDE Switch '${SWITCH_NAME}' is not running."
	fi
}
 
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	status)
		status
		;;
	restart)
		stop
		sleep 3
		start
	   ;;
	*)
	   echo "Usage: $0 {start|stop|restart|status}"
	   ;;
esac

Notas:

El modulo tun ya debe estar cargado, puedes agregarlo a /etc/rc.d/rc.modules

La interfaz virtual tap0 tendrá la siguiente configuración:


tap0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
link/ether aa:c2:26:3b:d3:77 brd ff:ff:ff:ff:ff:ff
inet 172.16.16.1/24 scope global tap0
inet6 fe80::a8c2:26ff:fe3b:d377/64 scope link
valid_lft forever preferred_lft forever

Se hace uso de dos interfaces de red, una física (wlan0 en mi caso) y la virtual (tap0). Mediante la interfaz virtual mantenemos un enlace al switch virtual y con la física mantenemos un enlace hacia el exterior/internet. Nuestro host de máquinas virtuales funciona como un router/gateway para la red virtual mediante NAT, por lo que:

1). Modifica tus reglas de iptables


iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A INPUT -i tap0 -j ACCEPT
iptables -A OUTPUT -o tap0 -j ACCEPT

2). Asigna permisos de ejecución a /etc/rc.d/rc.ip_forward

Puedes conectarte al switch mediante el comando unixterm /var/run/vde_switch1.mgmt

Para conectar tus máquinas virtuales agrega las opción -net a qemu-kvm, por ejemplo:


qemu-kvm -net nic,model=e1000,macaddr=52:54:00:00:EE:06 -net vde,sock=/var/run/vde_switch1.ctl -hda linux.hd

Puedes ejecutar desde tu host de máquinas virtuales un servidor de DHCP/DNS para proveer de dichos servicios en tu red virtual, yo uso dnsmasq:


dnsmasq --interface=tap0 --listen-address=172.16.16.1 --dhcp-authoritative --log-queries --dhcp-leasefile=/var/state/dnsmasq/tap0-dhcpd.leases --dhcp-range=interface:tap0,172.16.16.100,172.16.16.200,255.0.0.0,172.255.255.255,8h --pid-file=/var/run/dnsmasq-tap0.pid

Puedes crear más switches e inclusive interconectarlos, recomiendo leer al respecto VDE Basic Networking y Creating VLANs with multiple vde switches