#dns-lookup #domain-name #dns #host #ip-address #host-name #dns-records

bin+lib mhost

不仅仅是主机 - 一款基于经典 host DNS 查询工具的现代版本,包括易于使用且非常快速的 Rust 查询库

11 个版本

0.3.1 2024年3月11日
0.3.0 2021年3月6日
0.3.0-alpha.22021年2月27日
0.3.0-alpha.12021年1月20日
0.0.3 2017年9月29日

#211 in 命令行工具

Download history 1/week @ 2024-05-20 110/week @ 2024-07-29

110 每月下载量

MIT/Apache

460KB
11K SLoC

mhost mhost

对经典的 host DNS 查询工具的现代诠释,包括易于使用且非常快速的 Rust 查询库。

CI build Documentation on docs.rs GitHub release License: MIT License: Apache 2.0

特性

  • mhost 非常快,同时使用多个 DNS 服务器并发查询,并汇总所有结果以提高查询的可靠性。

  • mhost 支持 UDP 和 TCP 上的经典 DNS,以及现代的 DNS over TLS (DoT) 和 HTTP (DoH)。

  • mhost 以易于阅读的格式或 JSON 格式呈现结果,便于后处理。

  • mhost 可以发现任何域的主机名、子域以及以 CIDR 表示法的 IP 子网。

  • mhost 使用 lint 验证任何域的 DNS 配置。

  • mhost 提供了一个易于使用的 Rust 库,因此您可以在自己的项目中使用相同的查询功能。

有关详细信息,请参阅 Readme 中的 用例文档 部分。

快速入门

  1. 安装 mhost – 请参阅下面的 安装说明

  2. 运行 mhost -p l -a all -w github.com 并在 34 毫秒内向 16 个名称服务器查询了 github.com 的所有可用 DNS 记录。此外,您还获得了 GitHub 子网的 WHOIS 信息。 Multi lookup for all available records of github.com.

  3. 运行mhost -q -p --output json l --all -w github.com | jq '.lookups[] | .result.Response.records[]? | select(.type == "A") | .data.A'以获取所有IPv4地址。

  4. 设置shell别名alias host=mhost l以替换系统中的host命令。

目录

用例

仅查找IP地址

$ mhost l github.com

Default lookup for github.com.

在本次运行中,应用了所有默认设置。特别是,most只使用本地系统名称服务器并只查询默认记录类型。

仅查找IP地址,使用不仅仅是本地名称服务器

$ mhost -p l github.com

Default lookup with predefined servers for github.com.

看看,答案比以前多了!

-p添加mhost为您的方便预定义的公共名称服务器。默认情况下,仅使用UDP来联系预定义的名称服务器。您可以使用--predefined-filter来控制此行为并过滤UDP、TCP、DoT、DoH。--list-predefined显示所有可用的预定义名称服务器。

仅查找IP地址,使用不仅仅是更多的本地名称服务器

$ mhost server-lists public-dns -o servers.txt
$ mhost --limit 6000 --max-concurrent-servers 1000 --timeout 1 -f servers.txt l www.github.com

Default lookup with servers list for github.com.

看看,答案比以前更多了!

第一个命令下载了由Public DNS社区维护的公共可用名称服务器列表。通常只有其中的一小部分可访问,但仍然是一组大量的活动名称服务器。

第二个命令使用之前的名称服务器列表并发查询它们。这些设置非常激进,极大地压力您的互联网连接。mhost的默认设置设置得更加谨慎。

仅查找IP地址,使用UDP、TCP、DoT和DoH

$ mhost -s 1.1.1.1 -s tcp:1.1.1.1 -s tls:1.1.1.1:853,tls_auth_name=cloudflare-dns.com -s https:1.1.1.1:443,tls_auth_name=cloudflare-dns.com,name=Cloudflare -p l github.com

如前所述,mhost支持UDP、TCP、DNS over TLS (DoT)以及DNS over HTTPS (DoH)的DNS查询。在上面的示例中,mhost使用所有四种协议查询Cloudflare的名称服务器。

此命令还显示了名称服务器指定的语法,通常为protocol:<主机名 | ip address>:port,tls_auth_name=hostname,name=human-readable-name

Default lookup with all protocols for github.com.

发现一个域名

有时您想了解一个域名拥有哪些主机名和子域名。mhost提供简单的命令来帮助您找到这些。请注意,mhost只使用DNS特定的发现方法。如果您想使用Google、Shodan等工具进行更深入的发现,还有其他工具可用。

$ mhost -p d github.com -p

此命令使用预定义的名称服务器来发现GitHub域名。-s将所有发现的名称减少到github.com.的真实子域名。

Discover github.com.

您可以再进一步,探索GitHub使用的自治系统。为了发现这些,您可以使用以下命令

$ mhost -p l --all -w github.com
$ mhost -p l --all 140.82.121.0/24

Discover AS of github.com.

检查您的名称服务器配置

$ mhost -p c github.com -p

Check github.com.

安装

Docker

如果您想快速试用mhost并尽量减少麻烦,您可能想尝试Docker镜像

$ docker run lukaspustina/mhost:latest mhost l mhost.pustina.de

Homebrew

您可以将此存储库添加为自定义tap,然后按以下方式安装mhost

$ brew tap lukaspustina/mhost https://github.com/lukaspustina/mhost.git
$ brew install lukaspustina/mhost/mhost

Debian和Ubuntu

您可以在GitHub发布页面找到Debian软件包。下载包为mhost.deb,然后运行

$ dpkg -i mhost.deb

Redhat和Fedora

您可以在GitHub发布页面找到RPM软件包。下载包为mhost.rpm,然后运行

$ rpm -i mhost.rpm

对于Rust开发者

$ cargo install --features app mhost

从源代码

请通过rustup安装Rust,然后运行

$ git clone https://github.com/lukaspustina/mhost
$ cd mhost
$ make install

文档

mhost有三个主要命令:查找发现检查查找查找域名名的任意DNS记录。 发现尝试各种方法来发现域名的主机和子域名。 检查使用lint来检查域名名的所有记录是否遵守DNS RFC。

通用选项

    --use-system-resolv-opt                 Uses options set in /etc/resolv.conf
    --no-system-nameservers                 Ignores nameservers from /etc/resolv.conf
-S, --no-system-lookups                     Ignores system nameservers for lookups
    --resolv-conf <FILE>                    Uses alternative resolv.conf file
    --ndots <NUMBER>                        Sets number of dots to qualify domain name as FQDN [default: 1]
    --search-domain <DOMAIN>                Sets the search domain to append if HOSTNAME has less than ndots dots
    --system-nameserver <IP ADDR>...        Adds system nameserver for system lookups; only IP addresses allowed
-s, --nameserver <HOSTNAME | IP ADDR>...    Adds nameserver for lookups
-p, --predefined                            Adds predefined nameservers for lookups
    --predefined-filter <PROTOCOL>...       Filters predefined nameservers by protocol [default: udp]  [possible
                                            values: udp, tcp, https, tls]
    --list-predefined                       Lists all predefined nameservers
-f, --nameservers-from-file <FILE>          Adds nameservers from file
    --limit <NUMBER>                        Sets max. number of nameservers to query [default: 100]
    --max-concurrent-servers <NUMBER>       Sets max. concurrent nameservers [default: 10]
    --max-concurrent-requests <NUMBER>      Sets max. concurrent requests per nameserver [default: 5]
    --retries <NUMBER>                      Sets number of retries if first lookup to nameserver fails [default: 0]
    --timeout <TIMEOUT>                     Sets timeout in seconds for responses [default: 5]
-m, --resolvers-mode <MODE>                 Sets resolvers lookup mode [default: multi]  [possible values: multi,
                                            uni]
    --wait-multiple-responses               Waits until timeout for additional responses from nameservers
    --no-abort-on-error                     Sets do-not-ignore errors from nameservers
    --no-abort-on-timeout                   Sets do-not-ignore timeouts from nameservers
    --no-aborts                             Sets do-not-ignore errors and timeouts from nameservers
-o, --output <FORMAT>                       Sets the output format for result presentation [default: summary]
                                            [possible values: json, summary]
    --output-options <OPTIONS>...           Sets output options
    --show-errors                           Shows error counts
-q, --quiet                                 Does not print anything but results
    --no-color                              Disables colorful output
    --ascii                                 Uses only ASCII compatible characters for output
-v                                          Sets the level of verbosity
    --debug                                 Uses debug formatting for logging -- much more verbose

主要命令

查找

-t, --record-type <RECORD TYPE>...    Sets record type to lookup, will be ignored in case of IP address lookup
                                        [default: A,AAAA,CNAME,MX]  [possible values: A, AAAA, ANAME, ANY, CNAME, MX,
                                        NULL, NS, PTR, SOA, SRV, TXT]
    --all                             Enables lookups for all record types
-s, --service                         Parses ARG as service spec and set record type to SRV
-w, --whois                           Retrieves Whois information about A, AAAA, and PTR records
-h, --help                            Prints help information
-V, --version                         Prints version information

<DOMAIN NAME | IP ADDR | CIDR BLOCK [| SERVICE SPEC]>    domain name, IP address, or CIDR block to lookup
        domain name, IP address, CIDR block, or, if -s, SERVICE SPEC, to lookup"
        * DOMAIN NAME may be any valid DNS name, e.g., lukas.pustina.de
        * IP ADDR may be any valid IPv4 or IPv4 address, e.g., 192.168.0.1
        * CIDR BLOCK may be any valid IPv4 or IPv6 subnet in CIDR notation, e.g., 192.168.0.1/24
            all valid IP addresses of a CIDR block will be queried for a reverse lookup
        * SERVICE SPEC may be specified by name, protocol, and domain name, delimited by colons. If protocol is
        omitted, tcp is assumed, e.g.,
            * dns:udp:example.com is _dns._udp.example.com
            * smtp:tcp:example.com is _smtp._tcp.example.com
            * smtp::example.com is _smtp._tcp.example.com

发现

-p, --show-partial-results         Shows results after each lookup step
-w, --wordlist-from-file <FILE>    Uses wordlist from file
    --rnd-names-number <NUMBER>    Sets number of random domain names to generate for wildcard resolution check
                                    [default: 3]
    --rnd-names-len <LEN>          Sets length of random domain names to generate for wildcard resolution check
                                    [default: 32]
-s, --subdomains-only              Shows subdomains only omitting all other discovered names

检查

-p, --show-partial-results         Shows results after each check step
-i, --show-intermediate-lookups    Shows all lookups made during by all checks
    --no-cnames                    Does not run cname lints
    --no-soa                       Does not run SOA check
    --no-spf                       Does not run SPF check

辅助命令

服务器列表

-o, --output-file <FILE>    Sets path to output file
<SERVER LIST SPEC>...
    SERVER LIST SPEC as <SOURCE>[:OPTIONS,...]
    * 'public-dns' with options - cf. https://public-dns.info
        '<top level country domain>': options select servers from that country
        Example: public-dns:de
    * 'opennic' with options; uses GeoIP to select servers - cf. https://www.opennic.org
        'anon' - only return servers with anonymized logs only; default is false
        'number=<1..>' - return up to 'number' servers; default is 10
        'reliability=<1..100> - only return server with reliability of 'reliability'% or more; default 95
        'ipv=<4|6|all> - return IPv4, IPv6, or both servers; default all
        Example: opennic:anon,number=10,ipv=4

架构设计记录

子目录doc/adr包含此项目的体系结构设计记录(ADRs)。记录开始于项目期间,并非所有决策都已记录。我仍然希望它们将帮助所有感兴趣的人,包括我,理解设计决策的合理性。

变更日志

请参阅变更日志以获取发布历史。

限制

  • 目前mhost仅支持IN类。

  • 仅支持有限的一组DNS记录类型。

  • 由于Docker for macOS的限制,Docker测试环境只能在Linux上完全工作。

感谢

感谢Benjamin Fry提供的绝对出色的Trust-DNS服务器及其相应的客户端库,它们为mhost完成了所有的繁重DNS工作。

明信片软件

您可以使用mhost。如果您觉得它很有用,我将非常感激您从您家乡寄给我一张明信片,说明您如何使用mhost。我的工作地址是

     Lukas Pustina
     CenterDevice GmbH
     Rheinwerkallee 3
     53227 Bonn
     Germany

依赖关系

~21–35MB
~647K SLoC