Debian’s default TCP congestion control algorithm, CUBIC, relies on packet loss to detect network congestion. That works fine on local networks, but high-latency links, lossy connections, and long-distance transfers suffer because CUBIC backs off too aggressively. Google’s BBR (Bottleneck Bandwidth and Round-trip propagation time) takes a different approach: it measures actual bandwidth and round-trip time to keep throughput high without waiting for packets to drop. You can enable BBR on Debian with a kernel module load and two sysctl settings that persist across reboots.
Debian 13, 12, and 11 stock kernels include the tcp_bbr module. The same workflow loads that module, sets BBR as the default TCP congestion control algorithm, and keeps the setting active after reboot.
Check Current TCP Congestion Control on Debian
If this is a newly provisioned server, install available updates and reboot into the current kernel first. Then check which congestion control algorithm is active. Debian can keep /usr/sbin out of a normal user’s PATH, so these checks use sudo sysctl instead of a bare sysctl command:
These commands need administrative access for module loading and sysctl changes. If your user account lacks sudo access, follow the guide to add a user to sudoers on Debian first.
sudo sysctl net.ipv4.tcp_congestion_control
If BBR is already active, the output reads:
net.ipv4.tcp_congestion_control = bbr
If you see cubic or reno instead, BBR is not enabled and you can proceed to activate it.
Load the BBR Kernel Module on Debian
BBR requires Linux kernel 4.9 or later, and the Debian 13, 12, and 11 stock kernels are newer than that baseline. Load the BBR module to confirm your running kernel exposes it:
sudo modprobe tcp_bbr
No output means the module loaded successfully. Confirm BBR appears among the available congestion control algorithms:
cat /proc/sys/net/ipv4/tcp_available_congestion_control
reno cubic bbr
If modprobe fails or bbr does not appear, the running kernel may be older, custom-built, or missing the module. You can install the latest Linux kernel on Debian or use a performance-focused kernel such as XanMod or Liquorix when you need a kernel that documents BBR support.
Configure Persistent BBR Settings on Debian
With BBR confirmed available, configure it as the permanent default. Create a dedicated sysctl drop-in file in /etc/sysctl.d/ rather than editing /etc/sysctl.conf directly. The first line sets the Fair Queue (fq) packet scheduler, which BBR needs for proper pacing. The second line sets BBR as the default congestion control algorithm. The command pipes through sudo tee because a plain redirect like > does not inherit sudo privileges:
cat <<'EOF' | sudo tee /etc/sysctl.d/99-bbr.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
A dedicated file at /etc/sysctl.d/99-bbr.conf is easier to manage and remove than lines buried in /etc/sysctl.conf. These settings apply to both IPv4 and IPv6 TCP connections.
Because BBR is a loadable kernel module (not built-in) on Debian’s stock kernels, it must be loaded before the sysctl settings can take effect at boot. Create a module configuration file so the system loads tcp_bbr automatically on every startup:
echo 'tcp_bbr' | sudo tee /etc/modules-load.d/bbr.conf
The /etc/modules-load.d/ directory is the standard location for module loading configuration on modern Debian. The system reads it during early boot, before sysctl settings are applied.
Apply BBR Configuration Changes
Reload the sysctl configuration to apply changes immediately without a reboot. The --system flag loads the standard sysctl configuration directories, including the new drop-in file:
sudo sysctl --system
The command may print settings from several files. Verify the active values with direct sysctl reads before relying on the change.
Verify BBR is Active on Debian
Confirm BBR is the active congestion control algorithm:
sudo sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
Also confirm the Fair Queue scheduler is set:
sudo sysctl net.core.default_qdisc
net.core.default_qdisc = fq
To verify BBR is managing actual network connections, check an active TCP session:
ss -ti | grep -i bbr
Active connections established after enabling BBR show bbr as the congestion control algorithm along with BBR-specific diagnostics. A matching line looks similar to this, with bandwidth, RTT, and congestion-window values varying by connection:
bbr wscale:8,7 rto:208 rtt:4.508/8.149 ato:40 mss:1460 pmtu:1500 rcvmss:1460 advmss:1460 cwnd:21 bbr:(bw:160Mbps,mrtt:0.073,pacing_gain:2.88672,cwnd_gain:2.88672)
The bbr:(bw:...) section confirms BBR is actively pacing that connection. If you see no output, open a new connection (such as a fresh SSH session) and check again, since connections established before BBR was enabled continue using their original algorithm.
Troubleshoot BBR on Debian
BBR Module Not Found
If modprobe tcp_bbr fails with a “module not found” error:
modprobe: FATAL: Module tcp_bbr not found in directory /lib/modules/...
The running kernel does not expose the tcp_bbr module. Confirm you are booted into a supported Debian kernel with uname -r, then switch to a kernel that includes BBR support, such as XanMod on Debian or Liquorix on Debian, if the stock kernel path is not suitable.
sysctl Command Not Found
If a bare sysctl command returns command not found, use sudo sysctl or the full path /usr/sbin/sysctl. Minimal Debian shells often keep system administration commands outside the regular user PATH even when the command is installed.
BBR2 or BBR v3 Not Listed
Debian 13, 12, and 11 stock kernels expose reno cubic bbr after loading tcp_bbr. They do not expose a separate bbr2, bbrv3, or bbr3 sysctl name. If a third-party kernel advertises BBR2 or BBR v3, follow that kernel’s documentation and verify active behavior with the ss -ti connection check instead of assuming a new sysctl name exists.
BBR Settings Reset After Reboot
If BBR reverts to CUBIC after a reboot, verify both configuration files exist:
cat /etc/sysctl.d/99-bbr.conf
net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr
cat /etc/modules-load.d/bbr.conf
tcp_bbr
If the sysctl file is missing, recreate /etc/sysctl.d/99-bbr.conf with the BBR values. If the module loading file is missing, the kernel module does not load at boot and the sysctl settings fail silently. Create it with echo 'tcp_bbr' | sudo tee /etc/modules-load.d/bbr.conf and reboot to confirm persistence.
Disable BBR and Revert to CUBIC on Debian
To disable BBR and return to the default CUBIC algorithm, remove both configuration files:
The following commands modify system network configuration. While reverting to CUBIC is safe, ensure you have console access to your server in case of connectivity issues during remote sessions.
sudo rm -f /etc/sysctl.d/99-bbr.conf
sudo rm -f /etc/modules-load.d/bbr.conf
Apply the default runtime settings for your Debian release. Debian 13 and 12 normally use fq_codel, while Debian 11 normally uses pfifo_fast. If you previously used a custom queue scheduler, restore that value instead:
sudo sysctl -w net.ipv4.tcp_congestion_control=cubic
. /etc/os-release
if [ "$VERSION_ID" = "11" ]; then
sudo sysctl -w net.core.default_qdisc=pfifo_fast
else
sudo sysctl -w net.core.default_qdisc=fq_codel
fi
Verify the change:
sudo sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc
net.ipv4.tcp_congestion_control = cubic net.core.default_qdisc = fq_codel
Debian 11 shows net.core.default_qdisc = pfifo_fast when restored to its normal default. Reboot after removing the module-load file if you also want to unload tcp_bbr from memory.
Conclusion
BBR is now the default TCP congestion control on Debian, with Fair Queue pacing configured and persistence handled through dedicated drop-in files. Measure the effect with your own workload, especially long-distance SSH, file transfers, or public web traffic. Servers that install Nginx on Debian or install Apache on Debian benefit most when clients connect over high-latency paths.


Hi, I am on debian 12.10 but I have the error below when trying to enable bbr.
jq@debian:~$ sysctl net.ipv4.tcp_congestion_control
bash: sysctl: command not found
Thanks
use sudo for debian because privilege sensitive commands are placed in /sbin in Debian.