How to Enable BBR on Rocky Linux 8 (Step-by-Step)

Learn how to enable bbr on rocky linux 8, load its kernel module, persist fq settings, verify the live qdisc, and fix common VPS errors on your VPS.
A luminous green network path winds between a server rack and a cyan speed gauge on a midnight-blue background.

Enable BBR on Rocky Linux 8 to use a modern TCP congestion-control algorithm with the fq packet scheduler. You can apply it to a fresh VPS in about five minutes, keep the setting after reboots, and confirm the queue attached to the live network interface.

Prerequisites

  • A Rocky Linux 8 VPS, preferably fully updated, with a 4.9 or newer kernel. Rocky Linux 8 normally uses a 4.18-series kernel.
  • SSH access as root, or a normal account with working sudo privileges.
  • Permission to install kernel packages, load modules, write under /etc, and change the network queueing discipline. An unprivileged container may not allow these operations.
  • No domain, web server, extra RAM, or extra disk is needed because BBR is a kernel-level TCP setting.
  • If you need the server first, use a Linux VPS from VPSLake and install Rocky Linux 8.

BBR changes how TCP estimates available capacity and paces packets; it does not raise your VPS plan’s bandwidth limit. Your route, the remote peer, and the application determine whether it helps.

Step 1: Confirm Rocky Linux 8 and inspect the current TCP state

Identify the release and running kernel before installing a module so you do not mix packages for a different image or kernel.

cat /etc/rocky-release
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

The release should identify Rocky Linux 8, and the kernel should normally begin with 4.18. A typical installation starts with cubic; BBR may already be listed if the matching module is present.

Rocky Linux release 8.10 (Green Obsidian)
4.18.0-...el8_...x86_64
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic

Minor versions, kernel suffixes, and the algorithm order vary. Keep the provider’s newer kernel if it is working; the important checks are that it is at least 4.9 and exposes BBR.

Step 2: Install and load the Rocky Linux BBR module

On the EL8 kernel, BBR can be supplied by the extra kernel modules package. Install the package that matches the kernel currently running, then load tcp_bbr before selecting it.

sudo dnf install -y "kernel-modules-extra-$(uname -r)"
sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control

The final command should contain bbr:

net.ipv4.tcp_available_congestion_control = reno cubic bbr

If BBR was already available, the install confirms the module package and modprobe simply leaves the module ready. Using the exact running-kernel package avoids installing modules that cannot be used until a later reboot.

Step 3: Save BBR settings for future boots

Keep the module request and sysctl values in small, separate files so Rocky Linux can restore both pieces without changing unrelated kernel tuning.

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

The first file asks the boot-time module loader to prepare BBR. The second selects BBR for new TCP connections and makes fq the default queueing discipline; the final command applies the two values immediately.

Successful output is:

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

The RHEL 8 networking documentation explains the BBR support in the compatible kernel, and Rocky Linux 8 follows the same configuration layout.

Step 4: Put fq on the interface already carrying traffic

Changing net.core.default_qdisc affects interfaces initialized later; inspect the existing default-route interface and replace its current root queue if it still uses fq_codel.

MAIN_IFACE=$(ip route show default | awk '/^default/ {print $5; exit}')
printf '%s\n' "$MAIN_IFACE"
tc qdisc show dev "$MAIN_IFACE"

The first line should print an interface such as ens3 or eth0. If the last command does not show qdisc fq, apply fq for the current boot:

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

Look for a result containing qdisc fq:

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

To retain the per-interface queue when NetworkManager recreates the link, identify the active profile and save root fq there:

nmcli connection show --active
sudo nmcli connection modify "YOUR_CONNECTION_NAME" tc.qdiscs 'root fq'
sudo nmcli connection up "YOUR_CONNECTION_NAME"

Replace YOUR_CONNECTION_NAME with the profile name shown by the first command. The final command can briefly interrupt SSH, so use the VPS control panel console or schedule this change during maintenance if the connection cannot drop.

Red Hat’s RHEL 8 traffic-control guide documents the temporary tc method and the persistent NetworkManager profile option.

Verify BBR on Rocky Linux 8

Run the complete check after the settings are applied. It confirms the active algorithm, saved files, module availability, and queue on the interface used by the default route.

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-rocky-bbr.conf
grep -Fx 'tcp_bbr' /etc/modules-load.d/tcp-bbr.conf
tc qdisc show dev "$MAIN_IFACE"

You want tcp_congestion_control = bbr, default_qdisc = fq, bbr in the available list, both assignments from 99-rocky-bbr.conf, the line tcp_bbr, and qdisc fq on the active device. These values apply to new TCP connections, so reconnect SSH or restart a long-running service before comparing traffic.

net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
net.ipv4.tcp_available_congestion_control = reno cubic bbr
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
tcp_bbr
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024

Troubleshooting

No match for argument: kernel-modules-extra-...

The repository metadata may not contain a module package for the older kernel currently booted, or the VPS may use a provider-built kernel. Install the generic package, reboot into the newest Rocky kernel, and retry Step 2:

sudo dnf install -y kernel-modules-extra
sudo reboot

After reconnecting, run uname -r, then sudo modprobe tcp_bbr. If the module is still unavailable, ask the provider for a standard Rocky Linux 8 kernel with BBR support instead of forcing an unrelated module package.

modprobe: FATAL: Module tcp_bbr not found

The running kernel still cannot see the BBR module. Check the available algorithms first; if bbr is absent, confirm that the kernel-modules-extra package matches uname -r, then reboot into the kernel for which it was installed.

rpm -q "kernel-modules-extra-$(uname -r)"
sysctl net.ipv4.tcp_available_congestion_control

sysctl: cannot set net.ipv4.tcp_congestion_control

The sysctl file was applied before BBR was registered. Load the module, verify 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-rocky-bbr.conf

If the error returns after a reboot, check that /etc/modules-load.d/tcp-bbr.conf contains exactly tcp_bbr and that the file name has not been replaced by another image-management tool.

tc qdisc show still reports fq_codel

The default qdisc value does not replace the queue already attached to an existing interface. Repeat Step 4 with the real default-route device; if it changes back after a NetworkManager restart, save root fq in the active connection profile. If tc itself is missing, install the Rocky Linux iproute package first:

sudo dnf install -y iproute

FAQ

Does BBR require a firewall rule?

No. BBR changes TCP behavior inside the kernel and does not create a listening service or open an inbound port. Leave your existing SSH and application firewall rules as they are.

Why must the queue be fq instead of fq_codel?

BBR paces packets, and fq is designed to work with that pacing model. Rocky’s BBR guidance recommends explicitly using fq; setting the default alone may not change a queue already attached to a live interface.

Does BBR tune UDP traffic too?

No. net.ipv4.tcp_congestion_control applies only to TCP. UDP applications need their own rate-control behavior, so enabling BBR does not change their packet handling.

Can I return to CUBIC without rebooting?

Yes. Change the congestion-control value in /etc/sysctl.d/99-rocky-bbr.conf to cubic, then run sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf. You can leave tcp_bbr in the modules-load file because loading the module does not make it the active algorithm.

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

Run Windows Apps on Linux or Mac: Wine, VM or RDP

Next Article

Is It Safe to Open Port 3389? RDP Security Guide

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 ✨