User Tools

Site Tools


doc:appunti:linux:sa:dhcpcd_ip_alias

This is an old revision of the document!


How to configure an IP alias with dhcpcd

Some GNU/Linux distributions derived from Debian relies on dhcpcd to configure networking. Notably the Raspberry Pi offical operating system RaspiOS uses dhcpcd to configure both the Ethernet eth0 and WiFi wlan0 interfaces.

There are many HOWTOs describing how to configure a static IP address for the eth0, or even a fallback address to be used if the DHCP method fails, but you can hardly find a method to assign a static IP alias that should be up in any case: DHCP successful, DHCP failed, Ethernet cable detached.

First of all we need to say that every method suggesting to edit the /etc/network/interfaces file (or files under the /etc/network/interfaces.d/ directory) sould be considered obsolete and it may conflicts with the dhcpcd operations. Have a look at the official Raspberry Pi TCP/IP networking page.

The proper solution is to use the user defined hook scripts, see the dhcpcd-run-hooks man page. In short you have to create a shell script named /etc/dhcpcd.enter-hook. That script will be sourced by dhcpcd several times during bootstrap and when some events happen (DHCP succeed, cable is connected, etc.), each execution will be identified by a differnt content of the $interface and $reason environment variables.

This simple example will configure an eth0:0 alias at the very first time that dhcpcd consider the eth0 interface:

# File /etc/dhcpcd.enter-hook
# Assign an IP alias to the eth0 interface.
if [ "$interface" = "eth0" ]; then
    case $reason in
        PREINIT)
            # Other reasons are: NOCARRIER|CARRIER|BOUND
            /usr/sbin/ip addr add 10.0.0.38 dev eth0 label eth0:0 || true
            ;;
    esac
fi

Beware to not use addresses in the range 169.254.x.y, that is what's called the Automatic Private IP address. dhcpcd infact will assign automatically an address like that to the eth0 interface if DHCP fails and no fallback is defined. But more important is that dhcpcd will delete any IP address in the 169.254.x.y range whenever it obtains a valid IP address for the same interface.

If you enable the debug and logfile /tmp/dhcpcd.log option in /etc/dhcpcd.conf, you can observe this (unexpected to me) behaviour:

eth0: DAD completed for 192.168.3.38
eth0: leased 192.168.3.38 for 36000 seconds
eth0: renew in 18000 seconds, rebind in 31500 seconds
eth0: writing lease `/var/lib/dhcpcd5/eth0.lease'
eth0: adding IP address 192.168.3.38/24 broadcast 192.168.3.255
eth0: adding route to 192.168.3.0/24
eth0: adding default route via 192.168.3.1
eth0: ARP announcing 192.168.3.38 (1 of 2), next in 2.0 seconds
eth0: executing `/lib/dhcpcd/dhcpcd-run-hooks' BOUND
forking to background
forked to background, child pid 656
eth0: deleting IP address 169.254.255.38/32
doc/appunti/linux/sa/dhcpcd_ip_alias.1613298478.txt.gz · Last modified: 2021/02/14 11:27 by niccolo