婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > golang DNS服務(wù)器的簡(jiǎn)單實(shí)現(xiàn)操作

golang DNS服務(wù)器的簡(jiǎn)單實(shí)現(xiàn)操作

熱門(mén)標(biāo)簽:外呼系統(tǒng)顯本地手機(jī)號(hào) 百度地圖標(biāo)注后傳給手機(jī) 外呼系統(tǒng)用什么卡 涿州代理外呼系統(tǒng) 壽光微信地圖標(biāo)注 excel地圖標(biāo)注分布數(shù)據(jù) 阿克蘇地圖標(biāo)注 評(píng)價(jià)高的400電話辦理 電話機(jī)器人軟件免費(fèi)

簡(jiǎn)單的DNS服務(wù)器

提供一個(gè)簡(jiǎn)單的可以查詢域名和反向查詢的DNS服務(wù)器。

dig命令主要用來(lái)從 DNS 域名服務(wù)器查詢主機(jī)地址信息。

查找www.baidu.com的ip (A記錄):

命令:dig @127.0.0.1 www.baidu.com

根據(jù)ip查找對(duì)應(yīng)域名 (PTR記錄):

命令:dig @127.0.0.1 -x 220.181.38.150

源碼 :

package main
import (
	"fmt"
	"net"
	"golang.org/x/net/dns/dnsmessage"
)
func main() {
	conn, err := net.ListenUDP("udp", net.UDPAddr{Port: 53})
	if err != nil {
		panic(err)
	}
	defer conn.Close()
	fmt.Println("Listing ...")
	for {
		buf := make([]byte, 512)
		_, addr, _ := conn.ReadFromUDP(buf)
		var msg dnsmessage.Message
		if err := msg.Unpack(buf); err != nil {
			fmt.Println(err)
			continue
		}
		go ServerDNS(addr, conn, msg)
	}
}
// address books
var (
	addressBookOfA = map[string][4]byte{
		"www.baidu.com.": [4]byte{220, 181, 38, 150},
	}
	addressBookOfPTR = map[string]string{
		"150.38.181.220.in-addr.arpa.": "www.baidu.com.",
	}
)
// ServerDNS serve
func ServerDNS(addr *net.UDPAddr, conn *net.UDPConn, msg dnsmessage.Message) {
	// query info
	if len(msg.Questions)  1 {
		return
	}
	question := msg.Questions[0]
	var (
		queryTypeStr = question.Type.String()
		queryNameStr = question.Name.String()
		queryType    = question.Type
		queryName, _ = dnsmessage.NewName(queryNameStr)
	)
	fmt.Printf("[%s] queryName: [%s]\n", queryTypeStr, queryNameStr)
	// find record
	var resource dnsmessage.Resource
	switch queryType {
	case dnsmessage.TypeA:
		if rst, ok := addressBookOfA[queryNameStr]; ok {
			resource = NewAResource(queryName, rst)
		} else {
			fmt.Printf("not fount A record queryName: [%s] \n", queryNameStr)
			Response(addr, conn, msg)
			return
		}
	case dnsmessage.TypePTR:
		if rst, ok := addressBookOfPTR[queryName.String()]; ok {
			resource = NewPTRResource(queryName, rst)
		} else {
			fmt.Printf("not fount PTR record queryName: [%s] \n", queryNameStr)
			Response(addr, conn, msg)
			return
		}
	default:
		fmt.Printf("not support dns queryType: [%s] \n", queryTypeStr)
		return
	}
	// send response
	msg.Response = true
	msg.Answers = append(msg.Answers, resource)
	Response(addr, conn, msg)
}
// Response return
func Response(addr *net.UDPAddr, conn *net.UDPConn, msg dnsmessage.Message) {
	packed, err := msg.Pack()
	if err != nil {
		fmt.Println(err)
		return
	}
	if _, err := conn.WriteToUDP(packed, addr); err != nil {
		fmt.Println(err)
	}
}
// NewAResource A record
func NewAResource(query dnsmessage.Name, a [4]byte) dnsmessage.Resource {
	return dnsmessage.Resource{
		Header: dnsmessage.ResourceHeader{
			Name:  query,
			Class: dnsmessage.ClassINET,
			TTL:   600,
		},
		Body: dnsmessage.AResource{
			A: a,
		},
	}
}
// NewPTRResource PTR record
func NewPTRResource(query dnsmessage.Name, ptr string) dnsmessage.Resource {
	name, _ := dnsmessage.NewName(ptr)
	return dnsmessage.Resource{
		Header: dnsmessage.ResourceHeader{
			Name:  query,
			Class: dnsmessage.ClassINET,
		},
		Body: dnsmessage.PTRResource{
			PTR: name,
		},
	}
}

補(bǔ)充:Golang自定義DNS Nameserver

某些情況下我們希望程序通過(guò)自定義Nameserver去查詢域名,而不希望通過(guò)操作系統(tǒng)給定的Nameserver,本文介紹如何在Golang中實(shí)現(xiàn)自定義Nameserver。

DNS解析過(guò)程

Golang中一般通過(guò)net.Resolver的LookupHost(ctx context.Context, host string) (addrs []string, err error)去實(shí)現(xiàn)域名解析,

解析過(guò)程如下:

檢查本地hosts文件是否存在解析記錄,存在即返回解析地址

不存在即根據(jù)resolv.conf中讀取的nameserver發(fā)起遞歸查詢

nameserver不斷的向上級(jí)nameserver發(fā)起迭代查詢

nameserver最終返回查詢結(jié)果給請(qǐng)求者

用戶可以通過(guò)修改/etc/resolv.conf來(lái)添加特定的nameserver,但某些場(chǎng)景下我們不希望更改系統(tǒng)配置。比如在kubernetes中,作為sidecar服務(wù)需要通過(guò)service去訪問(wèn)其他集群內(nèi)服務(wù),必須更改dnsPolicy為ClusterFirst,但這可能會(huì)影響其他容器的DNS查詢效率。

自定義Nameserver

在Golang中自定義Nameserver,需要我們自己實(shí)現(xiàn)一個(gè)Resolver,如果是httpClient需要自定義DialContext()

Resolver實(shí)現(xiàn)如下:

// 默認(rèn)dialer
dialer := net.Dialer{
  Timeout: 1 * time.Second,
}
// 定義resolver
resolver := net.Resolver{
 Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
  return dialer.DialContext(ctx, "tcp", nameserver) // 通過(guò)tcp請(qǐng)求nameserver解析域名
 },
}

自定義Dialer如下:

type Dialer struct {
 dialer     *net.Dialer
 resolver   *net.Resolver
 nameserver string
}
// NewDialer create a Dialer with user's nameserver.
func NewDialer(dialer *net.Dialer, nameserver string) (*Dialer, error) {
 conn, err := dialer.Dial("tcp", nameserver)
 if err != nil {
  return nil, err
 }
 defer conn.Close()
 return Dialer{
  dialer: dialer,
  resolver: net.Resolver{
   Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
    return dialer.DialContext(ctx, "tcp", nameserver)
   },
  },
  nameserver: nameserver, // 用戶設(shè)置的nameserver
 }, nil
}
// DialContext connects to the address on the named network using
// the provided context.
func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
 host, port, err := net.SplitHostPort(address)
 if err != nil {
  return nil, err
 }
 ips, err := d.resolver.LookupHost(ctx, host) // 通過(guò)自定義nameserver查詢域名
 for _, ip := range ips {
    // 創(chuàng)建鏈接
  conn, err := d.dialer.DialContext(ctx, network, ip+":"+port)
  if err == nil {
   return conn, nil
  }
 }
 return d.dialer.DialContext(ctx, network, address)
}

httpClient中自定義DialContext()如下:

ndialer, _ := NewDialer(dialer, nameserver)
client := http.Client{
  Transport: http.Transport{
    DialContext:         ndialer.DialContext,
    TLSHandshakeTimeout: 10 * time.Second,
  },
  Timeout: timeout,
}

總結(jié)

通過(guò)以上實(shí)現(xiàn)可解決自定義Nameserver,也可以在Dailer中添加緩存,實(shí)現(xiàn)DNS緩存。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang-gin-mgo高并發(fā)服務(wù)器搭建教程
  • golang HTTP 服務(wù)器 處理 日志/Stream流的操作
  • golang項(xiàng)目如何上線部署到Linu服務(wù)器(方法詳解)
  • golang文件服務(wù)器的兩種方式(可以訪問(wèn)任何目錄)
  • golang搭建靜態(tài)web服務(wù)器的實(shí)現(xiàn)方法
  • 詳解如何熱重啟golang服務(wù)器
  • 淺談Golang中創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)器的方法
  • 基于 HLS 創(chuàng)建 Golang 視頻流服務(wù)器的優(yōu)缺點(diǎn)

標(biāo)簽:欽州 吐魯番 汕頭 雞西 蘭州 銅川 梅河口 重慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang DNS服務(wù)器的簡(jiǎn)單實(shí)現(xiàn)操作》,本文關(guān)鍵詞  golang,DNS,服務(wù)器,的,簡(jiǎn)單,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang DNS服務(wù)器的簡(jiǎn)單實(shí)現(xiàn)操作》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang DNS服務(wù)器的簡(jiǎn)單實(shí)現(xiàn)操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲精品亚洲人成人网| 成人一级片在线观看| 欧美精品乱码久久久久久| 精品一区二区国语对白| 亚洲影视在线播放| 国产精品久久免费看| 日韩美女在线视频| 欧美福利视频一区| 欧美在线制服丝袜| 99re6这里只有精品视频在线观看| 精品国产一二三区| 欧美日韩国产小视频在线观看| 99在线热播精品免费| 粉嫩蜜臀av国产精品网站| 国产在线视频一区二区| 极品少妇一区二区三区精品视频| 午夜久久福利影院| 亚洲国产精品麻豆| 亚洲精品乱码久久久久久黑人 | 亚洲国产毛片aaaaa无费看| 中文字幕成人av| 亚洲国产精华液网站w| 久久综合精品国产一区二区三区| 91精品欧美综合在线观看最新| 欧美日本一区二区三区| 欧美日韩黄色一区二区| 欧美性受xxxx黑人xyx| 欧美视频在线观看一区| 欧美精品自拍偷拍| 日韩欧美一级精品久久| 精品日韩99亚洲| 久久久国产综合精品女国产盗摄| 精品国产免费人成电影在线观看四季 | 麻豆91免费观看| 美女脱光内衣内裤视频久久影院| 日韩电影一二三区| 九色综合国产一区二区三区| 国内偷窥港台综合视频在线播放| 国产大陆亚洲精品国产| 成人av午夜影院| 欧美日韩综合在线免费观看| 9191久久久久久久久久久| 精品乱人伦小说| 亚洲婷婷国产精品电影人久久| 一区二区三区自拍| 日本一道高清亚洲日美韩| 精品一区二区三区免费视频| 成人黄色大片在线观看| 欧美午夜精品电影| 久久亚洲私人国产精品va媚药| 日韩一区中文字幕| 奇米影视7777精品一区二区| 国产河南妇女毛片精品久久久| 91麻豆6部合集magnet| 在线综合亚洲欧美在线视频| 国产精品沙发午睡系列990531| 亚洲综合在线第一页| 国产真实乱对白精彩久久| 日本久久电影网| 日韩欧美亚洲国产另类| 亚洲人成精品久久久久久 | 国产福利不卡视频| 欧洲一区二区三区免费视频| 精品国产自在久精品国产| 综合av第一页| 精品一区二区三区的国产在线播放| 成人黄色免费短视频| 日韩欧美国产一区在线观看| 中文字幕一区二区三区四区| 老司机一区二区| 欧美日韩中文一区| 亚洲欧洲精品天堂一级| 久久国产视频网| 欧美中文一区二区三区| 中文字幕欧美激情一区| 日韩高清中文字幕一区| 色噜噜狠狠色综合中国| 欧美国产一区视频在线观看| 久久av资源站| 欧美午夜一区二区| 亚洲视频你懂的| 成人a免费在线看| 久久精品人人做| 美女一区二区三区| 制服视频三区第一页精品| 亚洲一区成人在线| 色呦呦国产精品| 综合自拍亚洲综合图不卡区| 粉嫩一区二区三区在线看| 精品蜜桃在线看| 蜜臀a∨国产成人精品| 欧美色男人天堂| 亚洲国产综合人成综合网站| 色先锋资源久久综合| 亚洲素人一区二区| 97久久超碰国产精品电影| 中文字幕不卡在线播放| 成人黄色在线看| 亚洲国产高清在线观看视频| 国产成人福利片| 国产欧美一区二区三区鸳鸯浴| 国产老妇另类xxxxx| 久久综合色之久久综合| 精品一区二区三区影院在线午夜 | 国产精品久久久99| 成人污视频在线观看| 国产精品久久久久影视| 97超碰欧美中文字幕| 亚洲欧洲色图综合| 色婷婷激情综合| 亚洲gay无套男同| 欧美一区二区黄| 国模娜娜一区二区三区| 欧美国产精品劲爆| 91视频免费播放| 亚洲成人av免费| 精品久久久久一区二区国产| 国产精品69久久久久水密桃| 国产精品卡一卡二| 欧美性xxxxxxxx| 另类调教123区| 中文字幕亚洲成人| 777xxx欧美| 高清国产午夜精品久久久久久| 国产精品久久久久久久久免费相片 | 粉嫩av一区二区三区粉嫩| 国产精品沙发午睡系列990531| 欧洲精品视频在线观看| 蜜桃av一区二区三区| 国产色产综合色产在线视频| 色综合久久综合中文综合网| 亚洲一区二区欧美激情| 精品国产3级a| 不卡av在线免费观看| 日韩av一级片| 国产精品福利一区二区三区| 在线不卡的av| 丰满岳乱妇一区二区三区| 丝袜诱惑制服诱惑色一区在线观看 | 久久99最新地址| 国产精品久久久久四虎| 欧美精选在线播放| 大陆成人av片| 免费欧美在线视频| 自拍偷自拍亚洲精品播放| 欧美岛国在线观看| 精品污污网站免费看| 国产精品影视网| 日韩激情视频网站| 亚洲视频你懂的| 亚洲国产精品成人综合色在线婷婷 | 国产一区二区三区免费观看| 一区二区三区 在线观看视频| 久久久噜噜噜久久中文字幕色伊伊 | 久久草av在线| 亚洲欧美色一区| 国产欧美一区二区精品性| 91精品国产综合久久久蜜臀图片| bt欧美亚洲午夜电影天堂| 国内精品国产成人| 美美哒免费高清在线观看视频一区二区| 国产精品人妖ts系列视频| 精品国产一区二区亚洲人成毛片| 欧美日韩美少妇| 91视频com| 色综合久久中文综合久久97| 国产iv一区二区三区| 久久99国产精品麻豆| 人人狠狠综合久久亚洲| 香蕉乱码成人久久天堂爱免费| 亚洲综合清纯丝袜自拍| 亚洲欧美日韩一区| 亚洲另类春色国产| 亚洲综合成人在线视频| 一区二区在线免费观看| 亚洲夂夂婷婷色拍ww47| 一区二区视频在线看| 亚洲精品日韩一| 一区二区理论电影在线观看| 亚洲一区二区精品久久av| 亚洲高清久久久| 日韩av高清在线观看| 精品一区二区三区香蕉蜜桃| 国产毛片一区二区| 国产精品自产自拍| 岛国一区二区三区| www.视频一区| 91久久精品日日躁夜夜躁欧美| 色婷婷综合久久久久中文一区二区| 91蜜桃婷婷狠狠久久综合9色| 在线观看视频一区| 欧美日韩精品欧美日韩精品 | 久久久亚洲高清| 中文在线免费一区三区高中清不卡| 久久综合色婷婷| 日韩毛片一二三区| 亚洲小少妇裸体bbw| 奇米精品一区二区三区在线观看| 国内成人精品2018免费看| 成人精品免费网站|