类UNIX系统下使用Dnsmasq
简介
Dnsmasq是一个轻量级的DHCP服务器、DNS缓存服务器。它可以提供本地的DNS服务,把不能解析的请求转交给上级DNS处理。
Dnsmasq可以读取/etc/hosts文件中的条目,来作域名解析。
OS X
安装
可以通过Homebrew安装:
1 |
brew install dnsmasq |
创建配置文件:
1 2 |
mkdir -pv $(brew --prefix)/etc/ touch $(brew --prefix)/etc/dnsmasq.conf |
修改网络配置中的DNS配置,将127.0.0.1放到DNS列表的最前面。
服务化
1 2 3 4 5 6 7 8 9 10 11 |
sudo cp -v $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist # 现在可以看到Dnsmasq已经启动了 sudo launchctl list | grep dns # 要禁用Dnsmasq服务,可以 sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist # 注意,Dnsmasq不会监控hosts文件的变动,因此修改hosts后需要重新启动 sudo brew services restart dnsmasq |
Ubuntu
安装
通常Ubuntu已经自带了此软件包,不需要手工安装。如果你的机器上缺少dnsmasq,执行下面的命令安装:
1 |
sudo apt install dnsmasq |
安装后,dnsmasq的守护程序会自动启动。
配置
默认的启动脚本,包含以下参数:
1 2 3 4 5 6 7 8 9 |
/usr/sbin/dnsmasq # 指定PID文件路径 -x /var/run/dnsmasq/dnsmasq.pid # 以什么身份运行守护程序 -u dnsmasq # 指定上游DNS服务器,此文件自动生成,在桌面系统中会读取NetworkManager中的DNS设置并写入此文件 -r /var/run/dnsmasq/resolv.conf # 指定配置文件目录 -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new |
所以我们只需要把配置文件放在/etc/dnsmasq.d目录下就可以了。注意此目录中所有文件都会被读取。添加下面的配置文件:
1 2 |
expand-hosts domain=gmem.cc |
配置文件详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# 监听端口 port=53 # 上游DNS服务器的路径 resolv-file=/etc/resolv.conf # 安装定义顺序逐一尝试上游DNS服务器 strict-order # 不从任何外部文件读取上游DNS no-resolv # 添加上游服务器 # 对于本地网络的DNS查询,转发给192.168.0.1 server=/localnet/192.168.0.1 # 针对*.svc.k8s.gmem.cc的DNS查询,转发给10.96.0.10 server=/svc.k8s.gmem.cc/10.96.0.10 # 针对192.168.3/24的DNS反查,转发给10.1.2.3 server=/3.168.192.in-addr.arpa/10.1.2.3 # 和上游DNS 10.1.2.3联系时通过eth1路由 server=10.1.2.3@eth1 # 仅本地域名列表,这些域名的查询仅仅基于/etc/hosts文件或者DHCP完成 local=/localnet/ # 静态指定域名和IP的关系,支持泛域名解析 address=/zircon.gmem.cc/127.0.0.1 # 泛域名解析 address=/.k8s.gmem.cc/10.0.11.10 # 仅仅在指定的网络接口上监听DNS/DHCP请求,要指定多个接口,编写多行 interface=eth0 # 在除了指定网络接口外的任何接口上监听 except-interface=virbr0 # 在指定地址上监听,注意包含127.0.0.1 listen-address=127.0.0.1 # 在指定网络接口上仅仅提供DNS服务 no-dhcp-interface=eth0 # 通配绑定所有接口 bind-interfaces # 如果不希望读取/etc/hosts中的解析条目 no-hosts # 读取除了/etc/hosts之外的包含解析条目的文件 addn-hosts=/etc/banner_add_hosts # 根据domain选项,为hosts文件条目自动添加域名后缀 # 使用带后缀、不带后缀的方式访问此域名,都支持 expand-hosts # 设置dnsmasq的域,设置后,具有以下行为: # 1、允许DHCP主机拥有全限定的域名 # 2、设置DHCP的domain选项,进而潜在的设置所有基于DHCP配置的主机的domain # 3、如果设置了expand-hosts,自动为hosts文件中的条目添加后缀 domain=gmem.cc # 针对特定子网设置域名后缀 domain=vm.gmem.cc,10.0.0.1/8 # 下面这行启用内置的DHCP服务器,需要指定地址范围,租借时间 # 如果有多个网络,则重复下面的条目 dhcp-range=192.168.0.50,192.168.0.150,12h # 静态分配IP地址到指定的MAC dhcp-host=11:22:33:44:55:66,192.168.0.60 # 记录日志 log-facility=/var/log/dnsmasq.log # 最大连接数 dns-forward-max=512 |
常见问题
无法启动
报错信息:dnsmasq: setting capabilities failed: Operation not permitted
报错原因:在Docker中运行dnsmasq会出现此问题,将配置user/group改为root即可。
Leave a Reply