Maneja tus interfaces de red con Systemd
Desde hace unos meses estoy usando systemd-networkd y systemd-resolved para gestionar mis interfaces de red. He de decir que hasta ahora estoy muy contento con systemd-networkd, bueno… y con systemd en general (con esta frase algunos ya estarán buscando mi dirección postal para tenderme una emboscada), y no he notado problemas ni bugs importantes con su uso.
Voy a explicar en esta entrada como configurar las interfaces de red con el siguiente esquema:
- br0: Bridge-linux principal del sistema, aquí estará conectada eth0.
- eth0: interfaz principal.
- br1: Bridge-linux aislado, por ejemplo para su uso con máquinas virtuales usando qemu y libvirt, con un mini-servidor dhcp usando las opciones de networkd.
- wlan0: Interfaz wireless (aquí explicaré como tener varias redes wireless asociadas).
systemd-networkd
Ubicación y nombre de los archivos
Los archivos que definen la red usando systemd-networkd se guardan en: /etc/systemd/network
nombre.netdev : para la creación de interfaces.
nombre.network : para la definición de los parámetros de la red local.
Creando interfaces bridge-linux
Bridge principal br0: /etc/systemd/network/br0.netdev
[NetDev] Name=br0 Kind=bridge # Le asigno la misma MAC que tiene eth0 MACAddress=b0:bb:aa:11:22:33
Bridge aislado br1: /etc/systemd/network/br1.netdev
[NetDev] Name=br1 Kind=bridge
Definiendo los parámetros de la red ethernet (cableada)
Bridge principal br0: /etc/systemd/network/br0.network
[Match] Name=br0 [Network] DHCP=ipv4 [DHCP] UseDomains=yes RouteMetric=10
Interfaz de red eth0: /etc/systemd/network/eth0.network
[Match] Name=eth0 [Network] Bridge=br0
Bridge aislado br1: /etc/systemd/network/br1.network
[Match] Name=br1 [Network] Address=10.10.5.1/24 DHCPServer=yes [DHCPServer] PoolOffset=100 PoolSize=100 DefaultLeaseTimeSec=1y MaxLeaseTimeSec=1y EmitTimezone=yes Timezone="Europe/Madrid"
Definiendo la red wireless (wlan0)
Para la red wireless también es necesario el uso de un servicio externo, wpa_supplicant.
Hay que lanzar el servicio wpa_supplicant@wlan0.service, este servicio leerá la configuración desde /etc/wpa_supplicant/wpa_supplicant-wlan0.conf (wlan0 es el nombre que tiene nuestra interfaz wireless, por ejemplo, obtenido con `ip l`).
wpa_supplicant-wlan0.conf contendrá una lista de las redes con los datos de ellas cuya prioridad es posicional con respecto del inicio del fichero (más abajo pondré el mío).
Y por último hay que escribir el fichero correspondiente en /etc/systemd/network
Interfaz wlan0: /etc/systemd/network/wlan0.network
[Match] Name=wlan0 [Network] DHCP=ipv4 [DHCP] RouteMetric=20
En las opciones de la sección DHCP, tanto de br0.network com de wlan0.network, hay una directiva de bastante utilidad. En el caso de obtener parámetros de red por DHCP podemos definir la prioridad en el uso de las rutas. Esa directiva es `RouteMetric`, que recibe un entero como valor, cuanto menor sea este número, más prioridad tendrá esa ruta.
Fichero de wpa_supplicant
Definir el fichero ‘/etc/wpa_supplicant/wpa_supplicant-wlan0.conf‘ con el siguiente comando:
wpa_passphrase SSID contraseña >> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
Comforme vayamos definiendo redes wifi el fichero tendrá una composición como esta:
network={ ssid="UCO" #psk="hackme1" psk=477b8620612345566da0baf18ea775b9abcde4ae95032641b7f7b0b46f61a75f7 } network={ ssid="ONOE679-5G" #psk="hackme2" psk=550c41b6e53e4236234070b4100e972d856b501f23da604fa51805e68c2bf6f0 } network={ ssid="micasawlan" #psk="hackme3" psk=d876aecefd6b34cbd2019bd6561e6faabf30cb50c9a6c237c225624c3e9926ef }
systemd-resolved
Este servicio es el encargado de escribir resolv.conf, una vez ejecutado hay que enlazar el fichero dónde él escribe hacia /etc/resolv.conf
ln -sf /run/sytemd/resolve/resolv.conf /etc/resolv.conf
systemd-networkd-wait-online
Hay servicios, como autofs.service, en cuyas directivas de inicialización tienen como requisito que la red local esté activa y configurada correctamente:
[Unit] Description=Automounts filesystems on demand After=network-online.target network.target ypbind.ser .... Wants=network-online.target ... ...
Esa directiva solo funciona como debe si systemd-networkd-wait-online.service corre en nuestro sistema, así que es altamente recomendable tenerlo activo.
Solo un dato sobre el servicio. Ese servicio, por defecto, espera que todas las interfaces estén configuradas así que se podría dar el caso que solamente nos interese que compruebe una sola interfaz de red, consiguiendo 2 cosas:
- Que el arranque del sistema sea más rápido
- Que no devuelva error en el caso de que una interfaz no siempre sea levantada, por ejemplo, wlan0.
Este servicio ejecuta el siguiente comando:
... ExecStart=/usr/lib/systemd/systemd-networkd-wait-online ...
Tiene tres parámetros:
-i, –interface=
–ignore=
–timeout=
-i, –interface: ciega hacia la interfaz especificada, se puede repetir este parámetro junto con su valor tantas veces como interfaces queremos establecer la espera.
–ignore: interfaces que queremos ignorar, también hay que repetir este parámetro tantas veces como estimemos necesario.
Para nuestro caso podría quedar asi:
... ExecStart=/usr/lib/systemd/systemd-networkd-wait-online -i br0 ...
Lanzando los servicios necesarios
Antes de lanzar los servicios hay que comprobar dos cosas:
- Comprobar que no hemos modificado ningún .service de usuario o de sistema:
En ese caso hay que recargar los servicios.
systemctl daemon-reload
- Comprobar que no existe ningún otro servicio de red que actúe sobre las interfaces que estamos asignándole a systemd:
En ese caso hay que pararlas y deshabilitarlas si fuese necesario.
Los servicios los podemos lanzar de varias formas:
# 1. lanzarlos pero NO activarlos cuando se inicie el sistema systemctl start systemd-networkd-wait-online.service \ systemd-networkd.service \ systemd-resolved.service \ wpa_supplicant@wlan0.service # 2. activarlos para que inicien en el próximo arranque del sistema systemctl start systemd-networkd-wait-online.service \ systemd-networkd.service \ systemd-resolved.service \ wpa_supplicant@wlan0.service
# 3. activarlos para que inicien en el próximo arranque del sistema # y además que se ejecuten ahora mismo ( --now )) systemctl start systemd-networkd-wait-online.service \ systemd-networkd.service \ systemd-resolved.service \ wpa_supplicant@wlan0.service --now
Nota final
systemd-networkd tiene multitud de opciones, todo es cuestión de leer los man pages de systemd.network para ver cuáles nos pueden ser útiles.
Siéntete libre de usar los comentarios para ponerme a parir (siempre que sea sobre este artículo en cuestión), para compartir, preguntar dudas o para que rectifique cualquier error que haya podido cometer en el artículo, que seguro que los hay.
Todo está hecho sobre archlinux, si haces esto mismo sobre otra distro y quieres compartir las diferencias o errores que te vas encontrando, también serás bienvenida/o.
Conclusiones
A mi forma de verlo, y comparándolo con el clásico /etc/network/interfaces de distribuciones tipo debian/ubuntu, creo que esta forma es más clara y sencilla de manipular en caso de necesitar modificaciones vía scripts bash/python/perl.
Usar systemd-networkd tiene la ventaja de poder trabajar cómodamente con la red en el caso de que también usemos systemd-nspawn para lanzar contenedores con systemd.
Comentarios recientes