Kea-Ora — User Guide
A plain-language guide to running ISC Kea through Kea-Ora. Written for network engineers, not coders. No command line after setup — it's all buttons.
1. The big picture (read this first)
Kea-Ora is a web UI for ISC Kea. Kea is the DHCP server doing the real work; Kea-Ora is the friendly face on top of it. There are two moving parts:
- The helper — a small service running on the Kea server. It's the only thing that talks to Kea's control sockets. It listens on
127.0.0.1 only, on purpose, so it's never exposed to the network.
- The web page — what you actually click. You reach it through the helper (locally on the server, or over an SSH tunnel from your laptop).
The mental model that makes everything else click: you build your intended config in the page, then push it to Kea in one action. Nothing you type is live until you apply it. That "draft, then apply" rhythm is the heart of the tool.
Two facts that save confusion later:
- Kea starts out inert. After a fresh install, Kea is running but hands out nothing until you add a scope and apply. That's deliberate — you turn it on when you're ready.
- Apply is atomic. If a config is bad, Kea keeps the previous one and the page tells you why. A rejected change never leaves you half-broken.
2. First login
- Open the app at the URL from the installer (e.g.
http://<server-ip>:8765, or http://127.0.0.1:8765 through your SSH tunnel).
- Sign in as
admin with the one-time password the installer printed.
- You'll immediately be asked to set your own password. The one-time password stops working the moment you do.
If you ever lock yourself out, there's an emergency reset-kea-password.py on the server for exactly that.
3. The layout — what you're looking at
A quick tour so the rest of the guide has names to point at:
- IPv4 / IPv6 toggle — a segmented switch near the top. This is a mode, not a page: it flips the entire app between your v4 world and your v6 world. Almost everything — scopes, assignments, planners — respects which side you're on. When something looks "missing," check which mode you're in first.
- Scopes — the main working list. Every subnet (v4) or prefix (v6) you manage lives here, each row showing its key facts at a glance.
- Live config (Apply to Kea) — the panel where you push changes to the running server. This is where Validate, Apply & save, and Reload file live, plus the Helper connected status.
- The menu — everything else: Assignments, Dashboard, Backups, the planners and toolkit, Router relay setup, Doctor (diagnostics), and settings (users, email alerts, password).
4. The core loop (the one workflow to internalize)
Before the buttons, a principle: start with a plan, not a scope. The quickest way to a messy network is to open Add Scope and improvise pool boundaries on the spot. Five minutes in the planner first — deciding how your address space is actually carved up — saves you from overlapping pools, dead-end subnets, and the renumbering that eats a weekend later. Kea-Ora ships the planners precisely so "do it right" is the easy path, not the tedious one. Plan first, and the rest of the tool is just transcription.
So the real loop has four beats: plan → build → validate → apply.
- Plan the space. Open the IPv4 subnet planner (or IPv6 PD planner for v6) and work out your blocks, subnet boundaries, and pool sizes before you commit anything. Addressing decisions belong here — made on purpose, not discovered by accident halfway through. (More in §5 and §10.)
- Confirm the helper is connected. Open Live config; it should say Helper connected. If not, the page can't reach Kea — see Troubleshooting.
- Build it — add or edit a scope, feeding in the exact numbers the planner just handed you (next section).
- Validate. This checks your config against Kea without changing anything. Fix whatever it flags.
- Apply & save. This does two things at once: applies to the running server (no restart, no lease loss) and writes it to Kea's config file so it survives a reboot.
That's it. Plan → build → Validate → Apply & save. A few supporting buttons:
- Reload file — re-reads the on-disk config, for when someone edited the file directly on the server and you want the page to catch up.
- Full replace — pushes the entire config in one shot rather than a targeted update. Use it when you want the running server to exactly match the page, not a merge.
Habit worth forming: Validate before every Apply. It's free, it's instant, and it turns "why did that break" into "oh, it told me."
5. Scopes — the heart of it
A scope is one subnet (v4) or prefix (v6) that Kea hands addresses from. Click Add scope to open the editor. Ideally you're not inventing numbers here — you're transcribing the boundaries and pool sizes you already worked out in the planner (§10). The planner is where you make the plan; the scope editor is where you commit it; Apply is what makes it live. Keep those three roles distinct in your head and the tool stays simple.
The essentials
- Subnet / Scope prefix (CIDR) — the network, e.g.
203.0.113.0/24 (v4) or a /64 (v6). Required.
- Pool start / Pool end — the range Kea actually leases from. Leave headroom for gateways and static assignments.
- DNS — comma-separated resolvers handed to clients. New scopes pre-fill CentraCom (
69.163.69.163, 1.1.1.1) for v4 and Cloudflare (the 2606:4700:4700:: pair) for v6. The Preset… menu beside the field fills in a known resolver — Cloudflare, Google, Quad9, OpenDNS, Cloudflare Families, AdGuard, or CentraCom (IPv4 only) — with the right addresses for whichever family (v4/v6) you're in. It's just a shortcut; the field stays fully editable, so type your own whenever you like.
- Lease time — how long a client holds an address before renewing.
- Relay (giaddr) — each relay's client-facing IP, i.e. the
giaddr Kea keys on — not the server's IP. You only need this when the relay's address sits outside this scope. (This is exactly what the Router relay setup tool helps you configure on the router side — see §10.)
These don't change how Kea behaves — they're for you, so a scope isn't an anonymous subnet six months later. Location, Router name, Router interface, VLAN, and Service type. They show on the scope row and in properties, so you can tell at a glance that 203.0.113.0/25 is core-rtr-01 · vlan 200 at a given site. For an ISP juggling hundreds of subnets, this is the difference between a tool you trust and a spreadsheet you dread.
In v6 mode the editor adds a PD group: PD prefix, PD length, and delegated length. This is how you hand prefixes (not just addresses) down to customer routers — e.g. delegate a /60 out of a /50 pool. New v6 scopes pre-fill sensible defaults so the group is ready when you need it.
Per-scope access control (MAC / DUID allowlisting)
You can restrict a scope to known clients by MAC (v4) or DUID (v6). Kea-Ora compiles your allowlist into Kea client-classes under the hood, so only listed devices get a lease from that scope.
A scope's pool can also be paused (the ⏸ toggle in the scope editor, or the ⏸ shortcut on its row) — useful when draining customers to another pool. A paused pool issues no new leases and refuses renewals, so clients re-DISCOVER into other pools as their leases come up for renewal; the pool, its config and existing leases stay intact until you resume. Under the hood it's a never-matching guard class (KO-PAUSED) required on the pool. Pausing also mutes that scope's pool-exhaustion alert (and resuming unmutes it). Tip: shorten the lease time before pausing so clients converge quickly.
Be honest with yourself about what this is: it's soft control, convenient for keeping a scope tidy — not a security boundary. A determined device can spoof a MAC/DUID. Real lockdown lives in the network: firewall/ACL rules on UDP 67/68 (v4) and 547/546 (v6), or port security. Use allowlisting for hygiene, not as your only defense.
When the scope looks right: Validate, then Apply & save.
6. Super scopes & blocks (organizing bigger address space)
Beyond a single subnet, Kea-Ora gives you two ways to structure address space:
- Block — a parent range you carve smaller scopes out of, so your addressing stays structured instead of a flat pile of subnets.
- Super Scope (shared network) — several subnets that live on one physical segment, grouped so Kea treats them as one link. This one has real DHCP mechanics behind it, so it's worth understanding properly.
What a shared network actually does
A shared network tells Kea that several subnets sit on the same physical link — the same L2 segment, reached through the same relay interface. Normally Kea answers from the single subnet that matches where a request arrived. Group the subnets into a shared network and Kea treats them as interchangeable on that link: if it can't pin a request to one specific subnet, or the matching subnet's pool is exhausted, it can lease from any member subnet in the group.
That's the whole point of the feature. It's how you:
- add capacity to a segment that outgrew its original subnet (bolt a second subnet onto the same link instead of renumbering),
- run secondary addressing on a segment, or
- sit several subnets behind one relay interface without clients caring which one they land in.
How it's built here
A super scope is a named grouping with no CIDR of its own — it's just the label that ties member subnets together. Member scopes point at it. You can also give the group its own shared-network DNS and lease time that apply across every member, so common options are set once for the whole link rather than repeated per subnet.
Create one from the Add menu in the Assignments view (Super scope), or edit a scope and name the super scope it belongs to. Then Validate and Apply like anything else.
The part that saves you: automatic VLAN grouping
Here's where the tool does the thinking for you. Scopes that share a VLAN are grouped into a shared network automatically, and the group is named by router + VLAN — e.g. sntq-core-r1-42.
That naming convention isn't cosmetic, and it's the detail that prevents a real-world mistake: the same VLAN ID on two different routers is two different L2 segments — so Kea-Ora deliberately makes them two separate shared networks instead of wrongly merging them into one. Grouping subnets that only look related (same VLAN number, different physical segment) is a classic way to hand a client an address that doesn't belong on its link. Here, the safe outcome is the default.
You stay in control of the grouping:
- Keep separate — when scopes happen to share a VLAN but you don't want them treated as one link, split them back out.
- Group / regroup — put a VLAN back together as a shared network.
- Fix / conform nudge — if a group's name drifts from the router-VLAN convention, the tool offers to rename it (or split it by router) in one click.
As always, nothing is live until you Apply to Kea — you can group, split, and rename freely first, then push once you're happy.
7. Locations & routers
Locations are the backbone of the metadata that keeps your scopes legible. From the menu, Add location lets you name a site and attach the routers that live there. Once a location and its routers exist, they show up as dropdowns in the scope editor, so tagging a scope is a pick, not a re-type.
Create your locations from the Location panel first, then they're ready to pick in the scope editor's Location dropdown — tagging a scope stays a quick selection rather than a detour into another form mid-scope.
Renaming a location or router that's already in use (admins only). Open a location's edit dialog from the Location panel (the pencil). If you're an admin, the location name and any in-use router names become editable — rename them right there. The new name is pushed everywhere at once: live scopes, both Assignment views, the location list, and the shared-network names derived from router + VLAN. Names that are already taken are blocked, so you can't accidentally merge two locations or two routers. Because a rename lives inside the Kea config (it's stored on each subnet, and shared-network names are built from the router name), if any live scopes are affected the tool sends you straight to the Apply dialog — push it with Full replace, which rewrites the config in one atomic, backed-up step. If the name only existed in the Assignments (not on a live scope), nothing needs applying.
One thing worth knowing: Kea runs IPv4 and IPv6 as separate servers with separate control sockets, so an Apply only ever pushes the family you're currently in. If a site has both IPv4 and IPv6 scopes, a rename touches both — and the tool handles it in two steps: it applies the family you're in, then shows a note in the Apply dialog with a one-click Switch to IPv6/IPv4 button so you can Full-replace the other side too. Until you do, the second family shows its normal needs-apply indicator, so nothing gets silently left behind. In the edit dialog, each in-use router is also tagged live (on a real Kea scope) or record (Assignments only), so you can see at a glance which renames will reach the running config.
Deleting a location. The × on a location removes it. Any live scopes still tagged to it are moved to Unassigned (recoverable — nothing is lost, and you Apply afterward to push that to Kea). But if the location still has subnets tied to its router(s) in the IPv4 or IPv6 Assignments, the delete is blocked: those records live outside the Kea config, and removing the location would strand them. Clear or reassign them in the Assignments first, then the location will delete cleanly.
8. Assignments — audit-grade lease history
The Assignments view (IPv4 and IPv6 each have their own) is your gap-free record of every address handed out, renewed, and released. It's built on Kea's own forensic logging hook, so nothing is polled or sampled — Kea writes each event the instant it happens. This is the part that's suitable for audits and data-retention obligations.
- Enable logging — an admin turns it on here. Kea-Ora adds the forensic hook to your config, validates, applies, and persists. If a permission or directory prerequisite isn't met, a status banner tells you exactly what still needs doing (rather than silently failing).
- Export — pulls a CSV of the filtered records for an auditor, including the original raw log line for each entry.
- Retention — the installer sets up a daily job that compresses old logs and trims ones past your window (defaults: compress after ~60 days, keep ~3 years). The view reads both live and compressed files, so your full retained history still shows.
9. Dashboard — is everything healthy?
The Dashboard / stats view is your at-a-glance health check: active leases and pool utilization so you can see which scopes are filling up before they run dry. If you've turned on email alerts (§12), this is the visual companion to the "pool getting full" warnings that land in your inbox.
These live in the menu and open as draggable windows you can park beside your work. The two planners aren't afterthoughts — they're step zero of the core loop (§4). Park one next to the scope editor and work left-to-right: plan, then build.
- IPv4 subnet planner — your starting point. Work out subnet boundaries, pool sizes, and splits here first, then carry those exact numbers straight into Add scope → Validate → Apply. Plan in the planner, commit in the editor, push with Apply — that's the whole chain, and doing it in that order is what keeps your address space clean.
- IPv6 PD planner — the v6 equivalent: plan prefix-delegation math (how many
/60s fit in a /50, etc.) before you build the scope, so the delegated ranges you apply are ones you actually reasoned through — not a napkin guess you'll be renumbering later.
- IPv6 toolkit — v6 address helpers (EUI-64, ULA, expand/compress) for the fiddly parts of v6.
- Router relay setup — copy-paste DHCP-relay config for pointing an edge router at this Kea, with tabs for Cisco IOS XR (ASR9010) and Cisco IOS XE (ASR900). Each block has its own Copy button. It includes the two things people forget: the
ipv6 nd managed-config-flag / other-config-flag that actually make clients use DHCPv6 (without the managed flag they SLAAC an address and never reach Kea), and the reminder that the interface's giaddr / link-address must fall inside a scope you've defined here — or Kea won't know which pool to answer from.
- Doctor — diagnostics for when something's off, to point you at the cause.
11. Backups & restore
Here's the reassuring part you don't have to think about: Kea-Ora backs up before it ever changes anything. Every time you apply, save, or reload, the helper first snapshots the current running config — automatically, every time. You never have to remember to do it; the safety net is already under you before the change lands.
How backups are handled
- Automatic on every change. Any action that touches the running server (Apply, Apply & save, apply-subnets, Reload file) takes a snapshot first. No button to press.
- What's captured. The full running config, pulled straight from Kea, written as a timestamped JSON file — a complete, standalone copy, not a diff.
- Where they live.
/opt/kea-helper/backups/ on the server, named like kea-v4-20260707-143012.json. IPv4 and IPv6 are kept as separate families, so each side has its own history.
- Rolling retention. Kea-Ora keeps the most recent 20 per family and quietly prunes older ones. So the folder never grows without bound — but it's a rolling window, not forever. If you need to keep a specific config long-term, copy that JSON file somewhere safe (or use it as a known-good you re-import).
- View — read a backup's contents first, so you know exactly what you're about to roll back to. Viewing changes nothing.
- Restore — roll the running config back to that snapshot. This isn't a blind overwrite: Kea-Ora takes a fresh safety snapshot of the current state, then validates the backup, applies it to the running server, and persists it to disk. If validation fails, it stops and nothing changes — and because it snapshotted first, the restore itself is undoable.
So the whole safety story is: you're covered automatically before every change, every snapshot is a full config you can inspect, and even a restore can be walked back. Take a manual look at Backups before a big change if you like — but the automatic snapshot means a bad apply is never a dead end.
12. Settings — users, alerts, password
From the menu:
- Users — Kea-Ora has roles. An admin can change config; a read-only user can view scopes, assignments, and the dashboard but can't apply changes. Give NOC staff read-only and keep apply rights to the people who should have them.
- Email notifications — opt-in SMTP alerts for config changes and pool-utilization thresholds (getting full, recovered, and a forecast). This is how you find out a scope is filling up before a customer calls.
- Change password — self-explanatory; do this for the initial admin immediately if you haven't.
- Kea server settings — the Kea daemon's listen interface and related options (local or remote Kea alike).
13. The safety model (why it's built this way)
Worth understanding so you work with the grain:
- The helper binds to
127.0.0.1 only. Never change it to 0.0.0.0 or expose port 8765. Reach it over SSH (ssh -L 8765:127.0.0.1:8765 you@server). The helper can rewrite Kea's entire config — that power is exactly why it stays local.
- The helper only accepts a fixed set of actions (validate, apply, save, reload) against the socket paths it's configured for. It won't run arbitrary commands.
- Login-gated, but the sign-in page is visible to anyone who can reach the port — so firewall it to trusted sources and put TLS in front for production (the built-in Caddy option, or your own reverse proxy).
14. Quick troubleshooting
- "No helper detected" / not connected → the helper service isn't running, or you opened the page from the wrong address. Confirm the helper is up and you're reaching it through it (locally or via the SSH tunnel).
- "control socket not found" → Kea's
control-sockets block is missing, or Kea wasn't restarted after it was added, or the helper is looking in the wrong place. On Kea 3.0 the socket must live in Kea's own dir (/run/kea).
- "socket error: Permission denied" → the helper isn't running as a user that can reach the socket (usually
_kea). Match it to whoever owns /run/kea.
- A change was rejected → good news, actually: Kea kept its previous config and the page shows the reason. Fix it in the editor and re-apply. Nothing broke.
- "Where did my scope go?" → check the IPv4/IPv6 toggle. You're almost certainly looking at the other family.
The one-paragraph version
Sign in and set your password. Confirm Helper connected. Pick IPv4 or IPv6. Plan your space in the planner first — blocks, boundaries, pool sizes — then Add scope, transcribe those numbers, and tag it with location/router so future-you knows what it is. Validate, then Apply & save — now it's live and saved. Turn on Assignments logging for an audit trail, watch pool utilization on the Dashboard, take a Backup before big changes, and use Router relay setup to point your edge gear at Kea. That's Kea-Ora: plan the space, build the intent, apply it in one click, and get on with your day.