# Renaming network interfaces

NixOS uses the udev predictable naming scheme to assign names to network interfaces. This means that by default cards are not given the traditional names like `eth0` or `eth1`, whose order can change unpredictably across reboots. Instead, relying on physical locations and firmware information, the scheme produces names like `ens1`, `enp2s0`, etc.

These names are predictable but less memorable and not necessarily stable: for example installing new hardware or changing firmware settings can result in a name change. If this is undesirable, for example if you have a single ethernet card, you can revert to the traditional scheme by setting to `false`.

## Assigning custom names

In case there are multiple interfaces of the same type, it’s better to assign custom names based on the device hardware address. For example, we assign the name `wan` to the interface with MAC address `52:54:00:12:01:01` using a netword link unit:

     systemd.network.links."10-wan" = {
       matchConfig.MACAddress = "52:54:00:12:01:01";
       linkConfig.Name = "wan";
     };

Note that links are directly read by udev, not networkd, and will work even if networkd is disabled.

Alternatively, we can use a plain old udev rule:

     services.udev.initrdRules = ''
      SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", \
      ATTR{address}=="52:54:00:12:01:01", KERNEL=="eth*", NAME="wan"
     '';

The rule must be installed in the initrd using `services.udev.initrdRules`, not the usual `services.udev.extraRules` option. This is to avoid race conditions with other programs controlling the interface.