DEV Community

mich0w0h
mich0w0h

Posted on • Edited on

Setting up a CoreDNS Server for Local Custom Domain Management on Ubuntu Using Docker

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
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

What's next

I'll try to create a recursive resolver container and then build a local internal DNS service using docker-compose.

References

Top comments (0)