Upstream plugin prototype
This commit is contained in:
47
upstream/tls_upstream.go
Normal file
47
upstream/tls_upstream.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package upstream
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"github.com/miekg/dns"
|
||||
"golang.org/x/net/context"
|
||||
"time"
|
||||
)
|
||||
|
||||
// TODO: Use persistent connection here
|
||||
|
||||
// DnsOverTlsUpstream is the upstream implementation for plain DNS-over-TLS
|
||||
type DnsOverTlsUpstream struct {
|
||||
endpoint string
|
||||
tlsServerName string
|
||||
timeout time.Duration
|
||||
}
|
||||
|
||||
// NewHttpsUpstream creates a new DNS-over-TLS upstream from the endpoint address and TLS server name
|
||||
func NewDnsOverTlsUpstream(endpoint string, tlsServerName string) (Upstream, error) {
|
||||
return &DnsOverTlsUpstream{
|
||||
endpoint: endpoint,
|
||||
tlsServerName: tlsServerName,
|
||||
timeout: defaultTimeout,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Exchange provides an implementation for the Upstream interface
|
||||
func (u *DnsOverTlsUpstream) Exchange(ctx context.Context, query *dns.Msg) (*dns.Msg, error) {
|
||||
|
||||
dnsClient := &dns.Client{
|
||||
Net: "tcp-tls",
|
||||
ReadTimeout: u.timeout,
|
||||
WriteTimeout: u.timeout,
|
||||
TLSConfig: new(tls.Config),
|
||||
}
|
||||
dnsClient.TLSConfig.ServerName = u.tlsServerName
|
||||
|
||||
resp, _, err := dnsClient.Exchange(query, u.endpoint)
|
||||
|
||||
if err != nil {
|
||||
resp = &dns.Msg{}
|
||||
resp.SetRcode(resp, dns.RcodeServerFailure)
|
||||
}
|
||||
|
||||
return resp, err
|
||||
}
|
||||
Reference in New Issue
Block a user