如何为不同域名的DNS查询指定不同的源IP?
如何为不同域名的DNS查询指定不同的源IP?
嘿,这个需求我之前帮朋友处理过,完全不用自己写 resolver,用现有的 dnsmasq 或者 CoreDNS 就能轻松搞定!我给你详细说说两种方案的实现步骤:
用 dnsmasq 实现
dnsmasq 本身就支持针对特定域名,指定使用某个本地IP作为源去查询上游DNS服务器,配置起来很简单:
- 打开 dnsmasq 的主配置文件(通常是
/etc/dnsmasq.conf),如果是新安装的也可以直接新建配置片段放在/etc/dnsmasq.d/目录下 - 添加对应域名的规则,格式是
server=/目标域名/上游DNS@本地源IP:# 所有vnet1相关的域名(比如*.vnet1.internal),用IP-1(192.168.0.5)作为源查询DNS服务器10.0.0.10 server=/vnet1.internal/10.0.0.10@192.168.0.5 # 所有vnet2相关的域名(比如*.vnet2.internal),用IP-2(172.16.0.6)作为源查询DNS服务器10.0.0.10 server=/vnet2.internal/10.0.0.10@172.16.0.6 # 其他域名默认用IP-1查询 server=10.0.0.10@192.168.0.5 - 保存配置后,重启 dnsmasq 服务:
systemctl restart dnsmasq - 最后把系统的DNS指向本地的 dnsmasq,比如修改
/etc/resolv.conf,把第一行改成:
(如果用的是 systemd-resolved,可能需要调整它的配置或者直接禁用,避免端口冲突)nameserver 127.0.0.1
用 CoreDNS 实现
CoreDNS 更灵活,通过 route 插件可以轻松实现域名到不同转发规则的路由,同时指定源IP:
- 编写 CoreDNS 的配置文件(通常叫
Corefile),内容如下:.:53 { route { # 匹配vnet1的域名,用IP-1转发到DNS服务器 match domain vnet1.internal *.vnet1.internal { forward . 10.0.0.10 { source 192.168.0.5 } } # 匹配vnet2的域名,用IP-2转发到DNS服务器 match domain vnet2.internal *.vnet2.internal { forward . 10.0.0.10 { source 172.16.0.6 } } # 其他域名默认用IP-1转发 forward . 10.0.0.10 { source 192.168.0.5 } } # 可选:开启日志方便排查问题 log errors } - 启动 CoreDNS(如果是二进制文件直接运行,或者用容器部署都可以),确保它能绑定53端口(需要root权限或者设置
CAP_NET_BIND_SERVICE能力) - 同样把系统DNS指向
127.0.0.1,让所有查询都经过 CoreDNS
测试验证
配置完成后,你可以用 dig 命令测试一下,确认源IP是否正确:
# 测试vnet1的域名,应该用192.168.0.5作为源 dig nginx-service.vnet1.internal @127.0.0.1 # 测试vnet2的域名,应该用172.16.0.6作为源 dig nginx-service.vnet2.internal @127.0.0.1
你也可以用tcpdump抓包验证,比如:
tcpdump -i any port 53 and host 10.0.0.10
查看抓取到的DNS请求的源IP是否符合预期。
备注:内容来源于stack exchange,提问作者Vishesh Agarwal
相关产品推荐
相关产品推荐

