【问题标题】:Go for DNS SRV bind programmatically以编程方式进行 DNS SRV 绑定
【发布时间】:2016-09-21 00:15:49
【问题描述】:

有人知道如何在 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,但不知道从哪里开始。有人可以帮忙吗?

谢谢!

【问题讨论】:

  • bind 是您正在重新配置的守护进程。您是在尝试从 Go 编写它的重新配置,还是在尝试运行 dns 服务器(在这种情况下,您需要用自己的替换绑定服务器)
  • 谢谢。如果可以的话,我想更换绑定服务器。
  • “test.com”是来自第 3 方还是硬编码在您的应用程序/lib 中?您是直接通过 net.LookupSRV 查找 SRV 记录,还是从某个库中调用它(是否支持自定义 net.Transport 或 net.Dialer)?
  • @cvxv31431asdas 我已经创建了一个绑定服务器。如果您需要进一步的帮助,请发表评论。这台服务器我已经测试过了。

标签: linux go dns network-programming


【解决方案1】:

首先你需要将你的本地 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, Class: dns.ClassINET, 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 服务器。我正在使用您需要成为 root 用户的端口 53。您可以将其更改为其他内容。运行测试时,您可以从其他端口获取它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2012-12-03
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2021-09-06
    相关资源
    最近更新 更多