2026-05-27 20:56:30 -04:00
{
"client_requirement" : "client_is_viewer+" ,
"items" : [
{
"type" : "header_page_title" ,
"items" : [
{
"type" : "h1" ,
"text" : "Inter-VLAN Exceptions"
} ,
{
"type" : "p" ,
"text" : "Firewall rules that permit specific traffic to cross VLAN boundaries."
}
]
} ,
{
"type" : "table" ,
"datasource" : "config:inter_vlan_exceptions" ,
"empty_message" : "No inter-VLAN exceptions configured. All cross-VLAN traffic is blocked by default." ,
"columns" : [
{
"label" : "Description" ,
"field" : "description"
} ,
{
"label" : "Protocol" ,
"field" : "protocol" ,
2026-05-31 22:01:59 -04:00
"class" : "col-mono col-narrow"
2026-05-27 20:56:30 -04:00
} ,
{
"label" : "Source" ,
"field" : "src_ip_or_subnet" ,
"class" : "col-mono"
} ,
{
"label" : "Destination" ,
"field" : "dst_ip_or_subnet" ,
"class" : "col-mono"
} ,
{
2026-06-01 00:54:59 -04:00
"label" : "Port Start" ,
"field" : "dest_port_start" ,
2026-05-31 22:01:59 -04:00
"class" : "col-mono col-narrow"
} ,
{
2026-06-01 00:54:59 -04:00
"label" : "Port End" ,
"field" : "dest_port_end" ,
2026-05-31 22:01:59 -04:00
"class" : "col-mono col-narrow"
2026-05-27 20:56:30 -04:00
} ,
{
2026-06-05 22:16:52 -04:00
"label" : "Rule State" ,
2026-05-27 20:56:30 -04:00
"field" : "enabled" ,
"render" : "badge_enabled_disabled"
}
] ,
"row_actions" : [
{
"client_requirement" : "client_is_administrator+" ,
2026-06-02 14:09:05 -04:00
"method" : "js_edit" ,
"target" : "add-form" ,
2026-05-27 20:56:30 -04:00
"text" : "Edit" ,
2026-06-02 14:09:05 -04:00
"class" : "btn-ghost btn-sm"
2026-05-27 20:56:30 -04:00
} ,
{
"client_requirement" : "client_is_administrator+" ,
2026-05-27 22:04:04 -04:00
"action" : "/action/intervlan/table_delete" ,
2026-05-27 20:56:30 -04:00
"method" : "post" ,
"text" : "Delete" ,
"class" : "btn-danger btn-sm"
}
]
} ,
{
"type" : "card" ,
"id" : "add-form" ,
"label" : "Add Exception" ,
"client_requirement" : "client_is_administrator+" ,
"items" : [
{
"type" : "form" ,
2026-05-27 22:04:04 -04:00
"action" : "/action/intervlan/addexception_add" ,
2026-05-27 20:56:30 -04:00
"method" : "post" ,
"items" : [
2026-06-02 14:09:05 -04:00
{
"type" : "hidden" ,
"name" : "row_index" ,
"value" : ""
} ,
2026-05-27 20:56:30 -04:00
{
"type" : "field" ,
"label" : "Description" ,
"name" : "description" ,
"input_type" : "text" ,
"placeholder" : "e.g. Allow Chromecast"
} ,
{
2026-05-31 22:01:59 -04:00
"type" : "field_row" ,
2026-06-01 00:25:16 -04:00
"cols" : 2 ,
2026-05-31 22:01:59 -04:00
"items" : [
2026-06-01 00:25:16 -04:00
{
"type" : "field" ,
"label" : "Source" ,
"name" : "src_ip_or_subnet" ,
"input_type" : "text" ,
2026-06-06 00:51:30 -04:00
"validate" : "VALIDATION_IPV4_CIDRFLEX" ,
2026-06-01 00:25:16 -04:00
"placeholder" : "e.g. 192.168.20.100 or 192.168.20.0/24" ,
"hint" : "You may allow either a single device IP or an entire subnet to contact dest."
} ,
2026-05-31 23:17:30 -04:00
{
2026-06-01 00:22:54 -04:00
"type" : "field" ,
"label" : "Destination" ,
"name" : "dst_ip_or_subnet" ,
"input_type" : "text" ,
2026-06-06 00:51:30 -04:00
"validate" : "VALIDATION_IPV4_CIDRFLEX" ,
2026-06-01 00:22:54 -04:00
"placeholder" : "e.g. 192.168.10.200 or 192.168.10.0/24" ,
"hint" : "You may allow either a single device IP or an entire subnet to be reached by source."
2026-06-01 00:25:16 -04:00
}
]
} ,
{
"type" : "field_row" ,
"cols" : 3 ,
"items" : [
{
"type" : "field" ,
"label" : "Protocol" ,
"name" : "protocol" ,
"input_type" : "select" ,
"options" : "%PROTOCOL_OPTIONS%"
2026-06-01 00:22:54 -04:00
} ,
{
"type" : "field" ,
"label" : "Dest Port Range Start" ,
2026-06-01 00:54:59 -04:00
"name" : "dest_port_start" ,
2026-06-01 00:22:54 -04:00
"input_type" : "number" ,
"min" : 1 ,
2026-06-01 00:30:49 -04:00
"max" : 65535
2026-05-31 23:17:30 -04:00
} ,
2026-05-31 22:01:59 -04:00
{
"type" : "field" ,
2026-06-01 00:22:54 -04:00
"label" : "Dest Port Range End" ,
2026-06-01 00:54:59 -04:00
"name" : "dest_port_end" ,
2026-06-01 00:22:54 -04:00
"input_type" : "number" ,
"min" : 1 ,
"max" : 65535
2026-05-31 22:01:59 -04:00
}
]
2026-05-27 20:56:30 -04:00
} ,
2026-06-01 00:30:49 -04:00
{
"type" : "raw_html" ,
2026-06-01 00:40:06 -04:00
"html" : "<p class=\"form-hint\" style=\"margin-top:-1rem\">This exception only applies to traffic matching the selected protocol and destination port range.</p>"
2026-06-01 00:30:49 -04:00
} ,
2026-06-05 22:54:12 -04:00
{
"type" : "raw_html" ,
"html" : "<br>"
} ,
2026-06-02 14:09:05 -04:00
{
"type" : "field" ,
"label" : "Enabled" ,
"name" : "enabled" ,
"input_type" : "checkbox"
} ,
2026-05-27 20:56:30 -04:00
{
"type" : "button_row" ,
"items" : [
{
"type" : "button_primary" ,
2026-05-27 22:04:04 -04:00
"action" : "/action/intervlan/addexception_add" ,
2026-05-27 20:56:30 -04:00
"method" : "post" ,
"text" : "Add Exception"
} ,
{
"type" : "button_cancel" ,
"text" : "Cancel"
}
]
}
]
}
]
}
]
2026-05-31 22:01:59 -04:00
}