** Description changed:

+ [ Impact ]
+ 
+ Static IPv4 routes configured with MTUBytes= can be duplicated without
+ their MTU after restarting systemd-networkd. A subsequent networkctl
+ reconfigure, netplan apply, or networkd restart can then silently remove
+ the routes that include MTU values. This can cause fragmentation and
+ connectivity failures.
+ 
+ This bug should be fixed in the stable release because it affects
+ existing configurations that depend on persistent route MTUs, such as
+ tunneled or overlay networks. The problem can occur whenever networkd is
+ restarted or the network is reconfigured.
+ 
+ The fix includes the IPv4 MTU in route identity and comparison logic and
+ parses RTAX_MTU from kernel route notifications. This prevents networkd
+ from incorrectly reusing a route whose MTU differs from the configured
+ value, allowing the stale route to be removed and recreated with the
+ correct MTU.
+ 
  Release: Ubuntu Noble 24.04, systemd 255.4-1ubuntu8.17
  
- Description: Static IPv4 routes configured with MTUBytes= can be
- duplicated without their MTU after restarting systemd-networkd. A
- subsequent networkctl reconfigure, netplan apply, or networkd restart
- can then silently remove the routes that include MTU values. This can
- cause fragmentation and connectivity failures.
+ [ Test Plan ]
  
  Steps to reproduce:
  
  Launch a VM running Noble 24.04: lxc launch ubuntu:noble noble-vm --vm -c 
limits.cpu=1 -c limits.memory=4GiB
  Shell into VM: lxc shell noble-vm
  Create dummy netplan config: vim /etc/netplan/dummy.yaml
  
  network:
    version: 2
    dummy-devices:
      mgmt0:
        addresses: [10.34.141.45/24]
        dhcp4: false
        mtu: 9000
        routes:
          - {to: 169.254.169.254/32, from: 10.34.141.45, scope: link}
          - {to: 10.34.141.1, from: 10.34.141.45, scope: link, mtu: 1230, 
table: 252}
          - {to: 10.34.141.0/24, from: 10.34.141.45, scope: link, mtu: 9000, 
table: 252}
          - {to: default, via: 10.34.141.1, from: 10.34.141.45, mtu: 1230, 
table: 252}
          - {to: 10.34.134.128/25, type: unreachable, table: 252}
          - {to: 10.34.128.0/22, type: unreachable, table: 252}
        routing-policy:
          - {from: 10.34.141.45, table: 252}
  
  chmod 600 /etc/netplan/dummy.yaml
  netplan generate && netplan apply
  
  ip route list table 252
  
  default via 10.34.141.1 dev mgmt0 proto static src 10.34.141.45 mtu 1230 
  unreachable 10.34.128.0/22 proto static 
  unreachable 10.34.134.128/25 proto static 
  10.34.141.0/24 dev mgmt0 proto static scope link src 10.34.141.45 mtu 9000 
  10.34.141.1 dev mgmt0 proto static scope link src 10.34.141.45 mtu 1230 
  
  Restart networkd: systemctl restart systemd-networkd
  
  List duplicate routes in table:
  
  ip route list table 252
  
  default via 10.34.141.1 dev mgmt0 proto static src 10.34.141.45 mtu 1230 
  default via 10.34.141.1 dev mgmt0 proto static src 10.34.141.45 
  unreachable 10.34.128.0/22 proto static 
  unreachable 10.34.134.128/25 proto static 
  10.34.141.0/24 dev mgmt0 proto static scope link src 10.34.141.45 mtu 9000 
  10.34.141.0/24 dev mgmt0 proto static scope link src 10.34.141.45 
  10.34.141.1 dev mgmt0 proto static scope link src 10.34.141.45 mtu 1230 
  10.34.141.1 dev mgmt0 proto static scope link src 10.34.141.45 
  
  Reconfigure dummy mgmt0 interface: networkctl reconfigure mgmt0
  
  List table to see missing mtu routes:
  
  ip route list table 252
  
  default via 10.34.141.1 dev mgmt0 proto static src 10.34.141.45 
  unreachable 10.34.128.0/22 proto static 
  unreachable 10.34.134.128/25 proto static 
  10.34.141.0/24 dev mgmt0 proto static scope link src 10.34.141.45 
  10.34.141.1 dev mgmt0 proto static scope link src 10.34.141.45 
  
  Relevant config excerpt: cat /run/systemd/network/10-netplan-
  mgmt0.network
  
  [Route]
  Destination=10.34.141.1
  PreferredSource=10.34.141.45
  Scope=link
  Table=252
  MTUBytes=1230
  
  [Route]
  Destination=10.34.141.0/24
  PreferredSource=10.34.141.45
  Scope=link
  Table=252
  MTUBytes=9000
  
  [Route]
  Destination=0.0.0.0/0
  Gateway=10.34.141.1
  PreferredSource=10.34.141.45
  Table=252
  MTUBytes=1230
+ 
+ [ Where problems could occur ]
+ 
+ The change affects IPv4 route matching, kernel route parsing, and route
+ replacement during restart or reconfiguration. A regression could cause:
+ 
+ - Configured MTUs to be lost or incorrectly retained
+ - Routes to be removed without being recreated
+ - Duplicate routes or unexpected route-add failures
+ - Unnecessary route replacement and a brief connectivity interruption
+ - IPv6 route matching to change accidentally if the IPv4-only checks are 
implemented incorrectly
+ 
+ Regression testing should repeat the scenario above and verify that the
+ final state contains exactly one route for each configured entry, with
+ the expected MTU values.
+ 
+ The main regression area is IPv4 route reconciliation after restart and
+ reconfiguration. The patch is intended not to change IPv6 route identity
+ or the behavior of routes without a configured MTU.
+ 
+ [ Other Info ]
+ 
+ This is a focused backport for existing IPv4 route MTU support. It
+ introduces no new configuration options or protocol changes.
+ 
+ The configured MTU continues to be sent to the kernel as RTAX_MTU.
+ Parsing RTAX_MTU from kernel route notifications keeps networkd’s in-
+ memory route state synchronized with the live route and prevents stale
+ routes from being incorrectly reused.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2167098

Title:
  IPv4 route MTUs silently dropped after networkd restart / networkctl
  reconfigure / netplan apply

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/2167098/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to