加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 以编程方式转到DNS SRV绑定

发布时间:2020-12-13 22:59:24 所属栏目:Linux 来源:网络整理
导读:有人知道如何在Go中本地设置SRV记录吗? 它用于测试目的.例如,我想在测试期间将test.com绑定到localhost.目前,我必须编辑主机/etc/bind/test.com.hosts test.com. IN SOA bindhostname. admin.test.com. (145260748810800360060480038400 )test.com. IN NS b
有人知道如何在Go中本地设置SRV记录吗?

它用于测试目的.例如,我想在测试期间将test.com绑定到localhost.目前,我必须编辑主机/etc/bind/test.com.hosts

test.com.   IN  SOA bindhostname. admin.test.com. (
1452607488
10800
3600
604800
38400 )
test.com.   IN  NS  bindhostname.
my1.test.com.   300 IN  A   127.0.0.1
_etcd-client._tcp   300 IN  SRV 0 0 5000 my1.test.com.

我看了https://github.com/miekg/dns,但无法弄清楚从哪里开始.有人可以帮忙吗?

谢谢!

解决方法

首先,您需要将本地IP添加到/etc/resolv.conf

然后你可以使用以下代码:

package main

import (
    "log"
    "net"

    "github.com/miekg/dns"
)

const (
    DOM    = "test.com."
    srvDom = "_etcd-client._tcp."
)

func handleSRV(w dns.ResponseWriter,r *dns.Msg) {
    var a net.IP
    m := new(dns.Msg)
    m.SetReply(r)
    if ip,ok := w.RemoteAddr().(*net.UDPAddr); ok {
        a = ip.IP
    }
    if ip,ok := w.RemoteAddr().(*net.TCPAddr); ok {
        a = ip.IP
    }

    // Add in case you are using IPv6 alongwith AAAA
    /*if a.To4() !=nil {
        a = a.To4()
        }
    */
    // Checking which type of query has come
    switch r.Question[0].Qtype {
    default:
        fallthrough
    case dns.TypeA:
        rr := new(dns.A)
        rr.Hdr = dns.RR_Header{Name: DOM,Rrtype: dns.TypeA,Class: dns.ClassINET,Ttl: 0}
        rr.A = a.To4()
        m.Answer = append(m.Answer,rr)
    case dns.TypeSRV:
        rr := new(dns.SRV)
        rr.Hdr = dns.RR_Header{Name: srvDom,Rrtype: dns.TypeSRV,Ttl: 0}
        rr.Priority = 0
        rr.Weight = 0
        rr.Port = 5000
        rr.Target = DOM
        m.Answer = append(m.Answer,rr)
    }
    w.WriteMsg(m)
}

func serve(net string) {
    server := &dns.Server{Addr: ":53",Net: net,TsigSecret: nil}
    err := server.ListenAndServe()
    if err != nil {
        log.Fatal("Server can't be started")
    }
}

func main() {
    dns.HandleFunc(DOM,handleSRV)
    dns.HandleFunc(srvDom,handleSRV)
    go serve("tcp")
    go serve("udp")
    for {
    }
}

您可以检查此绑定服务器是否为dig提供了正确答案

dig @"127.0.0.1"  _etcd-client._tcp. SRV

我假设您正在使用IPv4地址(它只增加了大约十行,但我希望代码在没有处理IPv6的情况下简洁).

您可以更改我作为const使用的DOM和SRV模式.

您可以将其集成为在进行测试时启动dns服务器的库.我正在使用端口53,您需要成为root用户.您可以将其更改为其他内容.当测试运行时,您可以从一些不同的端口获取它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读