How to Enable BBR on Ubuntu 25.10 (Step-by-Step)

Learn how to enable bbr on ubuntu 25.10, persist fq and module loading, verify the live qdisc, and fix common VPS errors without opening network ports.
A glowing cyan network path passes through a server rack beside a speed gauge with a subtle orange accent on a midnight-blue background.

Enable BBR on Ubuntu 25.10 to make new TCP connections use a modern congestion-control algorithm and the fq packet scheduler. You will apply the change immediately, save it for future boots, and confirm the live network queue in about five minutes.

Prerequisites

  • An Ubuntu Server 25.10 (Questing Quokka) VPS with a kernel newer than 4.9; the release normally uses the Linux 6.17 kernel.
  • SSH access as root, or a normal user with working sudo privileges.
  • Permission to load kernel modules and write under /etc; an unprivileged container may not allow those operations.
  • The iproute2 package, which provides ip and tc, should be installed. No domain, web server, extra RAM, or extra disk is required.
  • Ubuntu 25.10 is an interim release with a nine-month support window; if you are provisioning a new server, check the supported-release options with your provider first.
  • If you need the server, start with a Linux VPS from VPSLake and choose Ubuntu 25.10 when available.

BBR changes TCP pacing and capacity estimation; it does not increase the bandwidth limit of your plan. The result depends on the route, the remote peer, and the application generating traffic.

Step 1: Inspect Ubuntu and the current TCP configuration

Check the release, running kernel, available algorithms, and tc command before changing anything so you know which kernel is actually handling the VPS network.

cat /etc/os-release
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
command -v tc

On a standard Ubuntu 25.10 image, the release identifies Questing Quokka and the kernel begins with 6.17. The active algorithm is usually cubic; bbr may already be listed if the module is built in or was loaded by the image.

PRETTY_NAME="Ubuntu 25.10"
VERSION_CODENAME=questing
6.17.0-...-generic
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic
/usr/sbin/tc

Kernel suffixes and algorithm order vary by image and provider. Do not replace a working provider kernel just to reproduce the sample output.

Step 2: Load BBR in the running kernel

The kernel must register BBR before a sysctl can select it, so load the module first and then inspect the available list.

sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control

The second command should now contain bbr:

net.ipv4.tcp_available_congestion_control = reno cubic bbr

If bbr was already present, modprobe simply confirms that the running kernel can use it. Some Ubuntu kernels expose the algorithm without a separate line in lsmod, so the available-algorithm sysctl is the useful check rather than the module listing alone.

Step 3: Save BBR and fq across reboots

Keep the boot-time module request separate from the sysctl drop-in so you can audit or remove this tuning without editing Ubuntu’s general configuration.

sudo tee /etc/modules-load.d/tcp-bbr.conf >/dev/null <<'EOF'
tcp_bbr
EOF
sudo tee /etc/sysctl.d/99-ubuntu-bbr.conf >/dev/null <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sudo sysctl -p /etc/sysctl.d/99-ubuntu-bbr.conf

The first file tells systemd to request tcp_bbr during later boots. The second selects BBR for new TCP connections and sets fair queueing as the default scheduler; sysctl -p applies both values now.

Successful output looks like this:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

Ubuntu reads local kernel-parameter drop-ins from /etc/sysctl.d/. The Ubuntu 25.10 release notes also matter here because this release packages kernel modules in linux-modules-<version>-<flavor> packages rather than the older linux-modules-extra-* pattern.

Step 4: Check the queue on the active interface

net.core.default_qdisc sets the default for interfaces initialized later, while the interface already carrying your SSH session may still have another queueing discipline.

MAIN_IFACE=$(ip route show default | awk '/^default/ {print $5; exit}')
printf 'Default interface: %s\n' "$MAIN_IFACE"
sudo 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, replace the live root queue without bringing the interface down:

sudo tc qdisc replace dev "$MAIN_IFACE" root fq
sudo tc qdisc show dev "$MAIN_IFACE"

Look for qdisc fq in the result:

Default interface: ens3
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024

The device name and queue details differ between VPS images. The tc replacement is runtime state and can be lost when the interface is recreated; the saved net.core.default_qdisc value applies when the interface is initialized again. Do not restart the network profile over SSH unless you have the VPS control panel console available.

Verify BBR on Ubuntu 25.10

Run this final check to confirm that the algorithm is active, the configuration is saved, BBR is available, and fq is attached to the default-route interface.

MAIN_IFACE=$(ip route show default | awk '/^default/ {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-ubuntu-bbr.conf
grep -Fx 'tcp_bbr' /etc/modules-load.d/tcp-bbr.conf
sudo tc qdisc show dev "$MAIN_IFACE"

You want tcp_congestion_control = bbr, default_qdisc = fq, bbr in the available list, both assignments from 99-ubuntu-bbr.conf, the line tcp_bbr, and qdisc fq for the active interface. The Linux kernel IP sysctl reference notes that tcp_congestion_control selects the algorithm for new connections, so reconnect SSH clients or restart a long-lived service before comparing traffic.

Troubleshooting

modprobe: FATAL: Module tcp_bbr not found

The running kernel does not have its matching BBR module installed, or the VPS is using a custom provider kernel. Ubuntu 25.10 places modules in a versioned linux-modules package, so try the package matching the kernel you are running:

sudo apt-get update
sudo apt-get install --reinstall "linux-modules-$(uname -r)"
sudo modprobe tcp_bbr

If APT cannot find that exact package, a standard generic image may need the generic kernel meta-package instead:

sudo apt-get install -y linux-generic
sudo reboot

After reconnecting, run Step 2. For a provider-managed kernel, ask the provider for a kernel with BBR support rather than mixing an unrelated module package into the running 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, and apply the dedicated file again:

sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
sudo sysctl -p /etc/sysctl.d/99-ubuntu-bbr.conf

If the error returns after every reboot, check that /etc/modules-load.d/tcp-bbr.conf contains exactly tcp_bbr and that the VPS is booting the kernel you inspected with uname -r.

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

The VPS is likely an unprivileged container without the CAP_NET_ADMIN capability required to replace a qdisc. The TCP sysctl may still work, but the live fq queue cannot be changed from inside that container; use a full VPS or ask the provider to enable the needed traffic-control capability.

FAQ

Does BBR increase the bandwidth of my VPS?

No. BBR changes how the kernel estimates path capacity and paces TCP packets, but it cannot raise the network limit attached to your plan. A remote server, congested route, or application limit can still be the bottleneck.

Why is BBR available but not active?

Loading tcp_bbr only registers the algorithm with the kernel. The net.ipv4.tcp_congestion_control = bbr setting selects it for new TCP connections, so check both the live sysctl value and the saved drop-in.

Does BBR tune UDP traffic too?

No. The setting is specifically for TCP congestion control. UDP applications need their own rate-control behavior and are unaffected by this choice.

Do I need to reboot Ubuntu 25.10?

No reboot is required when modprobe and sysctl -p succeed; the running kernel uses the new values immediately. The files under /etc/modules-load.d/ and /etc/sysctl.d/ make the configuration available after a later reboot.

Samrat Ghosh
Written by

Samrat Ghosh

Founder & Infrastructure Engineer

Samrat Ghosh is the founder of VPSLake, where he builds and runs the remote desktop and VPS hosting infrastructure the company is built on. He writes hands-on guides about RDP, Windows Server, VPS management and secure remote access - the practical documentation he wishes had…

Previous Article

Fix CredSSP Encryption Oracle Remediation Error in RDP

Next Article

Best RDP for Egypt in 2026: Cheap, Private Options

Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *

Subscribe to our Newsletter

Subscribe to our email newsletter to get the latest posts delivered right to your email.
Pure inspiration, zero spam ✨