Mapeo lógico de una interfaz de red
En este punto vamos a explicar cómo configurar un equipo con Debian GNU/Linux para que, durante el proceso de arranque y de forma totalmente automatizada, se escoja una determinada configuración lógica de red de entre varias disponibles. El caso más habitual es el de tener un portátil que se traslada a menudo desde una red en el trabajo, a otra distinta, en casa, por ejemplo.
Para hacer el mapeado lógico de una interfaz de red, el fichero /etc/network/interfaces aporta la siguiente sintaxis:
mapping <interface_name_glob>
script <script_name>
map <param_input1>
map <param_input2>
map ...
donde:
- <interface_name_glob> indica el dispositivo físico de red a mapear. Si van a mapearse más de uno, podemos indicarlos juntos separándolos con espacios (mapping eth0 eth1 ...).
- <script_name> hace referencia a un script que se encargará de determinar qué configuración lógica usar de entre las disponibles. Esta es la parte más complicada de todo el proceso.
- <param_inputN> se corresponde con una lista de parámetros, separados por espacios, que el script <script_name> recibirá por la entrada estándar. Desde el script podremos leerlos mediante el comando read valor1 valor2 [..] valorN, usando, si lo consideramos oportuno, una instrucción while o similar. Cada línea map va a representar el chequeo para una determinada interfaz lógica.
Veamos ahora, con más detalle, cómo debe ser el script que se encargará de seleccionar la interfaz lógica para asociarla con la interfaz física:
- El nombre de la interfaz física que está mapeando lo recibe como primer y único parámetro ($1). Si se estuviera mapeando más de una interfaz, se haría lo mismo con todas ellas, es decir, con la primera interfaz física se ejecutaría el script con la información de las líneas map para seleccionar una interfaz lógica (si no elige ninguna, la interfaz quedaría desconfigurada), y entonces, vuelta a empezar con la siguiente interfaz física indicada.
- El script recibe por la entrada estándar los valores de las líneas map, tal cual están escritos, y como una secuencia de líneas. Como ya se ha dicho, esta información puede recogerse con la instrucción read combinada con una instrucción while.
- Se espera que el script imprima por la salida estándar (usando el comando echo por ejemplo), el nombre de la interfaz lógica seleccionada. Obviamente, para que el script sepa cuáles son esos nombres, debemos pasárselos a través de las líneas map.
- Finalmente, el script debe terminar con un exit 0 en el caso de que queramos que se use el valor devuelto para configurar el dispositivo, o con exit 1 si queremos cancelar el proceso de configuración para ese mapeado.
Vamos a ver un ejemplo que nos podría servir para mapear la tarjeta de red de nuestro portátil que usamos en la red del trabajo y en la red de nuestra casa.
- Preparamos el bucle local:
auto lo
iface lo inet loopback
- Hacemos que al arrancar el equipo se cargue automáticamente la configuración de la interfaz física eth0:
auto eth0
- Creamos las interfaces lógicas:
iface casa inet static
address 192.168.1.200
netmask 255.255.255.0
gateway 192.168.1.1
network 192.168.1.0
broadcast 192.168.1.255
iface trabajo inet static
address 172.16.0.50
netmask 255.255.0.0
gateway 172.16.0.1
network 172.16.0.0
broadcast 172.16.255.255
- Preparamos las líneas del mapeado:
mapping eth0
script /root/bin/check-gw.bash
map 192.168.1.200/24 192.168.1.1 casa
map 172.16.0.50/16 172.16.0.1 trabajo
Como vemos, cada línea map lleva la información necesaria (ip, máscara, puerta de enlace y nombre de la interfaz lógica) para chequear la existencia de una puerta de enlace, pues esa será la tarea del script check-gw.bash, ya que esto determinará en qué red estamos.
- Creamos el script:
#!/bin/bash
declare interfaz_fisica ip gw interfaz_logica
interfaz_fisica=$1
while read ip gw interfaz_logica
do
ip address add $ip dev $interfaz_fisica
ip link set $interfaz_fisica up
if ping -c 4 $gw &> /dev/null
then
ip address del $ip dev $interfaz_fisica
ip link set $interfaz_fisica down
echo $interfaz_logica
exit 0
else
ip address del $ip dev $interfaz_fisica
ip link set $interfaz_fisica down
fi
done
exit 1
En el caso de usar el comando ifconfig en vez de ip, tendremos un problema, pues ifconfig no tiene una forma de eliminar la dirección ip de la tarjeta para poner otra a continuación, algo que sí se puede hacer con el comando ip usando la sintaxis address del. Una forma de resolver este problema es asignar con ifconfig una dirección errónea, por ejemplo la 0.0.0.0, lo cual provoca que la dirección ip previa de la tarjeta se borre, el único inconveniente es que se mostrará un mensaje de error, pero eso lo podemos solucionar redireccionando la salida de errores.
Por lo tanto, la instrucción:
ip address del $ip dev $interfaz_fisica
la sustituiríamos, en el caso de usar ifconfig en vez del comando ip, por la siguiente:
ifconfig $interfaz_fisica 0.0.0.0 netmask 0.0.0.0 2> /dev/null
Licencia: licencia de software libre GPL