dnsmasq常见用法

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同时存在于不同的网口上。静态使用interfacebind-interface选项;动态使用:

except-interface=lo
bind-dynamic
上一篇
下一篇