在日常開發中,有這么一個需求:
大家在公司內網同一個網段下,一般情況上網會由網關(一般是路由器)的DHCP服務分配IP。公司內網里放了幾台服務器,分別配置成靜態IP,這些IP是DHCP配置時預留的。服務器上會放置一些文件共享,所以有個Samba服務器。也配置了一些wiki及git等服務。大家可以使用IP訪問這些服務。但難記,IP偶爾也會變,總歸不如域名方便。但要每個人都改 hosts 又很麻煩,而且變更起來就更麻煩了。
一直想在內網布置一個域名解析的服務器,但不知道怎么搞定。今天跟一位IT運維請教后,才恍然大悟。是自己一直想復雜了。
整個配置過程大概有這么幾步:
- 取內網的一台服務器,部署一個 dnsmasq 服務作域名解析(不使用其DHCP功能)。
- 把內網這些服務的 IP 到域名的映射,設置到 dnsmasq 的配置文件里。
- 在DHCP服務上,把默認的DNS地址改成內網的這台服務器IP地址。這樣在連網會由DHCP把IP和DNS這些設置分配給機器。
這樣就行了。
使用域名上網的過程是:
- 訪問一個域名,但本地 /hosts 里找不到。
- 找到DNS服務器,到DNS服務器上去找
- DNS 服務器接收到域名訪問,如果是本地配置好的,則可直接返回結果。如果本地未配置,則到 dnsmasq 配置的默認上一級 DNS 服務器上找。
dnsmasq 在 ubuntu 上的配置
/etc/dnsmasq.conf
修改幾個地方:
listen-address=127.0.0.1, 10.39.249.211
監聽這兩個IP上的收到DNS請求
cache-size=2048
設置緩存的大小。有了緩存,被緩存的域名會立即返回IP地址。這樣可以加速訪問。
address=/node0.cpv.org/192.168.1.230
address=/node1.cpv.org/192.168.1.231
address=/node2.cpv.org/192.168.1.232
address=/node3.cpv.org/192.168.1.233
address=/node4.cpv.org/192.168.1.234
設置局域網內的域名IP映射關系。
修改本機DNS服務地址
本機的 DNS 服務地址配成 127.0.0.1。/etc/network/interfaces
里加上這一句:
dns-nameservers 127.0.0.1
修改 dnsmasq 的上一級DNS服務地址
dnsmasq 默認會到 /etc/resolv.conf
里去找,但這個文件里放的也是本機的DNS服務地址。上面的修改,把本機所有dns請求從 127.0.0.1 轉到了 dnsmasq 上。
另外,dnsmasq 會讀 /var/run/dnsmasq/resolv.conf
這個文件的內容作為上一級DNS服務地址。這個文件是怎么生成的呢:resolvconf 啟動時,會調用一個 hook 腳本:/etc/resolvconf/update.d/dnsmasq
,這個腳本生成 /var/run/dnsmasq/resolv.conf
文件。
我看了一下 /var/run/dnsmasq/resolv.conf
里面只有一句 nameserver 127.0.0.1
。可能是 resolvconf 這邊的腳本沒有被執行。
在 /etc/default/dnsmasq
里面設置 IGNORE_RESOLVCONF=yes
。這樣 dnsmasq 就不會去找 /var/run/dnsmasq/resolv.conf
,而是直接去讀 resolv-file
指定的文件。
在 /etc/dnsmasq.conf
設置 resolv-file=/etc/resolv.dnsmasq
最后創建 /etc/resolv.dnsmasq
文件,並在其中指定上一級 DNS 服務器地址。
后面這個文件是配置 dnsmasq 的上一級DNS服務器地址:
nameserver 10.39.249.254
nameserver 114.114.114.114
參考鏈接
https://bugs.launchpad.net/ubuntu/+source/dnsmasq/+bug/1090589
http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
https://wiki.archlinux.org/index.php/Dnsmasq_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)