En este artículo se explica cómo configurar un equipo con Linux para que, durante el proceso de arranque y de manera totalmente automatizada, se escoja una determinada configuración de red de entre varias disponibles. El caso más habitual es el de tener un portátil que se traslada a menudo de una red en el trabajo a otra, distinta, en casa.
Esta es la información técnica relevante del software y hardware que se ha utilizado para este artículo:
- Fichero de configuración /etc/network/interfaces
- Paquetes iproute e ifupdown
- Red de casa:
- Dirección IP: 192.168.0.6
- Máscara de red: 255.255.255.0
- Gateway: 192.168.0.254
- Red del trabajo:
- Dirección IP: 195.164.0.6
- Máscara de red: 255.255.255.0
- Gateway: 195.164.0.150
Se suponen ciertos conocimientos básicos de scripting en la shell bash de linux u otra alternativa.
/etc/network/interfaces. Éste es el fichero donde desarrollaremos el trabajo. Debería tener más o menos la siguiente apariencia antes de empezar:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.6
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254
Lo que vamos a hacer a continuación es añadir diversas líneas a este mismo fichero, de modo que dispongamos de una configuración ethernet para casa eth0-home y otra para el trabajo eth0-work.
auto lo
iface lo inet loopback
auto eth0
mapping eth0
script /usr/local/sbin/ping-places.sh
map 192.168.0.6/24 192.168.0.254 eth0-home
map 195.164.0.6/24 195.164.0.150 eth0-work
# Ethernet HOME
iface eth0-home inet static
address 192.168.0.6
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254
# Ethernet WORK
iface eth0-work inet static
address 195.164.0.6
netmask 255.255.255.0
network 195.164.0.0
broadcast 195.164.0.255
gateway 195.164.0.150
El proceso que hemos seguido para llegar a esta múltiple configuración automática de nuestra ethernet se basa, principalmente, en lo que se conoce como mapeado lógico eth0-home y eth0-work del dispositivo físico de red eth0. Para ello deben seguirse los siguientes pasos:
- Crear las distintas configuraciones de red que nos interesen. En el ejemplo han sido dos, las cuales han sido etiquetadas como eth0-home y eth0-work. Por supuesto, podemos asignar distintas configuraciones a más de un dispositivo, por ejemplo eth0 y eth1, en el caso de que tuviésemos una tarjeta pcmcia.
-
Realizar el mapeado lógico de los dispositivos físicos. En el ejemplo se lleva a cabo mediante las siguientes cuatro instrucciones:
mapping eth0
script /usr/local/sbin/ping-places.sh
map 192.168.0.6/24 192.168.0.254 eth0-home
map 195.164.0.6/24 195.164.0.150 eth0-work
- mapping eth0 indica el dispositivo físico a mapear. Si van a mapearse más de uno podemos usar mapping eth0 eth1.
- script /usr/local/sbin/ping-places.sh hace referencia a un script que se encargará de determinar qué configuración lógica usar de entre las disponibles. Ésta es la parte más complicada de todo el proceso y se detalla a continuación:
Este script, que deberemos construir a nuestra medida, recibirá los siguientes parámetros:
- $1 tendrá como valor la interfaz física que estamos mapeando. En el ejemplo valdrá eth0. En el caso de hacer un mapeado de múltiples dispositivos físicos simultáneamente mediante mapping eth0 eth1 [..] la llamada al script con los parámetros que se están explicando se repetiría para cada uno de los dispositivos. Es decir, en una primera llamada valdría eth0, en la posterior valdría eth1, y así sucesivamente.
- A partir de aquí, el script recibirá por la entrada estándar los valores que, separados por espacios, hayamos preparado mediante las instrucciones map. Es decir, mediante el comando map, pasaremos al script como valores lo que tras él hayamos puesto, separado por espacios. Desde el script podremos leerlos mediante el comando read valor1 valor2 [..] valorn, usando, si lo consideramos oportuno, una instrucción while o similar.
- Como parámetros de salida se espera, por la salida estándar (usando el comando echo por ejemplo), uno de los valores que hay al final de cada comando map y que coinciden exactamente con los valores lógicos que hemos asignado al dispositivo físico, que en el ejemplo serían eth0-home o eth0-work.
- 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.
- map 192.168.0.6/24 192.168.0.254 eth0-home y map 195.164.0.6/24 195.164.0.150 eth0-work. Puede observarse que el uso de la opción map es dependiente de los parámetros esperados por el script, es decir, no es algo genérico el que debamos pasarle una IP deseada, una máscara, una IP a hacer ping y un nombre de dispositivo lógico. Evidentemente, el número de parámetros variará dependiendo de la implementación del script que tiene por finalidad detectar en qué red nos encontramos y devolver un valor de salida que así lo indique. De hecho, el uso de la opción map no es obligatorio, a diferencia de la opción script, que sí lo es.
Para realizar este ejemplo se ha usado la documentación disponible en la página del manual interfaces (man interfaces) así como los ejemplos disponibles en /usr/share/doc/ifupdown/examples, especialmente el fichero /usr/share/doc/ifupdown/examples/network-interfaces.gz. Precisamente uno de los métodos sugeridos para un caso como el de quien escribe era el de hacer ping a una de las máquinas que se sepa con certeza que estará en la red. En el ejemplo,
- se pasa como primer parámetro la IP deseada dentro de la red (terminaría en algún número poco probable, como 253 o 254, en caso de usarse dhcp), una barra separatoria y la máscara de red como suma número de bits a uno (en el ejemplo 24 unos en binario equivaldrían a la conocida 255.255.255.0 en decimal);
- se pasa como segundo parámetro la IP local del router de cada red para hacerle ping;
- y se pasa como tercer parámetro, como ya se ha comentado anteriormente, el valor esperado de salida si esa opción map es la que, finalmente, el script determina que deba usarse.
Y eso es exactamente lo que hace el script /usr/local/sbin/ping-places.sh. Puede verse su contenido en /usr/share/doc/ifupdown/examples/ping-places.sh si se tiene instalado el paquete ifupdown. Asimismo, en dicho directorio hay otros ejemplos útiles, como la detección de tarjetas a partir de la dirección MAC.
A partir de aquí ya tenemos todo el trabajo hecho. Debido a que hemos puesto la opción auto eth0 en el fichero de configuración /etc/network/interfaces, de lo único de lo que deberemos asegurarnos es de tener el cable de red enchufado antes de encender el equipo, pues el resto se hará solo al arrancar. Además, si deseamos cambiar de red sin reiniciar el equipo, tan sólo debemos conectarnos físicamente a ella y hacer un ifdown eth0 seguido de un ifup eth0: nuestro querido Linux se encargará de todo.