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

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

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 站长故事
回帖
回复列表

    请遵守各国法律法规 严禁违规内容

    • QQ群:1140251126
    • Email:m@max.ooo
    • 本站可以自由发布外链
    • 本站域名皆为闲置域名,均可出售
    Hot posts
    01 迅雷推广激励平台:官方高收益网盘拉新赚钱项目 550
    02 kupid.ai和herahaven.com应该选哪个? 544
    03 a.icu b.icu c.icu d.icu 同时掉 514
    04 今天把所有的google广告去掉了 511
    05 aigc.cx又多了一个域名 503
    06 秀秀新米(已出) 501
    07 迅雷 12 精简绿色版(12.1.6.2780) 489
    08 Windows 11 LTSC 优化版 - placeholder(2025.02.27) 463
    09 deepseek给我的域名的建议 439
    10 音频文件转换软件 XRecode 3(1.164) 419
    推荐主机