- Introduction
- System Architecture
- Prerequisites
- Installation
- Configuration
- SSL Configuration
- Troubleshooting
- Advanced Usage
- Contributing
- License
This project sets up a local DNS infrastructure using CoreDNS, with one Debian server acting as the DNS server and two client VMs. The system is designed to use CoreDNS for local hostname resolution and fall back to 1.1.1.1 for internet queries. Additionally, it includes SSL configuration for secure local connections.
graph TD
A[CoreDNS Server] -->|DNS Queries| B(Client VM 1)
A -->|DNS Queries| C(Client VM 2)
A -->|Fallback| D{Internet DNS 1.1.1.1}
B -->|SSL| E[Local Services]
C -->|SSL| E
- 1 Debian VM for CoreDNS server
- 2 Client VMs (any Linux distribution)
- Root or sudo access on all VMs
- Basic understanding of DNS and networking
-
Download and install CoreDNS:
wget https://github.com/coredns/coredns/releases/download/v1.10.1/coredns_1.10.1_linux_amd64.tgz tar xzf coredns_1.10.1_linux_amd64.tgz sudo mv coredns /usr/local/bin/
-
Verify installation:
coredns -version
On each client VM, edit the /etc/resolv.conf
file:
sudo nano /etc/resolv.conf
Add the following content (replace 192.168.1.10
with your CoreDNS server's IP):
nameserver 192.168.1.10
nameserver 1.1.1.1
Create and edit the Corefile:
sudo mkdir /etc/coredns
sudo nano /etc/coredns/Corefile
Add the following content:
.:53 {
hosts {
192.168.1.10 server.local
192.168.1.20 client1.local
192.168.1.30 client2.local
fallthrough
}
forward . 1.1.1.1
log
errors
}
Create a SystemD service file:
sudo nano /etc/systemd/system/coredns.service
Add the following content:
[Unit]
Description=CoreDNS DNS server
After=network.target
[Service]
ExecStart=/usr/local/bin/coredns -conf /etc/coredns/Corefile
Restart=on-failure
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable coredns
sudo systemctl start coredns
Generate a self-signed certificate:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/hostname.local.key \
-out /etc/ssl/certs/hostname.local.crt
Follow the prompts, ensuring you set the Common Name to "hostname.local".
If CoreDNS fails to start, try the following:
-
Check permissions:
ls -l /usr/local/bin/coredns sudo chmod +x /usr/local/bin/coredns
-
Verify Corefile:
cat /etc/coredns/Corefile
-
Run CoreDNS manually:
sudo /usr/local/bin/coredns -conf /etc/coredns/Corefile
-
Check logs:
sudo journalctl -u coredns.service
-
Check for port conflicts:
sudo lsof -i :53
-
Configure firewall:
sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
- Custom DNS records: Add more entries to the
hosts
section in the Corefile. - Plugins: CoreDNS supports various plugins. Explore the official documentation for more options.
I understand you want to set up CoreDNS on your VMs with one Debian server for CoreDNS and two clients. You want to configure it so that if a hostname pings successfully, it uses CoreDNS for communication, and if not, it passes the request to the internet using 1.1.1.1 as the DNS server. Your main goal is to bind SSL using hostname.local.
Let's break this down into steps:
Let's start with the CoreDNS server setup:
First, install CoreDNS on your Debian VM:
Now, create a configuration file for CoreDNS:
Add the following content to the Corefile:
Replace the IP addresses with your actual VM IP addresses.
Create a systemd service file for CoreDNS:
Add the following content:
Start and enable the CoreDNS service:
sudo systemctl daemon-reload sudo systemctl start coredns sudo systemctl enable coredns
On each client VM, edit the
/etc/resolv.conf
file to use the CoreDNS server as the primary DNS:Add the following content (replace 192.168.1.10 with your CoreDNS server's IP):
This is already done in the Corefile we created earlier. The
hosts
plugin handles local resolution, and theforward
plugin sends unresolved queries to 1.1.1.1.To set up SSL for hostname.local, you'll need to use a tool like certbot to generate SSL certificates. However, since ".local" is not a valid public top-level domain, you won't be able to get a publicly trusted certificate for it.
Instead, you can create a self-signed certificate:
Follow the prompts, ensuring you set the Common Name to "hostname.local".
Now you can use these certificates in your web server configuration (e.g., Apache or Nginx) to enable HTTPS for hostname.local.
Remember that clients will need to add an exception for this self-signed certificate, as it won't be trusted by default.
This setup should allow you to resolve local hostnames using CoreDNS, fall back to 1.1.1.1 for internet queries, and use a self-signed SSL certificate for hostname.local. Keep in mind that for production environments, it's generally better to use a proper domain name and obtain a certificate from a trusted Certificate Authority.