dnsmasq:轻量级DNS和DHCP服务器
dnsmasq能够同时或单独地提供DNS和DHCP服务,非常适合在资源有限的场景中使用,比如路由器和防火墙。它能够缓存DNS记录,从而提高网站的访问速度。
安装
sudo apt-get install dnsmasq
配置简介
配置文件位于/etc/dnsmasq.conf
。
dnsmasq默认开启DNS服务,如果不需要,请将DNS端口设置为0:port=0
。
写好配置文件后,可以使用dnsmasq --test
来检测配置文件是否编写正常。
启动dnsmasq
目前大多数主机已经使用systemd系统管理,以下是如何启动守护进程的命令:
systemctl start dnsmasq.service # 启动
systemctl stop dnsmasq.service # 关闭
systemctl restart dnsmasq.service # 重新启动
systemctl status dnsmasq.service # 查看状态
systemctl enable dnsmasq.service # 开机启动
systemctl disable dnsmasq.service # 关闭开机启动
启动后需要重启网络操作,会生成一个DHCP客户端所需的文件/etc/resolv.conf
,该文件会覆盖系统原有的配置,因此一般在配置文件里另外指定一个会更好。下面的配置文件部分会提到这点。
配置DNS缓存功能
- 给本机设置DNS缓存,编辑
/etc/dnsmasq.conf
,注释掉listen-address
,添加本地的IP地址即可:listen-address=127.0.0.1
- 给本地主机提供DNS缓存服务:
listen-address=192.168.1.1 # 示例IP
- 多个IP:
listen-address=127.0.0.1,192.168.1.1
DNS地址文件
默认会使用/etc/resolv.conf
,为了避免冲突,一般会复制一份并重命名为resolv.dnsmasq.conf
。更改文件内容,以启用第三方前置DNS。
/etc/resolv.conf
nameserver 127.0.0.1
# External nameservers
...
/etc/resolv.dnsmasq.conf
# Google's nameservers, for example
nameserver 8.8.8.8
nameserver 8.8.4.4
/etc/resolv.dnsmasq.conf
作为前置nameservers来使用,即dnsmasq的上游DNS。具体体现在dnsmasq配置文件里:resolv-file=/etc/resolv.dnsmasq.conf
。
NetworkManager
NetworkManager有一个启用dnsmasq的插件。如果dnsmasq安装了但不能生效,请检查该插件是否已启用。编辑/etc/NetworkManager/NetworkManager.conf
,在[main]
标签下添加dnsmasq:
/etc/NetworkManager/NetworkManager.conf
[main]
...
dns=dnsmasq
重启NetworkManager或重启主机。NetworkManager将自动启动dnsmasq,并添加127.0.0.1
到/etc/resolv.conf
中。此时的DNS服务在/run/NetworkManager/resolv.conf
。你可以使用$ drill example.com
来验证是否生效以及解析时间是否变化。
自定义配置
自定义的配置文件可以写在/etc/NetworkManager/dnsmasq.d/
里面。例如,改变dnsmasq在RAM中的缓存数量:
/etc/NetworkManager/dnsmasq.d/cache.conf
cache-size=1000 # 数量
测试方法:
$ drill archlinux.org | grep "Query time"
;; Query time: 18 msec
$ drill archlinux.org | grep "Query time"
;; Query time: 2 msec
DHCP服务
# 只监听路由器的LAN网卡。这样做会打开tcp/udp端口53到localhost和udp端口67到world:
interface=<LAN-NIC>
# dnsmasq将打开tcp/udp端口53和udp端口67到world,以帮助处理动态接口(分配动态IP)。Dnsmasq将丢弃对它们的world请求,但谨慎的用户可能会喜欢关闭它们并让内核处理它们:
bind-interfaces # 使用的网卡接口,尤其是双网卡的指定一下
# 可选地设置一个域名
domain=example.com
# 设置默认网关
dhcp-option=3,192.168.1.1 # 设置默认网关,可以不写
# 设置要宣布的DNS服务器
dhcp-option=6,8.8.8.8,8.8.4.4 # 可以不写
# 可供LAN PC使用的动态IP范围以及租约时间。理想情况下,在测试一切正常之前,将租约时间仅设置为5分钟,然后再设置长期记录。
dhcp-range=192.168.111.50,192.168.111.100,12h # 地址范围以及租约时间
# 如果希望dnsmasq为某些客户端分配静态IP,请将LAN计算机的NIC MAC地址绑定:
dhcp-host=aa:bb:cc:dd:ee:ff,192.168.111.50 # 静态IP,地址与IP绑定
dhcp-host=aa:bb:cc:ff:dd:ee,192.168.111.51
TFTP服务
dnsmasq还可以用作TFTP服务器。为了增加安全性,建议使用dnsmasq的TFTP安全模式。在安全模式下,只有dnsmasq用户拥有的文件将通过TFTP服务。你需要将tftp
和其中的所有文件chown给dnsmasq用户使用这个功能。
/etc/dnsmasq.conf
enable-tftp
tftp-root=/srv/tftp # 服务器默认的根目录
tftp-secure # 安全TFTP
PXE服务器
PXE需要DHCP和TFTP服务器,这两个功能都可以由dnsmasq提供。是不是很厉害?
/etc/dnsmasq.conf
interface=enp0s0
bind-dynamic
dhcp-range=192.168.0.1,proxy
重定向
重定向所有Google的请求到对应的DNS上:
server=/www.google.com/<ISP DNS IP>
重定向地址:
address=/example.com/1.2.3.4 # 单条劫持
address=/#/1.2.3.4 # 劫持所有网址
此外,dnsmasq还支持两台dnsmasq同时存在于不同的网口上。静态使用interface
和bind-interface
选项;动态使用:
except-interface=lo
bind-dynamic