简介
DNSMASQ是英国程序员Simon Kelley开发的一件多功能DHCP服务器/DNS代理工具软件。墙内的IT极客们都非常熟悉它,因为它是逃离DNS污染的必用工具。
我们这里就重点介绍以下DNS转发和地址收集功能。在DNSMASQ配置文件里,你常常可以见到类似以下两行的配置:
server=/creekside.network/1.1.1.1 ipset=/creeksidenet.com/MY_ADDR_GRP
第一项配置,”server=/creekside.network/1.1.1.1″是告诉DNSMASQ,如果遇到以”creekside.network”为后缀的域名,都转发到IP地址是1.1.1.1的DNS服务器上进行解析;
第二项配置,”ipset=/creekside.network/MY_IP_ADDR_GRP“,指示DNSMASQ,把以“creeksidenet.com“为后缀的域名解析结果,都放到名为MY_ADDR_GRP的ipset集合里。
这两项功能对于企业很有用处。比如你在公司内网安装了一个文件服务器,为了方便访问,你可以给它设置一个内部用的域名,比如file.mycompany,在路由器里添加相应的DNSMASQ设置,就可以通过这个域名来访问你内部的资源。
EdgeOS
EdgeOS已经内置了DNSMASQ功能,你可以通过以下配置来启用它。
configure set service dhcp-server use-dnsmasq enable set service dns forwarding cache-size 1500 set service dns forwarding name-server 8.8.8.8 set service dns forwarding name-server 8.8.4.4 set service dns forwarding except-interface pppoe0 commit;save;exit
上述配置里,首先启用DNSMASQ(缺省不启用),然后设置DNS缓存大小,以及缺省使用的上游DNS域名服务器。
最后一行是除了pppoe0端口以外,其他端口都启用DNSMASQ。另外与之相斥的配置方法是设置listen-on来指定启用的端口,未指定的端口不启用。比如以下配置就是在eth1和tun0两个端口上启用DNSMASQ。
configure set service dns forwarding listen-on eth1 set service dns forwarding listen-on tun0 commit;save;exit
另外一个非常好用的配置是options,凡是在options里配置的内容,都会被复制到/etc/dnsmasq.conf文件里。这样我们就可以启用DNSMASQ手册里的所有功能。其典型的配置语法如下:
configure set service dns forwarding options "conf-file=/config/dnsmasq/dnsmasq-xxxlist-ipset.conf" commit;save;exit
这个设置指示DNSMASQ从/config/dnsmasq/dnsmasq-xxxlist-ipset.conf装载配置选项。
USG
USG装载的是比较旧版本的EdgeOS,虽然也内置了DNSMASQ功能,但是由于它是用Unifi控制器管理的,有一个限制。系统缺省配置except-interface选项,而且无法删除。这个配置是和listen-on相斥的,如果我们按照官网UniFi – USG Advanced Configuration一文中添加了这一条配置,会造成commit失败,让USG不停地重启。
我们可以配置一条options选项来规避这个问题。
configure set interfaces loopback lo address 10.255.255.254/32 set service dns forwarding options "listen-address=10.255.255.254" commit;save;exit
一旦启用这一条,except-interface就失效了。因此在DHCP配置DNS选项时,都把DNS指向10.255.255.254这个地址。
VyOS
不知道VyOS开发团队是如何考虑的,VyOS 1.2版本以后就没有再预装DNSMASQ了,改成PowerDNS,不支持ipset选项。
经过一番摸索,我们找到解决方法,在这里介绍给大家。
从Debian安装DNSMASQ
我们知道,VyOS 1.2.5版本是在Debian Jessie上开发的,理论上我们从Debian官方源安装的软件是可以直接拿来用的。
要从官方源安装软件,需要配置/etc/apt/sources.list文件,不幸的是,VyOS开发团队为了防止我们安装软件,搞乱系统,把soureces.list清空了。不过这难不倒我们。下面的shell命令可以完成DNSMASQ的安装。
echo "deb http://deb.debian.org/debian/ jessie main contrib non-free deb-src http://deb.debian.org/debian/ jessie main contrib non-free" | sudo tee /etc/apt/sources.list sudo apt update && sudo apt install dnsmasq -y
好像已经大功告成了,但是事情没有那么简单。如果你重启VyOS,你会发现新安装的DNSMASQ以及相应的缺省配置文件 /etc/dnsmasq.conf 统统不见了。这是因为VyOS开发团队为了保护系统,使用了Overlay文件系统,用户对路由器系统的任何改变都无法永久保存,这样保证了系统的稳健性。
固化DNSMASQ
我们知道,/config目录是会永久保存的,即使系统升级,这个目录也不会被触及。因此,我们可以将dnsmasq程序保存到这个目录里。
sudo mkdir -p /config/dnsmasq/bin sudo cp /usr/sbin/dnsmasq /config/dnsmasq/bin/
然后,我们可以创建一个基础的配置文件,
echo "log-facility=/var/log/dnsmasq.log except-interface=eth0 cache-size=15000 server=1.1.1.1 # statically configured server=8.8.4.4 # statically configured" | sudo tee /config/dnsmasq/dnsmasq.conf
为了在系统重启时自动启动dnsmasq,我们可以修改/config/scripts/vyos-postconfig-bootup.script脚本。
echo "/config/dnsmasq/bin/dnsmasq --conf-file=/config/dnsmasq/dnsmasq.conf" | \ sudo tee -a /config/scripts/vyos-postconfig-bootup.script
启用DNSMASQ
同理,如果要让终端使用DNSMASQ,而不是系统缺省内置的PowerDNS,我们需要做以下设置。
首先,给loopback接口配置一个IP地址,并在相应的DHCP设置中把DNS指向loopback接口地址。
configure set interfaces loopback lo address 10.255.255.254/32 set service dhcp-server shared-network-name LAN subnet 10.0.0.0/24 dns-server 10.255.255.254 commit;save;exit
在dnsmasq配置文件中添加以下设置。
echo "listen-address=10.255.255.254" | sudo tee -a /config/dnsmasq/dnsmasq.conf
ipset
ipset是防火墙里常用的工具。它可以收集IP地址,用于各种防火墙策略。在EdgeOS/VyOS里,每个address-group实际上就对应相应的ipset集合。
如果你想要在dnsmasq.conf里使用一个MY_ADDR_GRP的ipset,可以在配置里做如下操作。
configure set firewall group address-group MY_ADDR_GRP commit;save;exit
终端里常用的ipset命令有:
- 显示ipset内容,sudo ipset list MY_ADDR_GRP
- 查找某个IP,sudo ipset test MY_ADDR_GRP 8.8.8.8