本文介绍下在 Ubuntu 系统上使用 dnsmasq 搭建简单的 DNS 服务器的方法。(DHCP 服务默认是关闭的,除非你配置了 dhcp-相关参数,本文不涉及)
Ubuntu 系统软件源中有两个相关软件包:dnsmasq-base(包含 dnsmasq 的核心程序);dnsmasq(包含了将其配置成系统服务的脚本和相关文件)。
# 安装apt install dnsmasq-base
# 查看
dpkg -l dnsmasq-base
dpkg-query -L dnsmasq-base # 查看软件包安装了什么,除了doc和man手册,其他是重点
# 卸载,purge是彻底卸载,包含配置文件,如果想保留要用remove
apt purge dnsmasq-base
运行 dnsmasq,在 Ubuntu 上一般会报错:
注:--no-daemon 参数是 debug 模式,短参数为 -d,不创建后台进程,可打印更多信息,实际使用时去掉就行。
这是因为默 dnsmasq 是默认侦听所有 IP 地址的(即侦听 0.0.0.0),而当前 Ubuntu 系统有个默认的 DNS 缓存服务 systemd-resolved,其侦听了本机环回地址127.0.0.53:53,可以考虑关掉 systemd-resolved 或者指定接口或地址进行侦听:
dnsmasq -d --bind-interfaces --listen-address=127.0.0.1
--listen-address=<ip> 指定侦听的 IP 地址列表。也可以用--interface 参数指定侦听的网卡接口列表 (默认会添加 lo 接口)。
要注意的是--bind-interfaces 参数很关键,如果没有它,即使指定了接口或 IP,也还是会侦听 0.0.0.0 /(ㄒoㄒ)/~~
--port=<port> 指定DNS服务侦听的端口号,port为0则关闭DNS服务。
最终侦听结果是:
解决了端口侦听问题,我们来逐一讲解下如何配置。
通过 hosts 文件配置解析
dnsmasq 默认就会读取 /etc/hosts 文件,并提供其内容做解析结果。
禁用/etc/hosts 文件: -h, --no-hosts
指定 hosts 文件:-H, --addn-hosts=<file> 或 --hostsdir=<path>
使用 dig 命令指定刚启动的服务做测试:
--expand-hosts 参数可以支持对 hosts 文件中的主机名,添加域名后缀的解析,使用 --domain=<domain> 参数指定后缀,比如上例中,如果添加参数 --expand-hosts --domain=mydomain.com ,那么解析 house 或者 house.mydomain.com 都会返回 hosts 文件中的配置。
dnsmasq -d --bind-interfaces --listen-address=127.0.0.1 --expand-hosts --domain=mydomain.com
使用命令行参数配置解析
-A, --address=/<domain>[/<domain>...]/[<ipaddr>]
此参数配置域名及其泛域名的解析。
-A /a.com/1.2.3.4 意为 a.com、*.a.com 全解析为 1.2.3.4
-A /<domain>/ 只写域名,ip 留空,则此域名及其泛域名的返回结果为空
-A /#/<ipaddr> 可以使任意解析都返回 同一个IP(已经用 hosts 文件或 -A 命令特别指定的除外)不会向上级 dns 服务器请求了。
例:
dnsmasq -d --bind-interfaces --listen-address=127.0.0.1 -A /a.com/1.2.3.4 -A /b.com/ -A /#/5.6.7.8
配置上游 DNS 服务器
本地没有配置的域名(本地配置优先,可以覆盖公网解析),dnsmasq 可以向上游 DNS 服务器请求解析。
dnsmasq 默认使用/etc/resolv.conf 的配置作为上游 DNS 服务器,使用--no-resolv参数禁止读取此文件,--resolv-file=<file> 自定义 resolv.conf 文件。
--server=<server> 用于手动指定上游 DNS,<server> 前后可以加其他参数:
--server=/<domain>/<domain>/<server> 可以为特定的域名指定上游服务器
--server=<server>#<port>@<interface>@<source-i p>#<port> 用来配置发送请求的端口、发送请求的网络接口、发送源 IP、源端口
--server 参数可以配多个,默认只会向一个发送请求,--all-servers 参数可以让 dnsmasq 同时向多个上游 server 发请求,返回最快响应的内容,提高性能,但会增加服务器压力。
dnsmasq -d --bind-interfaces --listen-address=127.0.0.1 --no-resolv --server=8.8.8.8
本地做解析:
向上游DNS发送请求:
使用配置文件
dnsmasq 默认的配置文件为/etc/dnsmasq.conf,启动时可以用 --conf-file 和 --conf-dir 选项指定其他的位置。
文件中每行一条配置命令,将命令行长选项前边的“--”去掉写入文件即可。
“#”开头的行为注释行。
对于只能配置一次的参数,配置文件中的会覆盖命令行。
比如:
dnsmasq --bind-interfaces --listen-address=127.0.0.1 -A /a.com/1.1.1.1 --no-resolv --server=8.8.8.8
写入配置文件为:
# /etc/dnsmasq.conf
bind-interfaces
listen-address=127.0.0.1
address=/a.com/1.1.1.1
no-resolv
server=8.8.8.8
总结:
本文介绍了最基本的DNS配置,通过hosts文件、命令行(或配置文件)配置自己想要的解析,通过上游服务器获得公网的解析。更细节的配置请自行阅读文档说明。