Why

Technitium DNS Server is my DNS server of choice at home. The official way to install it on Linux is a shell script that downloads the .NET runtime and a tarball, creates the user and writes the systemd unit. It works well, but it sits outside the package manager: apt and dnf know nothing about it, so there is no clean uninstall, no dependency tracking and no inventory of what is installed where.

So I wrapped the same layout into proper packages.

What you get

Packages for both architectures, in both formats:

x86_64arm64
Debian / Ubuntutechnitium-dns-server_<ver>_amd64.debtechnitium-dns-server_<ver>_arm64.deb
RHEL / Alma / Rockytechnitium-dns-server-<ver>-1.x86_64.rpmtechnitium-dns-server-<ver>-1.aarch64.rpm

The arm64 ones are for Raspberry Pi, Orange Pi and other Armbian boards. I run it on an Orange Pi with Armbian (Debian 13 trixie). The app itself is managed .NET code, so the contents are identical on both architectures; only the package architecture label differs, which lets apt and dnf pick the right file.

The package mirrors what the official installer sets up:

  • app in /opt/technitium/dns
  • config and data in /etc/dns, logs in /var/log/technitium/dns
  • a dns.service systemd unit running as a dns-server system user

The ASP.NET Core dependency

Technitium needs the ASP.NET Core 10 runtime. The installer script downloads it with Microsoft’s dotnet-install.sh. The packages instead depend on aspnetcore-runtime-10.0, which is itself a deb/rpm, so the package manager pulls it in for you:

Install

Step 1: make the ASP.NET Core runtime available

Ubuntu 24.04 and 26.04 already have aspnetcore-runtime-10.0 in their own repositories, so skip this step there. On Debian 12/13 (and Raspberry Pi OS or Armbian based on them) add the Microsoft repository:

. /etc/os-release
curl -fsSL -o /tmp/packages-microsoft-prod.deb "https://packages.microsoft.com/config/debian/$VERSION_ID/packages-microsoft-prod.deb"
sudo dpkg -i /tmp/packages-microsoft-prod.deb
sudo apt update

On RHEL, Alma and Rocky 8/9/10, add it with:

sudo rpm -Uvh "https://packages.microsoft.com/config/rhel/$(rpm -E %rhel)/packages-microsoft-prod.rpm"

If your RHEL clone already ships .NET 10 in its own repos you can skip this, but it does no harm.

The packages are published to a Gemfury repository, so apt and dnf install the latest version and upgrade it with the rest of the system. The repo works for both x86_64 and arm64.

Debian, Ubuntu, Raspberry Pi OS, Armbian:

echo "deb [trusted=yes] https://apt.fury.io/cloudalbania/ /" | sudo tee /etc/apt/sources.list.d/cloudalbania.list
sudo apt update
sudo apt install technitium-dns-server

RHEL, Alma, Rocky:

sudo tee /etc/yum.repos.d/cloudalbania.repo <<'EOF'
[cloudalbania]
name=CloudAlbania
baseurl=https://yum.fury.io/cloudalbania/
enabled=1
gpgcheck=0
EOF
sudo dnf install technitium-dns-server

The repo is not GPG-signed (trusted=yes / gpgcheck=0), so only use it if you trust that I built it, or install from the GitHub release below.

Step 2b: from the GitHub release

If you would rather not add a repository, download the package from the latest release. This needs only curl, and no version number: it asks the GitHub API for the latest release and picks the file for your architecture.

Debian, Ubuntu, Raspberry Pi OS, Armbian:

curl -fsSLO "$(curl -s https://api.github.com/repos/besmirzanaj/technitium-dns-packages/releases/latest \
  | grep -o "https://[^\"]*_$(dpkg --print-architecture)\.deb")"
sudo apt install ./technitium-dns-server_*.deb

RHEL, Alma, Rocky:

curl -fsSLO "$(curl -s https://api.github.com/repos/besmirzanaj/technitium-dns-packages/releases/latest \
  | grep -o "https://[^\"]*\.$(uname -m)\.rpm")"
sudo dnf install ./technitium-dns-server-*.rpm

Then open http://<host>:5380/ and set the admin password.

One deliberate difference from the official script: the package does not disable systemd-resolved or rewrite /etc/resolv.conf. A package should not silently take over the machine’s resolver. If port 53 is already taken by systemd-resolved, free it yourself:

sudo systemctl disable --now systemd-resolved
echo 'nameserver 127.0.0.1' | sudo tee /etc/resolv.conf

Config and logs are kept when you remove the package; apt purge deletes them.

How it is built

Everything is in one public repo: besmirzanaj/technitium-dns-packages.

A daily GitHub Actions workflow asks the upstream project for its latest release, and if there is no matching release in my repo yet it:

  1. downloads the official DnsServerPortable.tar.gz,
  2. builds the four packages with nfpm,
  3. installs one deb (Ubuntu 24.04) and one rpm (AlmaLinux 9) in a clean container and checks that the web console answers,
  4. publishes the packages as a GitHub release.

So new upstream versions show up on their own, a day or so after they land. The repo also has a scripts/test.sh that runs the install test on Ubuntu 24.04 and 26.04, Debian 12 and 13 and AlmaLinux 8, 9 and 10, on x86_64 or arm64 (via Docker’s --platform). One honest limit: the containers have no systemd, so I run the app directly rather than through dns.service; the unit file is the upstream one, unmodified.

These are unofficial packages and not affiliated with Technitium. If you hit a packaging problem, open an issue on the repo.