dnsmasq 笔记

dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq 可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为 DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网 IP 地址和提供路由。DNS 和 DHCP 两个功能可以同时或分别单独实现。dnsmasq 轻量且易配置,适用于个人用户或少于 50 台主机的网络。此外它还自带了一个 PXE 服务器。

简介

dnsmasq 是一个开源的轻量级 DNS 转发和 DHCP、TFTP 服务器,使用 C 语言编写。Dnsmasq 针对家庭局域网等小型局域网设计,资源占用低,易于配置。支持的平台包括 Linux、BSD、Smoothwall、IP-Cop、floppyfw、Firebox、LEAF、Freesco, fli4l、CoyoteLinux 及 Android 等,并且在 dd-wrt、openwrt 路由器系统中也有使用。

dnsmasq 在线文档

如果需要为 ChinaDNS 配置国外上游 DNS,请使用 dnsmasq 或 dnsforwarder,不要使用 pdnsd,因为 pdnsd 的缓存功能无法完全禁用,会导致 ChinaDNS 失效。

配置

dnsmasq 就两个部分:/usr/bin/dnsmasq/etc/dnsmasq.conf,我们只需关心 /etc/dnsmasq.conf 配置文件。

dnsmasq.conf 里面的选项都是 dnsmasq --help 中的长选项(没有前面的连字符,这和 aria2 是一样的)。

dnsmasq.conf 中以 # 开头的为注释行,每个选项与选项值之间使用 = 相连(= 两边可以有任意空格),如 port = 60053,不以分号结尾,一行只能有一个选项。

典型配置如下:

关于 ipset 配置项
ipset 选项的作用:将指定域名解析到的 IP 添加到指定 ipest 中,也即
ipset add gfwlist 216.58.221.100,假设 ipset 中的 name 为 gfwlist
每次解析指定域名时,dnsmasq 都会将解析到的 ip 添加到指定 ipset 中
因为 ipset 内部是使用 hash 这种数据结构存储的,所以不会存在重复条目

ipset 配置项的典型用途:配合 iptables/ipset,进行 gfwlist 模式的代理分流
配置:server = /google.com/127.0.0.1#60053ipset = /google.com/gfwlist
当客户端请求 dnsmasq 解析 google.com 时,dnsmasq 会向 127.0.0.1:60053
发送域名解析请求(如 ss-tunnel),然后 dnsmasq 将解析到的 IP 放到 gfwlist
地址集合中(gfwlist 这个 ipset 必须已存在,否则没有任何效果,也无错误提示)
当客户端向 google.com 发送 TCP/UDP 请求时,就可以在 iptables 规则中判断
这个 IP 是不是 gfwlist 的 IP,如果是(在 gfwlist 这个 ipset 中)则将它发给代理
如果不是,比如百度、腾讯等墙内网站,则不会经过本地的代理,而是走直连网络

再次强调,dnsmasq 只是执行 ipset add gfwlist 1.2.3.4 命令(fork、exec)
它不管这个命令是执行成功,还是执行失败,这不是 dnsmasq 的义务,而是你的

运行

dnsmasq 默认以守护进程运行,配置文件为 /etc/dnsmasq.conf
dnsmasq -C dnsmasq.conf 使用指定配置文件 dnsmasq.conf
dnsmasq -C dnsmasq.conf -d 使用指定配置文件 dnsmasq.conf 且前台运行

给 dnsmasq 发送 SIGHUP 信号可以清空 DNS 缓存,kill -HUP $dnsmasq-pid