godns

package module
v1.3.0 Latest Latest
Warning

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

Go to latest
Published: Dec 3, 2024 License: GPL-3.0 Imports: 7 Imported by: 0

README

GoDNS

madewithlove Go Version Latest Version License GoDoc

简体中文 | English

GoDNS 是一个快速、灵活的实验用 DNS 服务器,旨在帮助开发者和研究人员探索和实验 DNS 协议的各种特性。

目录

GoDNSServer

GoDNSServer 是对 DNS 服务器的最顶层封装, 其由三部分组成:

  1. ServerConfig: DNS 服务器配置。
  2. Netter: 数据包处理器:接收、解析、发送数据包,并维护连接状态。
  3. Responser: DNS回复器:响应、解析、构造DNS回复
type GoDNSServer struct {
    ServerConfig DNSServerConfig
    Netter       Netter
    Responer     Responser
}

// GoDNSServer 启动!
func (s *GoDNSServer) Start()
Netter

Netter 数据包监听器:接收、解析、发送数据包,并维护连接状态。

type Netter struct { // size=16 (0x10)
    Config NetterConfig
}

// Send 函数用于发送数据包
func (n *Netter) Send(connInfo ConnectionInfo, data []byte)

// Sniff 函数用于监听指定端口,并返回链接信息通道
func (n *Netter) Sniff() chan ConnectionInfo

// handleListener 函数用于处理 TCP 链接
func (n *Netter) handleListener(lstr net.Listener, connChan chan 
ConnectionInfo)

// handlePktConn 函数用于处理 数据包 链接
func (n *Netter) handlePktConn(pktConn net.PacketConn, connChan chan 
ConnectionInfo)

// handleStreamConn 函数用于处理 流式链接
func (n *Netter) handleStreamConn(conn net.Conn, connChan chan ConnectionInfo)
Responser

Responser DNS回复器:响应、解析、构造DNS回复。

Responser是一个接口。 实现该接口的结构体将根据 DNS 查询信息生成 DNS 回复信息。

type Responser interface { // size=16 (0x10)
    // Response 根据 DNS 查询信息生成 DNS 回复信息。
    // 其参数为:
    //   - qInfo QueryInfo,DNS 查询信息
    // 返回值为:
    //   - ResponseInfo,DNS 回复信息
    //   - error,错误信息
    Response(ConnectionInfo) (dns.DNSMessage, error)
}

示例

通过下述几行代码,可以一键启动一个基础的 GoDNS 服务器:

// 创建一个 DNS 服务器
server := godns.GoDNSServer{
    ServerConfig: sConf,
    Netter: godns.Netter{
        Config: godns.NetterConfig{
        Port: sConf.Port,
            MTU:  sConf.MTU,
        },
    },
    Responer: &DullResponser{
        ServerConf: sConf,
    },
}
server.Start()

构造和生成 DNS 回复

通过实现 Responser 接口,可以自定义 DNS 回复的生成方式。

responser.go 文件中提供了若干的 Responser 实现示例及许多辅助函数,以供参考。

dns 包

dns 包使用Go的内置实现,提供了 DNS消息 的编解码功能,可以用于任意构造和解析 DNS消息。

DNSMessage表示 DNS协议 的消息结构。

type DNSMessage struct {
    // DNS消息头部
    Header DNSHeader // DNS 头部(Header)
    // DNS消息的各个部分(Section)
    Question   DNSQuestionSection // DNS 查询部分(Questions Section)
    Answer     DNSResponseSection // DNS 回答部分(Answers Section)
    Authority  DNSResponseSection // DNS 权威部分(Authority Section)
    Additional DNSResponseSection // DNS 附加部分(Additional Section)
}

dns包中的每个结构体基本都实现了以下方法:

// 从缓冲区中自解码
func (s *struct) DecodeFromBuffer(buffer []byte, offset int) (int, error)

// 编码为字节流
func (s *struct) Encode() []byte

// 编码到缓冲区
func (s *struct) EncodeToBuffer(buffer []byte) (int, error)

// 获取结构体的*实际*大小
func (s *struct) Size() int

// 获取结构体的字符串表示
func (s *struct) String() string

// [部分实现]判断两个结构体是否相等
func (s *struct) Equal(other *struct) bool

这些方法使得可以方便地对 DNS 消息进行编解码。

dns包对 DNS 消息的格式没有强制限制,并且支持对 未知类型的资源记录 进行编解码, 这使得其可以随意构造和解析 DNS 消息,来满足实验需求。

xperi 子包

xperi 包实现了一些实验用函数,特别是 DNSSEC 相关的辅助函数,包括:

  • ParseKeyBase64 用于解析 Base64 编码的 DNSKEY 为字节形式。

  • CalculateKeyTag 用于计算 DNSKEY 的 Key Tag。

  • GenerateRDATADNSKEY 根据参数生成 DNSKEY RDATA。

  • GenerateRDATARRSIG 根据参数对RRSET进行签名,生成 RRSIG RDATA。

  • GenerateRDATADS 根据参数生成 DNSKEY 的 DS RDATA。

  • GenerateRRDNSKEY 根据参数生成 DNSKEY RR。

  • GenerateRRRRSIG 根据参数对RRSET进行签名,生成 RRSIG RR。

  • GenerateRRDS 根据参数生成 DNSKEY 的 DS RR。

  • GenRandomRRSIG 用于生成一个随机的 RRSIG RDATA。

  • GenWrongKeyWithTag 用于生成错误的,但具有指定 KeyTag 的 DNSKEY RDATA。

  • GenKeyWithTag [该函数十分耗时] 用于生成一个具有指定 KeyTag 的 DNSKEY。

许可证

本项目遵循 GPL-3.0 许可证


如需更多信息或支持,请访问我们的 GitHub 页面

Documentation

Overview

简体中文

GoDNS 是一个快速、灵活的实验用 DNS 服务器,旨在帮助开发者和研究人员探索和实验 DNS 协议的各种特性。

GoDNSServer

GoDNSServer 是对 DNS 服务器的最顶层封装。

GoDNSServer 包含以下三部分:

  • ServerConfig: DNS 服务器配置
  • Netter: 数据包处理器
  • Responser: DNS回复器

Netter 接收、解析、发送数据包,并维护连接状态。

Responser 响应、解析、构造DNS回复。

示例

通过下述几行代码,可以一键启动一个基础的 GoDNS 服务器:

server := godns.GoDNSServer{
	ServerConfig: sConf,
	Netter: godns.Netter{
		Config: godns.NetterConfig{
		Port: sConf.Port,
			MTU:  sConf.MTU,
		},
	},
	Responer: &DullResponser{
		ServerConf: sConf,
	},
}
server.Start()

构造、生成 DNS 回复

[Responser]用于响应、解析、构造 DNS 回复

// Responser 是一个 DNS 回复器接口。
// 实现该接口的结构体将根据 DNS 查询信息生成 DNS 回复信息。
type Responser interface {
	// Response 根据 DNS 查询信息生成 DNS 回复信息。
	// 其参数为:
	//   - qInfo QueryInfo,DNS 查询信息
	// 返回值为:
	//   - ResponseInfo,DNS 回复信息
	//   - error,错误信息
	Response(ConnectionInfo) (dns.DNSMessage, error)
}

通过实现 Responser 接口,可以自定义 DNS 回复的生成方式。 [responser.go]文件中提供了若干的 Responser 实现示例, 及许多辅助函数,如 “笨笨”处理器、DNSSECResponser、 [ParseQueryInfo]、[ParseResponseInfo] 等。

可以参考它们的实现方式来实现自定义的 Responser, 从而随意构造 DNS 回复,实现更加复杂的回复逻辑。

dns 包

dns 使用Go的内置实现,提供了 DNS消息 的编解码功能,可以用于任意构造和解析 DNS消息。

dns.DNSMessage 表示 DNS协议 的消息结构。

type DNSMessage struct {
	// DNS消息 头部
	Header DNSHeader // DNS 头部(Header)
	// DNS消息的各个部分(Section)
	Question   DNSQuestionSection // DNS 查询部分(Questions Section)
	Answer     DNSResponseSection // DNS 回答部分(Answers Section)
	Authority  DNSResponseSection // DNS 权威部分(Authority Section)
	Additional DNSResponseSection // DNS 附加部分(Additional Section)
}

dns包中的每个结构体基本都实现了以下方法:

  • func (s *struct) DecodeFromBuffer(buffer []byte, offset int) (int, error)
  • func (s *struct) Encode() []byte
  • func (s *struct) EncodeToBuffer(buffer []byte) (int, error)
  • func (s *struct) Size() int
  • func (s *struct) String() string
  • [少部分实现]func (s *struct) Equal(other *struct) bool

这些方法使得可以方便地对 DNS 消息进行编解码。

dns包对 DNS 消息的格式没有强制限制,并且支持对 未知类型的资源记录 进行编解码, 这使得其可以随意构造和解析 DNS 消息,来满足实验需求。

xperi 子包

xperi 包实现了一些实验用函数。

其中 dnssec.go 文件提供了一系列 DNSSEC 相关实验辅助函数。

  • ParseKeyBase64 用于解析 Base64 编码的 DNSKEY 为字节形式。

  • CalculateKeyTag 用于计算 DNSKEY 的 Key Tag。

  • GenerateRDATADNSKEY 根据参数生成 DNSKEY RDATA。

  • GenerateRDATARRSIG 根据参数对RRSET进行签名,生成 RRSIG RDATA。

  • GenerateRDATADS 根据参数生成 DNSKEY 的 DS RDATA。

  • GenerateRRDNSKEY 根据参数生成 DNSKEY RR。

  • GenerateRRRRSIG 根据参数对RRSET进行签名,生成 RRSIG RR。

  • GenerateRRDS 根据参数生成 DNSKEY 的 DS RR。

  • GenRandomRRSIG 用于生成一个随机的 RRSIG RDATA。

  • GenWrongKeyWithTag 用于生成错误的,但具有指定 KeyTag 的 DNSKEY RDATA。

  • GenKeyWithTag [该函数十分耗时] 用于生成一个具有指定 KeyTag 的 DNSKEY。

English

GoDNS is a fast and flexible experimental DNS server designed to help developers and researchers explore and experiment with various features of the DNS protocol.

GoDNSServer

GoDNSServer is the top-level abstraction for a DNS server.

GoDNSServer consists of the following three components:

  • ServerConfig: DNS server configuration
  • Netter: Packet handler
  • Responser: DNS responder

Netter receives, parses, and sends packets while maintaining connection states.

Responser responds to, parses, and constructs DNS replies.

Example

You can quickly start a basic GoDNS server with the following lines of code:

server := godns.GoDNSServer{
	ServerConfig: sConf,
	Netter: godns.Netter{
		Config: godns.NetterConfig{
			Port: sConf.Port,
			MTU:  sConf.MTU,
		},
	},
	Responser: &DullResponser{
		ServerConf: sConf,
	},
}
server.Start()

Constructing and Generating DNS Responses

Responser is responsible for responding to, parsing, and constructing DNS replies.

// Responser is a DNS responder interface.
// Structures implementing this interface generate DNS responses based on DNS query information.
type Responser interface {
	// Response generates a DNS response based on the DNS query information.
	// The parameter is:
	//   - qInfo QueryInfo, DNS query information
	// The return value is:
	//   - ResponseInfo, DNS response information
	//   - error, an error if occurred
	Response(ConnectionInfo) (dns.DNSMessage, error)
}

By implementing the Responser interface, you can customize how DNS responses are generated. The responser.go file provides several examples of Responser implementations, as well as many utility functions like [ParseQueryInfo], [ParseResponseInfo], etc.

You can refer to these implementations to create your own custom Responser, allowing you to construct DNS responses in any way you choose, and implement more complex reply logic.

dns package

The dns package uses Go's built-in functions to provide DNS message encoding and decoding support.

dns.DNSMessage is the top-level abstraction for a DNS message structure.

// DNSMessage represents a DNS protocol message structure.

type DNSMessage struct {
	// DNS message header
	Header DNSHeader // DNS header (Header)
	// Sections of the DNS message
	Question   DNSQuestionSection // DNS query section (Questions Section)
	Answer     DNSResponseSection // DNS answer section (Answers Section)
	Authority  DNSResponseSection // DNS authority section (Authority Section)
	Additional DNSResponseSection // DNS additional section (Additional Section)
}

The dns package does not impose strict limitations on the DNS message format, and it supports encoding and decoding of unknown resource record types, allowing you to construct and parse DNS messages freely to meet experimental needs.

xperi subpackage

The xperi package implements several experimental utility functions.

The dnssec.go file provides a series of experimental functions related to DNSSEC.

  • ParseKeyBase64: Parses a Base64 encoded DNSKEY into a byte array.

  • CalculateKeyTag: Calculates the Key Tag for a DNSKEY.

  • GenerateRDATADNSKEY: Generates the DNSKEY RDATA based on parameters.

  • GenerateRDATARRSIG: Signs the RRSET and generates RRSIG RDATA.

  • GenerateRDATADS: Generates the DS RDATA for a DNSKEY.

  • GenerateRRDNSKEY: Generates a DNSKEY RR based on parameters.

  • GenerateRRRRSIG: Signs the RRSET and generates RRSIG RR.

  • GenerateRRDS: Generates the DS RR for a DNSKEY.

  • GenRandomRRSIG: Generates a random RRSIG RDATA.

  • GenWrongKeyWithTag: Generates an incorrect DNSKEY with a specified KeyTag.

  • GenKeyWithTag [This function is resource-intensive]: Generates a DNSKEY with a specified KeyTag.

Index

Constants

This section is empty.

Variables

View Source
var NXDOMAINResponse = dns.DNSMessage{
	Header: dns.DNSHeader{

		QR:     true,
		OpCode: dns.DNSOpCodeQuery,
		AA:     true,
		TC:     false,
		RD:     false,
		RA:     false,
		Z:      0,

		RCode: dns.DNSResponseCodeNXDomain,

		ANCount: 0,
		NSCount: 0,
		ARCount: 0,
	},

	Answer:     []dns.DNSResourceRecord{},
	Authority:  []dns.DNSResourceRecord{},
	Additional: []dns.DNSResourceRecord{},
}

NXDOMAINResponse 是一个默认的 NXDOMAIN 回复信息。

Functions

func EstablishToC added in v1.2.0

func EstablishToC(qry dns.DNSMessage, dConf DNSSECConfig, dMap map[string]DNSSECMaterial, resp *dns.DNSMessage) error

EstablishToC 根据查询自动添加 DNSKEY,DS,RRSIG 记录 自动完成信任链(Trust of Chain)的建立。 其接受参数为:

  • qry dns.DNSMessage,查询信息
  • dConf DNSSECConfig,DNSSEC 配置
  • dMap map[string]DNSSECMaterial,区域名与其相应 DNSSEC 材料的映射
  • resp *dns.DNSMessage,回复信息

func FixCount added in v1.0.0

func FixCount(resp *dns.DNSMessage)

FixCount 修正回复信息中的计数字段

func GoStart

func GoStart(serverConf DNSServerConfig)

GoStart为示例函数,其将会一键式创建一个基础 GoDNS 并启动它。 这个 GoDNS 将有一个DullResponser,它将对DNS请求做出简单的回复... 参数:

  • DNSServerConfig: DNS 服务器配置
  • Responser: DNS 回复生成器

func InitNXDOMAIN added in v1.2.0

func InitNXDOMAIN(qry dns.DNSMessage) dns.DNSMessage

InitNXDOMAIN 根据查询信息初始化 NXDOMAIN 回复信息 其接受参数为:

  • qry dns.DNSMessage,查询信息

返回值为:

  • dns.DNSMessage,初始化后的 NXDOMAIN 回复信息

该函数会返回具有相同 ID 和 Question 字段的 NXDOMAIN 回复信息

func InitResponse added in v1.2.0

func InitResponse(qry dns.DNSMessage, defaultResp dns.DNSMessage) dns.DNSMessage

InitRespone 根据查询信息初始化传入的 默认回复信息 其接受参数为:

  • qry dns.DNSMessage,查询信息
  • defaultResp dns.DNSMessage,默认回复信息

返回值为:

  • dns.DNSMessage,初始化后的回复信息

该函数会将回复信息的 ID 和 Question 字段设置为查询信息的对应字段

func InitTrustAnchor added in v1.0.0

func InitTrustAnchor(zName string, dConf DNSSECConfig,
	kBytes, pkBytes []byte) map[string]DNSSECMaterial

InitTrustAnchor 根据 DNSSEC 配置生成指定区域的信任锚点 其接受参数为:

  • zName string,区域名
  • dConf DNSSECConfig,DNSSEC 配置
  • kBytes []byte,KSK 公钥
  • pkBytes []byte,KSK 私钥

返回值为:

  • map[string]DNSSECMaterial,生成的信任锚点

func ParseQuery added in v1.2.0

func ParseQuery(connInfo ConnectionInfo) (dns.DNSMessage, error)

ParseQuery 解析 DNS 查询信息 其接受参数为:

  • connInfo ConnectionInfo,连接信息

返回值为:

  • dns.DNSMessage,解析后的 DNS 查询信息
  • error,错误信息

Types

type BaseManager added in v1.3.0

type BaseManager struct {
	// DNSSEC 配置
	DNSSECConf DNSSECConfig
	// 区域名与其相应 DNSSEC 材料的映射
	// 在初始化 DNSSEC Responser 时需要为其手动添加信任锚点
	DNSSECMap map[string]DNSSECMaterial
}

BaseManager 是一个 DNSSEC 管理器 实现范例。 它会根据查询信息生成 DNSSEC 签名后的 DNS 回复信息。 该结构体可以用于一键化支持 DNSSEC。 如果要实现更为复杂的 DNSSEC 管理逻辑,可以根据需求自定义 BaseManager 结构体。

func (*BaseManager) EnableDNSSEC added in v1.3.0

func (d *BaseManager) EnableDNSSEC(qry dns.DNSMessage, resp *dns.DNSMessage)

EnableDNSSEC 检查 DNS 回复信息,并对其进行 DNSSEC 签名, 实现一键化支持 DNSSEC。 其接受参数为:

  • qry dns.DNSMessage,查询信息
  • resp *dns.DNSMessage,回复信息

该函数会为传入的回复信息自动添加相关的 DNSSEC 记录, 目前尚未实现 规范化排序 功能,需要确保传入回复信息中的记录已经按照规范化排序, 否则会导致签名失败。

type ConnectionInfo added in v1.2.0

type ConnectionInfo struct {
	Protocol Protocol // 网络协议
	Address  net.Addr //	地址

	StreamConn net.Conn       // TCP 链接
	PacketConn net.PacketConn // UDP 链接

	Packet []byte //	数据包
}

ConnectionInfo 结构体用于记录链接信息 其包含以下字段:

  • Protocol: Protocol,网络协议
  • Address: net.Addr,地址
  • StreamConn: net.Conn,TCP 链接
  • PacketConn: net.PacketConn,UDP 链接
  • Packet: []byte,数据包

type DNSSECConfig added in v1.0.0

type DNSSECConfig struct {
	// DNSSEC 签名算法
	DAlgo dns.DNSSECAlgorithm
	// DNSSEC 摘要算法
	DType dns.DNSSECDigestType
}

DNSSECConfig 表示 DNSSEC 签名配置 如果需要多种签名配置,可以根据需求实现自己的签名配置结构体

type DNSSECManager added in v1.2.0

type DNSSECManager interface {
	EnableDNSSEC(qry dns.DNSMessage, resp *dns.DNSMessage)
	SignSection(section []dns.DNSResourceRecord) []dns.DNSResourceRecord
	SignRRSet(rrset []dns.DNSResourceRecord) dns.DNSResourceRecord
	EstablishToC(qry dns.DNSMessage, resp *dns.DNSMessage) error
	GetDNSSECMaterial(zName string) DNSSECMaterial
	CreateDNSSECMaterial(zName string) DNSSECMaterial
}

type DNSSECMaterial added in v1.0.0

type DNSSECMaterial struct {
	// KSKTag 是区域的 KSK 标签
	KSKTag int
	// ZSKTag 是区域的 ZSK 标签
	ZSKTag int
	// PrivateKSK 是区域的 KSK 私钥
	PrivateKSK []byte
	// PrivateZSK 是区域的 ZSK 私钥
	PrivateZSK []byte
	// DNSKEYRespSec 储存区域的 DNSKEY 记录
	DNSKEYRespSec []dns.DNSResourceRecord
}

DNSSECMaterial 表示签名一个区域所需的 DNSSEC 材料 如果需要更复杂的处理逻辑,可以根据需求实现自己的 DNSSEC 材料结构体

func CreateDNSSECMaterial added in v1.2.0

func CreateDNSSECMaterial(dConf DNSSECConfig, zName string) DNSSECMaterial

CreateDNSSECMaterial 根据 DNSSEC 配置生成指定区域的 DNSSEC 材料 其接受参数为:

  • dConf DNSSECConfig,DNSSEC 配置
  • zName string,区域名

返回值为:

  • DNSSECMaterial,生成的 DNSSEC 材料

该函数会为指定区域生成一个 KSK 和一个 ZSK,并生成一个 DNSKEY 记录和一个 RRSIG 记录。

func GetDNSSECMaterial added in v1.2.0

func GetDNSSECMaterial(dConf DNSSECConfig, dMap map[string]DNSSECMaterial, zName string) DNSSECMaterial

GetDNSSECMaterial 获取指定区域的 DNSSEC 材料 如果该区域的 DNSSEC 材料不存在,则会根据 DNSSEC 配置生成一个

type DNSSECResponser added in v1.0.0

type DNSSECResponser struct {
	ServerConf    DNSServerConfig
	DNSSECManager BaseManager
}

DNSSECResponser 是一个支持 DNSSEC 的 回复器 实现范例, 它会回复启用DNSSEC签名后的A记录信息, 基本上是开启DNSSEC后的 “笨笨回复器”。

func (*DNSSECResponser) Response added in v1.0.0

func (d *DNSSECResponser) Response(connInfo ConnectionInfo) (dns.DNSMessage, error)

Response 根据 DNS 查询信息生成 DNS 回复信息。

type DNSServerConfig

type DNSServerConfig struct {
	// DNS 服务器的 IP 地址
	IP net.IP
	// DNS 服务器的端口
	Port int
	// 网络设备的最大传输单元
	MTU int
}

DNSServerConfig 记录 DNS 服务器的相关配置

type DullResponser

type DullResponser struct {
	ServerConf DNSServerConfig
}

DullResponser 是一个"笨笨的" 回复器实现。 它会回复所查询名称的 A 记录,地址指向服务器的 IP 地址。

func (*DullResponser) Response

func (d *DullResponser) Response(connInfo ConnectionInfo) (dns.DNSMessage, error)

Response 根据 DNS 查询信息生成 DNS 回复信息。 DullResponser 会回复所查询名称的 A 记录,地址指向服务器的 IP 地址。

type GoDNSServer added in v1.2.0

type GoDNSServer struct {
	ServerConfig DNSServerConfig
	Netter       Netter
	Responer     Responser
}

GoDNSServer 表示 GoDNS 服务器 其包含以下三部分:

  • ServerConfig: DNS 服务器配置
  • Sniffer: 数据包嗅探器
  • Handler: 数据包处理器

func (*GoDNSServer) Start added in v1.2.0

func (s *GoDNSServer) Start()

Start 启动 GoDNS 服务器

type Netter added in v1.2.0

type Netter struct {
	Config NetterConfig
}

Netter 数据包监听器:接收、解析、发送数据包,并维护连接状态。

func (*Netter) Send added in v1.2.0

func (n *Netter) Send(connInfo ConnectionInfo, data []byte)

Send 函数用于发送数据包 其接收参数为:

  • connInfo: ConnectionInfo,链接信息
  • data: []byte,数据包

func (*Netter) Sniff added in v1.2.0

func (n *Netter) Sniff() chan ConnectionInfo

Sniff 函数用于监听指定端口,并返回链接信息通道 其返回值为:chan ConnectionInfo,链接信息通道

type NetterConfig added in v1.2.0

type NetterConfig struct {
	Port int
	MTU  int
}

NetterConfig 结构体用于记录网络监听器的配置

type Protocol

type Protocol string

Protocol 用于表示网络协议

const (
	ProtocolUDP Protocol = "udp"
	ProtocolTCP Protocol = "tcp"
)

func (*Protocol) String added in v1.2.1

func (p *Protocol) String() string

type Responser

type Responser interface {
	// Response 根据 DNS 查询信息生成 DNS 回复信息。
	// 其参数为:
	//   - qInfo QueryInfo,DNS 查询信息
	// 返回值为:
	//   - ResponseInfo,DNS 回复信息
	//   - error,错误信息
	Response(ConnectionInfo) (dns.DNSMessage, error)
}

Responser 是一个 DNS 回复器 接口。 实现该接口的结构体将根据 DNS 查询信息生成 DNS 回复信息。

Directories

Path Synopsis
dns
dns 使用Go的内置实现,提供了 DNS消息 的编解码功能,可以用于任意构造和解析 DNS消息。
dns 使用Go的内置实现,提供了 DNS消息 的编解码功能,可以用于任意构造和解析 DNS消息。
xperi
xperi 包实现了一些实验用函数。
xperi 包实现了一些实验用函数。

Jump to

Keyboard shortcuts

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