By Manny Fernandez

August 25, 2026

Deploying Fortinet IPAM on FortiOS: Centralized IP Address Management Across the Security Fabric

1. Executive Summary

Objective

This guide turns the FortiGate into the authoritative source of truth for private IPv4 subnet allocation across a Security Fabric. You will define address pools, write allocation rules that key off device serial, interface name, and interface role, enroll interfaces as IPAM-managed, and hand the resulting subnets straight to the built-in DHCP server. The result is that a new branch FortiGate, a new SSID, or a new FortiExtender LAN extension gets a non-overlapping subnet the moment it comes online, with no spreadsheet and no engineer picking a number by hand.

Why it matters

Overlapping RFC 1918 space is the single most common reason a site-to-site VPN, an SD-WAN overlay, or a post-acquisition merge turns into a NAT project. IPAM on FortiOS removes the human allocation step entirely, and it does it without adding a licensed appliance to the design. It is free, it is already in the firmware, and almost nobody turns it on.

Target audience

Network engineers, security engineers, and systems administrators who own a multi-site FortiGate estate. Also relevant to SD-Branch and LAN Edge architects who are standing up FortiAP and FortiExtender at scale and want addressing to be deterministic rather than negotiated.

2. Prerequisites & Architecture

Assumed knowledge

  • FortiOS CLI structure (config / edit / set / next / end) and tab completion.
  • Security Fabric roles: which device is the Fabric root, and how downstream members join.
  • FortiOS interface roles (lan, wan, dmz, undefined) and how role affects GUI behavior.
  • Classful notation, since IPAM pools are restricted to class A and class B masks.
  • Basic DHCP server configuration on a FortiGate interface.

Environment and lab requirements

  • FortiOS 7.6.x is the baseline used throughout. IPAM exists from 7.0, but pools, rules, exclusions, and the modern diagnostics only line up from 7.2 and 7.4 onward. A version matrix is in Section 6.
  • No additional license. Local IPAM is a FortiOS feature. The separate FortiIPAM service is a different product and is only relevant if you set the server type to cloud.
  • One FortiGate minimum. A standalone FortiGate can be its own IPAM server. To exercise the fabric behavior you want a root plus at least one downstream member.
  • Lab platform: physical FortiGates, or FortiGate-VM on Proxmox, ESXi, KVM, or EVE-NG. Two vCPU and 2 GB RAM per VM is sufficient.
  • Out-of-band access. Console or a dedicated management interface. You will be re-addressing LAN interfaces, and you do not want your only session riding on one of them.

Component table

Component Role in this build Identity / address
FGT-ROOT Fabric root and IPAM server. Owns pools, rules, and the allocation database. mgmt 10.10.10.1/24
SN FG200G<root_serial>
FGT-BR1 Downstream fabric member. Consumes allocations, cannot edit IPAM settings. SN FG91G<br1_serial>
FGT-BR2 Second downstream member, used to prove non-overlap across sites. SN FG91G<br2_serial>
FAP-431G FortiAP managed by FGT-BR1. Its SSID interfaces are vap-switch type and can be auto-addressed. SSID interface guest-ssid
FEXT-201F FortiExtender providing a LAN extension interface (lan-extension type). Auto-managed if enabled
Pool corp-lan Every interface carrying the lan role, estate wide. 10.64.0.0 255.255.0.0
Pool guest-wifi Guest SSID subnets, kept in a distinct block for policy and route filtering. 10.80.0.0 255.255.0.0
Pool branch-edge DMZ and appliance segments at branch sites only. 172.20.0.0 255.255.0.0

Architecture note

IPAM allocates subnets to interfaces, not addresses to hosts. It is the layer above DHCP: IPAM decides that FGT-BR2 port5 owns 10.64.7.0/24, and the FortiGate DHCP server then leases 10.64.7.10 through 10.64.7.254 to endpoints on that segment. Keep the two mental models separate and the whole feature stops being confusing.

3. Step-by-Step Implementation Workflow

Phase 1: Pre-flight and baseline capture

The goal: confirm the firmware level, confirm which device is the fabric root, capture the existing IPAM state, and take a restore point. IPAM can re-address live interfaces, so this phase is not optional.

The action: run the following on FGT-ROOT from a console or management-interface session.

FGT-ROOT # get system status
FGT-ROOT # show system csf
FGT-ROOT # diagnose sys csf neighbor list

# What IPAM already looks like (a factory-reset unit is NOT empty here)
FGT-ROOT # show system ipam
FGT-ROOT # show full-configuration system ipam

# Restore point before you touch anything
FGT-ROOT # execute backup config tftp pre-ipam-<yyyymmdd>.conf <tftp_server_ip>

GUI verification: go to Network > IPAM. If the menu item is missing, IPAM has never been enabled and the page is hidden until you turn it on, or you are looking at a downstream member whose root already owns the feature. Fabric membership is confirmed under Security Fabric > Fabric Connectors.

Know your default state

After a factory reset, enabling IPAM status auto-generates two subnets plus two rules. One rule is named role-lan, bound to 192.168.0.0/255.255.0.0, role LAN, DHCP enabled. The other is the Implicit Rule, which covers all subnets with role ANY and DHCP disabled, and which you cannot edit or delete. Plan your pools knowing that a 192.168.0.0/16 rule may already be sitting there matching everything you were about to catch yourself.

Phase 2: Define the address pools and exclusions

The goal: carve the estate’s private space into named pools before any rule references them. Exclusions protect ranges you have already assigned by hand, such as a static server VLAN or a legacy site that is not migrating.

The action: create three pools on FGT-ROOT. Pool subnets accept class A or class B masks only, so 255.255.0.0 is the smallest mask you can use for a pool.

config system ipam
    config pools
        edit "corp-lan"
            set description "Estate wide LAN role allocations"
            set subnet 10.64.0.0 255.255.0.0
            config exclude
                edit 1
                    set exclude-subnet 10.64.250.0 255.255.255.0
                next
                edit 2
                    set exclude-subnet 10.64.251.0 255.255.255.0
                next
            end
        next
        edit "guest-wifi"
            set description "Guest SSID subnets, no east-west reachability"
            set subnet 10.80.0.0 255.255.0.0
        next
        edit "branch-edge"
            set description "Branch DMZ and appliance segments"
            set subnet 172.20.0.0 255.255.0.0
        next
    end
end

GUI verification: Network > IPAM > IPAM Subnets. Add the subnet and netmask in Subnets, add the reserved ranges under Excluded subnets, click OK. The page renders a utilization chart splitting the space into IPAM-managed and unallocated, allocated by IPAM, manually configured, DHCP clients, and reserved. That chart is the fastest capacity answer you will get, and it is worth screenshotting for change records.

Phase 3: Enable IPAM and set the automation scope

The goal: turn the service on and, more importantly, decide how aggressive it is allowed to be. The three manage options are the blast radius control. Each one silently enrolls a whole category of interfaces.

The action: for a production cutover, enable status with all three manage options disabled first, enroll interfaces explicitly, then switch the manage options on once the pools and rules are proven.

config system ipam
    set status enable
    set server-type fabric-root

    # Blast radius: start conservative, widen later
    set manage-lan-addresses disable
    set manage-ssid-addresses disable
    set manage-lan-extension-addresses disable

    # Behavior controls
    set automatic-conflict-resolution enable
    set require-subnet-size-match disable
end
Setting GUI label What it actually does
status Status Master switch. Enabling it on a freshly reset unit also seeds the default subnets and the role-lan rule.
server-type n/a (CLI only) Chooses whether this FortiGate serves allocations locally as fabric root, or defers to the cloud service. Use fabric-root for the design in this guide.
manage-lan-addresses Interfaces with LAN role Every interface whose role is lan becomes IPAM-managed with no per-interface config. This is the option that re-addresses your production LAN.
manage-ssid-addresses FortiAP SSIDs Auto-enrolls vap-switch type interfaces. Excellent for scale wireless, since every new SSID gets clean space.
manage-lan-extension-addresses FortiExtender LAN extensions Auto-enrolls lan-extension type interfaces created by FortiExtender.
automatic-conflict-resolution Auto-resolve conflicts When an IPAM allocation collides with an existing address, IPAM reallocates instead of leaving the interface flagged for a human.
require-subnet-size-match Require subnet size match Forces the allocation to match the requested network size exactly rather than accepting a different-sized block. Leave it off until you have watched a few allocations land.

Phase 4: Write the allocation rules

The goal: map a request to a pool. A rule matches on any combination of device serial, interface name, and interface role, then hands back a subnet from the named pool and optionally builds the DHCP server for you.

The action: create three rules, moving from most specific to most general. Use * as the wildcard for device or interface.

config system ipam
    config rules
        # Most specific: DMZ segments on branch 1 only, no DHCP (static appliances)
        edit "rule-br1-dmz"
            set description "BR1 DMZ appliances, statically addressed"
            set device "<br1_serial_number>"
            set interface "*"
            set role dmz
            set pool "branch-edge"
            set dhcp disable
        next

        # Named interface across every device in the fabric
        edit "rule-guest-ssid"
            set description "Guest wireless SSID interfaces"
            set device "*"
            set interface "guest-ssid"
            set role any
            set pool "guest-wifi"
            set dhcp enable
        next

        # Catch-all for LAN role, estate wide
        edit "rule-corp-lan"
            set description "Any LAN role interface, any device"
            set device "*"
            set interface "*"
            set role lan
            set pool "corp-lan"
            set dhcp enable
        next
    end
end

GUI verification: Network > IPAM > IPAM Rules. Your three rules appear alongside the read-only Implicit Rule. Confirm the Implicit Rule sits last in evaluation and that its pool membership does not shadow a rule you care about. Because the implicit entry covers all subnets with role ANY, a badly scoped custom rule is easy to hide behind it.

Phase 5: Enroll interfaces and set the network size

The goal: tell a specific interface to stop holding a hand-typed address and take whatever IPAM gives it. This is the moment addressing changes, so schedule it.

The action: on FGT-BR1, enroll port5 with a 256-address block. The value in managed-subnetwork-size is a host count, not a prefix length. 256 gives you a /24.

config system interface
    edit "port5"
        set alias "BR1-USER-VLAN"
        set role lan
        set ip-managed-by-fortiipam enable
        set managed-subnetwork-size 256
        set allowaccess ping
    next
end

# Valid sizes (host counts):
# 4  8  16  32  64  128  256  512  1024  2048
# 4096  8192  16384  32768  65536

# Third option: follow the global manage-* switches instead of deciding per interface
config system interface
    edit "port6"
        set role lan
        set ip-managed-by-fortiipam inherit-global
    next
end

GUI verification: Network > Interfaces, edit the port, set Role to match the role your rule expects, then set Addressing Mode to IPAM and pick a Network size. Save. Reopen the interface and the assigned subnet is displayed. The estate-wide view lives at Network > IPAM > IPAM Interfaces, which lists every managed interface, its device, and its current allocation.

Role is the join key

The interface role and the rule role have to line up. An interface left at role undefined will not match a rule scoped to lan, and it will fall through to the Implicit Rule or get nothing at all. Set the role first, then the addressing mode.

Phase 6: Let IPAM build the DHCP server

The goal: avoid the second manual step. When a rule carries set dhcp enable, FortiOS provisions a DHCP server on the interface using the freshly allocated subnet, so a new branch VLAN is serving leases without anyone typing a range.

The action: confirm the generated server, then layer on the options your estate standard requires (DNS, NTP, domain, lease time). Those options are yours to set; IPAM only supplies the range.

FGT-BR1 # show system dhcp server

config system dhcp server
    edit 3
        set dns-service default
        set default-gateway 10.64.7.1
        set netmask 255.255.255.0
        set interface "port5"
        config ip-range
            edit 1
                set start-ip 10.64.7.2
                set end-ip 10.64.7.254
            next
        end
    next
end

# Layer your standards on top without disturbing the IPAM-derived range
config system dhcp server
    edit 3
        set lease-time 28800
        set domain "<your_domain>"
        set ntp-service specify
        set ntp-server1 <ntp_server_ip>
    next
end

GUI verification: Network > Interfaces, edit the port, and the DHCP Server block is already populated and enabled. Live leases show under Dashboard > Network > DHCP.

Phase 7: Bring the downstream fabric members in

The goal: prove that FGT-BR1 and FGT-BR2 draw from the same allocation database and therefore cannot collide. This is the entire point of the feature.

The action: nothing is configured on the downstream units beyond joining the fabric and enrolling interfaces. Once the root owns IPAM, downstream members cannot change IPAM settings, and their IPAM cards are read-only by design.

# On FGT-BR2: enroll and let the root decide the subnet
config system interface
    edit "port5"
        set alias "BR2-USER-VLAN"
        set role lan
        set ip-managed-by-fortiipam enable
        set managed-subnetwork-size 256
    next
end

# On FGT-ROOT: watch both branches land in different space
FGT-ROOT # diagnose sys ipam list entries

GUI verification: on the root, Network > IPAM > IPAM Interfaces now lists interfaces belonging to all three FortiGates with distinct subnets. On a downstream member, the same page renders but the settings are not editable.

4. Verification & Validation

Run all of these from the IPAM server (the fabric root). Three commands answer almost every question you will have: what is allocated, what is left, and how big a block can I still hand out.

4.1 The allocation table

FGT-ROOT # diagnose sys ipam list entries

IPAM Entries: (sn, vdom, interface, subnet/mask, flag)
FG200G<root_serial>   root   port10       10.64.0.1/24    0
FG91G<br1_serial>     root   port5        10.64.1.1/24    0
FG91G<br2_serial>     root   port5        10.64.2.1/24    0
FG91G<br1_serial>     root   guest-ssid   10.80.0.1/24    0
FG91G<br1_serial>     root   port7        172.20.0.1/28   0

What success looks like: one row per managed interface, every subnet unique, the pool prefix matching the rule you expect (10.64.x for LAN role, 10.80.x for the guest SSID, 172.20.x for BR1 DMZ). The trailing field is a state flag; rows that are not zero are the ones to cross-check against the IPAM Interfaces page, since flagged entries are where conflicts and manual overrides surface.

4.2 Remaining capacity

FGT-ROOT # diagnose sys ipam list subnets

IPAM free subnets: (subnet/mask)
10.64.3.0/24
10.64.4.0/22
10.64.8.0/21
10.64.16.0/20
10.64.32.0/19
10.64.64.0/18
10.64.128.0/17

FGT-ROOT # diagnose sys ipam largest-available-subnet
Largest available subnet is a /17.

What success looks like: the free list is contiguous and aggregates cleanly, and the largest available block is comfortably bigger than your next planned allocation. If the free list has fragmented into a scatter of small blocks, someone has been allocating and releasing odd sizes and it is time to review your standard network size.

4.3 Interface-level confirmation and a real data path test

# Did the interface actually take the address?
FGT-BR1 # get system interface physical | grep -A 3 port5
FGT-BR1 # show system interface port5

# Is the route in the table?
FGT-BR1 # get router info routing-table connected

# Is DHCP leasing from the allocated block?
FGT-BR1 # execute dhcp lease-list port5

# Prove reachability from an endpoint on the new segment
FGT-BR1 # execute ping-options source 10.64.1.1
FGT-BR1 # execute ping <upstream_gateway_ip>

What success looks like: show system interface port5 reports the IPAM-assigned address with ip-managed-by-fortiipam enable, a matching connected route is present, a client on the segment holds a lease inside the allocated /24, and it can reach its default gateway.

5. Troubleshooting & Gotchas

Gotcha 1: You enabled the manage options and lost your session

Symptom: the moment manage-lan-addresses enable is committed, HTTPS and SSH sessions on LAN interfaces drop and do not come back at the old address. This is not a bug. Every interface with the lan role was just enrolled and re-addressed out of the pool.

Diagnose from console:

# What did the box give itself?
FGT-ROOT # diagnose sys ipam list entries
FGT-ROOT # get system interface physical

# Confirm which global switches are on
FGT-ROOT # show full-configuration system ipam | grep manage

Resolution: reconnect on the new address, or opt the management segment out. Two clean patterns: give the management interface a role other than lan so the manage switch never catches it, or pin it with an explicit per-interface override.

config system interface
    edit "<management_interface>"
        set ip-managed-by-fortiipam disable
        set ip 10.10.10.1 255.255.255.0
        set allowaccess ping https ssh
    next
end

Gotcha 2: The interface is enrolled but never receives a subnet

Symptom: addressing mode shows IPAM, but the interface has no address, or it silently receives space from the wrong pool. There are four usual causes and they are all rule matching problems.

  • Role mismatch. Interface role is undefined or dmz while the rule expects lan.
  • Serial typo. A rule scoped to a specific device serial matches nothing. Wildcard it temporarily to prove the theory.
  • Pool exhaustion or fragmentation. The pool cannot satisfy the requested network size, especially with size matching enforced.
  • Exclusion overlap. The only free space left in the pool sits inside an excluded subnet.
# 1. Can the pool even satisfy the request?
FGT-ROOT # diagnose sys ipam largest-available-subnet
FGT-ROOT # diagnose sys ipam list subnets

# 2. Does the rule say what you think it says?
FGT-ROOT # show full-configuration system ipam

# 3. Does the interface role match the rule role?
FGT-BR1 # show system interface port5 | grep role

# 4. Temporarily relax size matching and retest
config system ipam
    set require-subnet-size-match disable
end

Resolution: fix the role first, since it is the most common cause. If capacity is the issue, either shrink the requested network size, add a second pool subnet, or trim an over-broad exclusion. Toggling the interface between disable and enable on ip-managed-by-fortiipam forces a fresh allocation request.

Gotcha 3: Conflict markers on interfaces that overlap manually configured space

Symptom: the IPAM Interfaces page shows a conflict marker against an interface, or an allocation quietly moves to a different subnet than the one you saw yesterday. IPAM detects collisions between what it allocated and what already exists in the network, including addresses typed in by hand on non-managed interfaces.

Diagnose:

# Look for rows carrying a non-zero flag
FGT-ROOT # diagnose sys ipam list entries

# Is auto-resolve on or off?
FGT-ROOT # show full-configuration system ipam | grep conflict

# Find the manual address that collides
FGT-ROOT # get system interface physical
FGT-ROOT # get router info routing-table connected

Resolution: with automatic-conflict-resolution enable, IPAM reallocates on its own and the marker clears. That is convenient and it is also why a subnet can change under you, which breaks anything static that points at it. With auto-resolve disabled, go to Network > IPAM > IPAM Interfaces, find the flagged interface, and either edit it or reallocate it by hand. The durable fix is to add the manually addressed range to the pool’s exclusion list so IPAM never offers it again.

Gotcha 4: A decommissioned FortiGate is still holding subnets

Symptom: a site was retired or an RMA swapped a chassis, but diagnose sys ipam list entries still shows allocations against the old serial number and the free list never recovers that space. Allocations are keyed to the serial, so a replacement unit is a new device with new allocations while the ghost entries linger.

# Confirm the stale serial is still consuming space
FGT-ROOT # diagnose sys ipam list entries

# Release everything held by that device
FGT-ROOT # diagnose sys ipam delete device <old_serial_number>
Successfully removed device <old_serial_number> from ipam

# Confirm the space returned to the free pool
FGT-ROOT # diagnose sys ipam list subnets
FGT-ROOT # diagnose sys ipam largest-available-subnet

Older firmware, different verbs

On FortiOS 7.0 the diagnostics use the original command names: diagnose sys ipam dump-ipams-entries, diagnose sys ipam dump-ipams-free-subnets, and diagnose sys ipam delete-device-from-ipams. If a runbook fails on a 7.0 box, this is usually why.

6. Version Matrix: Know Before You Design

FortiOS What you get
7.0 Local IPAM on the FortiGate. Single pool subnet, fabric root acts as server, downstream settings locked. Diagnostics use the dump-ipams command names.
7.2 Multiple pools and allocation rules, matching on device, interface, and role, with optional DHCP provisioning. Dedicated IPAM GUI page.
7.4 Manage options for LAN role, SSID, and LAN extension interfaces. Automatic conflict resolution. Pool exclusions and subnet size matching.
7.6 The mature baseline used in this guide. Four GUI tabs (Settings, Rules, Interfaces, Subnets), utilization chart, conflict markers, modern diagnostics.
8.0 Rules gain item-type (interface or address) with item-name, a vdom selector, and a dhcp-template. A DHCP Templates tab joins the GUI.

The 8.0 upgrade note worth writing down

In 8.0 the rule object drops the standalone interface field in favor of the item-type plus item-name pair, which also lets a rule target firewall address objects rather than only interfaces. Any automation or Terraform module that writes set interface into config system ipam / config rules needs updating before you jump to 8.0.

7. Operational Guidance

  • Standardize one network size. Pick 256 and stick to it unless a segment genuinely needs otherwise. Mixed sizes fragment the pool and make the free list ugly.
  • Exclude before you enable. Every hand-assigned range that will outlive the migration belongs in an exclusion list on day one, not after the first conflict.
  • Do not point static config at IPAM subnets. Firewall address objects, VPN phase 2 selectors, and route filters that hardcode an IPAM-allocated subnet will break the day conflict resolution moves it. Reference interfaces or use dynamic objects instead.
  • Treat the root as a dependency. The fabric root owns the allocation database. Back it up on the same schedule as the rest of your config, and know how you would rebuild the table if you lost it.
  • Capture the free list in change records. Two commands, diagnose sys ipam list entries and diagnose sys ipam list subnets, are the before-and-after evidence for any addressing change.


Recent posts

  • If you've spent any time configuring user authentication on... Full Story

  • DNS is one of those technologies that quietly underpins... Full Story

  • BGP issues on FortiGate firewalls usually trace back to... Full Story

  • Every time your laptop talks to your router, a... Full Story

  • If you've spent any time configuring NAT on a... Full Story

  • If you have spent any time configuring firewall policies... Full Story

  • High availability on FortiGate is one of those features... Full Story

  • If you've configured SD-WAN on a FortiGate, you've almost... Full Story

  • FortiLink is the management protocol that turns a FortiSwitch... Full Story

  • FortiSwitches are pretty rock solid from Mean Time Between... Full Story

  • This is a quicky tip.  Have you ever gone... Full Story

  • DNS is one of those quiet pieces of internet... Full Story

  • This article is an updated version of the previous... Full Story

  • You will add ns2 as a secondary (slave) BIND9... Full Story

  • In the process of deploying my lab, I needed... Full Story

  • RFC 8805, used to be known as Self-Correcting IP... Full Story

  • Years back, I wrote an article about certificate pinning. ... Full Story

  • FortiGates have the ability to send alerts to Microsoft... Full Story

  • In this post, I am going to walk through... Full Story

  • Troubleshooting VoIP on a FortiGate can feel like trying... Full Story

  • Prior to FortiOS 7.0, there were three commands to... Full Story

  • In this post, I am going to go over... Full Story

  • What we are going to do:  We are going... Full Story

  • Choosing between FGCP (FortiGate Clustering Protocol) and FGSP (FortiGate... Full Story

  • Creating a VLAN on macOS (The "Pro" Move) A... Full Story

  • This blog post explores the logic behind how macOS... Full Story

  • Pretty Fly for a Wi-Fi Tell My Wi-Fi Love... Full Story

  • Part of my daily gig is creating BoMs (Bill-of-Materials)... Full Story

  • ICMP introduces several security risks, but careful filtering, rate... Full Story

  • The command diag debug application dhcps -1 enables full... Full Story

  • In the world of FortiOS, execute tac report is... Full Story

  • LLDP; What is it The Link Layer Discovery Protocol... Full Story

  • What it actually does When you run diagnose fdsm... Full Story

  • Monkey Bites are bite-sized, high-impact security insights designed for... Full Story

  • I have run macOS in macOS with Parallels but... Full Story

  • Don't be confused with my other FortiNAC posts where... Full Story

  • This is the third session in a multi-part article... Full Story

  • Today I was configuring key-based authentication on a FortiGate... Full Story

  • Netcat, often called the "Swiss Army knife" of networking,... Full Story

  • At its core, IEEE 802.1X is a network layer... Full Story

  • In case you did not see the previous FortiNAC... Full Story

  • This is our 5th session where we are going... Full Story

  • Now that we have Wireshark installed and somewhat configured,... Full Story

  • The Philosophy of Packet Analysis Troubleshooting isn't about looking... Full Story

  • 1. Title & Executive Summary Objective dhcping sends a... Full Story

  • Objective: This guide shows how to use Scapy to... Full Story

  • Executive Summary ipcalc looks like a single, predictable command,... Full Story