Add health check for DNS
This commit is contained in:
core
go.modgo.sumvendor
github.com
miekg
dns
.codecov.yml.gitignore.travis.ymlAUTHORSCODEOWNERSCONTRIBUTORSCOPYRIGHTLICENSEMakefile.fuzzMakefile.releaseREADME.mdacceptfunc.goclient.goclientconfig.godane.godefaults.godns.godnssec.godnssec_keygen.godnssec_keyscan.godnssec_privkey.godoc.goduplicate.goedns.goformat.gofuzz.gogenerate.gogo.modgo.sumlabels.golisten_go111.golisten_go_not111.gomsg.gomsg_helpers.gomsg_truncate.gonsecx.goprivaterr.goreverse.gosanitize.goscan.goscan_rr.goserve_mux.goserver.gosig0.gosingleinflight.gosmimea.gosvcb.gotlsa.gotsig.gotypes.goudp.goudp_windows.goupdate.goversion.goxfr.gozduplicate.gozmsg.goztypes.go
golang.org
x
crypto
ed25519
net
bpf
internal
iana
socket
cmsghdr.gocmsghdr_bsd.gocmsghdr_linux_32bit.gocmsghdr_linux_64bit.gocmsghdr_solaris_64bit.gocmsghdr_stub.goempty.serror_unix.goerror_windows.goiovec_32bit.goiovec_64bit.goiovec_solaris_64bit.goiovec_stub.gommsghdr_stub.gommsghdr_unix.gomsghdr_bsd.gomsghdr_bsdvar.gomsghdr_linux.gomsghdr_linux_32bit.gomsghdr_linux_64bit.gomsghdr_openbsd.gomsghdr_solaris_64bit.gomsghdr_stub.gonorace.gorace.gorawconn.gorawconn_mmsg.gorawconn_msg.gorawconn_nommsg.gorawconn_nomsg.gosocket.gosys.gosys_bsd.gosys_bsdvar.gosys_const_unix.gosys_darwin.gosys_dragonfly.gosys_go1_11_darwin.gosys_linkname.gosys_linux.gosys_linux_386.gosys_linux_386.ssys_linux_amd64.gosys_linux_arm.gosys_linux_arm64.gosys_linux_mips.gosys_linux_mips64.gosys_linux_mips64le.gosys_linux_mipsle.gosys_linux_ppc64.gosys_linux_ppc64le.gosys_linux_riscv64.gosys_linux_s390x.gosys_linux_s390x.ssys_netbsd.gosys_posix.gosys_solaris.gosys_solaris_amd64.ssys_stub.gosys_unix.gosys_windows.gozsys_aix_ppc64.gozsys_darwin_386.gozsys_darwin_amd64.gozsys_darwin_arm.gozsys_darwin_arm64.gozsys_dragonfly_amd64.gozsys_freebsd_386.gozsys_freebsd_amd64.gozsys_freebsd_arm.gozsys_freebsd_arm64.gozsys_linux_386.gozsys_linux_amd64.gozsys_linux_arm.gozsys_linux_arm64.gozsys_linux_mips.gozsys_linux_mips64.gozsys_linux_mips64le.gozsys_linux_mipsle.gozsys_linux_ppc64.gozsys_linux_ppc64le.gozsys_linux_riscv64.gozsys_linux_s390x.gozsys_netbsd_386.gozsys_netbsd_amd64.gozsys_netbsd_arm.gozsys_netbsd_arm64.gozsys_openbsd_386.gozsys_openbsd_amd64.gozsys_openbsd_arm.gozsys_openbsd_arm64.gozsys_solaris_amd64.go
ipv4
batch.gocontrol.gocontrol_bsd.gocontrol_pktinfo.gocontrol_stub.gocontrol_unix.gocontrol_windows.godgramopt.godoc.goendpoint.gogenericopt.goheader.gohelper.goiana.goicmp.goicmp_linux.goicmp_stub.gopacket.gopayload.gopayload_cmsg.gopayload_nocmsg.gosockopt.gosockopt_posix.gosockopt_stub.gosys_aix.gosys_asmreq.gosys_asmreq_stub.gosys_asmreqn.gosys_asmreqn_stub.gosys_bpf.gosys_bpf_stub.gosys_bsd.gosys_darwin.gosys_dragonfly.gosys_freebsd.gosys_linux.gosys_solaris.gosys_ssmreq.gosys_ssmreq_stub.gosys_stub.gosys_windows.gozsys_aix_ppc64.gozsys_darwin.gozsys_dragonfly.gozsys_freebsd_386.gozsys_freebsd_amd64.gozsys_freebsd_arm.gozsys_freebsd_arm64.gozsys_linux_386.gozsys_linux_amd64.gozsys_linux_arm.gozsys_linux_arm64.gozsys_linux_mips.gozsys_linux_mips64.gozsys_linux_mips64le.gozsys_linux_mipsle.gozsys_linux_ppc.gozsys_linux_ppc64.gozsys_linux_ppc64le.gozsys_linux_riscv64.gozsys_linux_s390x.gozsys_netbsd.gozsys_openbsd.gozsys_solaris.go
ipv6
batch.gocontrol.gocontrol_rfc2292_unix.gocontrol_rfc3542_unix.gocontrol_stub.gocontrol_unix.gocontrol_windows.godgramopt.godoc.goendpoint.gogenericopt.goheader.gohelper.goiana.goicmp.goicmp_bsd.goicmp_linux.goicmp_solaris.goicmp_stub.goicmp_windows.gopayload.gopayload_cmsg.gopayload_nocmsg.gosockopt.gosockopt_posix.gosockopt_stub.gosys_aix.gosys_asmreq.gosys_asmreq_stub.gosys_bpf.gosys_bpf_stub.gosys_bsd.gosys_darwin.gosys_freebsd.gosys_linux.gosys_solaris.gosys_ssmreq.gosys_ssmreq_stub.gosys_stub.gosys_windows.gozsys_aix_ppc64.gozsys_darwin.gozsys_dragonfly.gozsys_freebsd_386.gozsys_freebsd_amd64.gozsys_freebsd_arm.gozsys_freebsd_arm64.gozsys_linux_386.gozsys_linux_amd64.gozsys_linux_arm.gozsys_linux_arm64.gozsys_linux_mips.gozsys_linux_mips64.gozsys_linux_mips64le.gozsys_linux_mipsle.gozsys_linux_ppc.gozsys_linux_ppc64.gozsys_linux_ppc64le.gozsys_linux_riscv64.gozsys_linux_s390x.gozsys_netbsd.gozsys_openbsd.gozsys_solaris.go
102
vendor/github.com/miekg/dns/udp.go
generated
vendored
Normal file
102
vendor/github.com/miekg/dns/udp.go
generated
vendored
Normal file
@ -0,0 +1,102 @@
|
||||
// +build !windows
|
||||
|
||||
package dns
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"golang.org/x/net/ipv4"
|
||||
"golang.org/x/net/ipv6"
|
||||
)
|
||||
|
||||
// This is the required size of the OOB buffer to pass to ReadMsgUDP.
|
||||
var udpOOBSize = func() int {
|
||||
// We can't know whether we'll get an IPv4 control message or an
|
||||
// IPv6 control message ahead of time. To get around this, we size
|
||||
// the buffer equal to the largest of the two.
|
||||
|
||||
oob4 := ipv4.NewControlMessage(ipv4.FlagDst | ipv4.FlagInterface)
|
||||
oob6 := ipv6.NewControlMessage(ipv6.FlagDst | ipv6.FlagInterface)
|
||||
|
||||
if len(oob4) > len(oob6) {
|
||||
return len(oob4)
|
||||
}
|
||||
|
||||
return len(oob6)
|
||||
}()
|
||||
|
||||
// SessionUDP holds the remote address and the associated
|
||||
// out-of-band data.
|
||||
type SessionUDP struct {
|
||||
raddr *net.UDPAddr
|
||||
context []byte
|
||||
}
|
||||
|
||||
// RemoteAddr returns the remote network address.
|
||||
func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr }
|
||||
|
||||
// ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a
|
||||
// net.UDPAddr.
|
||||
func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) {
|
||||
oob := make([]byte, udpOOBSize)
|
||||
n, oobn, _, raddr, err := conn.ReadMsgUDP(b, oob)
|
||||
if err != nil {
|
||||
return n, nil, err
|
||||
}
|
||||
return n, &SessionUDP{raddr, oob[:oobn]}, err
|
||||
}
|
||||
|
||||
// WriteToSessionUDP acts just like net.UDPConn.WriteTo(), but uses a *SessionUDP instead of a net.Addr.
|
||||
func WriteToSessionUDP(conn *net.UDPConn, b []byte, session *SessionUDP) (int, error) {
|
||||
oob := correctSource(session.context)
|
||||
n, _, err := conn.WriteMsgUDP(b, oob, session.raddr)
|
||||
return n, err
|
||||
}
|
||||
|
||||
func setUDPSocketOptions(conn *net.UDPConn) error {
|
||||
// Try setting the flags for both families and ignore the errors unless they
|
||||
// both error.
|
||||
err6 := ipv6.NewPacketConn(conn).SetControlMessage(ipv6.FlagDst|ipv6.FlagInterface, true)
|
||||
err4 := ipv4.NewPacketConn(conn).SetControlMessage(ipv4.FlagDst|ipv4.FlagInterface, true)
|
||||
if err6 != nil && err4 != nil {
|
||||
return err4
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// parseDstFromOOB takes oob data and returns the destination IP.
|
||||
func parseDstFromOOB(oob []byte) net.IP {
|
||||
// Start with IPv6 and then fallback to IPv4
|
||||
// TODO(fastest963): Figure out a way to prefer one or the other. Looking at
|
||||
// the lvl of the header for a 0 or 41 isn't cross-platform.
|
||||
cm6 := new(ipv6.ControlMessage)
|
||||
if cm6.Parse(oob) == nil && cm6.Dst != nil {
|
||||
return cm6.Dst
|
||||
}
|
||||
cm4 := new(ipv4.ControlMessage)
|
||||
if cm4.Parse(oob) == nil && cm4.Dst != nil {
|
||||
return cm4.Dst
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// correctSource takes oob data and returns new oob data with the Src equal to the Dst
|
||||
func correctSource(oob []byte) []byte {
|
||||
dst := parseDstFromOOB(oob)
|
||||
if dst == nil {
|
||||
return nil
|
||||
}
|
||||
// If the dst is definitely an IPv6, then use ipv6's ControlMessage to
|
||||
// respond otherwise use ipv4's because ipv6's marshal ignores ipv4
|
||||
// addresses.
|
||||
if dst.To4() == nil {
|
||||
cm := new(ipv6.ControlMessage)
|
||||
cm.Src = dst
|
||||
oob = cm.Marshal()
|
||||
} else {
|
||||
cm := new(ipv4.ControlMessage)
|
||||
cm.Src = dst
|
||||
oob = cm.Marshal()
|
||||
}
|
||||
return oob
|
||||
}
|
Reference in New Issue
Block a user