This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
devopscritical PriorityID: ebpf-tc-pod-egress-segmentation-invariant

Linux eBPF TC Egress Packet Classification & Segmentation Invariant

Enforces deterministic, non-bypassable egress network segmentation at the Traffic Control (TC) hook on host-side container veth interfaces before socket buffers enter Linux host routing. Mandates atomic packet classification, skb linearization, fail-closed drop semantics, and cryptographic/policy tag validation directly within the kernel datapath.

Prohibited Anti-Pattern: Attaching egress policies downstream on physical interfaces or failing open on eBPF parser errors

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Linux eBPF TC Egress Packet Classification & Segmentation Invariant - Enforces deterministic, non-bypassable egress network segmentation at the Traffic Control (TC) hook on host-side container veth interfaces before socket buffers enter Linux host routing. Mandates atomic packet classification, skb linearization, fail-closed drop semantics, and cryptographic/policy tag validation directly within the kernel datapath.
globs: bpf/**/*.c, bpf/**/*.h, pkg/datapath/**/*.go, pkg/ebpf/**/*.go, deploy/daemonset/**/*.yaml
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/ebpf-tc-pod-egress-segmentation-invariant"
---

# Linux eBPF TC Egress Packet Classification & Segmentation Invariant

> **Severity**: CRITICAL | **Category**: devops
> **Anti-Pattern Warning**: Attaching egress policies downstream on physical interfaces or failing open on eBPF parser errors

## System Constraints
You are a Principal Systems Architect specializing in Linux eBPF kernel datapath engineering and container security. Your mandate is to enforce absolute egress isolation at the Traffic Control (TC) hook (clsact/tcx) on container veth pairs. All egress network traffic generated by pod workloads MUST be classified, policy-checked, and filtered at the host-side veth ingress/egress hook before packet buffers (sk_buff) traverse host netfilter tables, IP routing, or overlay tunnels. Prohibit any pattern that allows uninspected skb delivery, tail-call failure escapes, or unverified packet boundaries.

## Strict Guidelines
- Engineers MUST ALWAYS attach eBPF TC classifier programs to the host-side veth interface (`clsact` egress or host-side peer ingress) to intercept traffic before Linux host routing decisions occur.
- Engineers MUST ALWAYS implement fail-closed semantics: any parsing anomaly, truncated header, unmapped pod identity, or map lookup failure MUST return `TC_ACT_SHOT` immediately.
- Engineers MUST ALWAYS invoke `bpf_skb_pull_data(skb, ...)` before dereferencing packet headers beyond the initial linear buffer to prevent verifier rejections and out-of-bounds reads on cloned or non-linear sk_buff structures.
- Code MUST re-evaluate verifier boundary pointers (`data = (void *)(long)skb->data`, `data_end = (void *)(long)skb->data_end`) immediately after any helper call that alters buffer layout (e.g., `bpf_skb_pull_data`, `bpf_skb_adjust_room`).
- Tail calls (`bpf_tail_call`) MUST ALWAYS be immediately followed by an explicit `return TC_ACT_SHOT;` so that missed lookups or depleted tail-call counters never result in accidental packet forwarding.
- Services MUST NOT defer pod egress segmentation to post-routing hooks (such as physical interface egress or iptables POSTROUTING) where inter-pod local bypass can occur.
- Components NEVER allow raw L3/L4 egress packets from untrusted cgroups to bypass LPM (Longest Prefix Match) policy map lookup.

## Bad vs Good Implementations
### eBPF TC Egress Classifier with Linearization and Strict Fail-Closed Policy

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: The program fails to invoke bpf_skb_pull_data for non-linear packet buffers, fails open (TC_ACT_OK) on boundary check failures, and permits arbitrary packet forwarding without authenticating pod egress metadata against identity or policy maps.
```c
#include <linux/bpf.h>
#include <linux/pkt_cls.h>
#include <bpf/bpf_helpers.h>

SEC("tc/egress")
int handle_egress_bad(struct __sk_buff *skb) {
    void *data = (void *)(long)skb->data;
    void *data_end = (void *)(long)skb->data_end;

    // ANTI-PATTERN: Direct access without pulling data for non-linear skbs
    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return TC_ACT_OK; // CRITICAL: Fail-open allows unvalidated traffic through

    // ANTI-PATTERN: No policy enforcement before returning OK
    // ANTI-PATTERN: Missing fallback drop after unverified processing
    return TC_ACT_OK;
}
```

#### Production Standard (Correct)
> **Standard**: The program linearizes the sk_buff using bpf_skb_pull_data, refreshes bounds, drops invalid or unhandled protocols with TC_ACT_SHOT (fail-closed), and strictly enforces an egress policy map match before granting egress permission.
```c
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/pkt_cls.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_endian.h>

struct {
    __uint(type, BPF_MAP_TYPE_LPM_TRIE);
    __type(key, struct egress_key);
    __type(value, struct egress_policy);
    __uint(max_entries, 65536);
    __uint(map_flags, BPF_F_NO_PREALLOC);
} egress_policy_map SEC(".maps");

SEC("tc/egress")
int handle_pod_egress(struct __sk_buff *skb) {
    // Ensure linear access for Ethernet + IPv4 headers
    const __u32 req_len = sizeof(struct ethhdr) + sizeof(struct iphdr);
    if (bpf_skb_pull_data(skb, req_len) < 0)
        return TC_ACT_SHOT; // Fail-closed on linearization error

    void *data = (void *)(long)skb->data;
    void *data_end = (void *)(long)skb->data_end;

    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return TC_ACT_SHOT;

    if (eth->h_proto != bpf_htons(ETH_P_IP))
        return TC_ACT_SHOT; // Strictly drop non-IPv4 unless explicitly permitted

    struct iphdr *ip = (void *)(eth + 1);
    if ((void *)(ip + 1) > data_end)
        return TC_ACT_SHOT;

    struct egress_key key = {
        .prefixlen = 32,
        .daddr = ip->daddr
    };

    struct egress_policy *policy = bpf_map_lookup_elem(&egress_policy_map, &key);
    if (!policy || policy->action != POLICY_ALLOW)
        return TC_ACT_SHOT; // Strict default-deny egress invariant

    return TC_ACT_OK;
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Linux eBPF TC Egress Packet Classification & Segmentation Invariant

Linux eBPF TC Egress Packet Classification & Segmentation Invariant defines an industrial-grade behavioral standard for devops engineering. Enforces deterministic, non-bypassable egress network segmentation at the Traffic Control (TC) hook on host-side container veth interfaces before socket buffers enter Linux host routing. Mandates atomic packet classification, skb linearization, fail-closed drop semantics, and cryptographic/policy tag validation directly within the kernel datapath. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Attaching egress policies downstream on physical interfaces or failing open on eBPF parser errors Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftAttaching egress policies downstream on physical interfaces or failing open on eBPF parser errorsCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS attach eBPF TC classifier programs to the host-side veth interface (`clsact` egress or host-side peer ingress) to intercept traffic before Linux host routing decisions occur.

Engineers MUST ALWAYS attach eBPF TC classifier programs to the host-side veth interface (`clsact` egress or host-side peer ingress) to intercept traffic before Linux host routing decisions occur.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST ALWAYS implement fail-closed semantics

Engineers MUST ALWAYS implement fail-closed semantics: any parsing anomaly, truncated header, unmapped pod identity, or map lookup failure MUST return `TC_ACT_SHOT` immediately.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Engineers MUST ALWAYS invoke `bpf_skb_pull_data(skb, ...)` before dereferencing packet headers beyond the initial linear buffer to prevent verifier rejections and out-of-bounds reads on cloned or non-linear sk_buff structures.

Engineers MUST ALWAYS invoke `bpf_skb_pull_data(skb, ...)` before dereferencing packet headers beyond the initial linear buffer to prevent verifier rejections and out-of-bounds reads on cloned or non-linear sk_buff structures.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Code MUST re-evaluate verifier boundary pointers (`data = (void *)(long)skb->data`, `data_end = (void *)(long)skb->data_end`) immediately after any helper call that alters buffer layout (e.g., `bpf_skb_pull_data`, `bpf_skb_adjust_room`).

Code MUST re-evaluate verifier boundary pointers (`data = (void *)(long)skb->data`, `data_end = (void *)(long)skb->data_end`) immediately after any helper call that alters buffer layout (e.g., `bpf_skb_pull_data`, `bpf_skb_adjust_room`).

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Tail calls (`bpf_tail_call`) MUST ALWAYS be immediately followed by an explicit `return TC_ACT_SHOT

Tail calls (`bpf_tail_call`) MUST ALWAYS be immediately followed by an explicit `return TC_ACT_SHOT;` so that missed lookups or depleted tail-call counters never result in accidental packet forwarding.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
6

Services MUST NOT defer pod egress segmentation to post-routing hooks (such as physical interface egress or iptables POSTROUTING) where inter-pod local bypass can occur.

Services MUST NOT defer pod egress segmentation to post-routing hooks (such as physical interface egress or iptables POSTROUTING) where inter-pod local bypass can occur.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
7

Components NEVER allow raw L3/L4 egress packets from untrusted cgroups to bypass LPM (Longest Prefix Match) policy map lookup.

Components NEVER allow raw L3/L4 egress packets from untrusted cgroups to bypass LPM (Longest Prefix Match) policy map lookup.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Linux eBPF TC Egress Packet Classification & Segmentation Invariant critical for AI coding assistants?

Enforces deterministic, non-bypassable egress network segmentation at the Traffic Control (TC) hook on host-side container veth interfaces before socket buffers enter Linux host routing. Mandates atomic packet classification, skb linearization, fail-closed drop semantics, and cryptographic/policy tag validation directly within the kernel datapath. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Attaching egress policies downstream on physical interfaces or failing open on eBPF parser errors) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

Linux