Changes in Release 2.0
New Functionality
Release 2.0.0
Well-defined node roles (host, router, bridge) available on multiple platforms
firewall.zonebased plugin
bridge nodes can be used as simple bridges or to implement multi-access links
netlab defaults command provides sysctl-like CLI interface to user/system defaults.
Gather usage statistics into a local file that can be inspected or managed with netlab usage
SRv6: BGP L3VPN support
Use the routing module to configure static routes on host devices. VRF-aware devices can use a default route; other devices get more specific routes for address pools and named prefixes.
Multiple EVPN import/export route targets allow you to build complex EVPN-based services like common services or hub-and-spoke connectivity
Implement node/link styles for D2 graphs
Implement ‘delete communities matching a list’ in routing policies
Retirements
Cumulus Linux 4.x is retired. While there are no plans to remove it from netlab, we will not add new features or run integration tests.
VirtualBox and direct Windows/macOS installations are obsolete.
Minor improvements
Names of defaults.const.validate constants can be used as wait times in the validation wait parameter
Recognize all and device types in the node selection expressions used in netlab inspect, netlab report and netlab exec commands
Use a different Ansible task list when reloading device configuration
Accept ‘int’ and ‘bool’ values for management IP addresses
Combine default tcpdump flags with user filter in the netlab capture command
Change the installed Vagrant version to 2.4.3-1
Check reserved ranges (local network, multicast) during IPv4/IPv6 address/prefix validation
Warn about EBGP ‘bgp’ attributes used on intra-AS links/vlans
New device features
Arista EOS:
Configuration reload uses configure replace command
You can use Arista EOS as router, host or bridge node
ArubaCX:
Unnumbered interfaces, including OSPFv2 support (requires release 10.14 or later)
Bird:
BGP session features: BFD, BGP timers, default route origination, GTSM
RFC 8950 (IPv4 AF over IPv6 BGP session) support
BGP remove private AS
VLAN and LAG support
netlab clab build can build Bird v2 or Bird v3 containers
Route redistribution into OSPF
OSPF timers, router priority, and passwords
IPv6 RA configuration (#2109)
You can use Bird as router or host
Cisco IOS:
Configuration reload uses configure replace command
You can use Cisco IOS as router, host or bridge node
Dell OS10:
BGP BFD, timers, passwords, and default route origination
BGP AS manipulation: allowas-in and remove-private-as
OSPF default route origination
Routing policies, prefix lists, AS-path filters, and BGP community filters
Static routes
FRR:
SRv6 with IS-IS
BGP L3VPN over SRv6
You can use FRR as router or host node
Junos:
Routing policies, prefix lists, AS-path filters, and BGP community filters
Static routes
BGP routing policies, local preference, MED, weight, AS-path prepending
Major cleanup and refactoring of routing policies
MAC-VRF EVPN implementation
Linux:
VLAN support on Linux containers (#2103)
You can use Linux containers as host or bridge nodes
SR Linux:
Release 25.3.1 support, including version-specific configuration templates that work with 24.10 and 25.3 releases
Support for configuration reload with netlab up –reload command
VyOS:
Static routes
Fixes in configuration templates:
Arista EOS:
Disable PHY control messages with ‘netlab_phy_control’ variable
IBGP routes are reflected over local-as IBGP sessions, their next hop is forced to self
ArubaCX:
Simplified Vagrant box build recipe
Do a soft clear of all BGP sessions after a routing policy change
Bird:
Configure logging to /var/log/bird
Filter BGP communities per neighbor type
Advertise IPv6 loopback as /128 in OSPF
Do not send IPv6 RA in ‘host’ role
Set ‘next-hop-self always’ on local-as IBGP sessions (#2110)
Cisco IOS:
Do a soft-clear of global and VRF BGP sessions after a routing policy change
IBGP routes are reflected over local-as IBGP sessions, their next hop is forced to self
Cumulus Linux:
Change STP parameters on the bridge and VXLAN interfaces
Cumulus Linux NVUE:
Explicitly enable IPv6 on extra loopbacks interfaces (#2118)
Filter duplicate VRF BGP network statements
Dell OS10:
Fix VRF context for the bgp.policy plugin configuration
Fix BGP address family activation (#2075)
Configure per-VRF BGP router-id (#2073)
Move route-target configuration to VRF module, apply only when BGP module is used (#2055)
dnsmasq:
Dnsmasq: Ubuntu 24.04 as the base image
FRR:
Replace obsolete ‘brctl’ commands with modern equivalents (#2107)
Fix the ARP sysctl settings on VARP/anycast GW MACVLAN interface (#2100)
Assign VARP/VRRP interfaces to the correct VRF
IBGP routes are reflected over local-as IBGP sessions, their next hop is forced to self
Junos:
Shutdown unused BGP neighbors on Junos
Linux:
Set default arp_announce value to 2 (#2159)
IPv4 unnumbered peering
Create extra loopback interfaces on Linux-based daemons (#2114)
Postpone disabling IPv6 on interfaces on Ubuntu until after netplan has been applied (#2247)
SR Linux:
Configure per-VRF BGP router ID (#2077)
Fix the BGP AF activation (#2074)
VyOS:
Check for configuration failures in Ansible playbooks
VyOS: work around the LLDP configuration inconsistency between release 1.4 and 1.5
Routing policies shall consider only IPv4 and IPv6 AF (#2146)
Fix BGP router-id on VRFs (#2072)
Breaking changes
Release 2.0.0
We implemented a generic mechanism to indicate that an attribute should not be inherited from a parent object (groups → nodes, nodes → interfaces, links → interfaces…). Setting an attribute to False will break the inheritance chain and remove the attribute.
The only exceptions are the attributes that can accept a False value (bools, IP addresses/prefixes); the inheritance chain is broken due to the presence of attributes with False values, but they are not removed.
The change did not impact any of our transformation and integration tests, so it should be pretty safe. However, it is not impossible that you’ll discover an edge case that works differently than it did in the past.
Bug Fixes
Bug Fixes in Release 2.0.0
Add a hint regarding node/gateway id conflict
The ‘prefix6’ attribute should not be copied into link/node data (#2235)
‘false’ value of an attribute with ‘true_value’ crashed validation
BGP session attributes can be removed with False value
Set defaults.provider when changing top-level provider
Change filelock minimum release to 3.16.1 (still supporting Python 3.8)
EVPN: Report an error when VNIs are used with mpls transport (#2205)
Enable VPNv4/VPNv6 AF based on mpls.vpn settings (#2221)
Consider intf/node bgp.local_as when computing ‘external’ role (#2215)
Prune IGP interfaces based on IGP/interface AF match (#2211)
Multi-protocol BFD whacked the IGP AF information (#2210)
Make ‘localas_ibgp’ a valid bgp.activate value (#2207)
Rename ‘netlab usage’ to ‘netlab help’, use rich console to print help
Add provider-specific node roles to daemons
Configure IPv6 LLA on bird loopback intf only when needed
BGP RFC 8950 test: DUT role must be set to ‘router’
SR Linux: Need to explicitly specify type as link-local for static LLA (#2186)
BGP-with-BFD integration test
Provider-specific features disable DHCP clients on cEOS and Linux (#2181)
Make DHCP error messages provider-aware (#2180)
Implement provider-specific module/role support (#2177)
Fix the description of DHCP feature flags
Routing object normalization crashed on group objects
Always set ‘disable_ipv6’ flag on Linux interfaces (#2176)
Save collected SR Linux configs into ‘.cfg’ files
Remove ‘building config’ banner from collected IOS configuration
Expand routing object shortcut definitions with the ‘normalize’ hook (#2168)
Implement static (defaults-driven) module hooks (#2166)
Fix: Insane ‘plugin’ values could crash netlab
Copyright and license: Update year to 2025 (#2165)
Fix double transformation for routing.community objects (#2164)
Split group sanity checks from in-depth data validation (#2163)
BGP module does not need pre_default hook
Configure VXLAN after BGP
Check source VRF of IPv4 addresses used on unnumbered VRF interfaces (#2123)
Move VRF loopback creation to post_link_transform hook (#2122)
Refactor the role-specific node transformation into a separate subsystem (#2095)
Check for a Linux bridge in the forwarding path of LAG links
Extract warnings generated in integration tests and store them in test results
Use report_quirk for consistent reporting of device quirks (#2083)
Remove paramiko-specific options from ansible.cfg (#2081)
‘loopback’ attribute in global VRF definition must be a bool (#2076)
Allow ‘no quirk flag’ in devices.report_quirk
Select the best (not first) interface for daemon control-plane IP address
Add the ‘activate’ dictionary to VRF EBGP neighbors (#2060)
Replace calls to string.format with strings.eval_format (#2063)
Add VPNv4/VPNv6 AF checks to EOS/FRR BGP validation functions
Add checks for BGP session and AF activation to EVPN integration tests
Deal with inconsistent FRR ‘bgp neighbor’ JSON data structure
Allow ‘bgp.multihop’ node attribute
Check AF activation in FRR/EOS BGP validation functions
Add a dump of config variables to ‘config’ validation action
Documentation Fixes
Documentation Fixes in Release 2.0.0
Make VirtualBox and direct Windows/macOS installations obsolete
Document the impact of specifying a node parameter for an auto-created node (#2106)
Allow interface name to be set on a per-interface basis (#2105)
IBGP sessions within VRFs do not work