对不同的 DNS 查找使用不同的源 IP

对不同的 DNS 查找使用不同的源 IP

我有一台 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 请求

相关内容