内网自建dns服务器

为什么内网需要dns服务器呢,主要是因为我电脑上跑了个虚拟机,有时候需要写socket程序让虚拟机和宿主机通信,这样ip地址就被嵌入到程序中了,如果将来要修改ip地址的话,就要改动很多地方,这是不符合软件设计原则的。所以我建了一个本地dns缓存服务器,然后将其设置为虚拟机和宿主机的dns服务器。然后在dns缓存服务器所在主机的hosts文件中添加虚拟机和宿主机的域名ip映射(dns缓存服务器设置为首先查询本地hosts,如果没有对应的域名ip映射再去查询上级dns服务器)。这样就可以在程序中用域名而不是ip来标识主机了。

具体到软件上,最经典的搭建dns服务器的软件当然是bind,不过这东东用起来比较麻烦,具体使用方法可以参考"鸟哥的Linux私房菜服务器架设篇"一书。我仅仅是需要个dns缓存服务器,没必要用bind,于是我选择了dnsmasq这个软件。此软件没有windows版,只有linux和mac版,因为我虚拟机系统是mac,所以我选择使用mac版。

我所使用的mac版本是El Capitan 10.11.3 (15D21),dnsmasq版本是2.75(安装dnsmasq的命令是brew install dnsmasq)。dnsmasq安装中的输出如下:

==> Downloading https://homebrew.bintray.com/bottles/dnsmasq-2.75.el_capitan.bot
######################################################################## 100.0%
==> Pouring dnsmasq-2.75.el_capitan.bottle.tar.gz
==> Caveats
To configure dnsmasq, copy the example configuration to /usr/local/etc/dnsmasq.conf
and edit to taste.
  cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
To have launchd start dnsmasq now and restart at startup:
  sudo brew services start dnsmasq
==> Summary
  /usr/local/Cellar/dnsmasq/2.75: 7 files, 492.3K

这里需要关注的就是==> Caveats部分,具体就是执行两个操作,一个是复制示例配置文件,一个是将dnsmasq作为服务启动。将这两条命令复制的终端中执行即可(注意,第二条命令中的sudo必须加上,否则执行后显示成功但实际dnsmasq并没有运行)

dnsmasq正常运行后,还需进行一些设置。

首先将dnsmasq设为mac的dns服务器,具体就是在mac中将dns服务器ip设为127.0.0.1(注意不要直接去修改/etc/resolv.conf这个文件,因为这个文件是系统自动生成的,应该用GUI的方式去设置,即点击 系统偏好设置->网络->以太网->高级->DNS->DNS服务器->填写ip)。

然后设置dnsmasq的上级dns服务器,具体就是在/usr/local/etc/文件夹下新建一个resolv.dnsmasq.conf文件,并用纯文本编辑器打开这个resolv.dnsmasq.conf文件,输入上级dns服务器的ip,例如

nameserver 223.5.5.5
nameserver 223.6.6.6

接下来打开/usr/local/etc/dnsmasq.conf,找到resolv-file所在行,并将此行改为

resolv-file=/usr/local/etc/resolv.dnsmasq.conf

这样dnsmasq就会根据/usr/local/etc/resolv.dnsmasq.conf这个文件中的内容去寻找上级dns服务器。

另外,如果/usr/local/etc/resolv.dnsmasq.conf有多个上级dns服务器地址,dnsmasq的默认查询方式为:In the start state, dnsmasq sends the query to all the servers. When the first server replies, it becomes the preferred server and dnsmasq moves into a state where only the preferred server is used.(这是查询方式的部分内容)

如果你想严格按照/usr/local/etc/resolv.dnsmasq.conf中的顺序自上而下进行dns查询(这是linux和windows中存在多个dns服务器时的默认查询方式),可以打开/usr/local/etc/dnsmasq.conf,取消注释strict-order行即可。

最后,/usr/local/etc/dnsmasq.conf修改完毕后,需使用下面的命令

sudo brew services restart dnsmasq

来使其生效。

到此为止,dnsmasq就已经做为mac的dns服务器在工作了,接下来需要将dnsmasq设置为宿主机的首选dns服务器,具体方法如下(测试系统为win7 sp1 pro):如果虚拟机的网络是nat模式,则将宿主机网络适配器"VMware Network Adapter VMnet8"(这个是vmware生成的一个虚拟网络适配器,连接到vmware的虚拟nat路由器)的dns服务器ip设为mac的ip,然后在系统的网络适配器管理窗口按alt键,在显示出的菜单上点击 高级->高级设置->适配器和绑定->连接->将"VMware Network Adapter VMnet8"置顶即可。

dnsmasq默认首先在本地hosts文件中寻找对应域名ip映射, 如果找不到再去上级dns服务器寻找(如果你不想dnsmasq去搜索hosts文件,可以打开/usr/local/etc/dnsmasq.conf,将no-hosts所在行取消注释),所以可以将虚拟机和宿主机的域名ip映射写入mac的hosts文件中,编辑hosts文件的命令如下:

sudo vi /etc/hosts

注意,etc前面的/不能忘了,否则vi会在当前目录下建立新文本。

hosts文件编辑完成后,所有的工作就完成了,以后就可以愉快的在程序中使用域名来定位虚拟机和宿主机了。



相关命令:

查看dnsmasq进程(mac自带的gui任务管理器默认是不会显示dnsmasq进程的,需要在菜单里选择显示所有进程才能看到dnsmasq进程)

ps aux | grep dnsmasq

查看53端口的监听情况(注意sudo不能少,否则啥也查不出来)

sudo lsof -ni:53

显示服务列表

sudo brew services list

如果dnsmasq运行不正常,想要监视其出错信息,可以先停止dnsmasq运行

sudo brew services stop dnsmasq

然后让其在前台运行

sudo /usr/local/opt/dnsmasq/sbin/dnsmasq --keep-in-foreground -C /usr/local/etc/dnsmasq.conf

测试结束后按ctrl+c结束dnsmasq进程或新建一个终端界面输入结束进程的命令

sudo pkill dnsmasq
此条目发表在 ., 运维与网管 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>