Systemd/networkd: Difference between revisions
imported>Mweinelt |
imported from old wiki |
||
(18 intermediate revisions by 8 users not shown) | |||
Line 1: | Line 1: | ||
{{Systemd/breadcrumb}} | |||
{{DISPLAYTITLE:systemd-networkd}} | {{DISPLAYTITLE:systemd-networkd}} | ||
[https://www.freedesktop.org/software/systemd/man/systemd-networkd.html systemd-networkd] is the network | [https://www.freedesktop.org/software/systemd/man/systemd-networkd.html systemd-networkd] is the network configuration component of the [[systemd]][[Category:systemd]] software suite. It is well integrated into NixOS below {{Nixos:option|systemd.network}} and should be preferred over {{Nixos:option|networking.interfaces}} options for most use cases, since it receives far superior maintenance. | ||
Configuration for networkd is split into three sections. | Configuration for networkd is split into three sections. | ||
Line 28: | Line 29: | ||
These use cases are better served by [[NetworkManager]] and its various frontends, that provides a better integrated user experience for various desktop systems. | These use cases are better served by [[NetworkManager]] and its various frontends, that provides a better integrated user experience for various desktop systems. | ||
{{Note|Both systemd-networkd and NetworkManager can exist in parallel on the same machine, | {{Note|Both systemd-networkd and NetworkManager can exist in parallel on the same machine, when they manage a distinct set of interfaces. If upstream connectivity is managed by NetworkManager (for example, NM handles wifi and networkd does VM networking), set {{Nixos:option|systemd.network.wait-online.enable}} to false so that boot isn't blocked on connectivity that networkd will never provide.}} | ||
when they manage a distinct set of interfaces.}} | |||
=== Enabling === | === Enabling === | ||
Line 70: | Line 70: | ||
</nowiki>}} | </nowiki>}} | ||
Note that we usually prefix the configuration file with a number. This can be important, because networkd collects all available configuration files, then sorts them | Note that we usually prefix the configuration file with a number. This can be important, because networkd collects all available configuration files, then sorts them alphanumerically, and uses the first match for each interface as its configuration. This happens separately for <code>.link</code>, <code>.netdev</code> and <code>.network</code> files, so that you can have one configuration of each type per interface. | ||
=== Debugging === | === Debugging === | ||
When things don't work as expected the journal for <code>systemd-networkd.service</code> should be consulted. Unfortunately by default the log is not very useful in its default loglevel. Increasing the loglevel can be done using the <code>SYSTEMD_LOG_LEVEL</code> environment variable. | When things don't work as expected, the journal for <code>systemd-networkd.service</code> should be consulted. Unfortunately, by default the log is not very useful in its default loglevel. Increasing the loglevel can be done using the <code>SYSTEMD_LOG_LEVEL</code> environment variable. | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 117: | Line 117: | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
systemd.network."50-enp3s0" = { | systemd.network.networks."50-enp3s0" = { | ||
matchConfig.Name = "enp3s0"; | matchConfig.Name = "enp3s0"; | ||
# acquire a DHCP lease on link up | # acquire a DHCP lease on link up | ||
Line 177: | Line 177: | ||
matchConfig.Name = "enp1s0"; | matchConfig.Name = "enp1s0"; | ||
address = [ | address = [ | ||
# configure addresses including subnet mask | |||
"192.0.2.100/24" | |||
"2001:DB8::2/64" | |||
]; | ]; | ||
routes = [ | routes = [ | ||
# create default routes for both IPv6 and IPv4 | # create default routes for both IPv6 and IPv4 | ||
{ | { Gateway = "fe80::1"; } | ||
{ | { Gateway = "192.0.2.1"; } | ||
# or when the gateway is not on the same network | # or when the gateway is not on the same network | ||
{ | |||
Gateway = "172.31.1.1"; | Gateway = "172.31.1.1"; | ||
GatewayOnLink = true; | GatewayOnLink = true; | ||
} | |||
]; | ]; | ||
# make the routes on this interface a dependency for network-online.target | # make the routes on this interface a dependency for network-online.target | ||
Line 200: | Line 200: | ||
VLANs can be configured on top of hardlinks as well as virtual links, like bonding interfaces. They provide separate logical networks over physical links. | VLANs can be configured on top of hardlinks as well as virtual links, like bonding interfaces. They provide separate logical networks over physical links. | ||
In this example we tag two VLANs with Ids 10 and 20 on a physical link <code>enp1s0</code>. The VLAN interfaces become available <code>vlan10</code> and <code>vlan20</code> and can receive additional configuration. | In this example we tag two VLANs with Ids 10 and 20 on a physical link <code>enp1s0</code>. The VLAN interfaces become available as <code>vlan10</code> and <code>vlan20</code> and can receive additional configuration. | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 226: | Line 226: | ||
# tag vlan on this link | # tag vlan on this link | ||
vlan = [ | vlan = [ | ||
vlan10 | "vlan10" | ||
vlan20 | "vlan20" | ||
]; | ]; | ||
networkConfig.LinkLocalAddressing = "no"; | |||
linkConfig.RequiredForOnline = "carrier"; | |||
}; | }; | ||
"40-vlan10" = { | "40-vlan10" = { | ||
Line 276: | Line 278: | ||
# Configure the bridge for its desired function | # Configure the bridge for its desired function | ||
"40-br0" = { | "40-br0" = { | ||
matchConfig.Name ="br0"; | matchConfig.Name = "br0"; | ||
bridgeConfig = {}; | bridgeConfig = {}; | ||
# Disable address autoconfig when no IP configuration is required | |||
#networkConfig.LinkLocalAddressing = "no"; | |||
linkConfig = { | linkConfig = { | ||
# or "routable" with IP addresses configured | # or "routable" with IP addresses configured | ||
Line 289: | Line 293: | ||
=== Bonding === | === Bonding === | ||
Given two hardlinks <code>enp2s0</code> and <code>enp3s0</code> create a virtual <code>bond0</code> interface using Dynamic LACP (802.3ad), hashing outgoing packets using a packet's | Given two hardlinks <code>enp2s0</code> and <code>enp3s0</code> create a virtual <code>bond0</code> interface using Dynamic LACP (802.3ad), hashing outgoing packets using a packet's layer 3/4 (network/transport layer in the OSI model) information. | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 339: | Line 343: | ||
"30-lan" = { | "30-lan" = { | ||
matchConfig.Name = "lan"; | matchConfig.Name = "lan"; | ||
address = [ | address = [ "2001:db8:1122:3344::1/64" ]; | ||
networkConfig = { | networkConfig = { | ||
IPv6SendRA = true; | IPv6SendRA = true; | ||
}; | }; | ||
ipv6Prefixes = [ { | ipv6Prefixes = [ | ||
{ | |||
# Announce a static prefix | |||
ipv6PrefixConfig.Prefix = "2001:db8:1122:3344::/64"; | |||
} | |||
]; | |||
ipv6SendRAConfig = { | ipv6SendRAConfig = { | ||
# Provide a DNS resolver | # Provide a DNS resolver | ||
Line 355: | Line 359: | ||
}; | }; | ||
}; | }; | ||
}; | |||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 372: | Line 377: | ||
* [https://gist.github.com/mweinelt/b78f7046145dbaeab4e42bf55663ef44 NixOS 22.11 VDSL Router (VLANs on top of Bonding, IPv6 Prefix-Delegation, pppd Integration)] by [https://github.com/mweinelt mweinelt] | * [https://gist.github.com/mweinelt/b78f7046145dbaeab4e42bf55663ef44 NixOS 22.11 VDSL Router (VLANs on top of Bonding, IPv6 Prefix-Delegation, pppd Integration)] by [https://github.com/mweinelt mweinelt] | ||
[[Category:systemd]] | |||
[[Category:Networking]] |