In this blog, we’ll explore what TC-BPF is, how it works, and why it’s so valuable for modern networking, observability, and security workloads.
What is TC-BPF?
TC-BPF refers to the use of eBPF programs attached to the Linux Traffic Control (TC) subsystem. Traffic Control is a feature of the Linux kernel that manages packet queuing, scheduling, and filtering in network interfaces. Traditionally, it was configured with tools like tc (from iproute2), using classifiers and queuing disciplines (qdiscs).
With the introduction of eBPF into the networking stack, TC-BPF allows you to attach small programs at ingress (incoming packets) and egress (outgoing packets) points of a network interface. These programs can inspect, filter, redirect, or manipulate network traffic in real-time, directly from the kernel.
Why TC-BPF Matters
Traditional network monitoring or manipulation tools either:
- Add overhead by operating in user space,
- Require packet copying,
- Or lack programmability and flexibility.
TC-BPF solves these problems by running directly in the kernel space, giving you:
- Low overhead: No need to copy packets to user space.
- Real-time filtering: Process packets as they flow through the interface.
- Programmability: Use custom logic written in C (compiled to BPF bytecode).
- Flexibility: Chain multiple programs or combine with other eBPF hooks.
This makes TC-BPF a powerful tool for packet filtering, shaping, redirecting, dropping, or even building custom firewalls, service meshes, and intrusion detection systems (IDS).
Where TC-BPF is Used
TC-BPF is foundational for many cloud-native technologies, especially in areas like:
1. Networking Observability
- Capture packet metadata for tracing without mirroring full packets.
- Drop, log, or redirect specific flows for debugging.
- Collect real-time network latency stats.
2. Security and Filtering
- Enforce Layer 3/4 ACLs at the network interface level.
- Detect suspicious traffic patterns using custom logic.
- Deploy zero-trust policies at ingress/egress.
3. Traffic Shaping and QoS
- Prioritize or delay packets based on source/destination.
- Enforce bandwidth limits per container or pod.
- Build smart congestion control mechanisms.
4. Service Mesh / CNI Enhancements
Tools like Cilium, a CNI for Kubernetes, use TC-BPF for load balancing, identity-aware routing, and enforcing security policies—without using iptables.
TC-BPF vs XDP
You might be wondering: How does TC-BPF compare to XDP (eXpress Data Path), another popular eBPF hook?
Feature | TC-BPF | XDP |
Attach Point | Ingress/Egress of TC (after kernel stack begins processing) | Early in receive path (before kernel stack) |
Latency | Slightly higher | Ultra-low |
Flexibility | Supports both ingress and egress | Mostly ingress |
Use Cases | Shaping, filtering, CNI | DOS protection, fast-drop packets |
If you need ultra-low latency filtering (like DDoS mitigation), use XDP. But for more flexible and programmable traffic control, TC-BPF is often the better choice.
How TC-BPF Works (High Level)
Here’s a simplified flow of how TC-BPF operates:
- A packet enters or exits a network interface.
- Linux invokes any attached TC-BPF program at the ingress or egress hook.
- The BPF program inspects the packet.
- Based on logic, it can:
- Pass the packet normally.
- Drop it.
- Redirect it to another interface.
- Modify headers or payload (limited).
- Pass the packet normally.
- Execution continues based on the return code.
The beauty is that you define the logic inside a small, verified, sandboxed BPF program.
Tools and Ecosystem
To get started with TC-BPF, you'll want to look into:
- iproute2/tc: The legacy command-line tool, now BPF-aware.
- BPF Compiler Collection (BCC): High-level tools and Python bindings.
- bpftool: Powerful CLI to inspect, load, and attach BPF programs.
- Cilium: Kubernetes networking based entirely on eBPF and TC-BPF.
- libbpf + LLVM/Clang: For compiling raw C programs into eBPF bytecode.
Challenges
While TC-BPF is powerful, it comes with a learning curve:
- Writing and debugging BPF code is tricky.
- You must understand Linux kernel networking internals.
- Programs are verified for safety, so you can't use loops or certain operations without newer kernel versions.
Fortunately, the ecosystem is evolving fast, and platforms like Keploy.io and Cilium are making it easier to build with eBPF and TC.
Final Thoughts
As cloud systems become more distributed and complex, the need for efficient, programmable, and kernel-level networking control grows. TC-BPF is a critical piece of this puzzle, giving developers deep traffic control without sacrificing performance.
Whether you're optimizing Kubernetes networking, building custom firewalls, or just curious about modern Linux internals—learning TC-BPF is a worthy investment.
Read more on https://keploy.io/blog/technology/using-tc-bpf-program-to-redirect-dns-traffic-in-docker-containers