Bij veel Linux-distributies zorgt de NetworkManager-daemon meestal onopvallend op de achtergrond voor de netwerkverbindingen. Maar die service kan naar wens ook scripts uitvoeren bij het wisselen van netwerk. We laten zien hoe je zelf zo’n script maakt om de NetworkManager in Linux te gebruiken.
Linux NetworkManager: scripts uitvoeren bij het wisselen van netwerk
Wat kun je met de Linux NetworkManager?
De daemon NetworkManager gaat verder dan wat zijn grafische gebruikersinterfaces in Gnome, Cinnamon en andere Linux-desktops suggereren. Het probeert automatisch een werkende netwerkverbinding op de achtergrond tot stand te brengen via een bekabelde aansluiting, wifi of VPN zoals NordVPN. NetworkManager biedt ook een service genaamd de Dispatcher, die zelf gemaakte scripts uitvoert wanneer er wijzigingen zijn in de netwerkverbinding. Je kunt bijvoorbeeld automatisch een netwerkshare mounten zodra je laptop verbinding maakt met het thuisnetwerk. Of je kunt de accuduur verlengen door wifi uit te schakelen zodra je een netwerkkabel aansluit.
Hoe werkt de Linux NetworkManager?
NetworkManager doorzoekt de directory’s /etc/NetworkManager/dispatcher.d en /usr/lib/NetworkManager/dispatcher.d en voert de aanwezige uitvoerbare scripts in alfabetische volgorde uit bij het maken van een verbinding. Bij het verbreken wordt de omgekeerd alfabetische volgorde gevolgd. Voor de duidelijkheid is het handig scriptnamen met cijfers te beginnen (10-scripta, 20-scriptb).
Het opslaan van scripts
Aangezien /usr/lib bedoeld is voor distributiescripts, moet je je eigen scripts opslaan in /etc/ NetworkManager/dispatcher.d, zodat die niet overschreven of verwijderd worden tijdens updates. Het script moet toebehoren aan de gebruiker root en alleen die mag schrijftoegang hebben, anders zal NetworkManager het negeren.
Argumenten doorgegeven aan scripts
Wanneer het wordt aangeroepen, geeft NetworkManager twee argumenten door aan de scripts: de naam van de netwerkinterface (enx…, tun1 …), gevolgd door de gebeurtenis die de trigger is (up, down, dhcp4-change …), ook wel actie genoemd. Mogelijke waarden staan in de tabel NetworkManager-acties. Bij VPN-verbindingen via plug-ins worden de actienamen voorafgegaan door vpn- (vpn-up, vpn-pre-down …). Dat geldt niet voor (native) WireGuard-verbindingen.
Ontvang informatie en tips over Linux, schrijf je in voor de gratis nieuwsbrief:
Uitvoering van pre-up/pre-down
De acties pre-up/pre-down worden alleen uitgevoerd wanneer NetworkManager de netwerkinterface zelf activeert of deactiveert. Als je bijvoorbeeld de netwerkkabel loskoppelt, heeft NetworkManager niet langer de mogelijkheid om pre-down aan te roepen. Bovendien worden daarbij alleen scripts uitgevoerd die aanwezig zijn in de subdirectory’s pre-up.d of pre-down.d. Het is echter genoeg om een in dispatcher.d aanwezig script te koppelen.
Speciaal geval voor hostname en connectivity-change
De acties hostname en connectivity-change zijn een speciaal geval, die geven none of een leeg veld door als interfacenaam.
Een script maken met Linux NetworkManager
Met het voorbeeldscript hieronder kun je energie besparen door de wifi-interface uit te schakelen wanneer er een netwerkkabel wordt aangesloten. In de alinea’s hieronder zullen we het voorbeeldscript verder voor je toelichten.
#!/bin/bash
IFACE=”$1″; EVENT=”$2″
# Lijst van te monitoren netwerknamen
DEVICES=”eth0 enx1234567890AF”
# Debug-informatie
logger “Netwerk-dispatcher: iface:$IFACE event:$EVENT” \
“id: $CONNECTION_ID uuid: $CONNECTION_UUID”
# Als $DEVICES de tekenreeks uit $IFACE bevat, dan…
if [[ $DEVICES =~ $IFACE ]]; then
# Afhankelijk van EVENT, wifi aan- of uitschakelen.
case “$EVENT” in
up)
logger “Netwerk-dispatcher: schakel wifi uit.”
nmcli radio wifi off ;;
down)
logger “Netwerk-dispatcher: schakel wifi aan.”
nmcli radio wifi on ;;
esac
fi
Argumenten toewijzen aan variabelen
Om de leesbaarheid te vergroten, wijst regel 2 de doorgegeven argumenten toe aan de variabelen $IFACE en $EVENT. De parameters $1 en $2 staan tussen aanhalingstekens om te voorkomen dat een leeg veld, zoals bij connectivity-change, fouten veroorzaakt. Om het debuggen te vergemakkelijken, schrijft de logger details van de dispatcher-aanroep naar het systeemlogboek. Je kunt dit bekijken door journalctl -f aan te roepen in een terminalvenster.
Andere omgevingsvariabelen ophalen
Naast de doorgegeven parameters zijn er andere omgevingsvariabelen die je in je script kunt ophalen. Zo bevat $CONNECTION_ID de naam van de verbinding. Een lijst van de beschikbare variabelen is te vinden in de manpage, die je kunt oproepen met man NetworkManager-dispatcher. Sommige variabelen zijn alleen beschikbaar voor bepaalde acties, bijvoorbeeld $CONNECTIVITY_STATE voor connectivity-change.
Bewaakte netwerkinterfaces
Het script definieert een lijst van te bewaken netwerkinterfaces in $DEVICES. Je kunt deze namen vinden met ip link. Als de interfacenaam die door dispatcher wordt doorgegeven op de lijst voorkomt, verwerkt het script de actie. Als de actie up is, deactiveert de opdrachtregeltool nmcli de wifi-interface. Als de actie down is, oftewel de LAN-interface gedeactiveerd is, schakelt nmcli de wifi-interface weer in. Het programma nmcli hoort bij NetworkManager.
Kopieer het script naar de juiste directory
Kopieer het voltooide script met rootrechten naar /etc/NetworkManager/dispatcher.d. Ga vervolgens naar die directory en pas de bestandsrechten aan:
sudo -i
cd /etc/NetworkManager/dispatcher.d/
sudo chmod 755 50-wifi-switch.sh
sudo chmod a+x 50-wifi-switch.sh
Script uitvoeren met NetworkManager
Om NetworkManager het script voortaan te laten uitvoeren, herstart je de service via Systemd:
sudo systemctl restart NetworkManager
Controleer of NetworkManager het script uitvoert
Gebruik journalctl -f om te zien of de Linux NetworkManager correct start en het script uitvoert wanneer de netwerkkabel wordt aangesloten of losgekoppeld.
Gebruikstips voor Linux NetworkManager
Om ervoor te zorgen dat scripts snel werken, is het belangrijk om rekening te houden met de tijd die het script nodig heeft om te voltooien. NetworkManager heeft namelijk geen exacte limiet voor de uitvoeringstijd van scripts en breekt deze af als het te lang duurt.
Gebruik subdirectory no-wait.d voor parallelle scripts
Als scripts parallel moeten starten, bewaar of koppel deze dan in de subdirectory no-wait.d. NetworkManager wacht niet op scripts en beëindigt ze ook niet als er ondertussen een nieuwe netwerkactie is. Hierdoor kan het voorkomen dat een script blijft proberen om een netwerkshare te mounten bij het maken van een verbinding met het bedrijfsnetwerk, terwijl de netwerkkabel snel achter elkaar wordt aangesloten en losgekoppeld.
Automatiseer acties bij wijziging netwerkverbinding
Door rekening te houden met de snelheid van scripts en parallelle uitvoeringen, kunnen acties geautomatiseerd worden die moeten worden uitgevoerd bij het wijzigen van de netwerkverbinding. Zo kan je ervoor zorgen dat het automatiseren van deze acties op een veilige en efficiënte manier gebeurt.
NetworkManager-acties
Ontvang informatie en tips over Linux, schrijf je in voor de gratis nieuwsbrief:
Lees ook
Zo installeer je NextCloud op een Raspberry Pi met NextCloudPi
De voordelen van de cloud zonder je data weg te geven: NextcloudPi voor de Raspberry Pi maakt het mogelijk. Zo installeer je het.
Met een Raspberry Pi wifi bewaken door gebruik te maken van Nzyme
Iedereen kan computers en andere apparaten in je wifi aanvallen, vaak zonder dat je iets doorhebt. Met deze workshop kun je je wifi bewaken.