Host-aware protection. Explicit control.

Firewall policy
follows actual
service state.

Auto XDP treats a Linux host's actual service exposure as the source of truth for firewall policy, then continuously reconciles that state into XDP when available or nftables when it is not.

Linux native · Open source · Local control

Approved live services pass traffic; unapproved or stopped services stay closed.

Toggle a listener. Green passes; red stops.
Postgres is running without a grant. Try approving it ↓

Loading latest release...

The host changes.
The firewall forgets.

A standalone Linux server has a live service state and a separate firewall state. When an operator has to keep both aligned by hand, stopped services leave holes and new services break until someone remembers another rule.

0
Independent convergence paths
Netlink · relay · safety timer
0s
Full safety reconcile
repairs missed events and map drift
0
Shared control plane
XDP · generic XDP · nftables

This is not one-time rule generation.

Auto XDP is a local reconciliation controller. It discovers live endpoints, matches them to explicit workload grants, and keeps effective exposure converged as services change.

01 / observe

Live workload endpoints

Observe live sockets, identify their workloads, and classify the ingress zone.

02 / reconcile

Effective firewall policy

Intersect runtime evidence with explicit workload grants. Fast events update state; a full pass repairs drift.

+ workload identity
+ zone / protocol / port grants
+ required protection profiles
03 / enforce

Safe dataplane

Native XDP first, generic XDP next, synchronized nftables when XDP cannot attach.

Running is one thing.
Permission is another.

A listener tells Auto XDP what exists. Your grant decides what may be exposed. Try granting Postgres access, then stop its listener: the exposure closes even though the grant remains.

Simulated listeners, grants and resulting exposure
ServiceListenerGrantExposure
sshTCP :22OPEN
nginxTCP :443OPEN
postgresTCP :5432NO GRANT

Simulated UI only. Changes stay in this page and update the hero above.

policy.eventsSIMULATED
    Policy converged
    See the updated traffic flow ↑

    XDP accelerates the policy. It does not define it.

    The same socket discovery and reconciliation control plane drives every enforcement path. The effective policy follows the available backend. Ports requiring unavailable XDP-only protection stay closed.

    PATH A

    Native XDP

    Preferred XDP-hook enforcement for unwanted ingress before the normal networking stack handles it.

    PATH B

    Generic XDP

    Compatibility path that preserves the XDP policy model when native attachment is unavailable.

    PATH C

    nftables fallback

    The same reconciler applies the effective policy instead of making operators maintain a second ruleset.

    One policy. Multiple enforcement backends.

    Built for unattended hosts.

    The deeper implementation exists to preserve policy continuity through reloads, missed events, backend changes, return traffic, and constrained single-host environments.

    Early enforcement

    When XDP is available, unwanted ingress is rejected at the XDP hook before it is passed into the normal kernel networking stack.

    XDP_DROP
    Continuous reconciliation

    Fast socket events update policy quickly, while an independent full discovery pass repairs missed events and map drift.

    event + timer
    TOML Config

    Human-friendly /etc/auto_xdp/config.toml. Configure rate limits, trusted CIDRs, ACL rules, tunnels. SIGHUP hot-reload.

    SIGHUP reload
    Protocol Plugins

    Loadable BPF slot handlers for GRE, ESP, SCTP, or custom protocols. axdp slot load gre or point at your own .o file.

    bpf_tail_call
    6in4 Tunnel Guard

    proto-41 (SIT) traffic accepted only from configured sit4_endpoints. All other proto-41 sources dropped at line rate.

    proto-41
    IPv4 + IPv6 Conntrack

    TCP SYN creates tracked state. TC egress records outbound flows so return traffic passes without reopening port holes.

    tc egress
    Per-Source Rate Limits

    SYN and UDP rate limits keyed per source IP, configurable by process name or IANA service. Aggregate caps available.

    anti-brute-force
    Safe degradation

    When XDP cannot attach, the same control plane drives a synchronized nftables ruleset. Policy automation keeps working.

    graceful degradation
    axdp CLI

    Terminal control for everything: axdp stats · axdp acl add · axdp trust · axdp slot load · axdp under-attack on · axdp log-level

    operator CLI

    axdp in action.

    The operator view exposes the reconciler's result: active backend, discovered services, policy limits, packet decisions, and the state that keeps legitimate return traffic moving.

    $
    axdp tui — stats · events · limits
    axdp main stats and events view axdp top traffic by source

    You grant the exposure.
    Auto XDP keeps it current.

    Use /etc/auto_xdp/config.toml to identify workloads, grant exposure by zone and port, and configure protection. Start in audit mode to inspect decisions before enforcing them.

    /etc/auto_xdp/config.toml
    # Inspect decisions before switching to enforce.
    [policy]
    mode = "audit"
    
    [zones.public]
    interfaces = []
    
    # Match the actual systemd unit on your host.
    [subjects.web.resolve]
    systemd_unit = "nginx.service"
    
    [subjects.web.exposure.public.tcp]
    ports = [443]
    
    # A grant only opens the port while its workload is listening.
    # Unapproved workloads remain closed in enforce mode.

    SYSTEM ARCHITECTURE

    How Auto XDP works.

    Live services + explicit grants → effective exposure.
    Follow the policy, packet and observation paths. Select a component to explore.

    Swipe horizontally to explore the full architecture →

    Auto XDP system architectureControl plane: runtime endpoints and explicit workload grants compile into effective policy. Data plane: ingress validation, a confirmed reply exception, exposure checks and protection lead to pass or drop. nftables is an alternative backend. Observation flows from counters and ring buffers to relay, clients and views. Select a component for details.01 / CONTROL PLANEDecide what may be exposed.02 / DATA PLANEEnforce on the host. Main TCP / UDP path shown.03 / OBSERVATIONRead outcomes. Never grant exposure.read onlycompiled policyconfirmed replyPASSno grantinvalidrejectfallbacknetfilter → accepted trafficlookupegress helpersprofile proofFrom XDP / TC hooks ↓Runtime endpointsSOCK_DIAG · /procsystemd · Docker / PodmanWorkload identityOwner + ingress zoneexact / delegated / sharedPolicy reconcilerLive endpoint ∩ grantreason + protection profileApply backendXDP maps / atomic nftablestransactional updatesChange detectionProcess / socket events30 s safety reconcileOperator intentaxdp approvals + TOMLsubjects · zones · profilesObserve / auditInventory + explanationsno backend writesIngressNetwork interfaceIPv4 / IPv6ValidateEthernet · VLAN · IPTCP / UDP parsingReply exceptionCONFIRMED + REPLYTCP / UDP onlyExposureifindex · proto · portapproved live endpointProtectionACL · rate limits · handlersoptional profiles / SYN cookiesnftables fallbackLinux netfiltersame effective exposureLinux conntrackKernel-owned statenamespace-local lookupTC helpersServer-progress proofoptional cookie handoffDROPRejected trafficstop at hostLinux stack → appAccepted ingressservice response → egressCounters + ringbufVerdicts · reason codesXDP / TC observationsLocal relayConsume · buffer · replaybounded event historyClient + aggregationDecode · deduplicateretained traffic windowCLI / TUIWatch · diagnose · explainlocal GeoIP / ASN

    Implementation notes

    Arrows show direction, not timing. All enforcement stays on your host.
    Native XDP → generic XDP → nftables, subject to capability checks. Required protection fails closed.

    Protection starts at the host.

    Auto XDP is intentionally a local host firewall, not a replacement for upstream mitigation or multi-user authorization.

    Not upstream DDoS mitigation.

    XDP only filters traffic that reaches the NIC. If upstream bandwidth is saturated, use provider-side scrubbing or a protected host.

    Workload evidence has boundaries.

    Exposure requires an explicit matching grant. Workload attribution is runtime evidence, not per-packet workload authentication or a substitute for host isolation.

    Not a cluster policy platform.

    It is designed for one Linux server, one local daemon, and local kernel state without an API server or datastore.

    Same flood. 28× less target CPU.

    In a real public-internet test, XDP reduced target softirq CPU from 85.9% to 3.0% under an approximately 367k PPS / 188 Mbps UDP flood. The same effective policy benefits from earlier packet rejection.

    Auto XDP OFF
    0%
    softirq CPU — kernel processing every packet
    Auto XDP ON
    0%
    softirq CPU — packets dropped at the XDP hook
    How to reproduce:
    Load modprobe pktgen on the attacker, configure a 64-byte UDP flood (pkt_size 64, clone_skb 100, count 10000000), and compare top softirq usage with sudo axdp watch showing live counter deltas on the target. This measures host-side filtering; it does not mitigate upstream bandwidth saturation.
    Packet path comparison
    TRADITIONAL AUTO XDP NIC Driver hardware RX CPU Kernel Stack socket buf · TCP/IP CPU iptables netfilter · late check DROP full kernel path wasted on every blocked packet NIC Driver hardware RX ⚡ XDP Hook XDP hook · pre-stack DROP ≈0 CPU PASS Kernel Stack legit traffic only Your App SSH · nginx · postgres drop at hook; pass continues through stack

    Why I built this.

    Standalone servers are constantly scanned and probed. Traditional firewalls work, but their static policy can drift from the services the host is actually running. A new service needs a remembered rule. A stopped service needs a remembered cleanup.

    Auto XDP starts from a different premise: the host already knows which services it is exposing. When an approved workload binds a granted port, policy should converge. When it stops listening, that exposure should disappear without a second manual ruleset.

    Auto XDP is an automatically reconciled host firewall for standalone Linux servers. XDP is the preferred acceleration layer, while generic XDP and nftables provide safer compatibility paths when the preferred backend is unavailable.

    Operating principles
    ↻ Host state first. Live endpoints and explicit grants define effective exposure.
    ↗ Converge continuously. Event paths react quickly while the safety timer repairs drift.
    ⇄ Separate policy from speed. One control plane can use XDP or nftables.
    □ Fail safely. Transactional reloads preserve protection through backend and generation changes.

    Open source, with a public trail.

    Auto XDP is built in the open for people operating real Linux hosts: VPSes, cloud instances, homelab nodes, and small public servers. The repository is the source of truth for releases, implementation, tests, and the next contribution.

    STATUS

    Active releases

    Tagged releases have landed across five consecutive months. Follow the trail, then inspect the changelog and CI-backed repository history.

    131 GitHub stars
    7 forks
    214 commits
    2 · 1 open issues · open PR
    Release history
    Loading releases...
    Support the project. Code, tests, docs, and hardware feedback all help strengthen the next release. Read the guide →