Skip to main content

Hillock

Drop traffic before it touches your stack.

Hillock is the kernel-level firewall that lives inside every Synapse agent. Malicious traffic is filtered, rate-limited, or dropped before it ever reaches your application — no proxy in the path, no TLS termination, no latency penalty.

AmygdaladecidesinstallsIP · port · fp · rateLinux kernelPacket arriveson the wireXDPbefore routingearliest drop pointpass · drop · reply · to userspaceTC (ingress/egress)both directionsrate limitingtraffic countersfalls back: nftables → iptablesWhat the kernel comparesIP address and prefix · port · protocolTCP-handshake fingerprint · per-source rateentries can carry a TTL and expire themselvesonly things readable straight from the packetDROPdiscardedPASSto your appWindowssame rule modelfirewall backendin developmentFast pathTC layerMatch keysVerdictAmygdaladecidesinstalls IP · port · fp · rateXDPbefore routingearliest drop pointpass · drop · reply · to userspaceTC — ingress and egressrate limiting, countersfalls back: nftables → iptablesWhat the kernel comparesIP + prefix · port · protocolTCP handshake fingerprintper-source rateentries can expire on a TTLPASS to your app / DROPFast pathTC layerMatch keysVerdict
XDP can pass, drop, reply to the sender, or hand a packet to userspace. It cannot forward to another host.

What Hillock is for

  • Enforce in the kernel, not in userspace. Blocks run as eBPF programs attached to the interface, so a dropped packet never costs a context switch into your application.
  • Drop as early as the kernel allows. The XDP path runs before routing, which is the earliest point a packet can be discarded.
  • Rate limiting. Cap noisy clients in the kernel, without writing custom middleware.
  • Live traffic counters. TCP, UDP, and ICMP metrics in real time, read straight from the BPF maps.
  • Best available, with fallback. XDP/eBPF where the kernel allows it, then nftables, then iptables — the rule does not change, only the machinery under it.

What it enforces on

Hillock is the primitive layer. It matches on what is cheap to read in the kernel:

MatchNotes
IP addressSource or destination, with prefix
PortTCP and UDP
ProtocolTCP, UDP, ICMP
TCP-handshake fingerprintJA4T-style, computed from SYN header fields
RatePer-source thresholds enforced in-kernel

Entries can carry a TTL, expired by a BPF timer, so a temporary block clears itself without a userspace sweep.

Richer matching resolves before it gets here

Hillock has no notion of ASN, country, ML verdict or threat score — none of those are readable from a packet header. They reach it as addresses, by two different routes.

Ahead of time. Cerebellum resolves an ASN or country in your access rules into the IP ranges it covers, and ships the ranges. The agent never sees the ASN.

At the moment of decision. Amygdala evaluates its own rules on the host — ML verdicts, IDS context, live GeoIP — and when one fires, installs an IP, port, fingerprint or rate block here.

Either way the kernel only ever compares something it can read directly, which is why enforcement stays cheap no matter how elaborate the policy above it.

How it attaches

PathDirectionUse it for
XDPIngress, before routingEarliest and cheapest drop on Linux
TC (clsact)Ingress and egressEgress control, rate limiting, and global metrics
nftablesHost firewallFallback where the BPF path is unavailable
iptablesHost firewallFallback again, for hosts without nftables
Windows is the same model, not yet the same backend

The goal is one firewall platform with one rule model across Linux and Windows. The Windows firewall backend is still in development, so treat Windows enforcement as a roadmap item rather than something to build policy on today.

XDP cannot forward a packet somewhere else

The XDP stage has four outcomes, and it is worth knowing which is which:

VerdictWhat it does
PassLet the packet continue up the stack
DropDiscard it
ReplyAnswer the sender in place, out of the arrival interface — used for SYN cookies and refusals
To userspaceHand the packet to an AF_XDP socket for capture

What it cannot do is send a packet to a different destination. There is no verdict that forwards to another host, another interface, or a scrubbing appliance — the reply path answers whoever sent the packet, and nothing else.

If your policy needs traffic moved rather than dropped or answered, that belongs upstream of Hillock.

How it fits

Hillock is the muscle in every Synapse agent. When Amygdala decides a source should be blocked, Hillock is the layer that makes the kernel do it — and Cortex and Thalamus are what feed Amygdala that decision.

Use cases

  • Drop bot traffic at wire speed across thousands of servers, without taking a box out of service to do it.
  • Rate-limit aggressive scrapers per source with no application changes.
  • Expire a block automatically by giving it a TTL, instead of tracking cleanup yourself.
  • Read live TCP/UDP/ICMP counters for cost attribution and incident review.

See also

  • Synapse documentation — the agent that ships Hillock
  • Amygdala — the rule engine that decides what Hillock enforces
  • Cortex — ML verdicts that can end in a Hillock block
  • Thalamus — signature hits that can end in a Hillock block