build 980262fe | content blog-content@c8490fa · 338 posts | profiles 20 · corpus 208 | 0 skipped |
News · 2021-12-28

Setting up a small DNS server for your Homelab

Setting up a small DNS server for your home lab Setting up a small DNS server for your Homelab is actually quite simple.

2021-12-28Date
Dario DörflingerAuthor
4Min read
731words
Topics capabilities · idf weight
Vendors vendors · idf weight VMware vmware 0.91

This post is from 2021. It stays online because people still look for it, but it describes the products as they were then.

Setting up a small DNS server for your home lab

Setting up a small DNS server for your Homelab is actually quite simple. With the release of vSphere 7, the VCSA (vCenter Server Appliance) requires a DNS server for setup. While some earlier versions allowed only IP deployments, with the latest versions you can’t set up your environment without a DNS server.

I was setting up a new Homelab environment running everything on my Macbook in VMware Fusion when I stumbled across this change in vSphere 7. So how did I go about it? I decided to set up a small Ubuntu server VM running bind9.

I thought about running this as a Docker container, as the reason for setting up a new vSphere home lab in the first place was to learn more about all the benefits of vSphere with Tanzu that are included in the latest vSphere releases. But since I’m not that familiar with Docker and containers yet, I chose a path I know well to quickly cross that requirement off my list.

Step One:

Download the latest Ubuntu server Image from the official Ubuntu Repo (from https://ubuntu.com/download/server):

Step Two:

Create a custom VM in VMware Fusion (or Workstation if you are on a Windows machine) and attach the downloaded Ubuntu server ISO and follow the wizard:

I chose not to use easy install because it has been ages since I had installed Ubuntu server manually.

I left the default setting at “Legacy BIOS”.

These are the default settings for an Ubuntu server. If your homelab is short on ressources you can decrease the amount of RAM down to 1GB.

After clicking on “Finish” you will be asked what to name the VM. I chose to name mine “homelab-dns”.

Step Three:

Install Ubuntu server

I won’t go into detail about the installation process as it is simple. I pretty much left everything at default settings and only installed openssh server to connect to the server with the terminal app.

Step Four:

Install BIND9 on your Ubuntu Server

I chose BIND9 as DNS server because it’s a pretty widely used DNS server and you can quickly find help for it if you get stuck. To install it, I connected to my Ubuntu server “homelab-dns” and entered the command:

sudo apt-get install bind9

After the installation has completed we need to configure BIND

Step Five:

Configure BIND

The first file we’ll edit is the /etc/bind/named.conf.local


// Forward Zone
zone "virtual.lab" {
 type master;
 file "/etc/bind/zones/virtual.lab.db";
};
// Reverse Zone
zone "108.16.172.in-addr.arpa" {
 type master;
 file "/etc/bind/zones/rev.108.16.172.in-addr.arpa";
};

This tells BIND where to find the actual lookup files.

Next up are the the mentioned files from above. We’ll create the directory “zones” and create the files we configured.

mkdir -p /etc/bind/zones

Then we’ll create the first file with your preferred Editor (mine is VIM)

vim /etc/bind/zones/virtual.lab.db

And here we’ll add our Forward lookup entries:


$TTL	86400 ; 24 hours / 1d
; $TTL used for all RRs without explicit TTL value
$ORIGIN virtual.lab.
@  1D  IN  SOA dnsserver.virtual.lab. hostmaster.virtual.lab. (
			      2002022401 ; serial
			      3H ; refresh
			      15 ; retry
			      1w ; expire
			      3h ; minimum
			     )
virtual.lab.      IN      NS              dnsserver.virtual.lab.
       

dnsserver    IN  A      172.16.108.53      
vcsa    IN  A      172.16.108.2
esxhost1  IN  A      172.16.108.3  
esxhost2  IN  A      172.16.108.4

Afterwards we’ll create our reverse lookup zone file:

vim /etc/bind/zones/rev.108.16.172.in-addr.arpa

And here we’ll add our reverse mapping:

       
@ IN SOA virtual.lab. admin.virtual.lab. ( 
                        2006081401; 
                        28800;  
                        604800; 
                        604800; 
                        86400  
) 
 
           IN    NS     dnsserver.virtual.lab. 
53         IN    PTR    virtual.lab 
2	   IN	 PTR	vcsa 
3	   IN	 PTR	esxhost1 
4	   IN	 PTR	esxhost2 

Step six:

restart BIND and check your files

As a final command we’ll need to restart BIND in order for it to use the new configuration:

sudo service bind9 restart

And optionally you can check if your files are properly configured:

named-checkzone virtual.lab /etc/bind/zones/virtual.lab.db
named-checkzone 172.16.108.0 /etc/bind/zones/rev.108.16.172.in-addr.arpa

Conclusion:

And that’s it. You have set up a small DNS server for your Homelab. If you have any questions, feel free to reach out to me or leave a comment. Next up, I’ll be looking at VMware Tanzu and containers, and I’ll be publishing another post where I do the exact same thing with a lightweight Docker container.

Comments

7 comments from the previous blog. We no longer take new ones here.

Marc 2022-01-31

Hi Dario, I’m really happy I found your article, unfortunately all the pics from BIND config are missing. Any chance u can reupload them? Thanks a lot. Best regards, Marc

Dario 2022-01-31

Hello Marc, Thanks so much for pointing that out! Those are actually “code” text boxes that somehow got a dark font during our last WordPress update. I just fixed the CSS for them so they are visible again.

Marc 2022-01-31

Hi Dario, thank you very much.

Niall 2022-02-14

I’ve followed this article, and I’m not sure what I’m doing wrong. Basically, I want to use this as a split DNS. I’ve tried adding view “local” { … } to named.conf.local, around what you’ve put here, but I cannot get the sites to display internally (on the same network). Removing the view-local “if” statement (programmer background) does allow me to view internally, but that stops it working externally, and it doesn’t include ports (one website only has access via a specific port, and no way to configure this). I use nginx reverse proxy to handle the external connections and the port issue. I just need something for internal access.

Niall 2022-02-14

And as per usual, I seem to “fix” it as soon as I ask for help. I included the view “if” statement. This time, called “internal”. I don’t know how to paste code here to show what I did, but I also included a match-clients { 192.168/16; }; above the zones. That seemed to have done the trick. Now to figure out that port number issue for that single site/record.

Dario 2022-02-22

Hi Niall, Thanks for the feedback and kudos for figuring it out yourself before I could even read your comment. Were you able to resolve the port number issue? /dario

João Ricardo 2023-06-30

Tnx Dario, nice article. For a lab, why you did not choose DnsMasq instead Bind9 ? Isn’t more easy?

You might also like

Too few qualifying matches. The block stays empty rather than showing one lonely card.