Etiqueta: VirtualBox

  • Crear interfaces virtuales para VirtualBox

    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.