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
| Concept | What it is |
|---|---|
| VLAN group | A named VID range, e.g. “Toronto 100–199”. Optional. Purely organizational. |
| VLAN | A VLAN ID (1–4094) with a name, a role and a status, optionally pinned to a location. |
| Subnet | A CIDR prefix, IPv4 or IPv6, optionally nested under a parent subnet. |
| IP address | One address inside one subnet, with a status and an optional assignment target. |
| DHCP scope | A lease pool inside one subnet, with lease times and DHCP options. |
| DHCP exclusion | A range inside a scope the pool must not hand out. |
| DHCP reservation | A MAC pinned to a specific address inside a scope. |
| DNS zone | A forward or reverse zone with SOA fields and a default TTL. |
| DNS record | One record inside a zone, optionally linked to an IpAddress row. |
| Port VLAN config | The 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
| Model | Statuses |
|---|---|
| VLAN | ACTIVE RESERVED DEPRECATED PLANNED |
| Subnet | ACTIVE RESERVED DEPRECATED PLANNED FULL |
| IP address | ACTIVE AVAILABLE RESERVED DHCP DEPRECATED CONFLICT |
| DHCP scope | ACTIVE INACTIVE FAILOVER |
| DNS zone | ACTIVE INACTIVE DELEGATED |
| DNS record | ACTIVE 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.
| Status | Counts as |
|---|---|
ACTIVE, DHCP, CONFLICT, DEPRECATED | Used |
RESERVED | Reserved |
AVAILABLE | Neither |
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.
| Action | Customer | power user | organization administrator | MSP technician | MSP administrator |
|---|---|---|---|---|---|
| View network data (org portal) | read* | yes | yes | n/a | n/a |
| Create/edit/delete (org portal) | — | — | yes | n/a | n/a |
| View network data (MSP portal) | n/a | n/a | n/a | yes | yes |
| Create/edit/delete (MSP portal) | n/a | n/a | n/a | yes | yes |
* 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
- 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.
- Create the VLAN — Network → 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. - Create the parent subnet — Network → Subnets → Create Subnet. Enter the CIDR. Host bits are masked off, so
10.0.1.55/24is stored as10.0.1.0/24. Attach the VLAN and location. - 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:
- Press Assign next available. Solidlio returns the first free address: for IPv4 it skips the network and broadcast address on
/30and shorter, and uses every address on a/31(RFC 3021) and/32; for IPv6 it skips nothing. - 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.
- Save. The address is stored as
ACTIVEand 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:
- Enter the pool’s start and end address. Both must be inside the subnet, and the start must not be after the end.
- Set lease and maximum lease seconds (defaults: 86,400 and 604,800).
- Optionally set gateway, DNS servers, DNS domain, NTP servers, TFTP server and boot file.
- 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
- Network → DNS → Create Zone. Choose
FORWARDorREVERSEand name it (example.com, or1.168.192.in-addr.arpa). - Zone settings edits the name, description, primary nameserver, admin email and default TTL. Deactivate flips the zone’s status without deleting it.
- Add Record creates a record. Values are checked against the type: an
Arecord must hold an IPv4 literal,AAAAan IPv6 literal,MXrequires a priority,SRVrequires a priority and a port,CAAmust read<flags> <tag> <value>.TXTis free-form. - Link an
A,AAAAorPTRrecord 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-
AVAILABLErecord 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.
| Setting | Where | If unset |
|---|---|---|
VLAN group minVid / maxVid | VLAN group form | The group bounds nothing; it is a label |
VLAN locationId | VLAN form | The VLAN is site-wide |
VLAN vlanGroupId | VLAN form | Ungrouped |
Subnet gateway | Subnet form | No gateway recorded |
Subnet dnsServers / dnsDomain | Subnet form | Empty list / no search domain |
Subnet parentSubnetId | Subnet create form | The subnet is a root |
DHCP leaseTimeSec | Scope form | 86,400 (24 hours) |
DHCP maxLeaseTimeSec | Scope form | 604,800 (7 days) |
DNS zone defaultTtl | Zone settings | 3,600 seconds |
DNS zone refreshSec / retrySec / expireSec | Zone form | 3,600 / 600 / 86,400 |
DNS record ttl | Record form | Inherits 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.
| Message | Cause |
|---|---|
Invalid CIDR notation | Not 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 exists | The 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 subnet | The CIDR is not inside the parent you selected. |
Child subnet must be the same IP version as its parent | An 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 subnets | Delete 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 subnet | Including the same IPv6 address typed a different way — comparison is canonical, not textual. |
Invalid IP address format | Not a parseable IPv4 or IPv6 literal. |
Invalid MAC address format | Not one of the three accepted notations. |
Asset not found in this organization | The asset belongs to another tenant. Same reply as a non-existent id, deliberately. |
Network port not found in this organization | As above, for a port. |
VLAN not found in this organization / Location not found in this organization / VLAN group not found in this organization | As above, for a VLAN, a location or a VLAN group. |
IP address not found in this organization | As above, for the address a DNS record is being linked to. |
VLAN ID <n> already exists for this location | Including two site-wide VLANs with the same VID. |
Cannot delete VLAN with associated subnets / …port configurations | Detach them first. |
Cannot delete VLAN group with associated VLANs | Move 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 end | An inverted pool or exclusion. It would lease nothing. |
IP address must be within the scope subnet | A reservation pointing outside its own subnet. |
Reservation conflict: duplicate MAC or IP in this scope | One 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 address | The value does not parse as that type. |
An MX record requires a priority / An SRV record requires a priority / …a port | Mandatory 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 subnet | Every address in scan range is taken. See §9 on the scan cap. |
No available addresses to create in the specified range | Bulk create found nothing free between the bounds you gave. |
Organization is not managed by this MSP | An 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.