Dig

如何要求“探勘”只返回 CNAME 記錄中的 IP?

  • August 27, 2019

dig +short命令(如“ dig show only answer ”中所述)非常適合將名稱批量處理為 IP 地址。它做了一個簡單的工作並且做得很好。

不幸的是,當有一個 CNAME 時甚至+short還不夠短。例如:

$ dig +short docs.sbonds.org
ghs.google.com.
173.194.69.121

我已經嘗試過+noall,但它似乎並沒有改變+short. 我也嘗試過指定-t a只是為了確保它認為我不是指 A 記錄或 CNAME,但這(不出所料)沒有任何改變。

$ dig +noall +short docs.sbonds.org
ghs.google.com.
173.194.69.121

我正在使用 RedHat 7 dig

# dig -v
DiG 9.9.4-RedHat-9.9.4-73.el7_6

我可以用 trusty 過濾掉 CNAME grep,但似乎 dig 應該有某種方式給出“只是 IP,女士”。

那是什麼方法?

dig是一個故障排除工具,因此它發送 DNS 查詢並接收 DNS 答案,正如 Andreas 所說,答案是 CNAME 和 A 記錄,正如設計的那樣。您的願望是提供“只是 IP,女士。”,所以這不是 DNS 故障排除,而是“只是”解決方案,這dig太過分了。

nslookup

nslookup不如dig但仍然會給你太多:

$ nslookup docs.sbonds.org
Server:     192.0.2.254
Address:    192.0.2.254#53

Non-authoritative answer:
docs.sbonds.org canonical name = ghs.google.com.
Name:   ghs.google.com
Address: 172.217.4.179

主持人

host更簡單,但仍會為您返回“太多”(但請注意,它還返回很好的 IPv6 地址):

$ host docs.sbonds.org
docs.sbonds.org is an alias for ghs.google.com.
ghs.google.com has address 172.217.15.83
ghs.google.com has IPv6 address 2607:f8b0:4004:815::2013

獲得性

根據你的Unix系統,getent可以使用。但是請注意,這可能會也可能不會進行 DNS 查詢,因為您在/etc/nsswitch.conf每個服務的數據源中進行了配置,並且hosts它可能是files(古老的/etc/hosts)和 DNS 的混合。

$ getent hosts docs.sbonds.org
2607:f8b0:4007:801::2013 ghs.google.com docs.sbonds.org

還要注意,在正確的 Unix 設置上,它會支持 IPv6 而不是 IPv4,因此這對您來說可能是個問題(這應該取決於 中的配置/etc/gai.conf

事實上hosts不兌現/etc/gai.conf,你需要使用ahosts代替,這將使用getaddrinfo和因此gai.conf。觀察你得到一個列表(其順序取決於gai.conf配置):

$ getent ahosts docs.sbonds.org
172.217.4.179   STREAM ghs.google.com
172.217.4.179   DGRAM
172.217.4.179   RAW
2607:f8b0:4007:801::2013 STREAM
2607:f8b0:4007:801::2013 DGRAM
2607:f8b0:4007:801::2013 RAW

Perl

如果允許你編寫一個簡單的腳本,你有很多解決方案,比如:

$ perl -MSocket -E 'say inet_ntoa(inet_aton("docs.sbonds.org"))'
172.217.4.179

衛生部

或者將任何 DOH(基於 HTTPS 的 DNS)端點(或類似的)與任何 HTTP 客戶端一起使用。例子:

$ curl --silent 'https://dns.google.com/resolve?name=docs.sbonds.org&type=A' | jq -c '.Answer[] | select(.type == 1) | .data'
"172.217.3.83"


$ curl --silent -H 'accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=docs.sbonds.org&type=A' | jq -c '.Answer[] | select(.type == 1) | .data'
"172.217.12.147"

系統

Systemd 有自己的解析器應用程序:

$ systemd-resolve docs.sbonds.org
docs.sbonds.org: 172.217.9.51
                2607:f8b0:4009:801::2013
                (ghs.google.com)

-- Information acquired via protocol DNS in 239.1ms.
-- Data is authenticated: no

您仍然需要以某種方式解析它,但它確實提供了直接的最終 IP 地址(當您呼叫它時有一個標誌,以使其不遵循CNAME任何需要的案例的記錄)

引用自:https://serverfault.com/questions/965368