Note
|
本文译自 https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html 2020-04-05 版本 |
dnsmasq 是一个轻量的 DNS、TFTP、PXE、路由宣告及 DHCP 服务器。它意在为局域网提供耦合的 DNS 和 DHCP 服务。
dnsmasq 接受 DNS 请求,要么从一个小型的、局部的缓存回应请求,要么将它转发至一个真实的、递归的 DNS 服务器上。它读取 /etc/hosts
的内容,以解析未出现在全局 DNS 的本地主机名,并响应由 DHCP 所配置的主机的 DNS 请求。它可以作为一个或多个的权威 DNS 服务器存在,允许将本地名追加至全局 DNS 中。它也可以被配置未执行 DNSSEC 验证。
dnsmasq DHCP 服务器知此恨静态地址分发,以及多重网络。它会自动发送有意义的默认 DHCP 选项集,也可以被配置未发送任何所需要的 DHCP 选项集,包括 vendor-encapsulated 选项。它包含一个安全的、只读的 TFTP 服务器,允许 DHCP 主机执行 net/PXE 启动,同时也支持 BOOTP。对 PXE 的支持是全功能的,并包含一个代理模式,它支持向客户端发送 PXE 信息的同时把 DHCP 地址分配交由用另一个服务器执行。
dnsmasq DHCPv6 服务器提供了与 DHCPv4 服务器相同的特性,额外的,它包括了路由宣告,且支持一个不错的特性:它允许为使用 DHCPv4 的客户端命名,而仅对 IPv6 配置使用无状态自动配置。它也支持为子网分配地址(通过 DHCPv6 或者 RA),该子网是通过 DHCPv6 前缀授权动态授权的。
dnsmasq 在编写时谨记微型嵌入式系统。它的目标就是在支持功能的同时做到最小的内存印记,并允许不需要的功能从编译后的程序中隐去。
注意,通常来说,允许丢失参数,者将关闭该功能,比如 --pid-file
将金庸写入一个 PID 文件。在 BSD 上,除非链接了 GNU getopt 库,否则选项的长形式无法在命令行中使用;但依旧可以在配置文件中识别。
- --test
-
读取配置文件并检查语法。若退出码为 0,则可用,否则不可用。不会启用 dnsmasq。
- -w, --help
-
显示全部命令行选项。
--help dhcp
将显示已知的 DHCPv4 配置选项,--help dhcp6
将显示 DHCPv6 选项。 - -h, --no-hosts
-
不要读取
/etc/hosts
中的主机名。 - -H, --addn-hosts=<file>
-
额外的主机文件。同时读取指定的文件和
/etc/hosts
。若给出了--no-host
,那么仅读取所指定的文件。该选项可指定多次来追加多个 hosts 文件。若给定了一个文件夹,则读取文件夹中的所有文件。 - --hostsdir=<path>
-
读取目录中的全部 hosts 文件。新加入的文件或者修改过的文件会被自动读取。参见
--dhcp-hostsdir
了解详情。 - -E, --expand-hosts
-
向
/etc/hosts
中的简单名称追加域,如同 DHCP 发送的名称一样。注意这不适用于 cnames、PTR 记录、TXT 记录中的域名。 - -T, --local-ttl=<time>
-
当返回来自
/etc/hosts
、配置文件、DHCP 租用文件的信息时,dnsmasq 默认会将 time-to-live 字段设置为 0,表示请求者自身不应该缓存信息。该设置在几乎全部的情况下都是正确的。该选项允许指定这些返回的 time-to-live(单位为秒)。它能降低服务器的负载,但会在在部分情况下导致客户端使用过期的数据。 - --dhcp-ttl=<time>
-
同
--local-ttl
,但仅影响回复自 DHCP 租用的信息。如果两者都给出,--dhcp-ttl
应用于 DHCP 信息,--local-ttl
应用于其它。将该值设置为 0 将会消去--local-ttl
对 DHCP 的影响。 - --neg-ttl=<time>
-
来自上游服务器的否定回答中的 SOA 记录通常包含 time-to-live 信息,该信息被 dnsmasq 用于缓存。若上游服务器隐去了该信息,dnsmasq 就不会缓存该信息。该选项给出了否定回答的默认 time-to-live 值(以秒计),当否定回复缺少 SOA 记录,dnsmasq 就会使用该选项的值来缓存记录。
- --max-ttl
-
设置将要发送给客户端的最大 TTL 值。若真实的 TTL 值比该值低,那么将向客户端发送该选项指定的最大 TTL。实际的 TTL 会存放在缓存中来防止对上游 DNS 服务器的冲击。
- --max-cache-ttl=<time>
-
设置缓存中的条目的最大 TTL 值。
- --min-cache-ttl=<time>
-
当缓存它们时,将 short TTL 值扩大至该值。TTL 值。注意,通常来说,人工扩大 TTL 的值都是坏注意,除非有充分的理由,并了解自己在做什么,否则不要使用它。dnsmasq 将该选项的值限制在了 1 小时,该限制仅能通过重编译修改。
- --auth-ttl=<time>
-
设置来自权威服务器的回答的 TTL 的值。
- -k, --keep-in-forground
-
不要像通常启动一样启动后就切入后台运行。它用于让 dnsmasq 运行在 daemontools 或 lauchd 的管理下。
- -d, --no-daemon
-
debug 模式:不要 fork 到后台,不要写入一个 pid 文件,不要修改 uid,在接到 SIGUSR1 后生成一个完整的 cache dump,同时向 stderr 和 syslog 写入日志,不要 fork 出新的进程来处理 TCP 请求。注意该选项仅用于 debug,要在生产环境中阻止 dnsmasq 自身的后台化,请使用
--keep-in-forground
。 - -q, --log-queries
-
将 dnsmasq 处理的 DNS 请求的结果记录入日志。当收到 SIGUSR1 时,生成一个完整的 cache dump。若给定了参数
extra
,比如--log-queries=extra
,那么会在日志的行首提供额外的信息。它包含了一个序列号,以及与序列号绑定的日志行,这些行包含独立的请求以及请求者的 IP 地址。 - -8, --log-facility=<facility>
-
dnsmasq 将把 syslog 条目发送给 facility,默认为 DAEMON,在 debug 模式中为 LOCAL0。若 facility 至少包含一个
/
字符,那么该值被认为是文件名,dnsmasq 将向给定文件而非 syslog 写入日志。若 facility 为-
,那么 dnsmasq 将日志写入 stderr。(在读取配置文件时产生的错误依旧会进入 syslog,但一次成功的启动的所有输出、以及运行时的全部输出都将排他地进入文件)。当向文件记录日志时,dnsmasq 将在收到 SIGUSR2 时关闭并重开文件。它允许日志文件被 rotate,而不需要停止 dnsmasq。 - --log-async[=<lines>]
-
启用异步日志写入,并可选地设置当 syslog 缓慢时,dnsmasq 可以队列的行的数量。dnsmasq 可以异步地写入日志:它允许 dnsmasq 继续其功能,而非被 syslog 阻塞运行,并允许 syslog 使用 dnsmasq 来查询 DNS,而不必冒生成死锁的风险。若日志行的队列已满,那么 dnsmasq 会记录该溢出,并记录丢失的信息的数量。默认的队列长度为 5,恰当的取值范围应该在 5 至 25 之间,最大值限制在了 100。
- -x, --pid-file=<path>
-
指定 dnsmasq 用于记录 pid 的文件的路径。通常为
/var/run/dnsmasq.pid
- -u, --user=<username>
-
指定在 dnsmasq 启动后,要切换至的用户。通常情况下,dnsmasq 必须以 root 身份启动,但在启动后,它就会抛弃 root 身份,并以另一个用户的 id 运行。该用户通常为 nobody,也可以通过该选项切换。
- -g, --group=<groupname>
-
指定 dnsmasq 运行时使用的组。若可用,则默认为 dip,这是为了访问
/etc/ppp/resolv.conf
,而该文件通常并不是任何账户可读的。 - -v, --version
-
打印版本号。
- -p, --port=<port>
-
监听端口号 port 而非标准 DNS 端口(53)。设置为 0 将完全关闭 DNS 功能,仅留下 DHCP 和/或 TFTP。
- -P, --edns-packet-max=<size>
-
指定被 DNS 转发者支持的最大 EDNS.0 UDP 包大小。默认为 4096,也是 RFC5625 的推荐大小。
- -Q, --query-port=<query_port>
-
用指定的 UDP 端口号 query_port、而非随机端口发送出站 DNS 请求,并监听其回复。注意,使用该选项将导致 dnsmasq 对 DNS 嗅探攻击的安全性下降,但可能提高速度并降低资源占用。将该值设置为 0 将导致 dnsmasq 使用由 OS 分配的单一端口:该行为在 2.43 版本前为默认行为。
- --min-port=<port>
-
不要使用小于该端口号的端口作为出站 DNS 请求的源端口。dnsmasq 将选择随机端口作为外部端口:当指定该选项后,所使用的端口将永远比指定的值大。对于防火墙后的系统很有用。默认值为 1024。
- --max-port=<port>
-
使用小于该端口号的端口作为出站 DNS 请求的源端口。nsmasq 将选择随机端口作为外部端口:当指定该选项后,所使用的端口将永远比指定的值小。对于防火墙后的系统很有用。
- -i, --interface=<interface name>
-
仅监听所指定的一个或多个接口。当使用
--interface
选项时,dnsmasq 会自动追加回环接口至接口列表。若不指定--interface
或--listen-address
选项,那么 dnsmasq 将监听除了由--except-interface
选项给出的接口之外的全部可用接口。在 Linux 上,当--bind-interfaces
或者--bind-dynamic
起效,将识别 IP 别名接口标签(比如 eth1:0),而非接口名。在简化的情况下,当一个接口仅有一个地址时,它们指向同一个事情,但当一个接口具有多个地址时,它允许控制接受哪些地址。在默认的模式下,也可以使用--listen-address
达到相同的效果。一个简单的通配符——一个尾缀的*
——可以用在--interface
以及--expect-interface
选项中。 - -I, --except-interface=<interface name>
-
不要监听指定的接口。注意,
--listen-address
、--interface
以及--except-interface
选项的指定顺序并不重要,因为--except-interface
选项将永远覆盖其它的。--listen-address
中描述的接口标签在这里同样适用。 - --auth-server=<domain>,[<interface>|<ip-address>…]
-
对到达特定接口或地址的请求启用 DNS 权威模式。注意这些接口或地址不需要在
--interface
或--listen-address
配置中指出,--auth-server
将在特定接口上覆盖这些选项,并提供一个不同的 DNS 服务。domain 为 glue 记录。它应该将全局 DNS 解析为指向 dnsmasq 所监听的 A 和/或 AAAA 记录。当指定接口时,它可以使用/4
或者/6
来指明仅监听与该接口绑定的 IPv4 或 IPv6 地址。由于任何定义好的权威 zone 同样作为受 dnmasq 支持的通常的递归 DNS 服务的一部分,所以也可以以无接口或地址,仅指定一个主外部名称服务器的方式声明--auth-server
。 - --local-service
-
仅接受地址在本地子网上的主机的 DNS 请求,比如服务器的接口所在的一个子网。该选项仅在没有
--interface
、--except-interface
、--listen-address
、--auth-server
选项时起效。它应该在安装时设置为默认值,来允许未配置的安装有用,且远离 DNS 放大攻击。 - -2, --no-dhcp-interface=<interface name>
-
不要在指定的界面上提供 DHCP 或 TFTP,但会提供 DNS 服务。
- -a, --listen-address=<ipaddr>
-
监听给定的一个或多个地址。
--interface
和--listen-address
也可一同指定,此时全部指定的接口和地址会被使用。注意若不指定--interface
,但指定了--listen-address
,那么 dnsmasq 就不会自动监听回环接口。要监听它,它的 IP 地址 127.0.0.1 必须要明确地在--listen-address
选项中指出。 - -z, --bind-interfaces
-
在支持的系统上,dnsmasq 会绑定通配符地址,即便它仅会监听一些地址。此后,它会丢掉那些不应该被回复的请求。这有助于平顺地工作,即便接口可能会出现、消失或者改变地址。该选项会强制 dnsmasq 仅真实地绑定它会监听的接口。该选项有用的情景大概只有一个,就是在同一个机器上还运行着另一个名称服务器(或另一个 dnsmasq 实例)。启用该选项同样会让同一个机器上可以运行多个提供 DHCP 服务的 dnsmasq 实例。
- --bind-dynamic
-
启用一个网络模式介于
--bind-interface
和默认模式之间的模式。dnsmasq 绑定独立接口的地址,允许多个 dnsmasq 实例,但如果新接口或地址出现,它会自动监听它们(受到访问控制配置的限制)。者让动态创建的接口与默认接口一样能工作。实现该选项要求非标准的网络 API,它仅出现在 Linux 上。其它平台则回落至--bind-interfaces
模式。 - -y, --localise-queries
-
从
/etc/hosts
和--interface-name
返回 DNS 请求的回答,其取决于请求接受的接口。若一个名字关联了多个地址,且其中至少有一个地址与请求发送的接口在相同的子网,那么仅返回在那个子网上的地址。它允许服务器在/etc/hosts
中为它的每个接口设置地址,而主机则能依照它所在的网络获得正确的地址。当前该设置仅限 IPv4。 - -b, --bogus-priv
-
虚空化对私有地址的反向查询。全部对私有 IP 范围(比如 192.168.x.x)的反向查询,若无法再
/etc/hosts
或者 DHCP 租用文件中找到的,均会回复 no such domain,而不会转发至上游。受影响的 IPv4 以及 IPv6 前缀由 RFC6303 中的列表给出。 - -V, --alias=[<old-ip>]|[<start-ip>-<end-ip>],<new-ip>[,<mask>]
-
修改由上游名称服务器返回的 IPv4 地址;用 new-ip 替换 old-ip。若给出了可选的 mask 那么任何可以匹配该带掩码的 IP 的地址都会被重写。所以,对于
--alias=1.2.3.0,6.7.8.0,255.255.255.0
将会把1.2.3.56
映射为6.7.8.56
。这就是被 Cisco PIX 路由称为 DNS doctoring 的东西。若旧 IP 以 IP 范围的形式给定,则仅有该范围内的 IP,而非整个子网会被重写。于是--alias=192.168.0.10-192.168.0.40,10.0.0.0,255.255.255.0
将会把192.168.0.10
至192.168.0.40
映射至10.0.0.10
到10.0.0.40
- -B, --bogus-nxdomain=<ipaddr>
-
将包含指定 IP 地址的回复替换为 no such domain 回复。这是为了消去 Verisign 在 2003 年 9 月开始实行的迷惑操作:它们考试对于未注册的名称的请求返回一个广告页的地址,而非正确的
NXDOMAIN
响应。该选项告诉 dnsmasq 当它看到这种行为时应该伪造正确的响应。在 2003 年 9 月时 Verisign 返回的地址为 64.94.110.11。 - --ignore-address=<ipaddr>
-
忽略包含了指定地址的 A 记录的回复。不会生成错误,dnsmasq 简单地监听其它回复。在正确的回复到达前,它可以使用快速伪造对于特定域的回复的方法来抵御封锁策略。
- -f, --filterwin2k
-
较新版本的 windows 会周期性地发送 DNS 请求,这些请求不会从公共 DNS 上获得什么有意义的回复,但会触发按需拨号链接而导致问题。启用该选项会过滤这类请求。会阻止的请求为具有 SOA 和 SRV 类型的请求,以及类型为 ANY、请求的名称中具有下划线的请求,也就是 LDAP 请求。
- -r, --resolv-file=<file>
-
从文件 file 而非
/etc/resolv.conf
中读取上游名称服务器的 IP 地址。对于该文件的格式参见 resolv.conf(5)。与 dnsmasq 相关的行仅为 namserver 行。可以让 dnsmasq 轮询多个resolv.conf
文件以拉取信息,指定的首个文件名将替换默认的,其后的每一个都会追加在列表后。仅在轮询时允许;会使用文件的最近修改时间。 - -R, --no-resolv
-
不要读取
/etc/resolv.conf
。仅从命令行以及 dnsmasq 配置文件中读取上游服务器。 - -1, --enable-dbus[=<service-name>]
-
允许 dnsmasq 的配置由 DBus 方法调用修改。可以被修改的配置为上游 DNS 服务器(以及对应的域)以及清空缓存。需要 dnsmasq 构建为支持 DBus。若给出了服务名,那么 dnsmasq 将提供该名称的服务,而非默认值 uk.org.thekelleys.dnsmasq。
- --enable-ubus[=<service-name>]
-
启用 dnsmasq UBus 接口。DHCPACK 和 DHCPRELEASE 事件会触发它在 UBus 上发送信息。而且它还提供 mdetrics。需要 dnsmasq 构建为支持 UBus。若给出了服务名,那么 dnsmasq 将提供该名称的服务,而非默认值 dnsmasq。
- -o, --strict-order
-
默认情况下,dnsmasq 会向任何一个已知的上游服务器发送请求,且偏好其中已知在线的服务器。设置该标示强制让 dnsmasq 严格按照
/etc/resolv.conf
中定义的服务器顺序逐次请求每个服务器。 - --all-servers
-
默认情况下,若 dnsmasq 具有多个可用的上游服务器,它仅会向其中一个服务器发送请求。设置该标示会强制 dnsmasq 向全部可用的服务器发送请求。首个回复请求的服务器的回复会被发送回原始的请求者。
- --dns-loop-detect
-
启用检测 DNS 转发回环的代码;比如向上游服务器发送的请求最终会作为一个新的请求返回该 dnsmasq 实例。该流程会通过生成一个
<hex>.test
形式的 TXT 请求,并向每个上游服务器发送该请求实现。hex shi 发送请求的 dnsmasq 和接收该请求的上游服务器编码而成的 UID。若请求被发回了发送它的服务器,则会停用该上游服务器,并记录日志。每次上游服务器的变动,都会重新检测它们,包含以前被停用的服务器。 - --stop-dns-rebind
-
拒绝(并记录)上游名称服务器返回的在私有范围内的地址。它阻止了一个防火墙后的浏览器侦察本地局域网上的机器的攻击。对于 IPv6,私有让位包含了 IPv4 私有空间映射、本地链路(LL)地址,以及本地站点(ULA)地址。
- --rebind-localhost-ok
-
不对 127.0.0.0/8 和 ::1 执行 rebind 检查。这些地址由实时黑洞服务器返回,封锁它们也许会阻止这些服务。
- --rebind-domain-ok=[<domain>]|[/<domain>/[<domain>/]]
-
不要检测和阻止对于指定的域的 dns-rebind 请求。如同
--server
的语法,参数可以为单一域,或者多个由/
包围的域,比如--rebind-domain-ok=/domain1/domain2/domain3/
- -n, -no-poll
-
不要轮询
/etc/resolv.conf
的修改。 - --clear-on-reload
-
每当重读
/etc/resolv.conf
或者通过 DBus 重设上游服务器时,清除 DNS 缓存。当新名称服务器具有的数据与缓存中的不同时十分有用。 - -D, --domain-needed
-
告诉 dnsmasq 不要将直接名称(plain name)——不含点号或者域部分——的 A 或者 AAAA 请求转发给上游名称服务器。若名称不能从
/etc/hosts
或者 DHCP 中找到,那么返回回答 not found。 - -S, --local, --server=[/[<domain>]/[domain/]]<ipaddr>[#<port>]][@<source-ip>|<interface>[#<port>]]
-
直接指定上游服务器的 IP 地址。设置该标示并不会抑制读取
/etc/resolv.conf
,要抑制读取,请使用--no-resolv
。若给出了一个或多个可选域,那么这些服务器仅用于解析这些域,且这些域也仅由这些服务器解析。它意在用于私有名称服务器:若在你的网络上有一个地址为 192.168.1.1 的名称服务器,其用于处理具有 xxx.interal.thekelleys.org.uk 格式的地址,那么给定标示--server=/internal.thekelleys.org.uk/192.168.1.1
会让全部查询内部机器的请求流向该名称服务器,其他的依旧使用/etc/resolv.conf
中指定的服务器。会关闭对这类私有服务器的 DNSSEC 校验,除非为该域指定了--trust-anchor
。若指定了空白的域,//
具有特殊的含义——仅为未限定名称,比如名称中不具有点号。可以使用非标准端口作为 IP 地址的组成部分,用#
分隔。可以指定多个--server
,每次指定都需要对应的 domain 或者 ipaddr。更详细的域会优先于不详细的域,所以
--server=/google.com/1.2.3.4 --server=/www.google.com/2.3.4.5
将把 *.google.com 的请求发送至 1.2.3.4,但会单独把 *www.google.com 的请求发送至 2.3.4.5。特殊的服务器地址
#
表示 使用标准服务器,所以--server=/google.com/1.2.3.4 --server=/www.google.com/#
将把 *.google.com 的请求发送至 1.2.3.4,而让 *www.google.com 的请求通常转发。也可以指定域而不指定 IP 地址;这告诉 dnsmasq 该域为本地的,它可以从
/etc/hosts
和 DHCP 查询地址,但永远不要将该域的查询转发至上游服务器。--local
为--server
的同义词,意在明确配置文件中的这种情况。IPv6 地址可以包含一个
%interface
限定 id,比如 fe80::202:a412:4512:7bbf%eth0。可选的在
@
之后的字符串告诉 dnsmasq 如何设置到该名称服务器的请求的源。它可以是 IP 地址、一个界面名,或者两者皆有。IP 地址应该属于 dnsmasq 所运行的机器,否则 server 行就会被忽略,并记录日志。若给定了一个接口名,那么发给服务器的请求会强制走所指定的接口;若给定了一个 IP 地址,那么请求的源地址就会设为该地址;若两者皆设置了,那么 IP 地址和接口名均会用于限制发送至服务器的请求。若指定了源地址,那么会忽略任何为该服务器设置的query-port
选项,这是由于可以直接在源地址中指定端口。强制请求走某个端口并非在全部 dnsmasq 支持的平台上可用。 - --rev-server=<ip-address>/<prefix-len>[,<ipaddr>][#<port>][@<source-ip>|<interface>[#<port>]]
-
功能与
--server
一样,但提供了语法糖让指定 address-to-name 的请求更简单。举例来说--rev-server=1.2.3.0/24,192.168.0.1
全等于--server=3.2.1.in-addr.arpa/192.168.0.1
- -A, --address=/<domain>[/<domain>…]/[<ipaddr>]
-
指定域中的主机对应的 IP 地址。域中的请求永远不会被转发,并永远回复为给定的 IPv4 或 IPv6 地址。要同时为域指定 IPv4 和 IPv6 地址,多次使用
--adress
标示。要在单个请求中包含多个 IP 地址,请转而使用--addn-hosts=<path>
。注意对于独立(individual)名称,/etc/hosts
和 DHCP 租用会覆盖该设置。一个常用的方法是将条目 doubleclick.net 域跳转至更友好的局域网 web 服务器上,来防止顶部广告。域指定与--server
相同,且新增/#/
表示任意域。因此--address=/#/1.2.3.4
会对无法从/etc/hosts
和 DHCP 中回复的请求直接返回 1.2.3.4,而并不会转发至--server
指定的上游服务器。对于--server
,一个或多个不具有地址的域将返回 no-such-domain 回答,所以--address=/example.com/
等价于--server=/example.com/
,并对 example.exe 以及其子域返回 NXDOMAIN。由#
指定的地址会被翻译为 NULL 地址 0.0.0.0 以及等价的 IPv6 地址 ::,于是--address=/example.com/#
将会对 example.com 以及其子域返回 NULL 地址。这部分是--address=/example.com/0.0.0.0
以及--address=/example.com/::
的语法糖,但因为合并了两者而减少了配置文件的行数。注意 NULL 地址通常与 localhost 的作用相同,因此要注意查找这些名字的客户端最后都容易和自己对话。 - --ipset=/<domain>[/<domain>…]/<ipset>[,<ipset>…]
-
将一个或多个请求的域所解析出来的 IP 地址放入指定的 Netfilter IP set 中。若给出了多个 setname,那么会在每个 set 中放置它们,但也会受到 IP set 的限制(IPv4 地址不能放在 IPv6 IP set 中,反之亦然)。域和子域的配置方法同
--address
。这些 IP sets 必须预先存在。参见 ipset(8) 了解更多详情。 - -m, --mx-host=<mx name>[[,<hostname>],<preference>]
-
返回一个名为 mx name 的 MX 记录,该记录指向(若给出)给出的主机名,或者在
--mx-target
指定的主机,若均为指定,则指向 dnsmasq 所运行的主机。默认值长用于将邮件从一个本地系统上转发至一个中心服务器上。preference 值为可选的,若不给定默认为 1.可以为一个主机指定多条 MX 记录。 - -t, --mx-target=<hostname>
-
指定 dnsmasq 返回的默认的 MX 记录的目标。参见
--mx-host
。若给定了--mx-target
但不给定--mx-host
,dnsmasq 返回一个 MX 记录,该记录包含了 dnsmasq 所在机器的主机名的 MX 目标。 - -e, --selfmx
-
对每个本地机器都返回一条指向其自身的 MX 记录。本地机器存在与于
/etc/hosts
和 DHCP 租用中。 - -L, --localmx
-
对于每个本地机器都返回一条指向
--mx-target
给出的主机(或者 dnsmasq 运行的主机)的 MX 记录。本地机器存在与于/etc/hosts
和 DHCP 租用中。 - -W, --srv-host=<_service>.<_port>.[<domain>],[<target>[,<port>[,<priority>[,<weight>]]]]
-
返回一个 SRV DNS 记录。参见 RFC2782 了解详情。若不给出,则由
--domain
给出。默认的目标域为空,默认的端口为 1,默认的权重和优先级为 0。要小心从 BIND zone 文件转换而来的数据:port、weight、priority 数字的顺序不同。可以为一个 service/domain 设置多于一个的 SRV 记录,所有的匹配值均会被返回。 - --host-record=<name>[,<name>….],[<IPv4-address>][,<TTL>]
-
向 DNS 添加 A、AAAA、PTR 记录。它向 DNS 中追加一个或多个关联了名称的 A(IPv4)或 AAAA(IPv6)记录。一个名称可以出现在多个 --host-record 中,此时它会对应多个地址。仅有第一个创建了 PTR 记录的地址会被链接至名称。于读取 hosts 文件的规则相同。
--host-record
选项先于 host 文件读取,如果在该选项中出现,也同时出现在 hosts 文件,那么他就会阻止 PTR 记录的生成。与 hosts 文件不同,名称不会被扩展,即便--expand-hosts
有效。短名和长名可以同时出现在一个--host-record
中,比如--host-record=laptop,laptop.thekelleys.org,192.168.0.1,1234::100
。如果给出了 time-to-live,那么它会覆盖默认值,默认值要么是 0 要么是
--local-ttl
。该值为正整数,且以秒计数。 - -Y, --txt-record=<name>[[,<text>],<text>]
-
返回一个 TXT DNS 记录。TXT 记录的值为一系列字符串,因此可以包含任何用逗号分隔数字;可以用引号将逗号放入字符串。注意单个字符串的最大长度为 255 个字符,大于该长度的字符串将被分为长度为 255 个字符的分块。
- -ptr-record=<name>[,<target>]
-
返回一个 PTR DNS 记录。
- --naptr-record=<name>,<order>,<preference>,<flags>,<service>,<regexp>[,<replacement>]
-
返回一个 RFC3403 中定义的 NAPTR DNS 记录。
- --caa-record=<name>,<flags>,<tag>,<value>
-
返回一个 RFC6844 定义的 CAA DNS 记录。
- --cname=<cname>,[<cname>,]<target>[,<TTL>]
-
返回一个 CNAME 记录,它指出 <cname> 实际为 <target>。对于 target 有明显的限制;它必须是 dnsmasq 所知的 DNS 记录,而非来自上游服务器的记录。cname 必须唯一,但允许多个 cname 指向同一个 target。实际上也支持在同一行中将多个 cname 指向同一个 target,如:
--cname=cnam1,cname2,cname3,target
若给定了 time-to-live,那么覆盖默认值,默认值一般为 0 或者
--local-ttl
的值。值为正整数,并以秒作为 time-to-live 的单位。 - --dns-rr=<name>,<RR-number>,[<hex data>]
-
返回一个任意的 DNS 资源记录。数字为记录的类型(它总是在 C_IN 类别中)。记录的值由十六进制数据给出,格式可以为 01:23:45 或 01 23 45 或 012345 或混用上述格式。
- --interface-nane=<name>,<interface>[/4|/6]
-
返回 DNS 记录,其中的名称与给出的接口的地址相关联。该标识为给定的名称指定一个 A 或 AAAA 记录,其与在
/etc/hosts
给出的方式相同,不同之处在于,地址并非定值,而是从给定的接口上获得。可以在接口后追加/4
或/6
,表示应该使用接口的 IPv4 或者 IPv6 接口。若接口下线、未配置或不存在,则返回一个空记录。会同时创建对应的 PTR 记录,将接口地址映射至名字。可通过重复指定该标识将多个名字与一个接口地址关联;这种情况下,首个实例将用于反向地址至名字的映射。注意,在--interface-name
条目里的名字可能不会出现在/etc/hosts
中。 - --synth-domain=<domain>,<address range>[,<prefix>[*]]
-
为一个范围内的地址人为创建 A/AAAA 和 PTR 记录。这些记录要么是序列数字,或者是地址,其中的点号(或者 IPv6 的分号)被连字符替代。
用一个案例来说。首先是序列数字。
--synth-domain=thekelleys.org.uk,192.168.0.50.192.168.0.70,internal-*
(注意尾部的星号*
) 将导致名称 internal-0.thekelleys.org.uk 返回 192.168.0.50,名称 internal-1.thekelleys.org.uk 返回 192.168.0.51 以此类推。相同的机制也同样适用于 IPv6 地址(数字可能会非常大)。对地址到名称的反向查找的行为在预期之中。其二,
--synth-domain=thekelleys.org.uk,192.168.0.0/24,internal-
(无星号*
)将导致 internal-192-168-0-56.thekelleys.org.uk 返回 192.168.0.56,反向查找反之亦然。相同情况也适用于 IPv6,但 IPv6 可能会以::
开头,而 DNS 标签不能以-
开头,此时若未指定前缀,则会在标签前添加一个0
。::1 就会变成 0—1。V4 映射的 IPv6 地址,其表现为 ::ffff:1.2.3.4,会被特殊处理,变成 0—ffff-1-2-3-4
地址段可以通过 <ip address>,<ip address> 或者 <ip address>/<netmask> 两种形式指定。
- --dumpfile=<path/to/file>
-
指定一个地址用于存放 pcap 格式的文件,该文件记录了用于排错的 dnsmasq 所 dump 的网络包。若 dnsmasq 启动时文件已存在,则不会删除原文件;而是直接在文件尾追加新包裹。
- --dumpmask=<mask>
-
指定哪些包应该被加入 dumpfile。其参数应该为要被 dump 的包的类型的 bitmask 的 OR 操作后的值:可以以 0x 作为前缀的十六进制值标识。每当一个包被记录入 dumpfile,dnsmasq 均记录包的序列号、以及它的类型的 mask。当前的类型为:
0x0001
来自客户端的 DNS 请求
0x0002
返回客户端的 DNS 回复
0x0004
向上游服务器发送的 DNS 请求
0x0008
来自上游服务器的 DNS 回复
0x0010
发送至上游服务器的 DNSSEC 验证的请求
0x0020
DNSSEC 验证的请求的回复
0x0040
向客户端回复的验证进程无法完成的 DNSSEC 验证
0x0080
向客户端回复的 DNSSEC 验证失败的回复。
- --add-mac[=base64|text]
-
向上游服务器转发 DNS 请求时,附上请求者的 MAC 地址。它用于上游服务器的 DNS 过滤。仅当请求者与 dnsmasq 服务器处在相同的子网下时,才能附加 MAC 地址。注意用于实现它的机制(EDNS0 选项)未被标准化,所以它应该被认为是实验性质的。同时也要注意以这种方式暴露 MAC 地址可能会引起安全和隐私漏洞。
--add-subnet
给出的关于缓存的警告同样适用于--add-mac
。用 base64 编码的 MAC 地址也可以通过添加base64
参数来实现,而以 十六进制/冒号 编码的人类可读的编码可以通过添加text
参数来实现。 - --add-cpe-id=<string>
-
在转发至上游服务器的 DNS 请求中追加一个任意的辨识字符串。
- --add-subnet[[=[<IPv4 address>/]<IPv4 prefix length>][,[<IPv6 address>/]<IPv6 prefix length>]]
-
在向上游转发的 DNS 请求中追加一个子网地址。若在参数中指定了地址,那么就用指定的地址,其它情况下,会使用请求者的地址。要转发的地址的长度将又前缀长度参数决定:32(对于 IPv6 为 128)将整个地址转发,0 不会转发任何值,但依旧会在请求中标记该值,这样上游服务器也不会追加客户端地址。对于 IPv4 和 IPv6 其默认值均为 0。注意上游名称服务器可能会被配置为依照该信息返回不同的结果,但 dnsmasq 缓存并不关心这个值。因此对于这类回复,会关闭缓存,除非添加的子网地址为定值。
举例来说,
--add-subnet=24,69
将分别为 IPv4 和 IPv6 请求者添加 /24 和 /96 长度的子网。--add-subnet=1.2.3.4/24
将会为 IPv4 请求者添加 1.2.3.0/24,为 IPv6 请求者添加 ::/0。--add-subnet=1.2.3.4/24,1.2.3.4/24
将同时为 IPv4 和 IPv6 的请求者添加 1.2.3.0/24。 - -c, --cache-size=<cachesize>
-
设置 dnsmasq 缓存的大小。默认为 150 个名字。设置为 0 关闭缓存。注意:值过大将影响性能。
- -N, --no-negcache
-
关闭 negative 缓存。negative 缓存允许 dnsmasq 记忆来自上游名称服务的“no such domain”回答,并在收到完全相同的请求之后不再转发它们。
- -0, --dns-forward-max=<queries>
-
设置并发的 DNS 请求的最大数量。默认为 150 个,该值对于大多数设置都够了。目前仅知的需要增加该值的情景是用于网页服务器日志解析器,它会生成大量的并发请求。
- --dnssec
-
验证 DNS 回复,并缓存 DNSSEC 数据。当转发 DNS 请求时,dnsmasq 会请求用于验证回复的 DNSSEC 记录。回复被验证,返回的 DNS 包会被设置 Authenticated Data 位。额外的 DNSSEC 记录会保存在缓存里,让 validation by clients 更高效。注意 validation by clients 是最安全的 DNSSEC 模式,但对于无法执行验证的客户端,只要能保证 dnsmasq 服务器和客户端之间的网络是可信的,那么设置 AD 位就很有用了。dnsmasq 必须以 HAVE_DNSSEC 启用的方式编译,并提供了 DNSSEC trust anchor,参见 --trust-anchor。由于 DNSSEC 验证过程使用了缓存,所以在启用了 DNSSEC 后,就不允许将缓存大小减小得比默认值还小。dnsmasq 的上游服务器必须是 DNSSEC 兼容的,比如能够返回具有 DNSSEC 记录的数据。如果它们不能做到,那么 dnsmasq 将无法决定回答的可信状态,从而导致整个 DNS 服务损坏。
- --trust-anchor=[<class>],<domain>,<key-tag>,<algorithm>,<digest-type>,<digest>
-
提供一个 DS 记录,作为 DNSSEC 验证的 trust anchor。通常来说,它们应该是具有根 zone 的 Key Signing key(KSK)的 DS 记录,也可以使用对于有限域的 trust anchor。当前的根 zone 的 trust anchor 可以从 https://data.iana.org/root-anchors/root-anchors.xml 下载。
- --dnssec-check-unsigned[=no]
-
默认情况下,dnsmasq 会检查未签名的 DNS 回复是合法的:即便这会导致对当前未签名的众多 zone 发送额外的请求。若
--dnssec-check-unsignes=no
出现在了配置中,那么那么这类回复就会被认为是有效的并传回(当然,也不会设置 authentic data 位。这并不能抵御攻击者修改来自签名的 DNS zone 的非签名回复,但它很块。先于 2.80 版本的 dnsmasq,默认不会检查未签名的回复,使用
--dnssec-check-unsigned
将开启它。这种配置已久可以使用,但那些原来默认为不检查的需要切换为明确地指出不检查。新的默认值是由于关闭对维签名的回复的检查是自然危险的。不仅是由于它会对被恶意修改的回复敞开大门,也是因为当上游服务器不支持 DNSSEC 时依旧允许所有东西看起来都正常运行,即便此时不会执行任何 DNSSEC 检查。 - --dnssec-no-timecheck
-
DNSSEC 签名尽在特定的时间窗口内有效,且应该在这些窗口之外废弃。若一台机器没有实时时钟,那么它就带来了一个先有鸡还是先有蛋的问题。通常来说,这些机器要通过 NTP 获得正确的时间,从而需要使用 DNS,但要验证 DNS 的有效性又需要已知正确的时间。设置该标示会移除时间窗口检查(但不会移除其它 DNSSEC 检查),直到 dnsmasq 进程接到 SIGINT。其用意在于系统应该在自认为可靠时间当前不可用时,让 dnsmasq 以该标识启动。一旦建立的可靠的时间,应当向 dnsmasq 发送 SIGINT,它会启用时间检查,并移除任何未被完全检查的缓存的 DNS 记录。
先前版本的 dnsmasq 重载了 SIGHUP(用于重读大部分配置)同样会启动时间检验。
若 dnsmasq 在 debug 模式下启动(
--no-daemon
标识),那么 SIGINT 会保持通常的含义,用于终止 dnsmasq 进程。 - --dnssec-timestamp=<path>
-
启用一个替代方法来检查对于 DNSSEC 的系统时间的有效性(见
--dnssec-no-timecheck
)。在该情景下,若系统时间比特定的文件的时间戳要晚,就会认为系统时间是有效的。该文件会被创建,且被 dnsmasq 自动设置。该文件必须存放在永续的文件系统上,让该文件和文件的 mtime 能跨系统重启而保留。该时间戳文件在 dnsmasq 放弃 root 后创建,所以该文件必须可以被 dnsmasq 所运行的非特权账户写入。 - --proxy-dnssec
-
将来自 DNSSEC Authenticated Data 位从上游服务器拷贝至下游客户端。这是让 dnsmasq 验证 DNSSEC 的一个替代方案,但它依靠于 dnsmasq 于上游服务器之间的网络安全,以及对上游服务器的可信度。注意,在所有的情况下,正确地缓存 Authenticated Data 位在技术上是不可行的。若设置该选项后要依靠 AD 位,那么缓存大小就应该用
--cache-size=0
设置为 0。对于大多数情况,在 dnsmasq 中启用 DNSSEC 检验是个更好的选择。参见--dnssec
了解详情。 - --dns-debug
-
为 DNSSEC 验证设置 debug 模式,对上游服务器的请求设置 Checking Disable 位,且不会将未验证的回复转换为带有 SERFAIL 返回码的回复。注意设置它会以糟糕的方式影响 DNS 的行为,它也不是一个记录额外日志的标识,也不应该用于生产环境。
- --auth-zone=<domain>[,<subnet>[/<prefix length>][,<subnet>[/<prefix length>]…..][,exclude:<subnet>[/<prefix length>]]…..]
-
设置 dnsmasq 作为权威服务器的 DNS zone。会提供本地定义的 DNS 记录。若给定了 subnet,那么 A 和 AAAA 记录必须处于指定的子网之一中。
作为直接指定子网的替代方法之一,也可以给出接口的名字,此时会使用接口配置的地址、掩码/前缀长度作为子网;在使用 DHCP 为 dnsmasq 分配地址时很有效,因为配置 dnsmasq 时不知道实际会被分配的 IP 地址。接口的地址可以通过 <interface>/6 配置为仅 IPv6 地址,或通过 <interface>/4 配置为仅 IPv4 地址。此时,接口就可以动态地决定应该把一个全局的 IPv6 地址加入 zone,但不会把 RFC1918 中的 IPv4 地址加入其中。接口名和文本指定的地址可以自由地在同一个
--auth-zone
声明中使用。可以从响应中排除特定的 IP 地址。它可以被用于,保证回答仅包含全局路由可达的 IP 地址(排除了回环、RFC1918、ULA 地址)。
subnet 也同时用于定义用于 DNS 反查请求的 in-addr.arpa 以及 ip6.arpa 域。若未指定,那么前缀长度默认为 IPv4 为 24,IPv6 为 64。对于 IPv4 subnet,前缀长度应为 8、16、24 中的一个,除非你熟悉 RFC 2317,并依次配置了 in-addr.arpa 授权。注意若不指定 subnet,那么就不会回应反查请求。
- --auth-soa=<serial>[,<hostmaster>[,<refresh>[,<retry>[,<expiry>]]]]
-
指定权威 zone 的 SOA 记录中的字段。注意其为可选项,所有值都被设置了合理的默认值。
- --auth-sec-servers=<domain>[,<domain>[,<domain>…]]
-
为 dnsmasq 所管辖的 zone 指定任意 secondary 服务器。这些服务器必须被配置为通过 zone transfer 从 dnsmasq 获得 zone 数据,且与 dnsmasq 一样回复对于相同的权威 zone 的请求。
- --auth-peer=<ip-address>[,<ip-address>[,<ip-address>…]]
-
指定允许对于 dnsmasq 管辖的 zone 发起 zone transfer(AXFR)请求的 secondary server 的地址。若不给出该选项,但给定了
--auth-sec-server
,那么就允许来自任何 secondary 的 AXFR 请求。指定--auth-peer
而不指定--auth-sec-servers
会启用 zone transfer,但不会在 dnsmasq 返回的 NS 记录中推荐 secondary。 - --conntrack
-
读取与进入的 DNS 请求关联的 Linux 连接追踪标记,并为回复自上游服务器的回答设置相同的标记值。它允许由 dnsmasq 生成的流量关联至导致它的请求,对于流量计费和防火墙很有用。dnsmasq 必须将 conntrack 支持编译其中,且内核必须包含且配置了 conntrack 支持。该选项不能与
--query-port
连用。 - -F, --dhcp-range=[tag:<tag>[,tag:<tag>],][set:<tag>,]<start-addr>[,<end-addr>|<mode>][,<netmask>[,<broadcast>]][,<lease time>]
- -F, --dhcp-range=[tag:<tag>[,tag:<tag>],][set:<tag>,]<start-IPv6addr>[,<end-IPv6addr>|constructor:<interface>][,<mode>][,<prefix-len>][,<lease time>]
-
启动 DHCP 服务器。给出的地址从 <start-addr> 至 <end-addr>,以及
--dhcp-host
选项中给出的静态地址。若给出了租期,那么租用将给出那么长的时间。租期的单位为秒,或分钟(比如 45m)或小时(比如 1h)或无限长infinite
。若不给出,那么默认的租期为 IPv4 一小时、IPv6 一天。最小的租期为两分钟。对于 IPv6 范围,租期可能为deprecated
;它设置 DHCP 租用或路由宣告中的偏好的生命周期至零,会导致客户端使用其它地址(若可用)进行新连接,来前导重编号。可用不同的地址,重复指定该选项,来为多个网络启用 DHCP 服务。对于直接连接的网络(比如,dnsmasq 运行的机器所具有的一个接口)网络掩码为可选项:dnsmasq 将从接口配置中获取它。对于通过中继获取 DHCP 服务的网络,dnsmasq 不能通过自身决定该值,所以必须指定它,否则 dnsmasq 则需要通过网络地址的类别(class A、class B、class C)猜测它。广播地址永远是可选的。永远允许在一个子网中具有多个
--dhcp-range
。对于 IPv6,参数稍有不同:它不用网络掩码和广播地址,而是具有一个可选的前缀长度,该长度必须等于或大于本地接口的前缀长度。若不给出,那么默认值为 64。与 IPv4 的情况不同,前缀长度不会自动从接口的配置推断出来。前缀长度的最小值为 64。
IPv6(仅)支持另一类范围。在该情况下,开始地址和额外的结束地址仅包含网络部分(比如 ::1),且它们气候跟随
constructor:<interface>
。它形成了一个模板,描述了如果基于分配给接口的地址创建一个范围。举例来说--dhcp=range=::1,::400,constructor:eth0
将会查看 eth0 上的地址,并创建一个从 <network>::1 至 <network>::400 的范围。若接口被分配了多个网络,那么对应的范围将会被自动创建,若地址被弃用并删除,那么范围也随之启动并删除。接口名的末尾可以具有一个通配符
*
。注意不是 eth0 上的任何地址均可用:它不可以是自动配置的或者私有地址,也不能处于弃用状态。若
--dhcp-range
仅用于无状态 DHCP 和/或 SLAAC,那么地址可以更简单:--dhcp-range=::,constructor::eth0
可选的
set:<tag>
会设置一个用于标记该网络的字母数字标签,让 DHCP 选项可以基于每网络指定。当转而使用tag:
前缀的时候,修改的配置会匹配标签。仅可设置一个标签,但可匹配多个标签。可选的
<mode>
关键字可以为static
,表示 dnsmasq 应该为指定的网络启用 DHCP,但不要动态分配 IP 地址:仅有通过--dhcp-host
给出的地址以及来自/etc/ethers
的地址会被提供。一个地址全部为零的、仅静态的子网可以作为“全捕获”地址,以此在无状态 DHCPv6 提供的子网上回复回复全部的信息请求包,比如--dhcp-range=::,static
对于 IPv4,
<mode>
可以为proxy
,此时 dnsmasq 会在特定的子网上提供代理 DHCP(参见--pxe-prompt
和--pxe-service
了解详情)。对于 IPv6,
<mode>
可以为ra-only
、slaac
、ra-name
、ra-stateless
、ra-advrouter
、off-link
的组合。ra-only
告诉 dnsmasq 在此子网上仅提供路由器宣告 Router Advertisement,而不提供 DHCP。slaac
告诉 dnsmasq 在此子网上提供路由器宣告,并设置路由器宣告中的 A 位,以此让客户端使用 SLAAC 地址,同时使用 DHCP 提供的其它配置信息。ra-stateless
发送设置了 O 位和 A 位的路由器宣告,并提供无状态 DHCP 服务。ra-names
启用的模式为对 SLAAC 的 IPv6 的双栈主机给出 DNS 名称。dnsmasq 使用主机的 IPv4 租用获得名字、网络段、MAC 地址,并假设主机同样会具有一个通过 SLAAC 算法获得的同网络段上的 IPv6 地址。会 ping 该地址,若获得了回复,则向 DNS 中为该 IPv6 追加一个 AAAA 记录。注意它仅发生于直连网络,(不会发生于中级 DHCP 上)且若一个主机使用了隐私扩展,则无法起效。ra-name
可以与ra-stateless
和slaac
连用。ra-advrouter
启用的模式为在宣告中包含路由器地址,而非前缀。它描述于 RFC3775 section 7.2,并用于 mobile IPv6。在该模式下,会包括一个 interval 选项,其如 RFC3775 section 7.3 中描述的一样。off-link
告诉 dnsmasq 宣告前缀,但不设置 on-link(也即 L)位。 - -G, --dhcp-host=[<hwaddr>][,id:<client_id>|*][,set:<tag>][tag:<tag>][,<ipaddr>][,<hostname>][,<lease_time>][,ignore]
-
为 DHCP 服务器指定每主机参数。它允许一个具有特定硬件地址的机器总是分配上相同的主机名、IP 地址、以及租期。在此处设置的 hostname 会覆盖任何由 DHCP 客户端提供的主机名。也可以隐去硬件地址并包含主机名,在此情况下 IP 地址和租期会赋予任何声明该名称的机器。举例来说
--dhcp-host=00:20:e0:3b:13:af,wap,infinite
告诉 dnsmasq 给具有硬件地址00:20:e0:3b:13:af
的主机赋予名称wap
,并设定 DHCP 租期为无限长。--dhcp-host=lap,192.168.0.199
告诉 dnsmasq 总是给主机lap
分配地址192.168.0.199
。用该方法分配的地址不限于
--dhcp-range
选项给定的范围,但必须落在某个有效的 dhcp-range 限定的子网中。对于不需要动态分配地址池的子网,在--dhcp-range
中使用static
关键字。允许使用以
id:
为前缀的客户端标识符(IPv6 中称为 client DUID)而非硬件地址来指定主机。因此--dhcp-host=id:01:02:03:04,……
指向具有客户端标识符 01:02:03:04 的主机。也允许用文本方式指定 client ID,比如--dhcp-host=id:clientidastext,……
一个单独的
--dhcp-host
可以包含一个 IPv4 地址或一个或多个 IPv6 地址,或两者。IPv6 地址必须被方括号包围,因此:--dhcp-host=laptop,[1234::56]
IPv6 地址仅可以包含主机标识符部分为:--dhcp-host=laptop,[::56]
,在这种情况下,它们将作为构建 DHCP 范围的通配符存在,会向其中插入合适的合适的网络部分。对于 IPv6,一个地址可以包含一个前缀长度:--dhcp-host=laptop,[1234::50/126]
,该地址就指定了四个地址,1234::50 至 1234::53。当一个主机展示出一个稳定的名称或硬件 ID,但却具有可变的 DUID 时,它(可以指定多个地址的能力)十分有效,这是由于它允许 dnsmasq 维护静态地址分配的同时,为每个 DUID 分配不同的地址。它常见于链式网络启动,此时链上的每个阶段会轮流获得一个地址。注意在 IPv6 DHCP 中,硬件地址可能不可用,虽然通常情况下,它用于直连的客户端,或者客户端使用的是支持 RFC6939 的 DHCP 中继。
对于 DHCPv4 来说,特殊的选项
id:*
表示忽略任何 client-id,仅使用 MAC 地址。它在一个客户端有时显示 client-id 有时不显示时十分有用。若名称出现在了
/etc/hosts
中,那么相关的地址也可以由 DHCP 租用分配,但仅限于存在与该名称对应的--dhcp-host
选项。在一个--dhcp-host
选项中仅能给出一个主机名,但可以通过 CNAME 指定别名(参见--cname
)。特殊关键字
ignore
告诉 dnsmasq 永远不要给一个机器提供 DHCP 租用。机器可以通过硬件地址、client ID 或者主机名指定,比如--dhcp-host=00:20:e0:3b:13:af,ignore
。当网络上还有另一个 DHCP 服务器,且部分机器应该使用哪个服务器时很有用。一旦使用该
--dhcp-host
指令,set:<tag>
结构就会设置该标签。它可以用于为该主机选择性地发送 DHCP 选项。在--dhcp-host
指令中可设置一个或多个标签(但其它允许set:<tag>
的地方不可以设置多个)。当一个主机匹配上了任何--dhcp-host
指令(或者由/etc/ethers
隐含的),那么就会被设置特殊标签known
。它允许通过--dhcp-ignore=tag:!known
将 dnsmasq 配置为忽略未知机器的请求。如果主机仅匹配上一个--dhcp-host
指令,且由于它指定的地址在另一个子网上而不能被使用,那么会设置known-othernet
标签。tag:<tag>
结构过滤要使用的 dhcp-host 指令。被标记的指令优先于未标记的指令。以太网地址(不能是 client-id)可以有通配符字节,所以,举例来说
--dhcp-host=00:20:e0:3b:13:*,ignore
将导致 dnsmasq 忽略一系列硬件地址。注意在命令行中*
需要被转义或者被引号引起,但配置文件中不需要。硬件地址通常匹配任何网络(ARP)类型,但也可以通过前缀 ARP 类型(十六进制表示)以及
-
来指定单独的 ARP 类型。所以--dhcp-host=06-00:20:e0:3b:13:af,1.2.3.4
仅会匹配令牌环硬件地址,这是由于令牌环的 ARP 地址类型为 6。作为特殊的情况,在 DHCPv4 中,可以包含多个硬件地址。比如
--dhcp-host=11:22:33:44:55:66,12:34:56:78:90:12,192.168.0.2
。它允许一个 IP 地址与多个硬件地址关联,给 dnsmasq 权限,让它能在其中一个硬件地址请求租用时,弃用另一个硬件地址的租用。要小心这样做很危险,仅在保证任意时间点上仅有一个硬件地址被激活的情况下才是可靠的,而 dnsmasq 无法保证它。举例来说,它可以方便同时具有有线和无线连接的笔记本电脑具有稳定的 IP 地址。 - --dhcp-hostsfile=<path>
-
从指定的文件读取 DHCP 主机信息。若给定了一个目录,则读取目录下的全部文件。文件的内容为每行一个主机的信息。每行的格式即为
--dhcp-host
的=
右侧的文本。将 DHCP 主机信息存储在该文件的优势是,不用重启 dnsmasq 就可以修改配置:当 dnsmasq 收到 SIGHUP 后就会重读文件。 - --dhcp-optsfile=<path>
-
从指定的文件中读取 DHCP 选项信息。若给定了一个目录,则读取目录下的全部文件。使用该选项的优势与
--dhcp-hostsfile
相同:当 dnsmasq 收到 SIGHUP 后就会重读--dhcp=optsfile
。注意,可以将-dhcp-boot
标识中的信息编码为 DHCP 选项,所使用的选项名称为bootfile-name
、server-ip-address
以及tftp-server
。这就允许这些内容被包含在--dhcp-optsfile
中。 - --dhcp-hostsdir=<path>
-
除了以下的不同,其等价于
--dhcp-hostsfile
。路径必须为文件夹,不可以为独立的文件。在该目录下修改或新建文件都会被自动读取,而不需要发送 SIGHUP。若一个文件被 dnsmasq 读取之后被删除或修改,那么它所包含的主机记录直到 dnsmasq 收到 SIGHUP 或重启之前都会被保留;也就是主机记录仅会动态地增加。 - --dhcp-optsdir=<path>
-
等价于
--dhcp-optsfile
,不同处类比--dhcp-hostsdir
。 - -Z, --read-ethers
-
为 DHCP 服务器读取
/etc/ethers
中关于主机的信息。/etc/ethers
的格式是一个硬件地址,跟随一个主机名或者点号四分的 IP 地址。当这些行被 dnsmasq 读取时,它们具有与包含了相同信息的--dhcp-host
选项相同的效应。/etc/ethers
在 dnsmasq 收到 SIGHUP 被重读。IPv6 地址不会从/etc/ethers
中获取。 - -O, --dhcp-option=[tag:<tag>,[tag:<tag>,]][encap:<opt>,][vi-encap:<enterprise>,][vendor:[<vendor-class>],][<opt>|option:<opt-name>|option6:<opt>|option6:<opt-name>],[<value>[,<value>]]
-
对 DHCP 客户端给出不同的或额外的选项。默认情况下,dnsmasq 会发送一些标准选项至 DHCP 客户端,子网地址和广播地址与 dnsmasq 所运行的主机的设置相同,DNS 服务器和默认路由则设置为 dnsmasq 所运行的主机的地址(等价规则适用于 IPv6)。若设置了域名选项,也会一同发送。该配置允许覆盖这些默认值,或者指定其它选项。要发送的选项,可以以十进制数给出,或者以
option:<option-name>
的形式给出。选项号在 RFC2132 以及其后的 RFC 中指定。dnsmasq 了解的 option-name 可以通过dnsmasq --help dhcp
命令获得。举例来说,要设置默认路由至 192.168.4.4,指定--dhcp-option=3,192.168.4.4
或者--dhcp-option=option:router,192.158.4.4
,要设置时间服务器的地址为 192.168.0.4,指定--dhcp-option=42,192.168.0.4
或者--dhcp-option=ntp-server,192.168.0.4
。特殊地址0.0.0.0
表示 dnsmasq 运行的机器的地址。允许的数据类型为逗号分隔的点四分 IPv4 地址、方括号
[]
包裹 IPv6 地址、十进制数、冒号分隔的十六进制数、以及文本字符串。若给定了可选的标签,那么该选项仅在匹配上全部标签时才发送。对于 option 119,会对文本参数执行特殊的操作,以符合 RFC3397。以文本或点号四分 IP 地址作为 option 120 的参数时,将依照 RFC3361 处理。点号四分的 IP 地址,其后跟随一个斜线以及网络掩码的长度的,将依照 RFC3442 的规则编码。
IPv6 须向以关键字
option6:
定义,其后跟随选项数或选项名。IPv6 选项名称空间与 IPv4 选项名称空间并不相交。选项中的 IPv6 地址必须用方括号包裹,比如--dhcp-option=option6:ntp-server,[1234::56]
。对于 IPv6,[::]
标识 dnsmasq 运行的机器的全局地址,而[fd00:]
会被 ULA 替代(若存在),[fe80::]
被本地链路地址替代。小心:不会检查所发送的选项的值的数据类型是否正确,若不明智地使用该标识,很容易让 dnsmasq 生成非法的 DHCP 包。当数值为十进制数时,dnsmasq 必须判定数据项的大小。它会同时依照选项数和/或值来检查,但也可以通过附加一个单字符标识来覆盖:
b
为 1 字节,s
为 2 字节,i
为 4 字节。它主要用于封装过的供应商类别选项(encapsulated vendor class option)(见下方),此时 dnsmasq 就无法从选项号判断数据大小了。仅由点号和十进制数字组成的选项值会被 dnsmasq 解释为 IP 地址,并以这种方式插入至选项中。要强制字面值字符串,使用双引号。举例来说,要使用 option 66 将 IP 地址的字面值作为 TFTP 服务器的名称发送,则必要使用--dhcp-option,66,"1,2,3,4"
。封装过的供应商类别选项也可以通过
--dhcp-option
指定(仅 IPv4):举例来说--dhcp-option=vendor:PEXClient,1,0.0.0.0
向任何供应商类被匹配为PXEClient
的客户端发送封装过的供应商类别选项mftp-address=0.0.0.0
。供应商级别的匹配基于子字符串(参见--dhcp-vendorclass
了解详情)。若 dnsmasq 发送了 vendor-class 选项(option 60),则它优先于来自客户端的选项,来选择要发送的封装过的选项。可以完全隐去供应商类别;--dhcp-option=vendor:,1,0.0.0.0
会导致总是发送封装过的选项。一个选项也可以被其它的选项封装(仅限 IPv4):举例来说
--dhcp-option=encap:175,190,iscsi-client0
,将发送 option 175,其中包裹着 option 190。若给出了多个选项,它们被同一个选项号封装,那么它们会被正确包裹进一个封装过的选项中。在同一个--dhcp-option
中encap:
和vendor:
不应该同时指定。对于封装选项最后的变化为“供应商辨识供应商选项(Vendor-Identifying Vendor Options)”,由 RFC3925 定义。它们如这样标识:
--dhcp-option=vi-encap:2,10,text
。vi-encap:
段的数字为用于分辨该选项的 IANA 企业数。在 IPv6 中也支持这种封装样式。在封装样式中,地址
0.0.0.0
不会被特殊对待。 - --dhcp-option-force=[tag:<tag>,[tag:<tag>,]][encap:<opt>,][vi-encap:<enterprise>,][vendor:[<vendor-class>],]<opt>,[<value>[,<value>]]
-
该选项与
--dhcp-option
的工作方式相同,不同之处在于,这里指定的选项永远会被发送出去,即便客户端并没有在参数请求列表中请求它。有时候需要它,比如当发送给 PXELinux 时。 - --dhcp-no-override
-
(仅 IPv4)禁用复用 DHCP servername 和 filename 字段作为额外选项空间。若可行,则 dnsmasq 会将启动服务器和文件名信息从(
--dhcp-boot
中的)他们自己的字段移入 DHCP 选项中。它为 DHCP 选项提供了额外的空间,同时也有很小的可能会迷惑旧的或损坏的客户端。该标识强制“简单又安全”的行为以在这种情况下防止问题。 - --dhcp-relay=<local address>,<server address>[,<interface>]
-
配置 dnsmasq 执行 DHCP 中继。local address 是 dnsmasq 所运行的机器的一个接口分配的一个地址。所有达到哪个接口的 DHCP 请求都会被转发至 server address 所指定的远程 DHCP 服务器上。可以通过指定多个
--dhcp-relay
,并配置为相同的本地地址和不同的服务器地址,从单个本地地址向多个远程服务器中继。服务地址必须为 IP 字面值,不可以是域名。对于 DHCPv6 的情况,服务器地址可以为 ALL_SERVERS 多播地址ff05::1:3
。在这种情况下,必须给出接口,且不能含有通配符,该接口用于将多播导向到达 DHCP 服务器的正确接口。对于 DHCP 客户端的访问控制与 DHCP 服务器的规则相同,参见
--interface
、--except-interface
等。--dhcp-relay
配置中的可选 interface 有一个额外的作用:它控制来自哪个接口服务器回复的 DHCP 回复会被接受。意在用于配置三种接口:一个接受中继、一个连接至 DHCP 服务器,第三个为不信任的网络,通常为宽广的互联网。它用于防止可能由第三个接口接收的欺骗性的回复。允许 dnsmasq 作为一组接口的 DHCP 服务器,同时作为另一组不相交的接口的中继。注意,虽然能写出看起来可以在一个端口同时运行服务器和中继的配置,但它并不被支持:中继功能会更优先。
DHCPv4 和 DHCPv6 中继均被支持。但不可以将 DHCPv4 中继至 DHCPv6,反之亦然。
- -U, --dhcp-vendorclass=set:<tag>,[enterprise:<IANA-enterprise number>,]<vendor-class>
-
将一个供应商类别字符串映射至一个标签。大多数 DHCP 客户端都会提供一个“供应商类别”,它在一定程度上表示了主机的类型。该选项将供应商类别映射至标签,借此就可以选择性地将 DHCP 选项发送至不同的类别的主机。举例来说:
--dhcp-vendorclass=set:printers,Hewlett-Packard JetDirect
将允许通过--dhcp-option=tag:printers,3,192.168.4.4
仅为 HP 打印机设置该 DHCP 选项。供应商类别字符串会对客户端提供的供应商类别进行子字符串匹配,来允许模糊匹配。set:
前缀为可选的,但为了一致性可以设置。注意仅在 IPv6 中,供应商类别使用一个 IANA 分配的企业号作为名称空间。它带来了
enterprise:
关键字,并表示仅搜索匹配了指定数字的供应商类别。 - -j, --dhcp-userclass=set:<tag>,<user-class>
-
将一个用户类别字符串映射至一个标签(同样是子字符串匹配,如同供应商类别一样)。大多数 DHCP 客户端都提供一个可配置的“用户类别”。该选项将用户类别映射为标签,借此就可以选择性地将 DHCP 选项发送至不同的类别的主机。它可以,举例来说,用它为“会计”类别和“工程师”类别的主机设置不同的打印机服务器。
- -4, --dhcp-mac=set:<tag>,<MAC address>
-
将一个 MAC 地址映射至一个标签。MAC 地址可以包含通配符。举例来说
--dhcp-mac=set:3com,01:34:23:*:*:*
将为任何 MAC 地址匹配该样式的主机设置标签3com
。 - --dhcp-circuitid=set:<tag>,<circuit-id>, --dhcp-remoteid=set:<tag>,<remote-id>
-
将一个 RFC3046 中继代理选项映射至一个标签。该数据可以由 DHCP 中继代理提供。circuit-id 或 remote_id 通常以分号分隔的十六进制给出,但也可以是一个简单字符串。若 circuit ID 或 agent ID 与某个中继代理提供的值精确匹配上,则设置该标签。
--dhcp-remoteid
支持 IPv6(--dhcp-circuitid
不支持)。 - --dhcp-subscrid=set:<tag>,<subscriber-id>
-
(IPv4 或 IPv6)将 RFC3993 subscriber-id relay agent option 映射为标签。
- --dhcp-proxy[=<ip addr>]……
-
(仅 IPv4)一个普通的 DHCP 中继代理仅用于转发与 DHCP 服务器的初始交互的部分。一旦一个客户端已经被配置,则它将于服务器直接通信。若中继代理向 DHCP 包中追加了额外的信息,比如被
--dhcp-circuitid
和--dhcp-remoteid
所使用的,则不期望该行为。一个全代理实现可以通过使用 RFC5107 serverid-override 选项,强制 DHCP 服务器使用该代理作为一个全代理,所有的包都会通过它。该选项为不支持 RFC5107 的中继提供了一个执行相同事情的替代方案。总的来说,它会修改通过中继的全部交互的 server-id。若给出了一个 IP 地址列表,那么仅有这些地址通过中继的交互会被影响。 - --dhcp-match=set:<tag>,<option number>|option:<option name>|vi-encap:<enterprise>[,<value>]
-
当不给出值时,若客户端发送了指定的 DHCP 选项数或选项名,那么就设置标签。当给出一个值时,仅当发送了该选项,且选项值与给出的值相同时,才设置标签。值可以为
01:ff:*:02
这种格式,此时值必须匹配(注意通配符)但所发送的选项的值在其末尾可能会有不匹配的数据。值也可以具有--dhcp-option
中的格式,此时发送的选项就作为一个数组处理,且必须匹配其中的一个元素,因此--dhcp-match=set:efi-ia32,option:client-arch,6
会为 option 93(参见 RFC4578)中记录的 list of architectures 中出现了数字 6 的客户端设置标签 efi-ia32。若值为一个字符串,那么会使用子字符串匹配。特殊格式
vi-encap:<enterprise number>
匹配对于特定企业的供应商定义的供应商类别。参见 RFC3925 了解关于这类少见且有趣的怪兽。 - --tag-if=set:<tag>[,set:<tag>[,tag:<tag>[,tag:<tag>]]]
-
对标签执行布尔操作。若所有
set:<tag>
指定的标签全都被设置(或tag!<tag>
表示该标签未设置),则会设置set:<tag>
指定的标签。若不指定tag:<tag>
,那么set:<tag>
会无视条件直接设置。可以指定任意数量、任意顺序的set:
以及tag:
。--tag-if
行按顺序执行,也就是说,如果在tag:<tag>
中指定的标签由另一个--tag-if
设置,那么设置该标签的行必须先于检验该标签的行。 - -J, --dhcp-ignore=tag:<tag>[,tag:<tag>]
-
当全部给定的标签全都出现时,忽略该主机,并不会为它分配一个 DHCP 租用。
- --dhcp-ignore-names[=tag:<tag>[,tag:<tag>]]
-
当全部给定的标签全都出现时,忽略由该主机提供的主机名。注意,与
--dhcp-ignore
不同,它允许不提供任何标签,此时总是抛弃 DHCP 客户端提供的主机名,添加至 DNS 的 DHCP 主机仅会使用 dnsmasq 中的--dhcp-host
配置、以及/etc/hosts
和/etc/ethers
的内容。 - --dhcp-generate-names=tag:<tag>[,tag:<tag>]
-
(仅 IPv4)为没有名字的 DHCP 客户端生成名字,名字为十六进制表示的 MAC 地址,由分隔符分开。注意,若主机名提供了名字,那么其优先于该设置,除非设置了
--dhcp-ignore-name
。 - --dhcp-broadcast[=tag:<tag>[,tag:<tag>]]
-
(仅 IPv4)当全部给定的标签全都出现时,当主机未被配置时,永远用广播与其沟通。可以不提供任何标签,此时它无条件执行。大多数需要广播回复的 DHCP 客户端会在它们的请求中设置一个标识,让其自动发生,但一些老旧的 BOOTP 客户端不会这么做。
- -M, --dhcp-boot=[tag:<tag>,]<filename>,[<servername>[,<server address>|<tftp_servername>]]
-
(仅 IPv4)设置 DHCP 服务器返回的 BOOTP 选项。服务器名和地址为可选项:若不提供,那么名称留空,地址设置为 dnsmasq 运行的机器。若 dnsmasq 提供了一个 TFTP 服务(参见
--enable-tftp
)那么此处仅需 filename 就可以启用网络启动。若给出了可选的标签,那么就必须要匹配这些标签才会发送这个配置。除了 IP 地址,TFTP 服务器地址可以以域名的形式给出,该域名会在/etc/hosts
中查找。该名称可以在/etc/hosts
中与多个 IP 地址关联,此时会以 round-robin 方式使用它们。该架构可用于在一组服务器上均衡负载。 - --dhcp-sequential-ip
-
dnsmasq 被设置为依照客户端的 MAC 地址的散列值为 DHCP 客户端选取 IP 地址。它通常允许一个客户端地址在长时间里保持稳定,即便客户端有时会让 DHCP 租用超时。在默认模式下, IP 地址在整个可分配的范围中伪随机地分布。在一些情况下(主要是服务器部署),让 IP 地址连续地、从最低地可用地址开始分配会更方便,设置这个标识会启用该模式。注意在顺序模式下,若客户端允许租用过期,那么它就更容易移动 IP 地址;鉴于这个原因,它不应该被广泛地使用。
- --dhcp-ignore-clid
-
dnsmasq 会读取客户端发送的(若存在)client identifier 选项(RFC2131)来分辨客户端。它允许为一个主机地多个界面配置相同的 IP 地址。使用该选项禁用 client identifier 的读取,也就是说,永远通过 MAC 地址分辨一个主机。
- --pxe-service=[tag:<tag>,]<CSA>,<menu text>[,<basename>|<bootservicetype>][,<server address>|<server_name>]
-
大多数 PEX 启动 ROM 的用法就是简单地允许 PXE 系统获得一个 IP 地址,再下载
--dhcp-boot
指定的文件,并执行它。但是当有合适的 DHCP 服务器做支持的话,PXE 系统能执行更加附加的功能。该选项指定了一个可以出现再 PXE 启动惨淡的启动选项。CSA 是客户端系统类型,仅有正确类型的服务会出现在菜单中。已知的类型有
x86PC
、PC98
、IA64_EFI
、Alpha
、Arc_x86
、Intel_Lean_Client
、IA32_EFI
、X86-64_EFI
、Xscale_EFI
、BC_EFI
、ARM32_EFI
和ARM64_EFI
;其它的类型可以通过一个整数指定。在 menu text 之后的参数可以为一个文件名,此时 dnsmasq 将作为启动服务器,并指导 PXE 客户端通过 TFTP 下载文件,该文件要么来自它自己(此时必须设置--enable-tftp
让它可用)若给出了尾部的 server address/name,那么文件就可以来自另一个 TFTP 服务器。注意 layer 后缀(通常为.0
)由 PXE 提供,因此不需要加入 basename 中。相反的,basename 也可以是一个完整的、具有后缀名的文件名,此时就不会追加 layer 后缀。若给出的是一个整数启动服务类型,而非 basename,那么 PXE 客户端会在网络上搜索一个适于该类型的启动服务。该搜索可以通过广播完成,若提供了 IP 地址或名称,那么也可以指向一个服务器。若不提供启动服务类型和文件名(或者启动服务类型为0
)那么菜单条目就会放弃网络启动流程,从而继续从本地介质启动。服务器地址可以给定为一个域名,该域名会在/etc/hosts
中查找。该名称在/etc/hosts
中可关联多个 IP 地址,它们会以 round-robin 的方式被使用。 - --pxe-prompt=[tag:<tag>,]<prompt>[,<timeout>]
-
设置该值以在 PXE 启动后显示一个提示。若给出了 timeout 那么在超过该时间后依旧没有键盘输入,会直自动执行第一个可用的菜单选项。若 timeout 为
0
,那么会立刻执行第一个可用的菜单项。若隐去了--pxe-prompt
那么当菜单中有多个条目时,系统会等待用户的输入,若只有一个则会立刻启动。参见--pxe-service
了解菜单项的详情。dnsmasq 支持 PXE proxy-DHCP,此时网络上的另一个 DHCP 服务器用于分配 IP 地址,dnsmasq 仅提供
--pxe-prompt
和--pxe-service
中的信息来允许网络启动。该模式通过--dhcp-range
中的关键字proxy
启用。 - --dhcp-pxe-vendor=<vendor>[,…]
-
由 UEFI 和 PXE 的规范可知,PXE 客户端和代理 PXE 服务器之间的 DHCP 包应该在 vendor-class 字段中设置
PXEClient
。但是少数计算机固件的供应商会自定义地在那个字段中携带不同地标识符。该选项就是用于将这些标识符辨识为有效的 PXE 客户端。比如--dhcp-pxe-vendor=PXEClient,HW-Client
将让 dnsmasq 也为具有标识符
HW-Client
的 PXE 客户端提供代理 PXE 服务。 - -X, --dhcp-lease-max=<number>
-
限制 dnsmasq 最大的 DHCP 租用数量。默认值为 1000。该限制用于阻止来自主机的 DoS 攻击,它会创建数以千计的租用,并导致 dnsmasq 进程占用大量的内存。
- -K, --dhcp-authoritative
-
当 dnsmasq 绝对是网络上唯一的 DHCP 服务器时应该设置它。对于 DHCPv4,它改变了严格遵守 RFC 的行为,依此会忽略对于未知主机的未知租用的 DHCP 请求。在所有的情况下,它都省去了新主机获得一个租用所需要等待的无聊的超时时间。当租用数据库丢失时,它也无需要求每个客户端重新获取租用就可以重建它的租用数据库。对于 DHCPv6 它将回复中的优先级设置为 255(最大值)而非 0(最小值)。
- --dhcp-rapid-commit
-
启动 RFC4039 定义的 DHCPv4 Rapid Commit Option。启用时,当收到的 DHCPDISCOVER 信息包含了 Rapid Commit 选项,dnsmasq 所回复的 DHCPACK 会包含 Rapid Commit 选项、以及完全确认的地址以及配置信息。仅当该服务器为该子网唯一的服务器,或者出现多个服务器,且每个服务都为全部的客户端提供一个绑定时设置。
- --dhcp-alternate-port[=<server port>[,<client port>]]
-
(仅 IPv4)修改默认的 DHCP 所使用的端口。若仅指定该选项,但不给出参数,则它将 DHCP 的端口从 67 和 68 修改至 1067 和 1068。若只给定一个参数,则该端口号用于服务器,且 端口号 +1 用于客户端。最后,使用两个端口号则允许随意指定 DHCP 的服务器和客户端的端口。
- -3, --bootp-dynamic[=<network-id>[,<network-id>]]
-
(仅 IPv4)启用对 BOOTP 客户端的 IP 地址动态分配。请小心使用,这是由于每个分配给 BOOTP 客户端的租用都是永久的,因此会永久地无法被其它主机重用。若不带标签给出该选项,则它将无视条件启用动态分配。当具有标签时,仅当全部满足时才启用。它可以已不同地标签集重复多次指定。
- -5, --no-ping
-
(仅 IPv4)默认情况下,DHCP 服务器将尝试保证一个地址在分配给一个主机前不会正在被使用。它通过对所需要地地址发送一个 ICMP echo request(也就是 ping)来确认。若它获得一个回复,则地址必然正在使用,此时它会尝试使用其它地址。该标识会关闭检查。请小心使用。
- --log-dhcp
-
对 DHCP 记录额外的日志:记录全部发送给 DHCP 客户端的选项,并记录用于决定他们的标签。
- --quiet-dhcp, --quiet-dhcp6, --quiet-ra
-
抑制记录这些协议的日常操作。错误和问题依旧会被记录。
--quiet-dhcp
和--quiet-dhcp6
会被--log-dhcp
覆盖。 - -l, --dhcp-leasefile=<path>
-
用特定的文件存储 DHCP 租用信息。
- --dhcp-duid=<enterprise-id>,<uid>
-
(仅 IPv6)指定 DHCPv6 服务器会使用的 server persistent UID。该选项通常不被需要,因为 dnsmasq 会在 DUID 首次被需要的时候自动创建它。当给出后,该选项为 dnsmasq 提供创建 DUID-EN 类型的 DUID 所需要的数据。注意,一旦设置,DUID 就会被存储在租用数据库中,所以在 DUID-EN 和自动创建的 DUID 之间的变换需要重新初始化租用数据库。enterprise-id 由 IANA 分配,uid 则是一个十六进制八位元组字符串,它对于特定的设备唯一。
- -6 --dhcp-script=<path>
-
每当 DHCP 租用被创建、或者旧的租用被销毁、或者 TFTP 文件传送完成,就会执行该选项定义的可执行文件。path 必须为一个绝对路径名,不会执行 PATH 搜索。传递给进程的参数为
add
、old
或del
,主机的 MAC 地址(IPv6 为 DUID),IP 地址,以及主机名(若已知)。add
表示一个租用被创建,del
表示它被销毁,old
则是 dnsmasq 启动时,对于一个已存在的租用的提醒,或是对于已存在的租用的 MAC 地址或主机名的修改(若设置了--leasefile-ro
则还会传递租用时长或过期以及 client-id,若设置了--script-on-renewal
则还会传递租用过期)。若 MAC 地址来自非以太网网络类型,它还会前缀网络类型,比如对于令牌环为06-01:23:45:67:89:ab
。该进程会以 root 运行(假设 dnsmasq 最开始以 root 运行)即便 dnsmasq 被配置为变换 UID 至一个无特权用户。环境变量继承于 dnsmasq 的调用者,会追加下方的部分或全部的变量
对于 IPv4 和 IPv6:
- DNSMASQ_DOMAIN
-
若知晓主机的全限定域名,则该变量设置为域的部分。(注意以参数形式传递给脚本的主机名永远不会是全限定的。)
- DNSMASQ_SUPPLIED_HOSTNAME
-
若客户端提供了主机名。
- DNSMASQ_USER_CLASS0..DNSMASQ_USER_CLASSn
-
若客户端提供了 user-classes。
- DNSMASQ_LEASE_LENGTH, DNSMASQ_LEASE_EXPIRES, DNSMASQ_TIME_REMAINING
-
若 dnsmasq 附带了 HAVE_BROKEN_RTC 编译,则租用的长度(以秒计)会存储在 DNSMASQ_LEASE_LENGTH 中,否则租用的过期时间会存储在 DNSMASQ_LEASE_EXPIRES 中。租用过期前的秒数永远会存放在 DNSMASQ_TIME_REMAINING 中。
- DNSMASQ_OLD_HOSTNAME
-
若一个租用原来有一个主机名,但它被移除了,会生成一个关于该租用的新状态的
old
事件,比如没有名字,而原先的名称则由环境变量 DNSMASQ_OLD_HOSTNAME 提供。 - DNSMASQ_INTERFACE
-
存储了请求到达的接口的名称;当 dnsmasq 重启时,触发
old
行动不会设置它。 - DNSMASQ_RELAY_ADDRESS
-
当 客户端通过 DHCP 中继与 dnsmasq 联络,且知道中继的 IP 地址时会设置它。
- DNSMASQ_TAGS
-
包含所有 DHCP 处理中设置的标签,以空格分隔。
- DNSMASQ_LOG_DHCP
-
若
--log-dhcp
生效则设置。
仅针对 IPv4:
- DNSMASQ_CLIENT_ID
-
若主机提供了一个 client-id。
- DNSMASQ_CIRCUIT_ID, DNSMASQ_SUBSCRIBER_ID, DNSMASQ_REMOTE_ID
-
若 DHCP 中继代理设置任何这些选项。
- DNSMASQ_VENDOR_CLASS
-
若客户端提供了 vendor-class。
- DNSMASQ_REQUESTED_OPTIONS
-
若客户端提供了参数请求列表选项,那么该环境变量就包含了该选项的十进制表示的、逗号分隔的字符串形式的表示。
仅 IPv6:
- DNSMASQ_VENDOR_CLASS_ID, DNSMASQ_VENDOR_CLASS0..DNSMASQ_VENDOR_CLASSn
-
若客户端提供了 vendor-class,那么 DNSMASQ_VENDOR_CLASS_ID 就包含了该类别的 IANA enterprise id。其数据保存在 DNSMASQ_VENDOR_CLASS0..DNSMASQ_VENDOR_CLASSn 中。
- DNSMASQ_SERVER_DUID
-
包含了服务器的 DUID:每次调用脚本时都相同。
- DNSMASQ_IAID
-
包含了 租用的 IAID。若租用是临时分配的,则前缀上
T
。 - DNSMASQ_MAC
-
若知晓,则包含客户端的 MAC 地址。
注意,提供主机名、vendorclass 和 userclass 数据仅出现在
add
动作,或者一个主机恢复一个以存在的租用的old
动作中,这是由于这些数据并不会保存在 dnsmasq 租用数据库中。全部的文件描述符都被关闭,除了 stdin 开启至 /dev/null、stdout 和 stderr 被捕获输出以便 dnsmasq 记录日志。(在 debug 模式下,stdin、stdout、stderr 继承 dnsmasq 的调用者的设置)。
脚本并非并发调用:同时至多运行脚本的一个实例(dnsmasq 会等待脚本的一个实例退出之后再运行下一个)。会修改租用数据库的脚本会被队列,并等待当前的实例运行结束之后才会调用。若该队列允许在脚本运行前、对单个租用的多态修改,那么早先的状态就会被掩盖,仅有当前的租用状态会在脚本最终运行时反射出来。
在 dnsmasq 启动时,全部以存在的租用从自用文件中读取,此时脚本会在每个租用上被调用。过期租用会被调用为
del
,而其它租用被调用为del
。当 dnsmasq 收到 HUP 信号时,脚本会在以存在的租用上调用,且触发old
事件。有四种额外的动作会作为脚本的第一个参数
init
、arp-add
、arp-del
和tftp
。未来可能会增加更多,因此脚本应该被编写为忽略未知的动作。init
在下方的--leasefile-ro
中描述。tftp
动作在一个 TFTP 文件传输完成时调用:参数为字节计算的文件大小、文件发送的地址、以及文件的完整名称。arp-add
和arp-del
动作仅在启用了--script-arp
时调用。它们会提供 MAC 地址和 IP 地址作为参数。arp-add
表示 ARP 或 neighbour table 有新条目,arp-del
表示两者的条目减少。 - --dhcp-luascript=<path>
-
指定一个 Lua 编写的脚本,当租用创建、销毁或修改时执行。要使用该选项,dnsmasq 必须编译为具有正确的支持。Lua 解释器仅会初始化以此,就在 dnsmasq 启动的时候,因此全局变量在租用事件之间保持一致。Lua 代码必须定义一个
lease
函数,可以提供init
和shutdown
函数,他们分别在 dnsmasq 启动和终止时以无参数的方式调用。它也可以提供一个tftp
函数。lease
函数会接收与--dhcp-script
一样详尽的信息。它获得两个参数,第一个为动作,是一个字符串,包含add
old
或del
,第二个是标签和值构成的表。标签大多数对应上面描述的环境变量,举例来说domain
所具有的值与环境变量DNSMASQ_DOMAIN
相同。一些额外的标签会持有作为参数传递给--dhcp-script
的值。它们包括 IPv4 时的mac_address
、ip_address
、hostname
,以及 IPv6 时的client_duid
、ip_address
、hostname
。tftp
函数调用的情况与 lease 函数相同,它的表包含标签destination_address
、file_name
、file_size
。arp
以及arp-old
函数仅当启用--script-arp
时被调用,它的表包含标签mac_address
、client_address
。 - --dhcp-scriptuser
-
指定运行 lease-change 脚本或 Lua 脚本的用户。默认为 root,可用该标识修改为另一个用户。
- --script-arp
-
启用
--dhcp-script
和--dhcp-luascript
中的arp
和arp-old
函数。 - -9, --leasefile-ro
-
完全抑制租用数据库文件的使用。文件不会被创建、读取或写入。修改租用变化脚本的调用方式,以便外部存储的租用数据库可以由该脚本维护。除了
--dhcp-script
给出的租用改变脚本被调用的情况之外,在 dnsmasq 启动时,会以init
作为参数调用该脚本。当这样调用时,脚本应该向标准输出(以 dnsmasq 租用文件的格式)写入保存的租用数据库的状态,并以 0 退出码退出。设置该选项同样会强制 在 client-id、租用长度或过期时间改变时调用租用修改脚本。 - --script-on-renewal
-
当过期时间修改时,调用 DHCP 脚本,比如租用续租时。
- --bridge-interface=<interface>,<alias>[,<alias>]
-
将任何来自 alias 接口的 DHCP(v4 或 v6)和 IPv6 Router Solicit 包当作来自 interface 接口的一样。该选项允许 dnsmasq 在不具有地址和未桥接的以太网接口提供 DHCP 和 RA 服务。比如,在一个 OpenStack 电脑主机上,有一个接口是到达 VM 的 TAP 接口,或者在 BSD 平台上的“老式桥接”。每个 alias 的末尾都可以使用一个星号通配符
*
。可以通过多个
--bridge-interface
选项添加多个别名,因为--bridge-interface=int1,alias1,alias2
全等价于--bridge-interface=int1,alias1 --bridge-interface=int1,alias2
- --shared-network=<interface>,<addr>
- --shared-network=<addr>,<addr>
-
DHCP 服务器基于 DHCP 请求到达的网络、以及服务器上在该网络的界面的 IP 配置,决定哪个 DHCP 范围可以用于分配地址。
shared-network
选项让可用的子网(也是 DHCP 范围)超越了到达接口的子网。第一个参数要么是一个接口的名字,或者是配置在本地接口上的一个地址,第二个参数是一个地址,其定义了另一个子网,地址可以从其中分配。
要让它有用,必须有一个合适的 DHCP 范围,让该子网有地址可以分配,且该 DHCP 范围必须包含网络掩码。
要使用 shared-network 同样需要对于路由的额外考虑。dnsmasq 无法像通常一样具有判定默认路由的信息,因此默认路由选项(或其它路由)必须被配置。用户端必须有一个到服务器的路由:若使用了 two-address 形式的 shared-network,那么它必须为第一个指定的地址。若使用了 interface,address 的形式,那么必须有一个到达配置在接口上的全部地址的路由。
shared-network 的 two-address 格式也可用于 DHCP 中继:第一个地址为中继的地址,第二个地址,同上,指定一个额外的子网,用于分配地址。
- -s, --domain=<domain>[,<address range>[,local]]
-
为 DHCP 服务器指定 DNS 域。域可以不加限定地给出(不附加 IP 范围)或限定 IP 范围。它有两个作用;首先它会导致 DHCP 向任何请求了域的主机回复该域,其它它设置了由 DHCP 所配置的主机可声明的合法的域。其用意在于,限制主机名,于是在 LAN 上的不可信主机不可以通过 DHCP 传播它的名字,比如 microsoft.com 并捕获本不属于它的流量。若不给出域后缀,那么任何具有域部分(比如有一个点号)的 DHCP 主机名均不会被允许,并被记录下来。若给定了后缀,那么允许主机名具有域的部分,但要保证域的部分域后缀匹配。额外的,当设置了一个后缀,那么不具有域部分的主机名会添加一个可选的域部分。比如,在我的网络上,我可以设置
--domain=thekelleys.org.uk
,并具有一个 DHCP 主机名为laptop
的机器。那么向dnsmasq
查询laptop
和laptop.thekelleys.org.uk
均可获得那台机器的 IP 地址。若域给出为#
那么域就从 /etc/resolv.conf 中首个search
指令(或等价对象)中读取。地址范围可以是如下形式 <ip address>,<ip address> 或 <ip address>/<netmask> 或仅为一个单独的 <ip address>。参见
--dhcp-fqdn
,它会改变具有域的 dnsmasq 的行为。若地址范围给定为 ip-address/network-size,那么可以提供一个额外的标识
local
,它等价于为转发和反向 DNS 请求添加一个--local
声明。比如--domain=thekelleys.org.uk,192.168.0.0/24,local
等价于--domain=thekelleys.org.uk,192.168.0.0/24 --local=/thekelleys.org.uk/ --local=/0.168.192.in-addr.arpa/
。要让它合法,network size 必须为8
、16
或24
。 - --dhcp-fqdn
-
在默认模式下,dnsmasq 会将 DHCP 客户端的未限定名称插入 DNS 中。由于这个原因,名称必须唯一,即便两个具有相同名称的客户端在不同的域名中。如果一个 DHCP 客户端与现有的客户端具有相同的名字,那么该名字就会转移给新的客户端。若设置了
--dhcp-fqdn
,那么行为修改为:未限定名称将不再置入 DNS 中,仅置入限定名称。两个具有相同的名称的 DHCP 客户端均可以保留它们的名字,只要它们的域部分不同即可(比如全限定名称不同)。要保证全部名称均具有一个域部分,当设置了--dhcp-fqdn
后,至少具有一个未指定地址的--domain
选项。 - --dhcp-client-update
-
通常情况下,当给出一个 DHCP 租用时,dnsmasq 会在 FQDN 选项中设置一个标识,告诉客户端不要尝试用它的名字和 IP 地址执行 DDNS 更新。这是由于 名称-IP 对会自动加入 dnsmasq 的 DNS 视野。该标识会抑制那个行为,它常用于,比如说,允许 Windows 客户端更新 Active Directory 服务器。参见 RFC4702 了解详情。
- --enable-ra
-
启动 dnsmasq 的 IPv6 路由宣告特性。DHCPv6 不会和 DHCPv4 一样处理整个网络的配置。自治地址创建的路由发现和(可能的)前缀发现由不同的协议处理。当使用 DHCP 时,仅需要它的部分子集,dnsmasq 可以处理它,使用已有的 DHCP 配置提供大多数数据。当 RA 启动时,dnsmasq 会为每个
--dhcp-range
分配一个前缀,并将默认路由设置为运行 dnsmasq 的机器的相关的链路本地地址。默认情况下,会设置managed address
位,并重置use SLAAC
位。它可以通过修改每个独立子网的--dhcp-range
的 mode 关键字来改变。RFC6106 DNS 参数会被包含在宣告中。默认情况下,运行 dnsmasq 的机器的相关的链路本地地址会作为递归 DNS 服务器被发送。若提供,DHCPv6 选项 dns-server 和 domain-search 会被用于 DNS 服务器(RDNSS)以及域搜索列表(DNSSL)。 - --ra-param=<interface>,[mtu:<integer>|<interface>|off,][high,|low,]<ra-interval>[,<router lifetime>]
-
为指定的接口发出 路由宣告设置非默认的值。路由的优先级字段可以从默认的中通过比如
--ra-param=eth0,high
修改。路由宣告的间隔可以通过--ra-para,=eth0,60
修改。路由的生命周期可以被修改或设置为零,它允许一个路由器宣告前缀,同时部将自身设置为一个路由,--ra-param=eth0,0,0
(间隔设置为 0 表示使用默认值)。全部四个参数可以一次性设置,--ra-param=eth0,mtu:1280,low,60,1200
。interface 字段可以包含一个通配符。
mtu:
参数可以为一个任意的接口名,这种情况下,会使用那个接口的 MTU 值。它常用于(比如)将一个路由的 WAN 接口的 MTU 值宣告至另一个接口上。 - --dhcp-reply-delay=[tag:<tag>,]<integer>
-
延迟至少指定的秒数后才发送
DHCPOFFER
和PROXYDHCP
。它可以用于绕行 PXE 启动固件中无法正常处理立刻返回的回复的 bug。该选项会将(若有)已花费的等待时间(比如执行 ping 检测)计算在内。 - --enable-tftp[=<interface>[,<interface>]]
-
启动 TFTP 服务器功能。它仅限用于需要网络启动的客户端。且仅允许读取;支持 tsize 和 blksize 扩展(tsize 仅支持 octet mode)。不提供参数时,提供 TFTP 服务的接口与 DHCP 服务的相同。若指定了一个接口列表,它就定义了那些接口会收到 TFTP 服务。
- --tftp-root=<directory>[,<interface>]
-
相对于给定目录查找要通过 TFTP 传输的文件。当它指定时,包含了
..
的 TFTP 路径会被拒绝,以阻止客户端移动至指定的根目录之外。允许绝对路劲(路径以/
)开头,但它们必须在tftp-root
之下。若给出了可选的 interface 选项,那么 directory 仅用于特定接口的 TFTP 请求。 - --tftp-no-fail
-
若指定的 tftp 根目录不可访问,也不要终止启动。
- --tftp-unique-root[=ip|mac]
-
在
tftp-root
的尾部添加 TFTP 客户端的 IP 或硬件地址作为路径的组成部分。仅当设置了--tftp-root
且目录存在时有效。默认为添加 IP 地址(以标准的点四分格式)。举例来说,若--tftp-root
是/tftp
,且客户端1.2.3.4
请求文件myfile
,那么等价路径为/tftp/1.2.3.4/myfile
,若/tftp/1.2.3.4
不存在,那么路径为/tftp/myfile
。若给定=mac
,那么会追加 MAC 地址,使用小写的零填充的连字符分隔的数字,比如 01-02-03-04-aa-bb。注意。解析 MAC 地址仅当客户端在本地网络中或向我们获取 DHCP 租用时才可行。 - --tftp-secure
-
启用 TFTP 安全模式:不启用它时,任何在通常 unix 访问控制规则下 dnsmasq 进程可读的文件均在 TFTP 下可用。当给出了
--tftp-secure
标识,仅有运行 dnsmasq 的用户所拥有的文件才可以被访问。当 dnsmasq 以 root 运行时,使用不同的规则:--tftp-secure
不起效,但仅有设置了全局可读位的文件才能被访问。不建议以 root 运行 dnsmasq 的同时启用 TFTP,此时非常不建议不指定--tftp-root
。这样做会对网络上的任何主机暴露服务器上的任何全局可读的文件。 - --tftp-lowercase
-
将 TFTP 请求中的文件名转换为全小写。它对于来自 Windows 机器的请求很有效,它具有大小写不敏感的文件系统,并对文件名中的大小写采取宽松的对策。注意 dnsmasq 的 tftp 服务器总是将文件名中的
\
转换为/
。 - --tftp-max=<connections>
-
设置并发 TFTP 连接数的最大值。默认为 50。当服务于较大数量的 TFTP 连接时,可能会遇到每进程文件描述符限制。对于每个并发的 TFTP 连接,dnsmasq 都需要一个文件描述符;且对于每个独立的文件,都需要一个文件描述符(额外增加一些其它的)。所以同时向 n 个客户端提供一个相同的文件需要使用 n+10 个文件描述符,同时向 n 个客户端提供不同的文件需要使用大约 (2*n)+10 个描述符。若给定了
--tftp-port-range
,那么它会影响并发连接的数量。 - --tftp-mtu=<mtu size>
-
在协商 TFTP 块大小时所使用的被中间网络所支持的 MTU 的最大值,若本地界面的 MTU 较大,则用该设置覆盖它。
- --tftp-no-blocksize
-
阻止 TFTP 服务器与客户端协商
blocksize
选项。有些有问题的客户端会请求这个选项,但在协商后却错误地执行。 - --tftp-port-range=<start>,<end>
-
TFTP 在连接起始阶段会监听一个总所周知的端口(69),同时也会为每个连接动态地分配端口。通常情况下这些端口由操作系统分配,但该选项指定了用于 TFTP 传输的端口的范围。它对于需要通过防火墙的 TFTP 很有用。除非 dnsmasq 以 root 运行,否则端口号的起始点不应该小于 1025。并发 TFTP 连接的数量受到该端口范围大小的限制。
- --tftp-single-port
-
在如下的模式运行:TFTP 服务器仅使用总所周知的端口(69)作为 TFTP 传输中它这端的端口。它允许 TFTP 在客户端和服务器之间的网络有 NAT 存在时正常工作。注意它并不严格兼容定义了 TFTP 的 RFC:自行承担使用后果。
- -C, --conf-file=<file>
-
指定一个配置文件。出现了该选项,就会阻止 dnsmasq 读取默认的配置文件(通常为
/etc/dnsmasq.conf
)。可以在命令行或配置文件中重复指定该选项来添加多个配置文件。文件名为-
会导致 dnsmasq 从标准输入读取配置。 - -7, --conf-dir=<directory>[,<file-extension>……],
-
将给定目录下的全部文件作为配置文件读取。若给定了扩展名,则任何以该扩展结尾的文件都会被忽略。任何文件名称以
~
为结尾,或以.
开头,或同时以#
作为开头和结尾的文件总是被忽略。若扩展以*
开头,则仅有具有该扩展名的文件会被读取。所以--conf-dir=/path/to/dir,*.conf
会读取/path/to/dir
下所有后缀名为.conf
的文件。该标识可以在命令行或配置文件中给出。若在命令行中给出,一定要保证转义*
字符。文件会以文件名的字母表顺序读取。 - --servers-file=<file>
-
--conf-file
的特殊状态,在两个方面有所不同。第一,所包含的配置文件中仅允许--server
和--rev-server
。第二,当 dnsmasq 收到 SIGHUP 后,文件会被重读,其中的配置也随之更新。
在启动时,若 /etc/dnsmasq.conf
存在,则 dnsmasq 会读取它(在 FreeBSD 上,文件为 /usr/local/etc/dnsmasq.conf
)(请先参阅 --conf-file
和 --conf-dir
选项)。该文件的格式为每行一个选项,与 [_选项] 节详细描述的长选项相同,但不包含前序的 --
。以 #
开头的行被认为是注释并被忽略。对于仅能指定一次的选项,配置文件覆盖命令行。可以在配置文件中使用引号:在引号 "
之间的 ,
、:
、.
、#
不具有特殊含义,允许下面的转义字符:\\
、\"
、\t
、\e
、\b
、\r
、\n
。后者分别表示制表符、退出、退格、返回、和新行。
当收到 SIGHUP 时,dnsmasq 清除它的缓存,并重读 /etc/hosts
/etc/ethers
,以及任何 --dhcp-hostsfile
、--dhcp-hostsdir
、--dhcp-optsfile
、--dhcp-optsdir
、--addn-hosts
、--hostsdir
。DHCP 租用变化脚本对全部已存在 DHCP 租用执行。如果设置了 --no-poll
,那么收到 SIGHUP 后还会重读 /etc/resolv.conf
。SIGHUP 不会重读配置文件。
当收到 SIGUSR1 时,dnsmasq 向系统日志中写入统计数据。它记录缓存大小、为了给新名称腾空间而不得不在租用过期前就从缓存中移除的名称的数量、以及已插入缓存的名称的总数量。同时也会给出缓存命中和未命中的数量、以及回答的权威请求的数量。对于每个上游服务器,它给出所发送的请求的数量,以及触发了错误的数量。在 --no-daemon
模式,或者启用了全日志(--log-queries
)时,会生成一份完整的缓存的内容的 dump。
缓存统计同样在 DNS 中可用,它会作为 CHAOS 类别和域绑定的 TXT 类型的 DNS 请求的回复。域名为 cachesize.bind
、insertions.bind
、evictions.bind
、misses.bind
、hits.bind
、auth.bind
、servers.bind
。用命令行请求它的样例,以 dig
工具可以为:
dig +short chaos txt cachesize.bind
当 dnsmasq 收到 SIGUSR2 且它直接将日志写入一个文件时(参见 --log-facility
),dnsmasq 将会关闭并重开日志文件。注意在这个操作中,dnsmasq 将不会以 root 运行。当它首次创建日志文件时,dnsmasq 会修改文件的所有权至它运行的非 root 用户上。日志轮替(logrotate)应该配置为在发送 SIGUSR2 前,创建一个新的日志文件,其所有权应该匹配现有的文件。若 TCP DNS 请求正在进行,旧的日志文件将在负责处理 TCP 请求的子进程中保持开启,并可能继续对其写入。有一个 150 秒的限制,在该限制之后,所有已存在的 TCP 进程均会超时:鉴于该原因,将刚轮替的日志文件立刻执行日志文件压缩并不明智。要使用日志轮替,需要的选项为 create
和 delaycompress
。
dnsmasq 是一个 DNS 请求转发器:它并不适用于递归地回答任意起始于根服务器的请求,相反它适用于转发这类请求至一个完全递归的上游 DNS 服务器,通常该服务器由 ISP 提供。默认情况下,dnsmasq 读取 /etc/resolv.conf
来发现它应该适用的上游名称服务器的 IP 地址,这是由于该信息通常存放在那里。除非适用了 --no-poll
,否则 dnsmasq 会检查 /etc/resolv.conf
(若使用了 --resolv-file
则为任何等价物)的修改时间,若改变则重读它。这允许 DNS 服务器可以动态地由 PPP 或 DHCP 设置,因为这两种协议均提供该信息。缺少 /etc/resolv.conf
并不被视为错误,这是因为在 PPP 连接存在前,它可能还未被创建。dnsmasq 会持续检查 /etc/resolv.conf
的创建。dnsmasq 可以被告知检查多个 resolv.conf 文件。这在笔记本上很有用,此时可能会同时使用 PPP 和 DHCP:dnsmasq 可以被设置为同时拉取 /etc/ppp/resolv.conf
和 /etc/dhcpc/resolv.conf
,并使用两者中最后修改的内容,以提供在 DNS 服务器间的动态切换。
上游服务器也可以通过命令行或在配置文件中指定。这些服务器指定可以额外地设置一个域名,用来告诉 dnsmasq 在那个特定的域中仅使用该服务器来查找名称。
要配置 dnsmasq 作为其所在主机的缓存器,在 /etc/resolv.conf
中写入 nameserver 127.0.0.1
强制让本地进程向 dnsmasq 发送请求。接着,要么通过 --server
选项直接为 dnsmasq 指定上游服务器,要么将它们的地址放在另一个文件中,比如 /etc/resolv.dnsmasq
,并以 --resolv-file /etc/resolv.dnsmasq
选项运行 dnsmasq。第二种技术允许通过 PPP 或 DHCP 动态更新服务器地址。
在 /etc/hosts
中的地址将掩蔽(shadow)上游 DNS 中相同名称的不同地址,因此 /etc/hosts
中的 mycompany.com 1.2.3.4
将保证对 mycompany.com
的请求总是返回 1.2.3.4
,即便请求上游 DNS 会返回一个不同的地址。它有一个例外:若上游 DNS 具有一个指向被掩蔽的名称的 CNAME,那么通过 dnsmasq 查找 CNAME 将获得 CNAME 所指向的未掩蔽的地址。要绕行,将 CNAME 也加入 /etc/hots
以便 CNAME 也被掩蔽。
标签系统按如下运行:对于每个 DHCP 请求,dnsmasq 从包含了 set:<tag> 的激活的配置行中收集一组有效的标签,这些行包括用于分配地址的 --dhcp-range
,任何匹配上的 --dhcp-host
(若匹配上 --dhcp-host
还会追加 known
或 known-othernet
),对于 BOOTP 请求会设置 bootp
标签,还会为请求设置到达的网络接口的名字的标签。
任何包含了一个或多个 tag:<tag> 结构的配置行,将仅在前序设置了标签且标签都匹配时才有效。一般为 --dhcp-option
。只要匹配了全部的标签,那么具有标签的 --dhcp-option
就比不具有的优先级要高。标签上具有 !
前缀的表示否定,因此 --dhcp-option=tag:!purpule,3,1,2,3,4
将在标签 purple 不属于有效标签时发送。(若在命令行而非配置文件中使用,切记转义 !
字符,因为它是 shell 的元字符)
在选择 --dhcp-options
的过程中,相对于其它标签 --dhcp-range
上的标签优先级更低,因此 --dhcp-range=set:interface1,…… --dhcp-host=set:myhost,….. --dhcp-option=tag:interface1,option:nis-domain,domain1 --dhcp-option=tag:myhost,option:nis-domain,domain2
将为在范围中的主机设置 NIS-domain 至 domain1,且将特定主机设置为 domain2。
注意对于 --dhcp-range
tag:<tag> 和 set:<tag> 均被允许,这样可以基于(比如)--dhcp-host
来限制要使用的范围,并基于选择的范围影响所发送的选项。
这个系统源自于一个先前的版本,为了向前兼容,可以用 net:
替代 tag:
,且 set:
可以被忽略(除了在 --dhcp-host
中,net:
可以替代 set:
)。出于相同的原因,#
可以替代 !
表示非。
配置 dnsmasq 作为一个权威 DNS 服务器是复杂的,这是由于它需要外部的 DNS 服务器提供委托(delegation)。我们将详细解释三个难度递增的情景。这些情景的前提条件为全球可达的 IP 地址,一个指向该地址的 A 或 AAAA 记录,以及一个可以执行 zone 委托的外部 DNS 服务器。对于该解释的第一个部分,我们将称全球可达的地址的 A(或 AAAA)记录为 server.example.com,而 dnsmasq 管理的 zone 为 our.zone.com。
最简单的配置由两条 dnsmasq 配置组成;比如
--auth-server=server.example.com,eth0
--auth-zone=our.zone.com,1.2.3.0/24
且外部 DNS 具有如下两条记录
server.example.com A 192.0.43.10
our.zone.com NS server.example.com
其中 eth0
为 dnsmasq 监听的外部网络接口,其具有(全球可达的)地址 192.0.43.10
。
注意外部 IP 地址可能为动态的(比如由 ISP 通过 DHCP 或 PPP 分配的)。若如此,则一条 A 记录必须通过比如常见的动态 DNS 系统链接至该动态分配的地址上。
一个更加复杂,但实际有用的配置为,全局可达的 IP 地址的地址记录出现在 dnsmasq 所服务的权威 zone 中,通常该记录在根节点上。现在我们有
--auth-server=our.zone.com,eth0
--auth-zone=our.zone.com,1.2.3.0/24
our.zone.com A 1.2.3.4
our.zone.com NS our.zone.com
our.zone.com 的 A 记录就成为了 glue record,它解决了一个先有鸡还是先有蛋的问题:当 our.zone.com 的名称服务器的 A 记录处在该 zone 里时,我们可以通过该记录查找到该名称服务器的 IP 地址。注意这是该条记录唯一的职责:由于 dnsmasq 对 our.zone.com 具有权威性,它也必须提供该条记录。若外部地址是静态的,那么它就可以通过一条 /etc/hots
中的条目或者 --host-record
完成。
--auth-server=our.zone.com,eth0
--host-record=our.zone.com,1.2.3.4
--auth-zone=our.zone.com,1.2.3.0/24
若外部地址是动态的,那么与 our.zone.com 关联的地址则必须有相关联的网络接口的地址派生出来。它通过 --interface-name
完成。比如:
--auth-server=our.zone.com,eth0
--interface-name=our.zone.com,eth0
--auth-zone=our.zone.com,1.2.3.0/24,eth0
(--auth-zone
的参数 eth0
将包含了 eth0 动态地址的子网加入 zone 中,如此 --interface-name
在外部请求中返回该地址。)
我们最后的配置建立在上面的内容上,同时也加入了一个次级 DNS 服务器。这是另一个 DNS 服务器,它会通过 zone transfer 学习 zone 的 DNS 数据,一旦主要服务器不可用,则作为备用服务器出现。配置次级服务器超出了本手册的范围,但所需的额外的 dnsmasq 配置则很简单:
--auth-sec-servers=secondary.myisp.com
以及
our.zone.com NS secondary.myisp.com
添加 auth-sec-server
会启动 dnsmasq 中的 zone transfer,以允许次级服务器收集 DNS 数据。若你希望限制该数据至特定的主机,则
--auth-peer=<IP address of secondary>
将实现它。
在 --auth-zone
语句中给出了子网后,dnsmasq 就会作为该子网关联的 in-addr.arpa 和 ip6.arpa 域的权威服务器,因此反向(地址至名称)查找可以简单地用一个合适的 NS 记录配置好,比如在这个案例中,我们允许 1.2.3.0/24 地址。
3.2.1.in-addr.arpa NS our.zone.com
注意,到目前为止,reverse(in-addr.arpa 和 ip6.arpa)zone 并不能执行 zone transfer,因此为次级服务器配置反向查找毫无意义。
当 dnsmasq 配置为一台权威服务器,那么下面的数据用于生成权威域。
--mx-host
、--srv-host
、--dns-rr
、--txt-record
、--naptr-record
、--caa-record
只要记录的名称在该权威域中。
--cname
只要记录的的名称在权威域中。若 CNAME 的目标是限定的,那么它将以权威 zone 的名称作为限定名。(仅有)以该中方法使用的 CNAME 可以使用通配符,如同:
--cname=*.example.com,default.example.com
来自 /etc/hosts
(以及 -addn-hosts
)的 IPv4 和 IPv6 地址、--host-record
以及 --interface-name
提供的地址落入 --auth-zone
指定的子网之一。
DHCP 租用地址,只要地址落入 --auth-zone
指定的子网之一。(若使用了依靠动态分配给网络接口的地址的构建的 DHCP 范围,那么应该使用通过一个网络接口的动态地址定义子网的 --auth-zone
形式,来保证该条件被满足。)
在默认模式中,DHCP 租用具有非限定名称,且可能使用 --domain
构建起限定性名称,那么权威 zone 里的名称由非限定名称以及 zone 的域构成。它有可能等于 --domain
所指定的,也有可能不等于。若设置了 --dhcp-fqdn
,那么会使用域 DHCP 租用关联的全限定名称,且必须与 zone 的域匹配。
0 |
dnsmasq 成功 fork 至后台,或当后台运行未启用时正常退出 |
1 |
检测出配置文件问题 |
2 |
出现网络访问问题(地址被占用、无权限使用特权端口) |
3 |
出现文件系统操作问题(丢失文件/目录、权限) |
4 |
内存分配错误 |
5 |
其它杂项错误 |
11 或更大 |
来自租用脚本进程 |
参见 LIMITS
/etc/dnsmasq.conf
/usr/local/etc/dnsmasq.conf
/etc/resolv.conf /var/run/dnsmasq/resolv.conf /etc/ppp/resolv.conf /etc/dhcpc/resolv.conf
/etc/hosts
/etc/ethers
/var/lib/misc/dnsmasq.leases
/var/db/dnsmasq.leases
/var/run/dnsmasq.pid