Adventures in Rolling Your Own Router: Part II

In my previous post, I described my current home-brewed router. In this post, I’ll describe my plan for the new router.

What OS?

While PiHole can be installed directly on Arch Linux or be run in a Docker container, I feel it is safer to use an officially supported OS. My choices are Debian, Ubuntu, Fedora, or CentOS.

I don’t want to use Ubuntu because even in ubuntu-server there are more bells and whistles than I need.

Fedora is out, because I am interested in long term stability. CentOS would be a good option if it wasn’t EOL at the end of 2021.

This leaves Debian, an OS which I do not have much experience with.

What Should it Do, and How?

NAT Routing

The router needs to not only forward packets between clients on the LAN and the Internet, it also needs to perform Network Address Translation because in my network only the router itself has a public IP address.

NAT can be enabled with systemd.network using the IPMasquerade flag.

Based on the man page, just enabling IPMasquerade on the LAN interface should be enough to also enable packet forwarding (IPForward). We will see if that’s really the case.

Since we want to use nftables instead of iptables on this system, systemd should be modifying nftables rather than using legacy iptables. See also here.

PiHole DNS

I want PiHole to run on the router. This is basically dnsmasq with some filter lists and a fancy GUI.

PiHole is supported on Debian, so we should be able to just install it using the installer script. However, the installation instructions mention that it will install dhcpcd5 and modify /etc/dhcpcd.conf to assign a static IP address. We don’t want this because we will be using systemd.networkd for interface management.

This means that I will potentially need to modify the installer script to skip this.

DHCP Server

The router should also run a DHCP server, optionally providing “static IPs” to known clients based on MAC address.

Since PiHole contains dnsmasq, we can just enable the DHCP server built in to pihole-FTL.service.

Firewall

All incoming traffic except SSH and Mosh should be blocked. We need connection tracking to allow clients to communicate with Internet hosts.

I’ve never used nftables, but since this is the immediate future I’ll take this as an opportunity to learn.

In the next post, I’ll set up some VMs and try setting this up before doing it on my physical network.