
New releaseSep 3, 2026
retryabledns v1.0.116
Goで書かれたリトライ可能なDNSクライアント
リトライ可能なDNSリゾルバ
miekg/dns をベースにしており、bogdanovich/dns_resolver から自由に着想を得ています。
特徴
- システムデフォルトのDNSリゾルバとユーザー指定のリゾルバの両方をサポート
- I/Oエラー、タイムアウト、ネットワーク障害が発生した場合にDNSリクエストを再試行
- 任意のクエリタイプを許可
- ランダムなリゾルバによる解決
- さまざまなDNSリゾルバプロトコル(TCP、UDP、DoH、DoT)に対応
go get を使用する
$ go get github.com/projectdiscovery/retryabledns
このコマンドの後、retryabledns ライブラリのソースが $GOPATH に配置されます。
/etc/hosts ファイルの処理
デフォルトでは、ライブラリは効率のために /etc/hosts ファイルを最大行数(4096)まで処理します。設定でより大きな hosts ファイルがあり、さらに多くの行を処理したい場合は、hostsfile.MaxLines 変数を調整することで簡単にこの制限を設定できます。
例:
hostsfile.MaxLines = 10000 // Now the library will process up to 10000 lines from the hosts file
使用例
使用例:
package main
import (
"log"
"github.com/projectdiscovery/retryabledns"
"github.com/miekg/dns"
)
func main() {
// It requires a list of resolvers.
// Valid protocols are "udp", "tcp", "doh", "dot". Default are "udp".
resolvers := []string{"8.8.8.8:53", "8.8.4.4:53", "tcp:1.1.1.1"}
retries := 2
hostname := "hackerone.com"
dnsClient, err := retryabledns.New(resolvers, retries)
if err != nil {
log.Fatal(err)
}
ips, err := dnsClient.Resolve(hostname)
if err != nil {
log.Fatal(err)
}
log.Println(ips)
// Query Types: dns.TypeA, dns.TypeNS, dns.TypeCNAME, dns.TypeSOA, dns.TypePTR, dns.TypeMX, dns.TypeANY
// dns.TypeTXT, dns.TypeAAAA, dns.TypeSRV (from github.com/miekg/dns)
// retryabledns.ErrRetriesExceeded will be returned if a result isn't returned in max retries
dnsResponses, err := dnsClient.Query(hostname, dns.TypeA)
if err != nil {
log.Fatal(err)
}
log.Println(dnsResponses)
}
クレジット:
https://github.com/lixiangzhong/dnsutilhttps://github.com/rs/dnstrace