User guide

Network and IPAM

Looking for what it does rather than how to use it? Read the Network and IP addresses overview .

Applies to the MSP portal, the organization portal, and the read-only network views in the customer portal.


What it is

IPAM is the record of every network you run: the VLANs, the subnets carved out of them, the individual addresses assigned inside those subnets, the DHCP pools that hand addresses out, and the DNS zones that name them. It replaces the spreadsheet.

It is a documentation system, not a control plane. Solidlio does not push configuration to switches, DHCP servers or DNS servers; it records what is supposed to be true so a human or a script can act on it.


Concepts

ConceptWhat it is
VLAN groupA named VID range, e.g. “Toronto 100–199”. Optional. Purely organizational.
VLANA VLAN ID (1–4094) with a name, a role and a status, optionally pinned to a location.
SubnetA CIDR prefix, IPv4 or IPv6, optionally nested under a parent subnet.
IP addressOne address inside one subnet, with a status and an optional assignment target.
DHCP scopeA lease pool inside one subnet, with lease times and DHCP options.
DHCP exclusionA range inside a scope the pool must not hand out.
DHCP reservationA MAC pinned to a specific address inside a scope.
DNS zoneA forward or reverse zone with SOA fields and a default TTL.
DNS recordOne record inside a zone, optionally linked to an IpAddress row.
Port VLAN configThe access/voice or native/tagged VLAN assignment on one physical network port.

The hierarchy

VLAN group ─┬─ VLAN ─┬─ Subnet ─┬─ Subnet (child)
            │        │          ├─ IP address
            │        │          └─ DHCP scope ─┬─ exclusion
            │        │                         └─ reservation
            │        └─ Port VLAN config
            └─ …

DNS zone ─── DNS record ─── (optionally) IP address

A subnet may be nested under a parent subnet to any depth. A child must be an identical IP version and must be fully contained inside its parent.

Statuses

ModelStatuses
VLANACTIVE RESERVED DEPRECATED PLANNED
SubnetACTIVE RESERVED DEPRECATED PLANNED FULL
IP addressACTIVE AVAILABLE RESERVED DHCP DEPRECATED CONFLICT
DHCP scopeACTIVE INACTIVE FAILOVER
DNS zoneACTIVE INACTIVE DELEGATED
DNS recordACTIVE INACTIVE PENDING

How an address status affects capacity

This is the one piece of arithmetic worth understanding, because it decides every percentage on every screen.

StatusCounts as
ACTIVE, DHCP, CONFLICT, DEPRECATEDUsed
RESERVEDReserved
AVAILABLENeither

An AVAILABLE row is a placeholder: it exists so the address map has something to draw and so you can annotate an address you have not assigned yet. Creating 256 of them in a /24 does not make the subnet full.

available = capacity − used − reserved, where capacity is derived from the prefix length, not from a stored counter.


Roles and permissions

Access is decided entirely by portal and role.

ActionCustomerpower userorganization administratorMSP technicianMSP administrator
View network data (org portal)read*yesyesn/an/a
Create/edit/delete (org portal)yesn/an/a
View network data (MSP portal)n/an/an/ayesyes
Create/edit/delete (MSP portal)n/an/an/ayesyes

* The customer portal has read-only network views reachable from Locations → a location → Network. There is no Network entry in the customer sidebar.

The two portals sit on two different backends with two different floors:

  • Reads are open to any authenticated member of the organization; every mutation carries requireMinRole("organization administrator").
  • The whole router carries requireMinRole("MSP technician"), reads included.

Note the ordering: MSP technician ranks above organization administrator in the role hierarchy, so an organization administrator is refused by the MSP router.

The UI hides what your role cannot do rather than letting you click into a 403: the canManageNetwork capability is true for organization administrator on the org portal and for all MSP roles on the MSP portal, and every create, edit and delete control in the network area is gated on it.


Walkthroughs

Document a site’s addressing from scratch

  1. Create the VLAN group (optional) — Network → VLANs → VLAN Groups → New Group. Give it a name and, if you want, a VID range such as 100–199.
  2. Create the VLANNetwork → VLANs → Create VLAN. Enter the VID (1–4094), a name, a role (DATA, VOICE, MANAGEMENT, GUEST, NATIVE, DMZ, IOT, STORAGE, BACKUP, OTHER) and optionally a location. A VID must be unique per location; two site-wide VLANs cannot share a VID.
  3. Create the parent subnetNetwork → Subnets → Create Subnet. Enter the CIDR. Host bits are masked off, so 10.0.1.55/24 is stored as 10.0.1.0/24. Attach the VLAN and location.
  4. Carve out children — create each child subnet with the parent selected. The child must be the same IP version and fully inside the parent.

Assign an address

From Network → Subnets → a subnet:

  1. Press Assign next available. Solidlio returns the first free address: for IPv4 it skips the network and broadcast address on /30 and shorter, and uses every address on a /31 (RFC 3021) and /32; for IPv6 it skips nothing.
  2. The assign drawer opens with that address filled in. Add a hostname, a MAC address, a free-text assignee, or link it to an asset or a network port.
  3. Save. The address is stored as ACTIVE and the subnet’s utilization updates.

To release it, open the address again and press Release. The row is deleted and the capacity returns.

Alternatively press Add addresses to materialize a block at once: up to 1,024 per call, optionally bounded by a start and end address, created with any status you choose. AVAILABLE is the default and does not consume capacity.

Set up DHCP for a subnet

From the subnet page, DHCP Scopes → + Add Scope:

  1. Enter the pool’s start and end address. Both must be inside the subnet, and the start must not be after the end.
  2. Set lease and maximum lease seconds (defaults: 86,400 and 604,800).
  3. Optionally set gateway, DNS servers, DNS domain, NTP servers, TFTP server and boot file.
  4. Save, then press Manage on the scope row to add reservations (a MAC pinned to an address) and exclusions (a range the pool must skip).

MAC addresses are accepted in any of three notations — AA:BB:CC:DD:EE:FF, AA-BB-CC-DD-EE-FF, AABB.CCDD.EEFF — and stored in the first. One MAC gets one reservation per scope regardless of how it was typed.

Run a DNS zone

  1. Network → DNS → Create Zone. Choose FORWARD or REVERSE and name it (example.com, or 1.168.192.in-addr.arpa).
  2. Zone settings edits the name, description, primary nameserver, admin email and default TTL. Deactivate flips the zone’s status without deleting it.
  3. Add Record creates a record. Values are checked against the type: an A record must hold an IPv4 literal, AAAA an IPv6 literal, MX requires a priority, SRV requires a priority and a port, CAA must read <flags> <tag> <value>. TXT is free-form.
  4. Link an A, AAAA or PTR record to an IP address row to keep the two in the same place. The link is a reference, not a sync — editing the address does not rewrite the record.

Deleting a zone that still has records is refused; add ?force=true to delete the zone and its records together. The UI’s Delete Zone confirmation sends the flag for you, which is what its “and all of its records” wording promises.

Check before you assign

Network → Tools carries two things:

  • Subnet calculator — enter an IPv4 address and a prefix and get the network, broadcast, first and last host, subnet mask, wildcard mask and usable host count. It is arithmetic only; nothing is saved.
  • Address conflict checker — enter an address, a MAC, or both. It reports every non-AVAILABLE record already holding that address, and every record holding that MAC, with the subnet and asset each belongs to. On the MSP portal it searches across every client you service, which is the point: the same laptop showing up in two clients’ records is exactly what you want to catch.

Read the address map

The subnet page draws a 256-cell grid for IPv4 /24 and longer, coloured by status. Larger IPv4 subnets and all IPv6 subnets say so and direct you to the address table instead — a /16 has 65,536 addresses and a grid is the wrong picture.


Configuration

Everything is per-record; there are no global IPAM settings.

SettingWhereIf unset
VLAN group minVid / maxVidVLAN group formThe group bounds nothing; it is a label
VLAN locationIdVLAN formThe VLAN is site-wide
VLAN vlanGroupIdVLAN formUngrouped
Subnet gatewaySubnet formNo gateway recorded
Subnet dnsServers / dnsDomainSubnet formEmpty list / no search domain
Subnet parentSubnetIdSubnet create formThe subnet is a root
DHCP leaseTimeSecScope form86,400 (24 hours)
DHCP maxLeaseTimeSecScope form604,800 (7 days)
DNS zone defaultTtlZone settings3,600 seconds
DNS zone refreshSec / retrySec / expireSecZone form3,600 / 600 / 86,400
DNS record ttlRecord formInherits the zone’s defaultTtl

Plan tiers

Network and IPAM carries no plan gate. Every paying tier gets the whole feature; the only differences are portal and role, per section 3.


Troubleshooting

Every message below is the literal string the service returns.

MessageCause
Invalid CIDR notationNot address/prefix, prefix out of range, or a prefix with a leading zero such as /024.
Subnet <cidr> overlaps with existing subnet <cidr>The prefix partially overlaps another, or duplicates one exactly. Nesting is allowed; straddling is not.
A subnet with this CIDR already existsThe masked network form is already recorded. 10.0.1.55/24 and 10.0.1.0/24 are the same subnet.
Child subnet must be contained within the parent subnetThe CIDR is not inside the parent you selected.
Child subnet must be the same IP version as its parentAn IPv6 child under an IPv4 parent, or the reverse.
Invalid DNS server address: <value>A DNS server entry is not a valid IP address.
Cannot delete subnet with child subnetsDelete or re-parent the children first.
Cannot delete subnet with IP addresses. Remove IP addresses first.Release the addresses first. Both portals behave identically here.
IP address <addr> is not within subnet <cidr>The address is outside the subnet you chose.
IP address <addr> already exists in this subnetIncluding the same IPv6 address typed a different way — comparison is canonical, not textual.
Invalid IP address formatNot a parseable IPv4 or IPv6 literal.
Invalid MAC address formatNot one of the three accepted notations.
Asset not found in this organizationThe asset belongs to another tenant. Same reply as a non-existent id, deliberately.
Network port not found in this organizationAs above, for a port.
VLAN not found in this organization / Location not found in this organization / VLAN group not found in this organizationAs above, for a VLAN, a location or a VLAN group.
IP address not found in this organizationAs above, for the address a DNS record is being linked to.
VLAN ID <n> already exists for this locationIncluding two site-wide VLANs with the same VID.
Cannot delete VLAN with associated subnets / …port configurationsDetach them first.
Cannot delete VLAN group with associated VLANsMove or delete the VLANs first.
Range start must be within the subnet / Range end must be…A DHCP pool or exclusion bound is outside the subnet.
Range start must not be after range endAn inverted pool or exclusion. It would lease nothing.
IP address must be within the scope subnetA reservation pointing outside its own subnet.
Reservation conflict: duplicate MAC or IP in this scopeOne MAC gets one reservation per scope, in any notation.
An A record value must be an IPv4 address / An AAAA record value must be an IPv6 addressThe value does not parse as that type.
An MX record requires a priority / An SRV record requires a priority / …a portMandatory type-specific fields.
A CAA record value must be "<flags> <tag> <value>"CAA values are three whitespace-separated fields.
Cannot delete DNS zone with records. Use ?force=true to delete with records.Confirm the cascade explicitly.
No available IP addresses in this subnetEvery address in scan range is taken. See §9 on the scan cap.
No available addresses to create in the specified rangeBulk create found nothing free between the bounds you gave.
Organization is not managed by this MSPAn organizationId outside the MSP’s visible set.

Limits and known behaviour

Solidlio does not configure devices. No switch, router, DHCP server or DNS server is written to. There is no discovery scan, no SNMP poll, no ping sweep, and no automatic import. IpAddress.lastSeen and lastScanned exist on the model and are written by nothing today.

DNS records do not sync from addresses. Linking a record to an IpAddress stores a reference. Renaming the host or changing the address does not rewrite the record, and no PTR is generated automatically.

Next-available scans at most 65,536 addresses past the last one taken. A sparse /8 answers on the first probe; a genuinely exhausted very large subnet reports No available IP addresses in this subnet rather than walking 16 million candidates inside a web request.

Bulk create is capped at 1,024 addresses per call.

The address map is IPv4 and /24-or-longer. Larger IPv4 subnets and every IPv6 subnet render a message pointing at the address table.

IPv6 prefixes of /65 and shorter exceed that, so they store the clamp and report capacityClamped: true. Derive from prefixLength, not from these columns.

Subnet.totalAddresses is also written only once, when the subnet is created; the counter refresh that runs after each IP assignment updates the other three but never revisits it.

Overlap is checked per organization, per IP version. Two different tenants may both use 192.168.1.0/24 — that is normal and correct. Within one organization, nesting is allowed and partial overlap is refused.

Do not use it.

Subnet lists paginate at 25 (org) or 20 (MSP) rows per page, capped at 100. The subnet detail page fetches up to 300 addresses for its map; a subnet with more than that renders the first 300.

The customer portal is read-only. Its network views have no create, edit, delete, assign or release control, and no Tools tab.

Questions this guide did not answer?

Ask us. You will get a reply from someone who uses the product every day.

Book a demo Contact us

A 30-minute walkthrough against your own workflow. No slides.