For caching DNS Server, I use PowerDNS recursor server. Install it first :
apt install pdns-recursor
By default it listens on 127.0.0.1:53 and should work right after the installation, but for faster performance I want it to forward all queries to 8.8.8.8 which is Google’s public DNS server. so change /etc/powerdns/recursor.conf and add the following line :
forward-zones-recurse= .=8.8.8.8;
Restart the service after config change :
systemctl restart pdns-recursor.service
Now you can test it :
dig yahoo.com @127.0.0.1
You should get a valid response.
Now lets redirect all DNS queries to our local server :
iptables -t nat -I OUTPUT -m owner --uid-owner pdns -j RETURN iptables -t nat -I POSTROUTING -m owner --uid-owner pdns -j RETURN iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 127.0.0.1:53 iptables -t nat -A POSTROUTING -p udp --dport 53 -j SNAT --to-source 127.0.0.1
The first two iptables rules prevent a loop in redirecting pdns queries to outside world (8.8.8.8 in our case).
Done. Easy 😉