我有一台 Linux VM,它连接到 2 个不同的虚拟网络。假设 IP-1(在 vnet-1 中)= 192.168.0.5/24,IP-2(在 vnet-2 中)= 172.16.0.6/24。我有一个 DNS 服务器(假设为 10.0.0.10),它根据源 IP 返回不同的结果。例如:如果我使用 IP-1 作为源 IP 搜索“nginx-service”,我将获得 vnet-1 中服务的结果;如果我使用 IP-2 作为源 IP 搜索“nginx-service”,我将获得 vnet-2 中服务的结果。
我在 vnet-1 中有一些服务,在 vnet-2 中也有一些服务。因此,我想有条件地通过 IP-1 查询一些域,通过 IP-2 查询一些域(列表是固定的)。有没有办法使用现有的解析器来实现这一点?
我可以编写自己的 DNS 解析器,根据要解析的域构建具有正确源 IP 的 DNS 查询。但如果现有的解析器(如 coredns 或 dnsmasq)具有此功能,那就更好了。我知道 dig 允许您使用 -b 选项指定源 IP。
答案1
即使你没有找到支持此功能的任何 DNS 服务器,你也可以这样做:
您可以在不同的端口上运行 2 个 DNS 服务器,然后劫持DNS查询在你的防火墙里端口转发根据源 IP 地址/范围到所需 DNS 服务器的端口。
你nftables
可以这样做:
table ip nat {
map ip2port {
type ipv4_addr: inet_service;
flags interval;
elements = {
192.168.0.0/24: 53,
172.16.0.0/24: 5353
}
}
chain prerouting {
type nat hook prerouting priority -100;
ip protocol { udp, tcp } th dport 53 redirect to ip saddr map @ip2port;
}
}
在此示例中,如果 DNS 请求来自vnet-1
,则使用端口 53 上的 DNS 服务器,如果来自,vnet-2
则使用端口 5353 上的 DNS 服务器。
答案2
您可以构建自己的请求包并发送到 10.0.0.10,或者:
- 通过所需接口将路由设置为 10.0.0.10
- 发送正常 DNS 请求