Este procedimiento surge de la necesidad de crear interfaces virtuales para su uso por distintas máquinas virtuales de VirtualBox ejecutadas sobre un equipo anfitrión Kubuntu, pero es válido para cualquier otra situación en la que se necesiten crear interfaces virtuales en una máquina interconectados entre sí virtualmente.  En otras distribuciones debe bastar con sustituir los comandos de obtención de paquetes y poco más.

El procedimiento consiste en crear un interfaz bridge que sirva de conexión entre los interfaces virtuales y entre éstos y el resto de interfaces de la máquina. Para crear este tipo de interfaz se necesita instalar el paquete bridge-utils:

# apt-get install bridge-utils

También hará falta el paquete uml-utilities (no relacionado con diagramas UML, sino con User-Mode Linux):

# apt-get install uml-utilities

Puesto que en este caso se desea que estos interfaces estén disponibles siempre que se inicie la máquina se ha elaborado un conjunto de scripts que puedan configurarse para su ejecución al inicio del sistema y que capturan parte de la configuración de un fichero para facilitar la modificación del conjunto de interfaces virtuales deseados.

Hay un script principal pensado para aceptar los parámetros start y stop de modo que pueda configurarse como un servicio más y arranque automáticamente en los niveles de ejecución deseados y se detenga al salir de los mismos. Este será /etc/init.d/netbridges.

Dicho script utilizará a su vez otros cuatro destinados cada uno de ellos a una de las funciones para crear y eliminar los interfaces virtuales y habilitar y deshabilitar el encaminamiento de paquetes desde el interfaz bridge y sus interfaces con el resto de interfaces de la máquina para permitir a estos interfaces virtuales la comunicación con el exterior de la máquina anfitrión. Estos estarán situados en /usr/local/sbin y se llamarán addtap, deltap, nattap y unnattap respectivamente. Tanto addtap como deltap accederán al fichero /etc/local/network-bridges.conf para preparar la lista de interfaces virtuales a crear/eliminar, que estará formada por $NUMBER_OF_VM interfaces virtuales numerados desde $NB y por los interfaces separados por espacios indicados en $NAMED_TAPS.

/etc/local/network-bridges.conf

NUMBER_OF_VM=2
NB=1
NAMED_TAPS="tap_win"

Cada interfaz, a su vez, puede incluir comandos específicos de configuración en un fichero con el nombre tap<numero>.conf o <nombre>.conf situado en /etc/local/netbridges.d/:

/etc/local/netbridges.d/tap1.conf

ifconfig tap1 hw ether 00:ff:10:01:01:10

Los scripts son:

/etc/init.d/netbridges

#!/bin/sh -e                                         
### BEGIN INIT INFO                                  
# Provides:          netbridges                      
# Required-Start:    $network                        
# Required-Stop:     ifupdown $local_fs              
# Default-Start:     2                               
# Default-Stop:                                      
# Short-Description: Raise bridge network interfaces.
### END INIT INFO                                    

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

[ -x /sbin/ifup ] || exit 0

. /lib/lsb/init-functions

case "$1" in
start)      
 log_action_begin_msg "Configuring network bridge interfaces"

 if [ "$VERBOSE" != no ]; then
 if addtap; then          
 log_action_end_msg $?
 else                     
 log_action_end_msg $?
 fi                       
 else                         
 if addtap >/dev/null 2>&1; then
 log_action_end_msg $?      
 else                           
 log_action_end_msg $?      
 fi                             
 fi                                 

 unnattap
 nattap  
 ;;      

stop)
 log_action_begin_msg "Removing NAT with network bridge interfaces"

 unnattap

 log_action_begin_msg "Removing network bridge interfaces"

 if deltap >/dev/null 2>&1; then
 log_action_end_msg $?
 else
 log_action_end_msg $?
 fi
 ;;

force-reload|restart)
 if $0 stop; then
 log_action_end_msg $?
 else
 log_action_end_msg $?
 fi

 if $0 start; then
 log_action_end_msg $?
 else
 log_action_end_msg $?
 fi

 ;;

*)
 echo "Usage: /etc/init.d/netbridges {start|stop|restart|force-reload}"
 exit 1
 ;;
esac

exit 0

/usr/local/sbin/addtap

#!/bin/sh                                          
# set PATH for the case we are called via sudo or su root

PATH=/sbin:/usr/sbin:/bin:/usr/bin
USER=usuario_virtualbox                          

NUMBER_OF_VM=2
NB=1          

$LOCAL_ERRORS=0

if [ -f /etc/local/network-bridges.conf ];
then                                      
 . /etc/local/network-bridges.conf       
fi                                        

# create the bridge
brctl addbr br0    

# create the taps and insert them into the bridge

while [ $NB -le $NUMBER_OF_VM ];
do
 tunctl -t tap$NB -u $USER
 `cat /etc/local/netbridges.d/tap$NB.conf`
 ip link set up dev tap$NB
 brctl addif br0 tap$NB
 if ifconfig tap$NB; then
 echo Tun interface created: tap$NB
 else
 LOCAL_ERRORS=`expr $LOCAL_ERRORS + 1`
 fi
 NB=`expr $NB + 1`
 done

for TAP_NAME in $NAMED_TAPS; do
 tunctl -t $TAP_NAME -u $USER
 `cat /etc/local/netbridges.d/$TAP_NAME.conf`
 ip link set up dev $TAP_NAME
 brctl addif br0 $TAP_NAME
 if ifconfig $TAP_NAME; then
 echo Tun interface created: $TAP_NAME
 else
 LOCAL_ERRORS=`expr $LOCAL_ERRORS + 1`
 fi
done

# set the IP address and routing
ip link set up dev br0
ip addr add 10.1.1.1/24 dev br0
ip route add 10.1.1.0/24 dev br0 2> /dev/null

echo $LOCAL_ERRORS

/usr/local/sbin/deltap

#!/bin/sh
# set PATH for the case we are called via sudo or su root

PATH=/sbin:/usr/sbin:/bin:/usr/bin
USER=usuario_virtualbox

NUMBER_OF_VM=2
NB=1

if [ -f /etc/local/network-bridges.conf ];
then
 . /etc/local/network-bridges.conf
fi

# remove the taps and extract them from the bridge

while [ $NB -le $NUMBER_OF_VM ];
do
 sudo brctl delif br0 tap$NB
 tunctl -d tap$NB
 NB=`expr $NB + 1`
 echo Tun interface deleted: tap$NB
done

for TAP_NAME in $NAMED_TAPS; do
 sudo brctl delif br0 $TAP_NAME
 tunctl -d $TAP_NAME
 echo Tun interface deleted: $TAP_NAME
done

# remove the bridge
ip link set down dev br0
brctl delbr br0

/usr/local/sbin/nattap

#!/bin/bash

INTIF="br0"
EXTIF="wlan0"
echo 1 > /proc/sys/net/ipv4/ip_forward

# clear existing iptable rules, set a default policy
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
#iptables -P FORWARD DROP
iptables -P FORWARD ACCEPT
iptables -F FORWARD
iptables -t nat -F

# set forwarding and nat rules
iptables -A FORWARD -i $EXTIF -o $INTIF -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

# enable forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/ip_dynaddr

/usr/local/sbin/unnattap

# remove NAT rule
iptables -t nat -F
# disable forwarding
echo 0 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr

Bueno, pues eso es todo, los scripts podrían estar un poco mejor hechos, sobre todo con más información tomada del fichero de configuración, pero como base sirven.

Dejar una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes utilizar estas etiquetas y atributos HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.