Enable BBR on Debian 13 to make new TCP connections use BBR with the fq packet scheduler. You can apply the change immediately and make it persistent across reboots in about five minutes, without opening a new firewall port.
BBR does not increase your VPS plan’s bandwidth limit. It changes how Linux estimates available capacity and paces TCP traffic, so the result depends on the route, remote peer, and application.
Prerequisites
- A fresh Debian 13 (Trixie) VPS with a kernel newer than 4.9; the standard Debian 13 kernel is in the 6.12 series.
- SSH access as
root, or a normal user with workingsudoprivileges. - Permission to load kernel modules and write files below
/etc; an unprivileged container may not provide those capabilities. - No domain, web server, extra RAM, or extra disk space is required because BBR is a kernel-level TCP setting.
- If you need the server first, choose a Linux VPS from VPSLake and install Debian 13.
Step 1: Confirm Debian 13 and inspect the current TCP settings
Check the release, running kernel, and current congestion-control algorithm before changing anything. This catches a mismatched image or a provider-supplied kernel that may not expose BBR.
. /etc/os-release && printf '%s\n' "$PRETTY_NAME"
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
A normal Debian 13 installation reports Trixie and a 6.12-series kernel. cubic is commonly active before tuning, while the available list may not contain BBR yet.
Debian GNU/Linux 13 (trixie)
6.12.0-...-amd64
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic
The kernel revision and algorithm order vary with updates. Do not replace a working kernel merely to match the example output.
Step 2: Load BBR into the running kernel
The kernel must register BBR before a sysctl can select it, so load the module for the current boot and check the available algorithms immediately.
sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
The second command should now include bbr:
net.ipv4.tcp_available_congestion_control = reno cubic bbr
If BBR was already listed, modprobe simply confirms that the running kernel can use it. The order of the names is not important, and the module size or lsmod output is not a reliable success test on every kernel build.
Step 3: Save the module and sysctl settings
Keep the boot-time module request separate from the TCP parameters so each part is easy to inspect or remove later.
sudo tee /etc/modules-load.d/tcp-bbr.conf >/dev/null <<'EOF'
tcp_bbr
EOF
sudo tee /etc/sysctl.d/99-bbr-debian13.conf >/dev/null <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sudo sysctl -p /etc/sysctl.d/99-bbr-debian13.conf
The first file tells Debian’s boot services to make BBR available after a reboot. The second selects BBR for new TCP connections and sets fair queueing as the default scheduler; sysctl -p applies those values now.
Expected output:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
Debian reads local kernel-parameter files from /etc/sysctl.d/; the Debian Reference documents this configuration model.
Step 4: Apply fq to the active network interface
The default qdisc setting is used when an interface is initialized, but an interface that is already up can retain its previous queue, often fq_codel. Inspect the device carrying the default route and replace its live root qdisc when necessary.
MAIN_IFACE=$(ip -o route show default | awk '{print $5; exit}')
printf '%s\n' "$MAIN_IFACE"
tc qdisc show dev "$MAIN_IFACE"
The first line should print a device such as ens3 or eth0. If the final command does not show qdisc fq, apply fq for the current boot:
MAIN_IFACE=$(ip -o route show default | awk '{print $5; exit}')
sudo tc qdisc replace dev "$MAIN_IFACE" root fq
tc qdisc show dev "$MAIN_IFACE"
The result should contain qdisc fq:
ens3
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024
Interface names, counters, and queue limits differ between VPS images. The tc replacement changes the live device; the saved net.core.default_qdisc value handles future interface initialization and the next boot. Keep the VPS control panel console available if your provider recreates the network device during maintenance.
Verify BBR on Debian 13
Run this complete check to prove that BBR is available, selected, saved for the next boot, and paired with fq on the interface carrying normal traffic.
MAIN_IFACE=$(ip -o route show default | awk '{print $5; exit}')
sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc
sysctl net.ipv4.tcp_available_congestion_control
grep -Ev '^[[:space:]]*(#|$)' /etc/sysctl.d/99-bbr-debian13.conf
grep -Fx 'tcp_bbr' /etc/modules-load.d/tcp-bbr.conf
tc qdisc show dev "$MAIN_IFACE"
A successful check includes tcp_congestion_control = bbr, default_qdisc = fq, bbr in the available list, both assignments from 99-bbr-debian13.conf, the line tcp_bbr, and qdisc fq for the active device. These settings affect connections created after the change, so reconnect SSH or restart a long-lived service before comparing traffic.
For the meaning of the TCP controls, see the Linux kernel IP sysctl reference. BBR is enabled when the live values are correct; a speed increase is not guaranteed for every route or workload.
Troubleshooting
modprobe: FATAL: Module tcp_bbr not found
The running kernel does not provide the BBR module, or its matching module files are missing. Install Debian’s standard kernel meta-package and reboot into the newly installed kernel:
sudo apt-get update
sudo apt-get install -y linux-image-amd64
sudo reboot
After reconnecting, repeat Step 2. If the VPS still boots a provider-managed custom kernel, ask the provider for a Debian 13 kernel with BBR support rather than trying to copy a module from another kernel.
sysctl: cannot set net.ipv4.tcp_congestion_control
The sysctl file was applied before BBR became available. Load the module, confirm that bbr appears in the available list, and apply the Debian 13 file again:
sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
sudo sysctl -p /etc/sysctl.d/99-bbr-debian13.conf
If the error returns after every reboot, verify that /etc/modules-load.d/tcp-bbr.conf contains exactly tcp_bbr.
tc: command not found
The minimal image is missing iproute2, which supplies both ip and tc. Install it, then repeat Step 4:
sudo apt-get update
sudo apt-get install -y iproute2
RTNETLINK answers: Operation not permitted
This normally indicates an unprivileged container without the capability required to change a qdisc. The TCP setting may still be usable, but the live queue cannot be changed inside that container; enable BBR on the host or move the workload to a full VPS.
FAQ
Why does lsmod not always show tcp_bbr?
Some kernels build BBR into the kernel or expose it without the same module-list behavior. Use sysctl net.ipv4.tcp_available_congestion_control as the authoritative check that the running kernel offers bbr.
Does BBR require a firewall rule?
No. BBR changes TCP behavior inside the kernel and does not start a daemon or listen on a port. Leave your existing SSH and application firewall rules unchanged.
Will my current SSH session switch to BBR?
Do not assume that an already-open connection changes algorithm state. Reconnect SSH, or restart the service you are evaluating, after the verification commands report BBR.
How do I restore CUBIC?
Change net.ipv4.tcp_congestion_control = bbr to cubic in /etc/sysctl.d/99-bbr-debian13.conf, then run sudo sysctl -p /etc/sysctl.d/99-bbr-debian13.conf. You can keep the module-load file because loading BBR does not select it as the active algorithm.