Limiter la bande passante sur macOS avec dnctl et pf
Introduction
macOS intègre nativement des outils puissants pour contrôler le trafic réseau. Contrairement aux applications tierces comme Little Snitch (qui ne fait que bloquer ou autoriser les connexions), les outils dnctl (dummynet) et pf (packet filter) permettent de faire du véritable traffic shaping : limiter le débit sans couper les connexions.
Cette méthode fonctionne sur macOS Tahoe (et versions antérieures) sans nécessiter de logiciel tiers.
Prérequis
- Accès administrateur : Les commandes nécessitent sudo
- Terminal : Toutes les manipulations se font en ligne de commande
- macOS : Testé sur macOS Tahoe, compatible avec les versions précédentes
Étape 1 : Créer un pipe dummynet
Un "pipe" dummynet est un canal virtuel par lequel transite le trafic avec une limite de débit définie.
# Créer un pipe limité à 40 Mbit/s
sudo dnctl pipe 1 config bw 40Mbit/s
# Vérifier la configuration
sudo dnctl list
La commande dnctl list affiche le pipe créé avec ses paramètres :
00001: 40.000 Mbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
Vous pouvez ajuster la valeur selon vos besoins : 10Mbit/s, 100Mbit/s, 1Gbit/s, etc.
Étape 2 : Créer les règles pf
Le fichier de règles indique à pf quel trafic doit passer par le pipe dummynet.
cat << 'EOF' | sudo tee /etc/pf.anchors/bandwidth > /dev/null
# Limiter tout le trafic sortant
dummynet out quick proto tcp from any to any pipe 1
dummynet out quick proto udp from any to any pipe 1
# Limiter tout le trafic entrant
dummynet in quick proto tcp from any to any pipe 1
dummynet in quick proto udp from any to any pipe 1
EOF
Note : Ces règles s'appliquent à tout le trafic TCP et UDP. Voir plus bas pour des règles plus ciblées.
Étape 3 : Référencer l'anchor dans pf.conf
Pour que pf charge les règles, il faut déclarer l'anchor "bandwidth" dans la configuration principale :
# Ajouter les références à l'anchor
echo 'dummynet-anchor "bandwidth"' | sudo tee -a /etc/pf.conf
echo 'anchor "bandwidth"' | sudo tee -a /etc/pf.conf
Étape 4 : Activer la configuration
Recharger pf et activer les règles :
# Désactiver pf temporairement
sudo pfctl -d
# Recharger la configuration principale
sudo pfctl -f /etc/pf.conf
# Charger les règles de l'anchor bandwidth
sudo pfctl -a "bandwidth" -f /etc/pf.anchors/bandwidth
# Réactiver pf
sudo pfctl -e
Les messages "No ALTQ support in kernel" sont normaux et n'affectent pas le fonctionnement.
Commandes utiles
Modifier le débit à chaud
Pas besoin de tout reconfigurer pour changer la limite :
# Passer à 100 Mbit/s
sudo dnctl pipe 1 config bw 100Mbit/s
# Passer à 10 Mbit/s
sudo dnctl pipe 1 config bw 10Mbit/s
Désactiver la limitation
# Vider les règles de l'anchor
sudo pfctl -a "bandwidth" -F all
# Supprimer le pipe dummynet
sudo dnctl -q flush
Vérifier l'état
# Voir les pipes actifs
sudo dnctl list
# Voir si pf est actif
sudo pfctl -s info | head -1
Variante : Limiter uniquement certains ports
Pour limiter uniquement le trafic web (HTTP/HTTPS) sans affecter le reste :
cat << 'EOF' | sudo tee /etc/pf.anchors/bandwidth > /dev/null
# Limiter uniquement HTTP et HTTPS
dummynet out quick proto tcp from any to any port {80, 443} pipe 1
dummynet in quick proto tcp from any to any port {80, 443} pipe 1
EOF
Points importants
- Non persistant : La configuration est perdue au redémarrage. Pour la rendre permanente, il faudrait créer un LaunchDaemon.
- Débit partagé : La limite s'applique au total de toutes les connexions passant par le pipe.
- Services système : Certains services Apple peuvent contourner les règles pf.
- SIP : System Integrity Protection n'empêche pas l'utilisation de pf/dnctl.
Voici un script en .command permettant de gérer automatiquement la bande passante.
📥 Télécharger bandwidth-limiter.command.zip
↑ Haut de page