====== 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 **[[https://www.raspberrypi.org/documentation/configuration/tcpip/|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/24 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