自定义域名解析神器 dnsmasq
什么是 dnsmasq?
dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。
dnsmasq 能做什么?
| 功能 | 说明 | 应用场景 |
|---|---|---|
| DNS 转发与缓存 | 将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果 | 加快 DNS 查询速度,减少外部 DNS 流量 |
| 本地 DNS | 解析本地网络设备的主机名,无需编辑 /etc/hosts | 通过主机名访问本地设备(如 printer.local) |
| DHCP 服务 | 自动分配 IP 地址给网络客户端,支持 IPv4 和 IPv6 | 网络 IP 地址管理 |
| TFTP/PXE 服务 | 支持网络启动 | 无盘工作站或嵌入式设备启动 |
| 广告/恶意软件过滤 | 在 DNS 级别阻止不需要的域名 | 全网络级别的广告拦截 |
| DNSSEC 安全验证 | 验证 DNS 响应的真实性 | DNS 安全解析 |
| IPv6 路由广告 | IPv6 自动配置 | IPv6 网络支持 |
关键优势:
轻量级、资源消耗少
易于配置(单个配置文件)
跨平台支持(Linux、macOS、BSD、Android)
完美适合开发环境和小型网络
Mac 下的安装和配置
第 1 步:安装 dnsmasq
使用 Homebrew(推荐):
brew install dnsmasq
第 2 步:配置 dnsmasq
配置文件路径:
Intel Mac:
/usr/local/etc/dnsmasq.confApple Silicon (M1/M2/M3):
/opt/homebrew/etc/dnsmasq.conf
为了对泛域名进行本地解析,添加以下配置:
# 将 .test 域名的所有子域解析到本地 echo "address=/.test/127.0.0.1" >> $(brew --prefix)/etc/dnsmasq.conf # 如果需要 .lan 域名 echo "address=/.lan/127.0.0.1" >> $(brew --prefix)/etc/dnsmasq.conf # DNS 端口(通常无需修改,默认为 53) echo "port=53" >> $(brew --prefix)/etc/dnsmasq.conf
推荐域名后缀:使用 .test、.lan、.example 等非公共 TLD
不要用
.dev(被 Google 保留)不要用
.local(被 Bonjour/mDNS 使用)
第 3 步:配置系统 DNS 解析器
为你的自定义 TLD(如 .test)配置系统解析器:
# 创建解析器目录 sudo mkdir -pv /etc/resolver # 为 .test 域名创建解析器配置 echo "nameserver 127.0.0.1" | sudo tee /etc/resolver/test > /dev/null # 如果需要 .lan 域名 echo "nameserver 127.0.0.1" | sudo tee /etc/resolver/lan > /dev/null
第 4 步:启动 dnsmasq
自动启动并在后台运行(推荐):
sudo brew services start dnsmasq
检查服务状态:
sudo brew services list | grep dnsmasq
手动运行(调试):
sudo dnsmasq --no-daemon
第 5 步:更新 macOS DNS 设置
打开 系统设置 → 网络 → 高级 → DNS
点击 + 添加 DNS 服务器:
127.0.0.1确保其他 DNS 服务器(如 ISP DNS)也在列表中作为备用
第 6 步:刷新 DNS 缓存
# 清空系统 DNS 缓存 sudo dscacheutil -flushcache # 重启 mDNS 响应器 sudo killall -HUP mDNSResponder
第 7 步:测试配置
# 测试 ping ping mysite.test # 你应该看到来自 127.0.0.1 的回复 # 使用 dig 进行详细查询 dig mysite.test dig api.myapp.test dig foo.bar.test # 使用 nslookup nslookup test.test 127.0.0.1
本地开发泛域名解析
泛域名解析的优势
无需为每个新的子域手动编辑
/etc/hosts文件支持无限的子域名:
api.project.test、web.project.test、admin.project.test等都自动解析到127.0.0.1完美适合微服务开发、多租户应用开发等场景
配置示例
需求:让所有 *.myapp.test 和 *.api.test 域名都解析到本地
编辑配置文件:
sudo nano $(brew --prefix)/etc/dnsmasq.conf
添加以下配置行:
# 泛域名解析配置 address=/.test/127.0.0.1 address=/.myapp.test/127.0.0.1 address=/.api.test/127.0.0.1 # 如果你想特定的域名指向不同的 IP(高级用法) # address=/admin.myapp.test/192.168.1.100
刷新配置:
# 重启 dnsmasq 使配置生效sudo brew services restart dnsmasq
测试泛域名解析:
# 这些应该都返回 127.0.0.1 dig frontend.myapp.test dig api.myapp.test dig anything.myapp.test dig test.api.test