Subnets API
ESB3024 Router provides utilities to quickly match clients into subnets. Any combination of IPv4 and IPv6 addresses can be used. To begin, a JSON file is needed, defining all subnets, e.g:
{
"255.255.255.255/24": "area1",
"255.255.255.255/16": "area2",
"255.255.255.255/8": "area3",
"90.90.1.3/16": "area4",
"5.5.0.4/8": "area5",
"2a02:2e02:9bc0::/48": "area6",
"2a02:2e02:9bc0::/32": "area7",
"2a02:2e02:9bc0::/16": "area8",
"2a02:2e02:9de0::/44": "combined_area",
"2a02:2e02:ada0::/44": "combined_area"
}
and PUT
it to the endpoint :5001/v1/subnets
or :5001/v2/subnets
, the
API version doesn’t matter for subnets:
curl -k -T subnets.json -H "Content-Type: application/json" https://router-host:5001/v1/subnets
Note that it is possible for several subnet CIDR strings to share the same label, effectively grouping them together.
This will load the subnets into the router which will then be usable within any
Lua functions, accessed from the request
and session
tables
respectively, e.g.
{
"routing": {
"id": "routing_table",
"member_order": "sequential",
"members": [
{
"id": "node1",
"host_id": "host1",
"weight_function": "return request.subnet == 'area1' and 1 or 0"
}
]
}
}
Subnet matching will use the client IP fetched from the request
or session
tables. When possible, the subnet with the longest matching subnet mask will
be chosen, i.e. 255.255.255.255/28
will be chosen over 255.255.255.255/24
.
If no matching subnets are found, the boolean value false
will be returned.
NOTE: To use booleans in strings in Lua, calling
tostring(bool)
is required. Therefore, since subnet lookup might
return false
, the subnet call should be wrapped as: tostring(session.subnet)
or tostring(requst.subnet)
.
Invalid ip-addresses will be omitted during subnet list construction accompanied by a message in the log displaying the invalid IP address.