dnsmasq是轻量级的域名和dhcp服务器,今天只讨论一下它域名功能的部分。
在国内,请不要以为可以轻易自架一个公网的DNS服务器,因为域名解析服务是严格被禁止的,只有运营商才有资格,所以不要轻易尝试,否则IP有可能被封。但dnsmasq仍可以在内网中使用。在新近的Ubuntu发行版上安装dnsmasq,如果不加配置,是会出错,服务根本无法跑起来,这是因为ubuntu默认已经自带了一个本地的域名解析服务systemd-resolve,它已经监听在127.0.0.53的53端口上,除非你想用dnsmasq取代它,否则是需要配置一下,以便不和systemd-resolve冲突。
查看53端口的占用情况,用lsof命令:
sudo lsof -n -i:53
最简单的配置是在/etc/dnsmasq.conf中,把bind-interfaces前的#号去掉,这样dnsmasq服务就可以跑起来,并且鉴定在所有接口的53端口上,不和systemd-resolve冲突,相反,默认地它以127.0.0.53作为上游的dns服务器。
我们可以从dnsmasq的 systemctl状态来分析它的行为:
其中,可以看到dnsmasq使用的上游服务器配置文件/run/dnsmasq/resolv.conf,这个默认是空的,而dnsmasq会把本地的127.0.0.53写入,如果你不想用systemd-resolve,可以直接改写这个文件。而运行时的命令–local-service指定了DNS服务仅限于本地内网(仅在未指定绑定接口或监听IP时有效)。此外,dnsmasq会读取/etc/hosts作为域名解析服务的源。当然你也可以在配置文件/etc/dnsmasq中指定其它专用的域名解析映射源文件。值得注意的是,/etc/hosts也服务于systemd-resolve,所以如果你指定了不同的源文件,可能会有不同的效果,比如当你本机不用自己定义的域名,而仅向内网其它服务器提供域名解析服务。
下面分别来测试一下:
1. 修改/etc/hosts 加上一行 192.168.1.11 mylaptop.local>
上面这个改动,在本机上直接生效了,但要让内网其它机器可查询,需要重启dnsmasq服务
2. 在dnsmasq中指定/etc/additional_hosts作为域名文件
在配置文件中去掉addn-hosts前的注释,并指定配置文件为/etc/additinal_hosts,然后创建这个文件,添加192.168.1.11 ip11.home这一行
重启dnsmasq服务后,效果一样,这是因为dnsmasq也监听在127.0.0.1:53上,
如果指定只监听192.168.1.11呢,在配置文件中添加listen-address=192.168.1.11,就会发现此时本地ping不了ip11.home,但指定该dns服务器的客户机则可以ping通。