如何配置dnsmasq仅响应远程DNS请求,本地程序走公网DNS?
完全可以实现你的需求!下面是分步配置方案
核心思路
我们要让dnsmasq只监听主机的外部网络接口(不监听本地回环127.0.0.1),这样本地程序默认使用系统resolv.conf里的公网DNS;同时配置dnsmasq处理远程请求、限制允许的IP,以及添加特定域名的伪造解析记录。
1. 配置dnsmasq仅监听外部接口
编辑dnsmasq的主配置文件(通常是/etc/dnsmasq.conf),添加以下配置:
# 只监听指定的外部网卡(比如eth0,换成你的实际网卡名) interface=eth0 # 或者直接绑定主机的局域网IP(更精确) # listen-address=192.168.1.100 # 禁止监听本地回环接口(确保本地请求不走dnsmasq) except-interface=lo
这样dnsmasq只会响应发往你主机外部IP的DNS请求,本地程序会直接使用系统resolv.conf里的公网DNS,完全忽略dnsmasq。
2. 配置dnsmasq处理远程请求的规则
继续在配置文件中添加:
# 指定公网DNS服务器,用于转发非本地配置的域名查询 server=8.8.8.8 server=8.8.4.4 # 添加本地伪造解析记录(针对你的场景:远程服务器故障时返回伪造IP) # 示例:让嵌入式系统查询faulty-server.com时返回192.168.1.10 address=/faulty-server.com/192.168.1.10
这样远程系统发过来的请求,要么返回你配置的伪造IP,要么转发到公网DNS获取真实结果。
3. 限制允许查询的远程系统IP
为了安全,只允许指定IP/子网的远程系统查询,添加:
# 允许单个IP查询 allow-list=192.168.1.50 # 或者允许整个子网查询(比如192.168.1.0/24) # allow-list=/192.168.1.0/24/
注意:如果使用旧版dnsmasq(v2.85之前),可能需要用local-service配合interface来限制本地子网,但allow-list是更灵活的新特性。
4. 确保本地程序使用公网DNS
检查主机的/etc/resolv.conf,确保里面没有指向127.0.0.1的nameserver,而是直接写公网DNS:
nameserver 8.8.8.8 nameserver 8.8.4.4
如果你的系统用systemd-resolved管理DNS,可能需要调整相关配置,确保本地解析不走dnsmasq。
最后验证
重启dnsmasq服务:
sudo systemctl restart dnsmasq
- 在本地主机上执行
nslookup faulty-server.com,应该返回公网的真实IP; - 在允许的远程嵌入式系统上执行
nslookup faulty-server.com 192.168.1.100(替换成你的主机IP),应该返回你配置的伪造IP。
内容的提问来源于stack exchange,提问作者Paul D Smith
相关产品推荐
相关产品推荐

