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

Learn how to enable bbr on rocky linux 10 with persistent kernel settings, fq queueing, live verification, and fixes for missing-module errors on a VPS.
A server rack sends glowing blue and red network trails toward a speed gauge in a dark blue server room.

Enable BBR on Rocky Linux 10 to make new TCP connections use BBR with the fq queueing discipline. You can apply the kernel settings immediately and make them survive reboots in about five minutes, without opening another firewall port.

Prerequisites

  • A Rocky Linux 10 VPS with the standard 6.12-series kernel or another kernel newer than 4.9.
  • SSH access as root, or an administrator account with working sudo privileges. Rocky Linux 10 normally expects you to manage the server from a sudo-enabled account.
  • Permission to load kernel modules, change sysctl values, and modify NetworkManager settings. An unprivileged container may deny one or more of these operations.
  • No domain, web server, extra RAM, or extra disk space is needed because BBR is a kernel-level TCP setting.
  • If you need the server first, choose a Linux VPS from VPSLake and install Rocky Linux 10.

BBR changes TCP congestion control and packet pacing; it does not increase the bandwidth limit of your VPS. The result depends on the route, the remote peer, and the application using TCP.

Step 1: Confirm Rocky Linux 10 and inspect TCP

Check the release and running kernel before changing anything so a provider image or custom kernel does not surprise you.

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

The release line should identify Rocky Linux release 10, and a standard installation should show a 6.12 kernel. The current algorithm is often cubic; BBR may be absent from the available list until its module is loaded.

Rocky Linux release 10.x (Red Quartz)
6.12.0-...el10_...x86_64
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic

Patch numbers and the algorithm order vary. Do not replace a working provider kernel just to match the sample output.

Step 2: Load BBR for the current boot

The kernel must register BBR before a sysctl can select it, so load the module and check the available algorithms in the same session.

sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control

The result should contain 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. You do not need to unload or reload the network driver.

Step 3: Save BBR and fq permanently

Use separate boot and sysctl files so a kernel update can restore the module and the TCP settings without changing unrelated configuration.

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 systemd to load tcp_bbr at boot. The second selects BBR for new TCP connections and sets fair queueing as the default scheduler; the final command applies both values now.

Expected output:

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

The RHEL 10 kernel-parameter documentation describes the compatible /etc/sysctl.d/ method. Rocky Linux 10 also uses the EL10 modules-load.d layout for persistent modules.

Step 4: Put fq on the active interface

Changing net.core.default_qdisc controls interfaces created later, but the interface already carrying SSH may still have Rocky Linux’s usual fq_codel queue. Inspect the default-route device before changing it.

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

If the last command does not show qdisc fq, replace the live root queue for this boot:

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

Successful output contains qdisc fq, although the counters and limits differ by system:

default via 198.51.100.1 dev ens3 proto dhcp src 198.51.100.20 metric 100
ens3
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024

Rocky Linux 10 uses NetworkManager; legacy ifup and ifdown commands are not available. To retain a deliberate per-interface qdisc when NetworkManager reactivates the link, identify the active profile and set it with nmcli:

nmcli -g GENERAL.CONNECTION device show "$MAIN_IFACE"
sudo nmcli connection modify "YOUR_CONNECTION_NAME" tc.qdiscs 'root fq'
sudo nmcli connection up "YOUR_CONNECTION_NAME"
tc qdisc show dev "$MAIN_IFACE"

Replace YOUR_CONNECTION_NAME with the profile printed by the first command. Activating the profile can briefly interrupt SSH, so use the VPS control panel console if you cannot risk losing the session. The RHEL 10 traffic-control documentation documents the tc and NetworkManager approach.

Verify BBR on Rocky Linux 10

Run the complete check below to confirm the live algorithm, saved files, module availability, and queue attached to the default-route interface.

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-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-lived service before comparing network behavior.

Troubleshooting

modprobe: FATAL: Module tcp_bbr not found

The running kernel does not provide the BBR module, or its module files do not match the kernel returned by uname -r. Install Rocky Linux’s current kernel package, reboot into it, and repeat Step 2:

sudo dnf install -y kernel
sudo reboot

If the VPS still boots a provider-managed custom kernel, ask the provider for a Rocky Linux 10 kernel with BBR support. Do not copy a module from a different kernel release.

sysctl: cannot set net.ipv4.tcp_congestion_control

BBR was selected before the kernel registered it. Run sudo modprobe tcp_bbr, confirm that bbr appears in net.ipv4.tcp_available_congestion_control, and reload the saved file:

sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf

If bbr never appears, the problem is kernel support rather than the sysctl syntax.

RTNETLINK answers: Operation not permitted

The VPS is likely an unprivileged container without the capability needed to replace a qdisc. The TCP setting may still work, but the live fq queue cannot be changed inside that container; enable it on the host or use a full VPS with traffic-control permissions.

BBR returns to cubic after a reboot

The module-load file may be missing, or another sysctl file may load after yours and select cubic. Inspect all local assignments, then reload the module and Rocky Linux 10 file:

grep -RnsE 'tcp_congestion_control|default_qdisc' /etc/sysctl.conf /etc/sysctl.d /usr/lib/sysctl.d 2>/dev/null
sudo systemctl restart systemd-modules-load
sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf
sysctl net.ipv4.tcp_available_congestion_control net.ipv4.tcp_congestion_control

Remove or update a later conflicting assignment rather than creating multiple BBR files.

Next steps

BBR is a transport-level change, so judge it with the traffic your server actually sends rather than with a single generic speed test. A long-lived download, reverse proxy, backup job, or game connection may need to be restarted before it reflects the new algorithm.

  • Reboot during a maintenance window and rerun the verification block to prove that both the module and sysctl file load automatically.
  • Compare several transfers to the same remote peer before and after the change; record latency and throughput instead of relying on one result.
  • If the server has more than one active interface, inspect each device with tc qdisc show and apply a deliberate NetworkManager profile only where it is needed.

FAQ

Does BBR open a firewall port?

No. BBR changes TCP behavior inside the kernel and does not create a listener, so Rocky Linux firewall rules do not need a new entry. Keep your existing SSH and application rules in place.

Will existing SSH connections switch to BBR?

The algorithm is chosen when a TCP connection is created. Reconnect SSH and restart the service you are evaluating; an already-open session may retain its original TCP state.

Why can BBR be available but not active?

Loading tcp_bbr only makes the algorithm usable. The net.ipv4.tcp_congestion_control = bbr value selects it, so check both the live sysctl and /etc/sysctl.d/99-rocky-bbr.conf.

How do I switch back to CUBIC?

Change the congestion-control value in /etc/sysctl.d/99-rocky-bbr.conf to cubic, run sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf, and verify the live value. You can leave tcp_bbr in the module-load file because loading a module does not select it.

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

RDP vs VPS: What's the Difference and Which Do You Need?

Next Article

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

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 ✨