dnsmasp配置详解

#############################################################################
#
# 配置文档:https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
#
############################################################################
# 不加载本地的 /etc/hosts 文件
#no-hosts
# 添加读取额外的 hosts 文件路径,可以多次指定。如果指定为目录,则读取目录中的所有文件。
# addn-hosts=/home/homework/dnsmasq/conf/hosts
# 读取目录中的所有文件,文件更新将自动读取
#hostsdir=/home/homework/dnsmasq/hosts


# 例如,/etc/hosts中的os01将扩展成os01.example.com
# expand-hosts 是 dnsmasq 的一个实用功能,它会自动为 /etc/hosts 中的短主机名添加指定的域名后缀,使其成为完全限定域名(FQDN)。
# 需要配合 domain 或 local 指令指定默认域名
# expand-hosts
# 将 /etc/hosts 中的条目 192.168.1.100 os01
# 自动扩展为 192.168.1.100 os01 os01.example.com
# domain=example.com
# expand-hosts
##############################################################################
# 缓存时间设置,一般不需要设置
# 本地 hosts 文件的缓存时间,通常不要求缓存本地,这样更改hosts文件后就即时生效。
local-ttl=300
# 同 local-ttl 仅影响 DHCP 租约
# dhcp-ttl=<time>
# dhcp-ttl=0           # 租约变更立即生效
# 对于上游返回的值没有ttl时,dnsmasq给一个默认的ttl,一般不需要设置,
neg-ttl=30 # 缓存“域名不存在”结果 5 分钟
# 指定返回给客户端的ttl时间,一般不需要设置
# 强制限制返回给客户端的 DNS 记录 TTL 最大值(秒)。
# 即使上游返回的 TTL 更大,也会被截断到此值。
# 默认值:0(不限制,使用上游 TTL)
max-ttl=3
# 限制本地缓存生命周期为 10 分钟,避免长期占用内存。
max-cache-ttl=9
# 强制最低缓存 10 秒,防止超高频查询冲击上游 DNS(如抗 DDoS)。
min-cache-ttl=15
# 一般不需要设置
#auth-ttl=<time>
##############################################################################
# 启用DNS查询日志(记录所有查询请求)
log-queries
#log-reply
# 将日志输出到独立文件(需确保目录存在且可写)
log-facility=/home/homework/dnsmasq/logs/dnsmasq.log
# 启用异步日志,队列大小50(平衡性能与可靠性)
# log-async=50
# 可选:限制日志级别,避免过多噪音(默认已足够)
# log-debug
##############################################################################
#指定DNS的端口,默认53,设置 port=0 将完全禁用 DNS 功能,仅使用 DHCP/TFTP
port=53
#指定向上游查询的 UDP 端口,默认是随机端口,指定后降低安全性、加快速度、减少资源消耗。
#query-port=53535
# 指定向上游查询的 UDP 端口范围,方便防火墙设置。
#min-port=<port>
#max-port=<port>
# 监听指定接口,可以使用’*’通配符,例如:eth0
# 只监听内网网卡
interface=eth0
# 指定排除的接口,排除高优先级,可以使用‘*‘通配符
# 明确排除回环
except-interface=lo
# 不带参数或带 net 参数时,将服务限制在已连接的网络范围内。仅接受来自地址位于本地子网(即服务器上存在接口的子网)的主机的 DNS 查询。带 host 参数时,仅监听 lo 接口并仅接受来自 localhost 的查询。此选项仅在没有 –interface 、 –except-interface 、 –listen-address 或 –auth-server 选项。该选项旨在安装时设置为默认设置,以便未配置的安装也能正常工作,同时还能防止 DNS 放大攻击。
local-service=net
# 强制严格绑定
bind-interfaces
# 指定不提供 DHCP 或 TFTP 服务的接口,仅提供 DNS 服务
#no-dhcp-interface=enp3s0
# 指定IP地址,可以多次指定。下面两行跟指定接口的作用类似。
listen-address=172.25.15.29
# 对于新添加的接口也进行动态绑定。
#bind-dynamic
##############################################################################
# 如果 hosts 中的主机有多个 IP 地址,仅返回对应子网的 IP 地址,目前此功能仅限于 IPv4。
localise-queries
# 如果反向查找的是私有地址例如192.168.X.X,仅从 hosts 文件查找,不再转发到上游服务器
bogus-priv
# 将包含指定地址或子网的回复转换为“无此域名”的回复
#bogus-nxdomain=64.94.110.11
# 忽略指定的 DNS 响应服务器地址,例如 1.1.1.1 为伪造的 dns 服务器并且响应速度非常快,
# ignore-address=1.1.1.1
##############################################################################
# 指定 resolv-file 文件路径,默认/etc/resolv.conf
resolv-file=/etc/resolv.conf
# 不读取 resolv-file 来确定上游服务器
#no-resolv
# 在编译时需要启用 DBus 支持。
#enable-dbus[=<service-name>]
#enable-dbus=com.example.mydnsmasq  # 自定义服务名
# 严格按照resolv.conf中的顺序进行查找
# 强制严格按照 /etc/resolv.conf 中 nameserver 的顺序依次查询 DNS不并行查询所有服务器。
strict-order
# 向所有上有服务器发送查询,而不是一个。
# 同时向所有上游服务器发送相同查询,采用最先返回的结果。
all-servers
# 启用 DNS 循环检测,防止因配置错误导致 dnsmasq 将查询循环转发给自己或其他递归服务器。
dns-loop-detect
#用于 过滤所有 IPv6(AAAA 记录)的 DNS 查询,使其不会向上游 DNS 服务器转发请求,而是直接返回空响应(NODATA)
filter-AAAA
##############################################################################
# 需要了解DNS 重绑定攻击(DNS Rebinding)
# 拦截所有返回私有IP的响应
# stop-dns-rebind
# 例外1:允许 localhost
#rebind-localhost-ok
# 仅允许特定域名重绑定
#rebind-domain-ok=/.dinghuangjie.com/.dhj.com/.harlinsu.com/.example.com/.test.com/.esderive.com/
##############################################################################
# 也不要检测 /etc/resolv.conf 的变化
#no-poll
# 重启后清空缓存
clear-on-reload
# 完整的域名才向上游服务器查找,如果仅仅是主机名仅查找hosts文件
# 告诉 dnsmasq 永远不要将不带点或域部分的纯名称的 A 或 AAAA 查询转发到上游名称服务器。如果 /etc/hosts 或 DHCP 中找不到该名称,则返回“未找到”答案。
domain-needed
##############################################################################
# IP地址转换
# alias=[<old-ip>]|[<start-ip>-<end-ip>],<new-ip>[,<mask>]
# 将访问 192.168.1.100 的请求自动重定向到 10.0.0.100。
# alias=192.168.1.100,10.0.0.100
# 将 192.168.1.1-192.168.1.50 映射到 10.0.0.1-10.0.0.50。
# alias=192.168.1.1-192.168.1.50,10.0.0.1
# 将 172.16.1.0/24 子网映射到 10.1.1.0/24。
# alias=172.16.1.0,10.1.1.0,24
##############################################################################
# 指定本地域名解析规则,强制将特定域名解析到指定 IP(类似 /etc/hosts 但更灵活)
# local=/[<domain>]/[<ipaddr>][#<port>][@<source-ip>|<interface>[#<port>]]
# 强制本地域名解析
# 所有 *.internal.company 解析到 192.168.1.100, 适用于内网服务(如 wiki.internal.company → 内网 Wiki 服务器)
# local=/internal.company/192.168.1.100
# 指定端口和源接口
# 解析 dev.test 到 127.0.0.1:8080,且 DNS 查询从 eth0 接口发出
# local=/dev.test/127.0.0.1#8080@eth0
# 指定特定域名的上游 DNS 服务器,覆盖全局 DNS 设置
# server=/[<domain>]/[<ipaddr>][#<port>][@<source-ip>|<interface>[#<port>]]
# 所有 *.corp.com 查询转发到内网 DNS 10.0.0.53
# server=/corp.com/10.0.0.53
# 对 secure.example.com 使用 Cloudflare 的 DoT 服务(端口 853
# server=/secure.example.com/1.1.1.1#853
# 所有包含 .sub.example.com 的域名(如 a.sub.example.com)均用 8.8.8.8 解析
# server=/.sub.example.com/8.8.8.8
# 为反向 DNS 查询(PTR 记录)指定专用服务器
# rev-server=<ip-range>/<prefix-len>,<ipaddr>[#<port>][@<source-ip>|<interface>[#<port>]]
#所有 10.0.0.* 的反向查询发送到 10.0.0.53
# rev-server=10.0.0.0/24,10.0.0.53
# 192.168.1.* 的反向查询通过 eth1 发送到 192.168.1.1:5353
# rev-server=192.168.1.0/24,192.168.1.1#5353@eth1
# 示例
# 内网域名强制本地解析
# 在 dnsmasq 中,local 指令的优先级高于 /etc/hosts。具体行为如下:
# local=/internal/192.168.1.100
# local=/.branch.corp/10.2.0.1
# 公网域名走特定 DNS
# server=/google.com/8.8.8.8
# server=/.aws.amazon.com/1.1.1.1
# 反向解析规则
# rev-server=10.0.0.0/8,10.0.0.53
# rev-server=192.168.0.0/16,192.168.1.1
# 和local相似
address=/test1/172.25.15.160
address=/test1/172.25.15.161
#host-record=test2,172.25.15.160
#host-record=test2,172.25.15.161
#synth-domain=testabc,172.25.15.160,172.25.15.161
# 对比其他类似功能
# address= 语法简洁,支持通配符         不能指定端口或接口 最高(同 local)
# local= 支持端口和接口绑定(如 #8080) 语法复杂         与 address= 同级
# /etc/hosts 系统全局生效                 不支持通配符         最低
# 将特定域名解析到的 IP 地址动态添加到指定的 ipset 集合中,用于配合防火墙(如 iptables/nftables)实现流量控制。
# ipset=/<domain>/<ipset>
# ipset=/ads.example.com/ads
# ipset=/.youtube.com/video,proxy
# 自定义 MX(邮件交换)记录,指定邮件服务器的优先级。
# mx-host=<mx name>[,<hostname>],<preference>​
# 为example.com配置两个邮件服务器
# mx-host=mail1.example.com,10  # 优先级10
# mx-host=mail2.example.com,20  # 优先级20
# 覆盖默认的 MX 记录目标,将邮件服务器指向指定主机。
# mx-target=<hostname>
# 将所有MX记录指向mailgate.example.com
# mx-target=mailgate.example.com
# 配合mx-host使用
# mx-host=mailgate.example.com,0
# 定义服务定位记录(Service Record),用于指定服务的主机和端口。
# srv-host=<_service>.<_prot>.[<domain>],[<target>[,<port>[,<priority>[,<weight>]]]]
# LDAP 服务配置
# srv-host=_ldap._tcp.example.com,ldap1.example.com,389,10,50
# srv-host=_ldap._tcp.example.com,ldap2.example.com,389,20,50
# 同时定义正向(A/AAAA)和反向(PTR)解析记录。
# host-record=<name>[,<name>….],[<IPv4-address>],[<IPv6-address>][,<TTL>]
# 定义主机记录(IPv4 + IPv6 + PTR)
# host-record=server.example.com,192.168.1.100,2001:db8::1,3600
# 定义文本记录,常用于 SPF、DKIM 等验证。
# txt-record=<name>[[,<text>],<text>]
# SPF 记录
# txt-record=example.com,”v=spf1 mx -all”
# 多文本记录
# txt-record=_dmarc.example.com,”v=DMARC1; p=none”
# 单独定义反向解析记录(IP → 域名)。
# ptr-record=<name>[,<target>]
# ptr-record=1.1.168.192.in-addr.arpa,server.example.com
# 定义命名权威指针记录,用于 SIP、ENUM 等场景。
# naptr-record=<name>,<order>,<preference>,<flags>,<service>,<regexp>[,<replacement>]
# ENUM 电话路由
# naptr-record=1.2.3.4.5.6.7.8.9.0.e164.arpa,100,50,”u”,”E2U+sip”,”!^.*$!sip:info@example.com!”
# 定义别名记录(域名 → 域名)。
# cname=<cname>,<target>[,<TTL>]
# cname=www.example.com,example.com,3600
#dns-rr=<name>,<RR-number>,[<hex data>]
#interface-name=<name>,<interface>[/4|/6]
#synth-domain=<domain>,<address range>[,<prefix>]
#add-mac[=base64|text]
#add-cpe-id=<string>
#add-subnet[[=[<IPv4 address>/]<IPv4 prefix length>][,[<IPv6 address>/]<IPv6 prefix length>]]
##############################################################################
# 设置DNS缓存条目数量上限
cache-size=10000  # 高性能服务器建议值
# 禁用对未知域名的缓存
no-negcache  # 不缓存”域名不存在”响应
# 限制并发向上游转发的DNS查询数量(并发)
# dns-forward-max=$(($(nproc) * 200))  # 按CPU核心数动态设置
dns-forward-max=2000

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>