I recently embarked on a journey to set up a CoreDNS server as an authoritative nameserver on my Ubuntu machine to manage a local custom domain, mich0w0h.house
, within my home network. This post is one part of building a local DNS service using docker-compose and I'll write other remaining parts later.
Directory Structure
Before diving in, let's take a quick look at the directory structure:
internal-dns │ └── authoritative │ ├── Corefile └── zone └── mich0w0h.house.db
Prerequisites
Make sure Docker is installed and running on your Ubuntu server.
Creating the Corefile
The Corefile is where we define our CoreDNS configuration. Here's what mine looks like:
mich0w0h.house { file /etc/coredns/zone/mich0w0h.house.db log }
- The first line defines zone for this server (default DNS port is 53).
- file /path/to/your/mich0w0h.house.db tells CoreDNS to load the zone file for your domain.
- log enables logging ## Creating the Zone File
Now, let's create the zone file mich0w0h.house.db
with our DNS records. Here's a snippet of what mine looks like:
$TTL 2d $ORIGIN mich0w0h.house. @ IN SOA ns1.mich0w0h.house. mail.mich0w0h.house. ( 2024031801 3600 600 86400 3600 ) ; Name server resource record for the domain IN NS ns1.mich0w0h.house. ; Domain hosts includes NS records defined above ns1 IN A 192.168.1.102 www IN A 192.168.1.103
Creating a Docker network
Create a Docker network to enable the container to be accessed by a static IP address.
sudo docker network create --subnet=192.168.1.0/24 internal-dns
Running the CoreDNS Container
Now, let's fire up the CoreDNS container (run this command in internal-dns
directory):
sudo docker container run --rm -d --name authoritative -v $(pwd)/authoritative:/etc/coredns --network internal-dns --ip 192.168.1.102 coredns/coredns -conf /etc/coredns/Corefile
command explanations
-
--rm
: remove container when it stops -
-d
: Runs the container in detached mode (background). -
--name authoritative
: Assigns a name to the container for easier management. -
-v $(pwd)/authoritative:/etc/coredns
: Mounts the directory containing your Corefile into the /etc/coredns directory inside the container. This allows CoreDNS to access your configuration files. -
-network internal-dns
: Specifies the Docker network created at the preliminary step. -
--ip 192.168.1.102
: Set a static IP address for this container. This should be inside of the subnet of specified Docker network -
coredns/coredns
: Specifies the Docker image to use. -
-conf /etc/coredns/Corefile
: let CoreDNS read/etc/coredns/Corefile
Testing with Dig
Finally, let's test our setup using dig
on the host ubuntu server:
dig +nocookie @192.168.1.102 ns1.mich0w0h.house
Now I can see these outputs and it shows the configurations work correctly.
; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> +nocookie @192.168.1.102 ns1.mich0w0h.house ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58701 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;ns1.mich0w0h.house. IN A ;; ANSWER SECTION: ns1.mich0w0h.house. 172800 IN A 192.168.1.102 ;; AUTHORITY SECTION: mich0w0h.house. 172800 IN NS ns1.mich0w0h.house. ;; Query time: 3 msec ;; SERVER: 192.168.1.102#53(192.168.1.102) (UDP) ;; WHEN: Tue Mar 19 10:08:10 JST 2024 ;; MSG SIZE rcvd: 127
What's next
I'll try to create a recursive resolver container and then build a local internal DNS service using docker-compose.
Top comments (0)