Linux NetworkManager: scripts uitvoeren bij het wisselen van netwerk

Marco den Teuling
0

Inhoudsopgave

    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

    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:

    Ontvang elke week het laatste IT-nieuws, de handigste tips en speciale aanbiedingen.

    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

    NetworkManager-acties


    Ontvang informatie en tips over Linux, schrijf je in voor de gratis nieuwsbrief:

    Ontvang elke week het laatste IT-nieuws, de handigste tips en speciale aanbiedingen.

    Deel dit artikel

    Marco den Teuling
    Marco den TeulingHad als eerste eigen computer ooit een 16-bit systeem, waar van de 48 kilobyte toch echt niet ‘genoeg voor iedereen’ was. Sleutelt graag aan pc’s, van de hardware tot het uitpluizen van de BIOS-instellingen. Vindt ‘Software as a Service’ een onbedoeld ironische naamgeving.

    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.

    0 Praat mee
    avatar
      Abonneer  
    Laat het mij weten wanneer er