【问题标题】:Find out what's the DNS server in use by the system找出系统使用的 DNS 服务器是什么
【发布时间】:2021-12-11 21:12:50
【问题描述】:

我希望我的 Rust 程序告诉我我当前在 Linux 机器上的 DNS 服务器是什么。我想了几个选择:

  • example.com 进行DNS 查询并检查哪个响应。我认为这需要对 DNS 响应进行逐字节解析。
  • 在 Rust 程序中运行和解析 cat /etc/resolv.confnmcli 命令,但这些是特定于发行版和特定于 Linux 配置的。
  • 运行一些收集系统信息的板条箱,但我找不到包含 DNS 设置的板条箱
  • 或者只是运行并解析nslookup example.com,这似乎最简单,但并不那么优雅。

这里最好的解决方案是什么?也许我错过了一些明显的解决方案,或者已经有一个板条箱可以做到这一点?

【问题讨论】:

  • 对于“系统当前配置的 DNS 服务器是什么”的问题,并不总是有一个明确的答案;例如在 macOS 上,不同的网络接口可以配置不同的 DNS 服务器。您能否详细介绍一下您的用例?这将有助于缩小正确答案的范围。
  • 谢谢@Coder-256,我对macOS一无所知。我正在使用 Linux 的 nfqueue 处理 DNS 流量,我需要知道 IP 地址来设置队列。我当然可以手动完成,但我想要自动检测。现在我可以意识到,使用 nfqueues 我被锁定在 Linux 中,所以我不需要与操作系统无关的解决方案。已编辑的问题。

标签: rust dns


【解决方案1】:

使用trust-dns-resolver crate 中的read_system_conf()

use trust_dns_resolver::system_conf;

let (conf, _opts) = system_conf::read_system_conf().unwrap();
println!("{:#?}", conf.name_servers());

【讨论】:

  • 看起来像it just reads /etc/resolv.conf file,所以我不需要箱子。但是感谢这个提示,我将根据 resolv.conf 做一些假设,它应该可以完成工作。
【解决方案2】:

感谢@kmdreko 在另一个答案中的建议,我使用了解析/etc/resolv.conf 文件的resolv_conf crate。此解决方案假定 Linux 机器确实拥有并使用此文件,但这将满足我的大部分需求。简单地说:

let contents = fs::read_to_string("/etc/resolv.conf").expect("Failed to open resolv.conf");
let config = resolv_conf::Config::parse(&contents).unwrap();
println!("{:?}", config.nameservers); // prints: [V4(192.168.1.1), V4(9.9.9.9)]

对于/etc/resolv.conf 文件,如下所示:

[adam@localhost ~]$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1
nameserver 9.9.9.9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2022-01-21
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多