Dieser Artikel gehört zur Serie Linux-Router mit vielen Funktionen selber einrichten.
Ich nutze auf meinem Zotac den BitTorrent-Client Transmission. Nun möchte man natürlich während des Nutzen des Internets nicht durch aktive Torrents gestört werden. Aber immer auf die Webseite zu gehen und die Drosselung durch Klicken zu aktivieren, ist natürlich nicht praktikabel. Eine generelle Drosselung würde die Bandbreite in der Nacht und am Arbeitstag ungenutzt lassen.
Ziel war es also anhand der aktiven LAN-Geräte zu entscheiden, ob die Drosselung aktiviert werden soll. Dafür brauche ich eine Liste von wichtigen MAC-Adressen, bei denen die Drosselung aktiviert werden soll. Dazu zählen derzeit der Fernseher, mein und Annes Laptop. Smartphones, andere Laptops und Playstation brauchen nicht die volle Datennutzung.
#!/bin/bash LEASE_HOSTS=$(cat /var/lib/misc/dnsmasq.leases | awk '{print $3}') HOSTS=$(nmap -sP -n -oG - $LEASE_HOSTS | grep "Up" | awk '{print $2}') for host in ${HOSTS}; do /usr/sbin/arp -an | grep "(${host})" | awk '{print $4}' done
Zeile 3 speichert alle IPs, die derzeit vom DHCP-Server zugewiesen wurden. Zeile 4 man dann mittels nmap einen Ping-Scan nur auf diese Hosts, was bedeutend schneller ist, als an alle IPs des Netzwerks zu Pingen. In der Variable HOSTS
werden dann nur die Zeilen gespeichert, die Antworten, also online sind. Nun wird über die Einträge iteriert und über die ARP-Tabelle die zugehörige MAC-Adresse gesucht. Dieses Skript zeigt uns also alle MAC-Adressen, die derzeit auf einen Ping im Netzwerk reagieren.
Nun muss nur noch entschieden werden, ob es sich bei den Online-MACs um wichtige MACs handelt, bei denen man die Drosselung aktivieren sollte. Dafür habe ich mir ein kleines PHP-Projekt aufgesetzt, welches mittels PHP-FPM und Nginx eine Webseite anzeigt.
Die Webseite teilt sich in 4 Bereiche:
- Alle derzeitigen MACs die im Netzwerk online sind
- Derzeit nicht in die Konfiguration übernommene MACs
- Vorhandene Einträge und ihr derzeitiger Status
- Zustand der Drosselung (hier kann die Automatik überschrieben werden)
- Konfiguration der MACs. Die Spalten:
- Drosselung aktivieren
- MAC
- Kommentar
Die PHP-Dateien kann man im zugehörigen Github-Repository sehen.
Nun führe ich mittels Cronjob die Datei cronjob.php
alle 5 Minuten aus. Sie ruft intern das oben gezeigte Shellscript auf und prüft ob eine wichtige MAC dabei ist. Danach sendet sie mittels transmission-remote
Befehle an den Transmission-Client. Der Cronjob und die PHP-FPM-Daemon laufen bei mir unter einem unprivilegierten Benutzer.
Eine Beispielkonfiguration für Nginx könnte wie folgt aussehen:
server { # Nur SSL erlauben listen 443; ssl on; server_name drosselung.georf.de; ssl_certificate /etc/letsencrypt/live/zotac.georf.de/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/zotac.georf.de/privkey.pem; # Aufrufe mit Passwort schützen auth_basic "Wohnung"; auth_basic_user_file /etc/nginx/htpasswd_wohnung; # Root festlegen root /opt/throttling; index status.php; # Letsencrypt braucht kein Passwort location /.well-known/acme-challenge/ { root /tmp/certbot/; auth_basic off; } # PHP an FPM weiterleiten location ~ \.php$ { fastcgi_param SCRIPT_NAME $uri; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/php-fpm-www.sock; fastcgi_intercept_errors on; } location / { try_files $uri $uri/ =404; } }
1 thought on “Drosselung von Transmission bei aktiver LAN-Nutzung”