使用dnsmasq搭建简单的DNS服务器

优秀源码 无标签
0 930
WIZ
WIZ 自成一派 2023-07-09 21:13:38
Lv:36级

dnsmasq 是一个轻量级 DHCP 和 DNS 缓存服务器。

本文介绍下在 Ubuntu 系统上使用 dnsmasq 搭建简单的 DNS 服务器的方法。(DHCP 服务默认是关闭的,除非你配置了 dhcp-相关参数,本文不涉及)

Ubuntu 系统软件源中有两个相关软件包:dnsmasq-base(包含 dnsmasq 的核心程序);dnsmasq(包含了将其配置成系统服务的脚本和相关文件)。

本文使用 dnsmasq-base 进行介绍,如果想配置成系统服务,只需安装dnsmasq软件包,配置好配置文件,使用 systemd 命令启停服务即可

安装、卸载

# 安装apt install dnsmasq-base
# 查看
dpkg -l dnsmasq-base
dpkg-query -L dnsmasq-base # 查看软件包安装了什么,除了doc和man手册,其他是重点
# 卸载,purge是彻底卸载,包含配置文件,如果想保留要用remove
apt purge dnsmasq-base

运行 dnsmasq,在 Ubuntu 上一般会报错:

1688744663-1_1688744662_Iqr7C9xdgg.png

注:--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

1688744695-1_1688744694_0s2BOezZi9.png

--listen-address=<ip> 指定侦听的 IP 地址列表。也可以用--interface 参数指定侦听的网卡接口列表 (默认会添加 lo 接口)。

要注意的是--bind-interfaces 参数很关键,如果没有它,即使指定了接口或 IP,也还是会侦听 0.0.0.0   /(ㄒoㄒ)/~~

--port=<port> 指定DNS服务侦听的端口号,port为0则关闭DNS服务

最终侦听结果是:

1688744718-1_1688744718_XGVN3v1ra1.png

解决了端口侦听问题,我们来逐一讲解下如何配置。

通过 hosts 文件配置解析

dnsmasq 默认就会读取 /etc/hosts 文件,并提供其内容做解析结果。

禁用/etc/hosts 文件: -h, --no-hosts

指定 hosts 文件:-H, --addn-hosts=<file> 或 --hostsdir=<path>

1688744750-1_1688744750_pOo1qWXX0p.png

使用 dig 命令指定刚启动的服务做测试:

1688744771-1_1688744771_ZC6jzypYWD.png

--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

1688744858-1_1688744857_IcsmMumVv4.png

1688744873-1_1688744872_onn5PT7pyb.png

使用命令行参数配置解析

-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

1688744943-1_1688744942_GXuzO1csWk.png

1688744955-1_1688744953_O2WRnSHWx6.png

配置上游 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

1688744991-1_1688744990_oja6ecqbog.png

本地做解析:

1688745007-1_1688745006_buvfuyrMFH.png

向上游DNS发送请求:

1688745022-1_1688745022_W9YG6EX7BO.png

使用配置文件

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文件、命令行(或配置文件)配置自己想要的解析,通过上游服务器获得公网的解析。更细节的配置请自行阅读文档说明。

楼主签名:DNSWIZ 站长故事
回帖
回复列表