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


É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


Voici un script en .command permettant de gérer automatiquement la bande passante.
📥 Télécharger bandwidth-limiter.command.zip



↑ Haut de page