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.