Some time ago I installed the arch linux distribution to my Raspberry Pi device. My plan was to eventually start using the RPi as a local DHCP + DNS server. I decided to use dnsmasq which combines both the DHCP and the DNS server functionalities. One of the nice things about dnsmasq is that after it has provided an IP address and a name to a DHCP client it will store that information to the local DNS database. Then we can ask the local DNS server to resolve any DHCP client name to the corresponding IP address.
Restoring the time during reboots
The RPi does not contain a real-time clock. This means that during reboot the time is lost until it is reset manually or by using NTP. It also means that the journal is messed up as the message time stamps are not in a chronological order. However, we can easily resynchronize the time by NTP or by the simpler systemd-timesyncd service. Edit the configuration file in /etc/systemd/timesyncd.conf
and start the service with:
# timedatectl set-ntp true |
Setting up a static IP address for the server
I already setup RPi to use a static IP address using the netctl-ifplugd unit. However, after some experimenting with dnsmasq I decided to select the basic network configuration approach with the systemd.networkd unit.
So the first thing to do is just to stop and disable the netctl-ifplugd unit.
# systemctl stop netctl-ifplugd@eth0 # systemctl disable netctl-ifplugd@eth0 |
Then we can enable the networkd and resolved units.
# systemctl enable systemd-networkd.service # systemctl enable systemd-resolved.service |
The resolv.conf file under /etc should be a symlink to the runtime configuration file.
# cd /etc # mv resolv.conf resolv.conf.orig # ln -s /run/systemd/resolve/resolv.conf |
The network configuration file is /etc/systemd/network/wired.network.
[Match] Name=eth0 [Network] DNS=192.168.1.1 [Address] Address=192.168.1.6/24 [Route] Gateway=192.168.1.1 |
Finally start the network services.
# systemctl start systemd-networkd.service # systemctl start systemd-resolved.service |
Installing dnsmasq
The dnsmasq app can be installed with pacman.
# pacman -S dnsmasq resolving dependencies... looking for conflicting packages... Packages (1) dnsmasq-2.72-2 Total Download Size: 0.16 MiB Total Installed Size: 0.38 MiB :: Proceed with installation? [Y/n] y :: Retrieving packages ... dnsmasq-2.72-2-armv6h 161.8 KiB 539K/s 00:00 [######################] 100% (1/1) checking keys in keyring [######################] 100% (1/1) checking package integrity [######################] 100% (1/1) loading package files [######################] 100% (1/1) checking for file conflicts [######################] 100% (1/1) checking available disk space [######################] 100% (1/1) installing dnsmasq [######################] 100% |
Configuring dnsmasq
Edit /etc/hosts and add all the static IP addresses defined for the LAN hosts there. E.g. the DHCP host itself and the router could be added (with an optional LAN domain suffix).
192.168.1.1 gateway.home gateway 192.168.1.6 arch-linux.home arch-linux |
Starting the DHCP and DNS servers
The dnsmasq app takes care of both the DHCP and caching DNS server duties. So let’s enable it and let’s fire it up!
# systemctl enable dnsmasq # systemctl start dnsmasq |