使用 dnsmasq 配置内部 DNS server

前言

為什麼要配置內部的 dns server 呢? 因為現在各種應用溝通都開始使用 FQDN 啦~ 其實要在 public nameserver 配置 private ip 也可以, 但是有幾點考量 :

  • 有時候他們被限制不能上網, 那又需要解析 domain 的時候, 就必須要用內部 dns 啦
  • 明明要去的目的地就在旁邊, 不需要繞出去 internet 在查詢一次
  • 如果被人發現你們的域名解出來是 private ip, 那 ... 其實他也不能怎樣, 就是很有趣的發現這樣XD.

說好的 bind9 呢?

沒有錯! 我這一開始也是安裝 bind9, 但是配置到一半我就投降了! 他比較適合架構比較大的時候使用吧, 我們這就是一個小小的內部 dns server, 追求的就是一個單純快速簡易穩定~



入正題!

安裝環境: Ubuntu 16.04.4 LTS
第一步就是安裝啦 apt-get install dnsmasq
安裝好後會有個設定檔 /etc/dnsmasq.conf , 裡面寫的落落長但全都註解的, 我們就先把他改名子, 當作之後的配置參考. mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak


基本配置

基本配置這樣就可以啦~ 如果還需要其他選項, 比如 ttl, 或是 ptr 或是要使用哪張網卡, 監聽哪個端口, 都可以去剛剛的 /etc/dnsmasq.conf.bak 裡面找需要的參數使用. 我們就先把目前的配置講完吧.

會有三個配置文件

  • /etc/dnsmasq.conf: 主要配置, 要加什麼選項通常在這
  • /etc/hosts_myns.conf: 裡面內容格式和 /etc/hosts 一樣, 就是本地 dns 紀錄
  • /etc/hosts_myns.conf: 上游選項, 就是說如果你身上沒有紀錄的話, 他要去哪裡幫你找答案

root@ubuntu:~# cat /etc/dnsmasq.conf
# 我们自己的ns纪录对照, 格式和 /etc/hosts一样
no-hosts
addn-hosts=/etc/hosts_myns.conf

# 自己没有纪录的话就向外询问
resolv-file=/etc/resolv_myns.conf

# 如果要指定是 CNAME 的话这样配置
# 这笔纪录一定要存在于hosts (/etc/hosts_myns.conf)
cname=fish01.tux.com,fish.tux.com
root@ubuntu:~# cat /etc/hosts_myns.conf
2.2.2.2 www.bar.com
3.3.3.3 fish.tux.com
root@ubuntu:~# cat /etc/resolv_myns.conf
nameserver=8.8.8.8
nameserver=168.95.1.1

改完後記得 systemctl reload dnsmasq 或是 systemctl restart dnsmasq

兩者的差別是, 如果你配置的 domain, 在 internet 已經查詢的到, 你要強制覆蓋的話, 使用 reload 指令是不會馬上生效的哦, 因為緩存還沒失效

就這樣短短幾行配置, 完成了 A 紀錄, CNAME 紀錄, 上游 dns 配置啦~ 下面就演示一下成果



驗收

配置的A紀錄

可以看到預設的 ttl 是 0 哦


配置的CNAME紀錄


沒配置的紀錄, 要去詢問上游



尾聲

嘛~ 有時間還是要把 bind9 學好阿~人家可是老字號阿.