dns

package
v0.0.0-...-3ed7d68 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 4, 2026 License: MPL-2.0 Imports: 19 Imported by: 0

README

DNS 解析模块

该模块提供 DNS 解析功能,支持配置自定义 DNS 服务器,并在配置的 DNS 服务器不可用时自动回退到系统 DNS。

功能特性

  1. 支持配置自定义 DNS 服务器
  2. 自动检测配置的 DNS 服务器可用性
  3. 当配置的 DNS 服务器不可用时,自动回退到系统 DNS
  4. 支持超时控制
  5. 线程安全的实现
  6. 支持多种DNS协议:
    • 传统DNS (UDP/TCP:53)
    • DNS-over-HTTPS (DoH)
    • DNS-over-TLS (DoT)
    • DNSCrypt
    • DNS-over-QUIC (DoQ)

配置

config.yaml 中添加 DNS 配置:

dns:
  servers:
    - "8.8.8.8"                                    # 传统DNS
    - "sdns://AQcAAAAAAAAADjIwOC42Ny4yMjAuMjIw"   # DNSCrypt格式
    - "sdns://AgcAAAAAAAAADjIwOC42Ny4yMjAuMjIwILxRg8tR2Wo7dV5npt77i_W5N8LwpHiYyrWG6H54W6xw" # DoH格式
  timeout: 5s
  max_conns: 10
配置说明
  • servers: DNS 服务器列表,按顺序尝试解析
    • 可以是传统DNS服务器IP地址
    • 可以是DNS stamp格式的服务器地址,支持DNSCrypt、DoH、DoT等协议
  • timeout: DNS 查询超时时间,默认为 5 秒
  • max_conns: 最大连接数,默认为 10

使用方法

初始化

在程序启动时初始化 DNS 解析器:

err := dns.Init()
if err != nil {
    log.Printf("初始化DNS解析器失败: %v", err)
}
解析域名
// 解析IP地址
ips, err := dns.LookupIP("example.com")
if err != nil {
    log.Printf("DNS解析失败: %v", err)
}

// 使用上下文的解析方法
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
addrs, err := dns.LookupIPAddr(ctx, "example.com")
if err != nil {
    log.Printf("DNS解析失败: %v", err)
}

工作原理

  1. 程序启动时读取配置文件中的 DNS 配置
  2. 如果配置了 DNS 服务器,则根据服务器地址格式创建相应的解析器
  3. 解析域名时首先尝试使用配置的 DNS 服务器
  4. 如果配置的 DNS 服务器解析失败,则自动回退到系统 DNS
  5. 所有解析操作都有超时控制,避免长时间阻塞

支持的协议

传统DNS

使用标准的UDP/TCP端口53进行DNS查询。

DNSCrypt

通过加密通道进行DNS查询,保护DNS查询内容不被窃听或篡改。

DNS-over-HTTPS (DoH)

通过HTTPS协议进行DNS查询,避免DNS查询被中间网络设备监控。

DNS-over-TLS (DoT)

通过TLS加密通道进行DNS查询,提供安全的DNS解析服务。

DNS-over-QUIC (DoQ)

基于QUIC协议的DNS查询,提供更低延迟和更好性能的DNS解析。

故障处理

  • 当配置的 DNS 服务器都不可用时,会自动回退到系统 DNS
  • 所有解析操作都有超时控制,防止长时间阻塞
  • 提供日志记录功能,便于问题排查

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetDialer

func GetDialer() *net.Dialer

GetDialer 获取使用自定义DNS的拨号器

func GetFallbackDialer

func GetFallbackDialer() *net.Dialer

GetFallbackDialer 获取使用系统DNS的回退拨号器

func GetNetResolver

func GetNetResolver() *net.Resolver

GetNetResolver 获取可以用于net包的解析器

func GetResolvers

func GetResolvers() []string

GetResolvers 获取当前使用的DNS服务器列表

func GetSystemResolver

func GetSystemResolver() *net.Resolver

GetSystemResolver 获取系统解析器

func HandleConfigUpdate

func HandleConfigUpdate(oldCfg, newCfg *config.Config)

HandleConfigUpdate 处理配置更新事件

func Init

func Init()

func LookupIP

func LookupIP(host string) ([]net.IP, error)

LookupIP 使用默认解析器解析IP地址

func LookupIPAddr

func LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error)

LookupIPAddr 使用默认解析器解析IP地址(返回net.IPAddr数组)

func LookupIPWithIPv6Disabled

func LookupIPWithIPv6Disabled(ctx context.Context, host string) ([]net.IPAddr, error)

LookupIPWithIPv6Disabled 使用默认解析器解析IP地址,但只返回IPv4地址

func RefreshConfig

func RefreshConfig()

RefreshConfig 刷新DNS配置

func SetupGlobalDNSResolver

func SetupGlobalDNSResolver()

Types

type Common

type Common struct {
	Server    string
	ReuseConn bool
}

type Dialer

type Dialer struct {
	*net.Dialer
	// contains filtered or unexported fields
}

Dialer 包装net.Dialer以使用自定义DNS解析器

func NewDialer

func NewDialer() *Dialer

NewDialer 创建一个新的Dialer实例

func NewFallbackDialer

func NewFallbackDialer() *Dialer

NewFallbackDialer 创建一个使用系统DNS的回退Dialer实例

type NetResolver

type NetResolver struct {
	// contains filtered or unexported fields
}

NetResolver 包装net.Resolver以使用自定义DNS解析器

func NewNetResolver

func NewNetResolver() *NetResolver

NewNetResolver 创建一个新的NetResolver实例

func (*NetResolver) LookupIP

func (nr *NetResolver) LookupIP(ctx context.Context, network, host string) ([]net.IP, error)

LookupIP 实现IP解析

func (*NetResolver) LookupIPAddr

func (nr *NetResolver) LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error)

LookupIPAddr 实现net.Resolver接口

type QUIC

type QUIC struct {
	Common
	TLSConfig       *tls.Config
	PMTUD           bool
	AddLengthPrefix bool
}

QUIC 是用于通过 QUIC 协议进行 DNS 查询的结构体

type Resolver

type Resolver struct {
	// contains filtered or unexported fields
}

func GetInstance

func GetInstance() *Resolver

GetInstance 获取单例 Resolver

func (*Resolver) GetDialer

func (r *Resolver) GetDialer() *net.Dialer

func (*Resolver) GetFallbackDialer

func (r *Resolver) GetFallbackDialer() *net.Dialer

func (*Resolver) GetNetResolver

func (r *Resolver) GetNetResolver() *net.Resolver

func (*Resolver) GetResolvers

func (r *Resolver) GetResolvers() []string

GetResolvers 获取当前 DNS 列表

func (*Resolver) GetSystemResolver

func (r *Resolver) GetSystemResolver() *net.Resolver

func (*Resolver) LookupIP

func (r *Resolver) LookupIP(host string) ([]net.IP, error)

func (*Resolver) LookupIPAddr

func (r *Resolver) LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error)

func (*Resolver) RefreshConfig

func (r *Resolver) RefreshConfig()

RefreshConfig 刷新配置

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL