Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
○Not yet marked complete on this device.
The previous lesson built zones, VNets and subnets. It left one question
open, and it is the question that decides whether SDN is worth the
machinery: who decides which address a new guest gets, and who else
finds out about it?
Without IPAM, the answer is a person and a spreadsheet. Somebody picks
192.0.2.47 because the wiki page says .40 to .60 are free, writes
it into the guest, updates the wiki, and — on a good day — asks somebody
to add a DNS record. Three of those four steps are done by hand and the
fourth is done by a different team.
With IPAM and a DNS plugin, creating a guest allocates the address and
registers the name. That is a real reduction in operational surface, and
it introduces a dependency that was not there before.
Three IPAM plugins
An IPAM is selected per zone, in the zone’s IPAM field, and
defaults to pve.
PVE IPAM — the built-in one
The default. Allocations are stored in the Proxmox cluster filesystem
alongside the rest of the SDN configuration under /etc/pve/sdn, which
means they are replicated to every node and shared with them
automatically.
You can “inspect the current status of the PVE IPAM Plugin via the IPAM
panel in the SDN section of the datacenter configuration”, and create,
update and delete IP mappings there.
This is the right starting point for almost every estate. It has no
external dependency, it survives a node loss because it is in pmxcfs,
and it is visible in the same GUI as everything else.
Its limitation is scope: it knows about the addresses Proxmox allocated,
and nothing else. If your network team also assigns addresses in the
same subnets — for switches, printers, physical servers — the PVE IPAM
has no view of those, and nothing prevents a collision.
NetBox
Two configuration properties:
URL — “The NetBox REST API endpoint:
http://yournetbox.domain.com/api”
Token — “An API access token”
The token is generated in NetBox itself, and the documentation points at
the upstream instructions for doing so.
Configuration changeregister a NetBox IPAM— Creates the IPAM entry at datacenter level. It is not used until a zone selects it. The token is a credential with write access to your address database, so it belongs in /etc/pve, which is mode 0700 for its private subtree - not in a playbook checked into git.
NetBox is the right choice when it is already the organisation’s source
of truth for addressing. The value is not that Proxmox allocates
addresses better — it is that the network team’s view and the
virtualisation team’s view stop being two databases that disagree.
phpIPAM
Three configuration properties:
URL — “The REST-API endpoint:
http://phpipam.domain.com/api/<appname>/”
Token — “An API access token”
Section — “An integer ID. Sections are a group of subnets in
phpIPAM. Default installations use sectionid=1 for customers.”
The <appname> component of the URL is the API application you created
inside phpIPAM, not a placeholder Proxmox fills in. Getting it wrong
produces an authentication failure rather than a not-found error, which
sends people to the token.
DNS: the PowerDNS plugin
A DNS plugin is also selected per zone, and it is what turns an
allocated address into a resolvable name.
PowerDNS has to be prepared first. The documentation is specific:
“You need to enable the web server and the API in your PowerDNS
config” with
url — “The REST API endpoint:
http://yourpowerdnserver.domain.com:8081/api/v1/servers/localhost”
key — “An API access key”
ttl — “The default TTL for records”
The zone then carries the DNS settings:
Field
Level
Meaning
DNS
Zone
“DNS API server. Optional.”
ReverseDNS
Zone
“Reverse DNS API server. Optional.”
DNSZone
Zone
“DNS domain name. Used to register hostnames… The DNS zone must already exist on the DNS server. Optional.”
DNS Zone Prefix
Subnet
“Add a prefix to the domain registration”
Two details in that table repay attention.
The DNS zone must already exist. Proxmox registers records into a
zone; it does not create the zone. A DNSZone naming something PowerDNS
does not serve fails at registration time, which is to say at guest
creation time.
Forward and reverse are separate settings. Configuring DNS and
leaving ReverseDNS empty gives you A records and no PTR records —
a state that looks complete until something does a reverse lookup, which
in practice is a monitoring system or an SSH server with
UseDNS.
DNS Zone Prefix is per subnet, which is how several subnets in one
zone get distinct names: a guest in the subnet with prefix dmz becomes
hostname.dmz.example.com rather than colliding with the same hostname
in another subnet.
Read-only / Safewhat is configured today— Read-only. Shows the registered IPAM and DNS backends and which zones reference them. A zone with no ipam field is using the pve default rather than nothing.
pvesh get /cluster/sdn/ipams --output-format yaml
pvesh get /cluster/sdn/dns --output-format yaml
pvesh get /cluster/sdn/zones --output-format yaml
Verification that can fail
The configuration being accepted proves that Proxmox could parse it. It
does not prove that the far service will answer, and the two failures
look different at very different times.
Read-only / Safeprove the external services actually answer— Read-only against both services. Run it from a Proxmox node, not from your workstation - the node is what will need to reach them at guest-creation time, and a firewall between them is exactly the defect this catches.
Then do the thing that actually matters: create a guest on a VNet in the
zone, and check that the address appears in the IPAM and the name
resolves.
Read-only / Safeend-to-end check after creating a test guest— Read-only. If the allocation appears in the IPAM panel but the name does not resolve, the IPAM half works and the DNS half does not - which narrows the problem to the DNS plugin or the zone that was supposed to already exist.
HOSTNAME=sdn-test-01
DOMAIN=example.com
pvesh get /cluster/sdn/ipams/pve/status --output-format yaml 2>/dev/null | head -30
dig +short "$HOSTNAME.$DOMAIN"
dig +short -x 192.0.2.47
Common mistakes
Treating the IPAM as the only record and never reconciling it. It
drifts from restores, hand-edits and failed provisioning runs.
Pointing DNSZone at a zone PowerDNS does not serve. The zone
must already exist; registration fails at guest creation.
Configuring DNS and forgetting ReverseDNS. You get A records
and no PTR records, and discover it through a monitoring system.
Selecting NetBox on every zone. Provisioning now has a dependency
outside the cluster on every path. Keep one zone on pve.
Getting the phpIPAM <appname> wrong in the URL. The error looks
like an authentication failure.
Storing the IPAM token in a playbook rather than letting Proxmox
hold it. It is a write credential for the organisation’s address
database.
Assuming an external IPAM is restored with /etc/pve. It is not,
which is a feature — and it means it needs its own backup.
Building production automation on the tech-preview surface without
reading release notes at upgrade time.
Key takeaways
IPAM is selected per zone and defaults to the built-in pve plugin,
whose state lives in /etc/pve/sdn and is replicated across the
cluster.
NetBox takes a URL and a token; phpIPAM takes a URL, a token and a
numeric section ID.
The PowerDNS plugin needs the API and web server enabled on the
PowerDNS side, and takes url, key and ttl.
Zones carry DNS, ReverseDNS and DNSZone; subnets carry a
DNS Zone Prefix. The DNS zone must already exist.
An external IPAM makes guest creation depend on a service the cluster
does not control. Monitor it from a node and keep a pve-IPAM zone as
a fallback.
The built-in IPAM is in your configuration backup, so a /etc/pve
restore can resurrect a stale allocation table and cause duplicate
addresses.
Reconcile the IPAM against guest configuration and the neighbour table
on a schedule, not after an incident.
Knowledge check
Knowledge check · 4 questions
Q1. A cluster using the built-in PVE IPAM has /etc/pve restored from a four-week-old configuration backup after an incident. Guests created during those four weeks are running normally. What problem has been introduced?
Q2. Guests on an SDN zone get their address allocated and appear in the IPAM panel, but no DNS record is created. The PowerDNS API answers when tested from a node with the configured key. What should you check next?
Q3. Which are genuine consequences of selecting NetBox rather than the built-in PVE IPAM on a zone? Select all that apply.
Q4. With the built-in PVE IPAM, a cluster that has lost quorum can still allocate an address to a newly created guest, because the allocation is local to the node doing the work.
Passing score: 75%. Answers are checked in this browser.