server.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. // DNS server implementation.
  2. package dns
  3. import (
  4. "context"
  5. "crypto/tls"
  6. "encoding/binary"
  7. "errors"
  8. "io"
  9. "net"
  10. "strings"
  11. "sync"
  12. "time"
  13. )
  14. // Default maximum number of TCP queries before we close the socket.
  15. const maxTCPQueries = 128
  16. // aLongTimeAgo is a non-zero time, far in the past, used for
  17. // immediate cancellation of network operations.
  18. var aLongTimeAgo = time.Unix(1, 0)
  19. // Handler is implemented by any value that implements ServeDNS.
  20. type Handler interface {
  21. ServeDNS(w ResponseWriter, r *Msg)
  22. }
  23. // The HandlerFunc type is an adapter to allow the use of
  24. // ordinary functions as DNS handlers. If f is a function
  25. // with the appropriate signature, HandlerFunc(f) is a
  26. // Handler object that calls f.
  27. type HandlerFunc func(ResponseWriter, *Msg)
  28. // ServeDNS calls f(w, r).
  29. func (f HandlerFunc) ServeDNS(w ResponseWriter, r *Msg) {
  30. f(w, r)
  31. }
  32. // A ResponseWriter interface is used by an DNS handler to
  33. // construct an DNS response.
  34. type ResponseWriter interface {
  35. // LocalAddr returns the net.Addr of the server
  36. LocalAddr() net.Addr
  37. // RemoteAddr returns the net.Addr of the client that sent the current request.
  38. RemoteAddr() net.Addr
  39. // WriteMsg writes a reply back to the client.
  40. WriteMsg(*Msg) error
  41. // Write writes a raw buffer back to the client.
  42. Write([]byte) (int, error)
  43. // Close closes the connection.
  44. Close() error
  45. // TsigStatus returns the status of the Tsig.
  46. TsigStatus() error
  47. // TsigTimersOnly sets the tsig timers only boolean.
  48. TsigTimersOnly(bool)
  49. // Hijack lets the caller take over the connection.
  50. // After a call to Hijack(), the DNS package will not do anything with the connection.
  51. Hijack()
  52. }
  53. // A ConnectionStater interface is used by a DNS Handler to access TLS connection state
  54. // when available.
  55. type ConnectionStater interface {
  56. ConnectionState() *tls.ConnectionState
  57. }
  58. type response struct {
  59. closed bool // connection has been closed
  60. hijacked bool // connection has been hijacked by handler
  61. tsigTimersOnly bool
  62. tsigStatus error
  63. tsigRequestMAC string
  64. tsigProvider TsigProvider
  65. udp net.PacketConn // i/o connection if UDP was used
  66. tcp net.Conn // i/o connection if TCP was used
  67. udpSession *SessionUDP // oob data to get egress interface right
  68. pcSession net.Addr // address to use when writing to a generic net.PacketConn
  69. writer Writer // writer to output the raw DNS bits
  70. }
  71. // handleRefused returns a HandlerFunc that returns REFUSED for every request it gets.
  72. func handleRefused(w ResponseWriter, r *Msg) {
  73. m := new(Msg)
  74. m.SetRcode(r, RcodeRefused)
  75. w.WriteMsg(m)
  76. }
  77. // HandleFailed returns a HandlerFunc that returns SERVFAIL for every request it gets.
  78. // Deprecated: This function is going away.
  79. func HandleFailed(w ResponseWriter, r *Msg) {
  80. m := new(Msg)
  81. m.SetRcode(r, RcodeServerFailure)
  82. // does not matter if this write fails
  83. w.WriteMsg(m)
  84. }
  85. // ListenAndServe Starts a server on address and network specified Invoke handler
  86. // for incoming queries.
  87. func ListenAndServe(addr string, network string, handler Handler) error {
  88. server := &Server{Addr: addr, Net: network, Handler: handler}
  89. return server.ListenAndServe()
  90. }
  91. // ListenAndServeTLS acts like http.ListenAndServeTLS, more information in
  92. // http://golang.org/pkg/net/http/#ListenAndServeTLS
  93. func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
  94. cert, err := tls.LoadX509KeyPair(certFile, keyFile)
  95. if err != nil {
  96. return err
  97. }
  98. config := tls.Config{
  99. Certificates: []tls.Certificate{cert},
  100. }
  101. server := &Server{
  102. Addr: addr,
  103. Net: "tcp-tls",
  104. TLSConfig: &config,
  105. Handler: handler,
  106. }
  107. return server.ListenAndServe()
  108. }
  109. // ActivateAndServe activates a server with a listener from systemd,
  110. // l and p should not both be non-nil.
  111. // If both l and p are not nil only p will be used.
  112. // Invoke handler for incoming queries.
  113. func ActivateAndServe(l net.Listener, p net.PacketConn, handler Handler) error {
  114. server := &Server{Listener: l, PacketConn: p, Handler: handler}
  115. return server.ActivateAndServe()
  116. }
  117. // Writer writes raw DNS messages; each call to Write should send an entire message.
  118. type Writer interface {
  119. io.Writer
  120. }
  121. // Reader reads raw DNS messages; each call to ReadTCP or ReadUDP should return an entire message.
  122. type Reader interface {
  123. // ReadTCP reads a raw message from a TCP connection. Implementations may alter
  124. // connection properties, for example the read-deadline.
  125. ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error)
  126. // ReadUDP reads a raw message from a UDP connection. Implementations may alter
  127. // connection properties, for example the read-deadline.
  128. ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error)
  129. }
  130. // PacketConnReader is an optional interface that Readers can implement to support using generic net.PacketConns.
  131. type PacketConnReader interface {
  132. Reader
  133. // ReadPacketConn reads a raw message from a generic net.PacketConn UDP connection. Implementations may
  134. // alter connection properties, for example the read-deadline.
  135. ReadPacketConn(conn net.PacketConn, timeout time.Duration) ([]byte, net.Addr, error)
  136. }
  137. // defaultReader is an adapter for the Server struct that implements the Reader and
  138. // PacketConnReader interfaces using the readTCP, readUDP and readPacketConn funcs
  139. // of the embedded Server.
  140. type defaultReader struct {
  141. *Server
  142. }
  143. var _ PacketConnReader = defaultReader{}
  144. func (dr defaultReader) ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
  145. return dr.readTCP(conn, timeout)
  146. }
  147. func (dr defaultReader) ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
  148. return dr.readUDP(conn, timeout)
  149. }
  150. func (dr defaultReader) ReadPacketConn(conn net.PacketConn, timeout time.Duration) ([]byte, net.Addr, error) {
  151. return dr.readPacketConn(conn, timeout)
  152. }
  153. // DecorateReader is a decorator hook for extending or supplanting the functionality of a Reader.
  154. // Implementations should never return a nil Reader.
  155. // Readers should also implement the optional PacketConnReader interface.
  156. // PacketConnReader is required to use a generic net.PacketConn.
  157. type DecorateReader func(Reader) Reader
  158. // DecorateWriter is a decorator hook for extending or supplanting the functionality of a Writer.
  159. // Implementations should never return a nil Writer.
  160. type DecorateWriter func(Writer) Writer
  161. // A Server defines parameters for running an DNS server.
  162. type Server struct {
  163. // Address to listen on, ":dns" if empty.
  164. Addr string
  165. // if "tcp" or "tcp-tls" (DNS over TLS) it will invoke a TCP listener, otherwise an UDP one
  166. Net string
  167. // TCP Listener to use, this is to aid in systemd's socket activation.
  168. Listener net.Listener
  169. // TLS connection configuration
  170. TLSConfig *tls.Config
  171. // UDP "Listener" to use, this is to aid in systemd's socket activation.
  172. PacketConn net.PacketConn
  173. // Handler to invoke, dns.DefaultServeMux if nil.
  174. Handler Handler
  175. // Default buffer size to use to read incoming UDP messages. If not set
  176. // it defaults to MinMsgSize (512 B).
  177. UDPSize int
  178. // The net.Conn.SetReadTimeout value for new connections, defaults to 2 * time.Second.
  179. ReadTimeout time.Duration
  180. // The net.Conn.SetWriteTimeout value for new connections, defaults to 2 * time.Second.
  181. WriteTimeout time.Duration
  182. // TCP idle timeout for multiple queries, if nil, defaults to 8 * time.Second (RFC 5966).
  183. IdleTimeout func() time.Duration
  184. // An implementation of the TsigProvider interface. If defined it replaces TsigSecret and is used for all TSIG operations.
  185. TsigProvider TsigProvider
  186. // Secret(s) for Tsig map[<zonename>]<base64 secret>. The zonename must be in canonical form (lowercase, fqdn, see RFC 4034 Section 6.2).
  187. TsigSecret map[string]string
  188. // If NotifyStartedFunc is set it is called once the server has started listening.
  189. NotifyStartedFunc func()
  190. // DecorateReader is optional, allows customization of the process that reads raw DNS messages.
  191. DecorateReader DecorateReader
  192. // DecorateWriter is optional, allows customization of the process that writes raw DNS messages.
  193. DecorateWriter DecorateWriter
  194. // Maximum number of TCP queries before we close the socket. Default is maxTCPQueries (unlimited if -1).
  195. MaxTCPQueries int
  196. // Whether to set the SO_REUSEPORT socket option, allowing multiple listeners to be bound to a single address.
  197. // It is only supported on certain GOOSes and when using ListenAndServe.
  198. ReusePort bool
  199. // AcceptMsgFunc will check the incoming message and will reject it early in the process.
  200. // By default DefaultMsgAcceptFunc will be used.
  201. MsgAcceptFunc MsgAcceptFunc
  202. // Shutdown handling
  203. lock sync.RWMutex
  204. started bool
  205. shutdown chan struct{}
  206. conns map[net.Conn]struct{}
  207. // A pool for UDP message buffers.
  208. udpPool sync.Pool
  209. }
  210. func (srv *Server) tsigProvider() TsigProvider {
  211. if srv.TsigProvider != nil {
  212. return srv.TsigProvider
  213. }
  214. if srv.TsigSecret != nil {
  215. return tsigSecretProvider(srv.TsigSecret)
  216. }
  217. return nil
  218. }
  219. func (srv *Server) isStarted() bool {
  220. srv.lock.RLock()
  221. started := srv.started
  222. srv.lock.RUnlock()
  223. return started
  224. }
  225. func makeUDPBuffer(size int) func() interface{} {
  226. return func() interface{} {
  227. return make([]byte, size)
  228. }
  229. }
  230. func (srv *Server) init() {
  231. srv.shutdown = make(chan struct{})
  232. srv.conns = make(map[net.Conn]struct{})
  233. if srv.UDPSize == 0 {
  234. srv.UDPSize = MinMsgSize
  235. }
  236. if srv.MsgAcceptFunc == nil {
  237. srv.MsgAcceptFunc = DefaultMsgAcceptFunc
  238. }
  239. if srv.Handler == nil {
  240. srv.Handler = DefaultServeMux
  241. }
  242. srv.udpPool.New = makeUDPBuffer(srv.UDPSize)
  243. }
  244. func unlockOnce(l sync.Locker) func() {
  245. var once sync.Once
  246. return func() { once.Do(l.Unlock) }
  247. }
  248. // ListenAndServe starts a nameserver on the configured address in *Server.
  249. func (srv *Server) ListenAndServe() error {
  250. unlock := unlockOnce(&srv.lock)
  251. srv.lock.Lock()
  252. defer unlock()
  253. if srv.started {
  254. return &Error{err: "server already started"}
  255. }
  256. addr := srv.Addr
  257. if addr == "" {
  258. addr = ":domain"
  259. }
  260. srv.init()
  261. switch srv.Net {
  262. case "tcp", "tcp4", "tcp6":
  263. l, err := listenTCP(srv.Net, addr, srv.ReusePort)
  264. if err != nil {
  265. return err
  266. }
  267. srv.Listener = l
  268. srv.started = true
  269. unlock()
  270. return srv.serveTCP(l)
  271. case "tcp-tls", "tcp4-tls", "tcp6-tls":
  272. if srv.TLSConfig == nil || (len(srv.TLSConfig.Certificates) == 0 && srv.TLSConfig.GetCertificate == nil) {
  273. return errors.New("dns: neither Certificates nor GetCertificate set in Config")
  274. }
  275. network := strings.TrimSuffix(srv.Net, "-tls")
  276. l, err := listenTCP(network, addr, srv.ReusePort)
  277. if err != nil {
  278. return err
  279. }
  280. l = tls.NewListener(l, srv.TLSConfig)
  281. srv.Listener = l
  282. srv.started = true
  283. unlock()
  284. return srv.serveTCP(l)
  285. case "udp", "udp4", "udp6":
  286. l, err := listenUDP(srv.Net, addr, srv.ReusePort)
  287. if err != nil {
  288. return err
  289. }
  290. u := l.(*net.UDPConn)
  291. if e := setUDPSocketOptions(u); e != nil {
  292. u.Close()
  293. return e
  294. }
  295. srv.PacketConn = l
  296. srv.started = true
  297. unlock()
  298. return srv.serveUDP(u)
  299. }
  300. return &Error{err: "bad network"}
  301. }
  302. // ActivateAndServe starts a nameserver with the PacketConn or Listener
  303. // configured in *Server. Its main use is to start a server from systemd.
  304. func (srv *Server) ActivateAndServe() error {
  305. unlock := unlockOnce(&srv.lock)
  306. srv.lock.Lock()
  307. defer unlock()
  308. if srv.started {
  309. return &Error{err: "server already started"}
  310. }
  311. srv.init()
  312. if srv.PacketConn != nil {
  313. // Check PacketConn interface's type is valid and value
  314. // is not nil
  315. if t, ok := srv.PacketConn.(*net.UDPConn); ok && t != nil {
  316. if e := setUDPSocketOptions(t); e != nil {
  317. return e
  318. }
  319. }
  320. srv.started = true
  321. unlock()
  322. return srv.serveUDP(srv.PacketConn)
  323. }
  324. if srv.Listener != nil {
  325. srv.started = true
  326. unlock()
  327. return srv.serveTCP(srv.Listener)
  328. }
  329. return &Error{err: "bad listeners"}
  330. }
  331. // Shutdown shuts down a server. After a call to Shutdown, ListenAndServe and
  332. // ActivateAndServe will return.
  333. func (srv *Server) Shutdown() error {
  334. return srv.ShutdownContext(context.Background())
  335. }
  336. // ShutdownContext shuts down a server. After a call to ShutdownContext,
  337. // ListenAndServe and ActivateAndServe will return.
  338. //
  339. // A context.Context may be passed to limit how long to wait for connections
  340. // to terminate.
  341. func (srv *Server) ShutdownContext(ctx context.Context) error {
  342. srv.lock.Lock()
  343. if !srv.started {
  344. srv.lock.Unlock()
  345. return &Error{err: "server not started"}
  346. }
  347. srv.started = false
  348. if srv.PacketConn != nil {
  349. srv.PacketConn.SetReadDeadline(aLongTimeAgo) // Unblock reads
  350. }
  351. if srv.Listener != nil {
  352. srv.Listener.Close()
  353. }
  354. for rw := range srv.conns {
  355. rw.SetReadDeadline(aLongTimeAgo) // Unblock reads
  356. }
  357. srv.lock.Unlock()
  358. if testShutdownNotify != nil {
  359. testShutdownNotify.Broadcast()
  360. }
  361. var ctxErr error
  362. select {
  363. case <-srv.shutdown:
  364. case <-ctx.Done():
  365. ctxErr = ctx.Err()
  366. }
  367. if srv.PacketConn != nil {
  368. srv.PacketConn.Close()
  369. }
  370. return ctxErr
  371. }
  372. var testShutdownNotify *sync.Cond
  373. // getReadTimeout is a helper func to use system timeout if server did not intend to change it.
  374. func (srv *Server) getReadTimeout() time.Duration {
  375. if srv.ReadTimeout != 0 {
  376. return srv.ReadTimeout
  377. }
  378. return dnsTimeout
  379. }
  380. // serveTCP starts a TCP listener for the server.
  381. func (srv *Server) serveTCP(l net.Listener) error {
  382. defer l.Close()
  383. if srv.NotifyStartedFunc != nil {
  384. srv.NotifyStartedFunc()
  385. }
  386. var wg sync.WaitGroup
  387. defer func() {
  388. wg.Wait()
  389. close(srv.shutdown)
  390. }()
  391. for srv.isStarted() {
  392. rw, err := l.Accept()
  393. if err != nil {
  394. if !srv.isStarted() {
  395. return nil
  396. }
  397. if neterr, ok := err.(net.Error); ok && neterr.Temporary() {
  398. continue
  399. }
  400. return err
  401. }
  402. srv.lock.Lock()
  403. // Track the connection to allow unblocking reads on shutdown.
  404. srv.conns[rw] = struct{}{}
  405. srv.lock.Unlock()
  406. wg.Add(1)
  407. go srv.serveTCPConn(&wg, rw)
  408. }
  409. return nil
  410. }
  411. // serveUDP starts a UDP listener for the server.
  412. func (srv *Server) serveUDP(l net.PacketConn) error {
  413. defer l.Close()
  414. reader := Reader(defaultReader{srv})
  415. if srv.DecorateReader != nil {
  416. reader = srv.DecorateReader(reader)
  417. }
  418. lUDP, isUDP := l.(*net.UDPConn)
  419. readerPC, canPacketConn := reader.(PacketConnReader)
  420. if !isUDP && !canPacketConn {
  421. return &Error{err: "PacketConnReader was not implemented on Reader returned from DecorateReader but is required for net.PacketConn"}
  422. }
  423. if srv.NotifyStartedFunc != nil {
  424. srv.NotifyStartedFunc()
  425. }
  426. var wg sync.WaitGroup
  427. defer func() {
  428. wg.Wait()
  429. close(srv.shutdown)
  430. }()
  431. rtimeout := srv.getReadTimeout()
  432. // deadline is not used here
  433. for srv.isStarted() {
  434. var (
  435. m []byte
  436. sPC net.Addr
  437. sUDP *SessionUDP
  438. err error
  439. )
  440. if isUDP {
  441. m, sUDP, err = reader.ReadUDP(lUDP, rtimeout)
  442. } else {
  443. m, sPC, err = readerPC.ReadPacketConn(l, rtimeout)
  444. }
  445. if err != nil {
  446. if !srv.isStarted() {
  447. return nil
  448. }
  449. if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
  450. continue
  451. }
  452. return err
  453. }
  454. if len(m) < headerSize {
  455. if cap(m) == srv.UDPSize {
  456. srv.udpPool.Put(m[:srv.UDPSize])
  457. }
  458. continue
  459. }
  460. wg.Add(1)
  461. go srv.serveUDPPacket(&wg, m, l, sUDP, sPC)
  462. }
  463. return nil
  464. }
  465. // Serve a new TCP connection.
  466. func (srv *Server) serveTCPConn(wg *sync.WaitGroup, rw net.Conn) {
  467. w := &response{tsigProvider: srv.tsigProvider(), tcp: rw}
  468. if srv.DecorateWriter != nil {
  469. w.writer = srv.DecorateWriter(w)
  470. } else {
  471. w.writer = w
  472. }
  473. reader := Reader(defaultReader{srv})
  474. if srv.DecorateReader != nil {
  475. reader = srv.DecorateReader(reader)
  476. }
  477. idleTimeout := tcpIdleTimeout
  478. if srv.IdleTimeout != nil {
  479. idleTimeout = srv.IdleTimeout()
  480. }
  481. timeout := srv.getReadTimeout()
  482. limit := srv.MaxTCPQueries
  483. if limit == 0 {
  484. limit = maxTCPQueries
  485. }
  486. for q := 0; (q < limit || limit == -1) && srv.isStarted(); q++ {
  487. m, err := reader.ReadTCP(w.tcp, timeout)
  488. if err != nil {
  489. // TODO(tmthrgd): handle error
  490. break
  491. }
  492. srv.serveDNS(m, w)
  493. if w.closed {
  494. break // Close() was called
  495. }
  496. if w.hijacked {
  497. break // client will call Close() themselves
  498. }
  499. // The first read uses the read timeout, the rest use the
  500. // idle timeout.
  501. timeout = idleTimeout
  502. }
  503. if !w.hijacked {
  504. w.Close()
  505. }
  506. srv.lock.Lock()
  507. delete(srv.conns, w.tcp)
  508. srv.lock.Unlock()
  509. wg.Done()
  510. }
  511. // Serve a new UDP request.
  512. func (srv *Server) serveUDPPacket(wg *sync.WaitGroup, m []byte, u net.PacketConn, udpSession *SessionUDP, pcSession net.Addr) {
  513. w := &response{tsigProvider: srv.tsigProvider(), udp: u, udpSession: udpSession, pcSession: pcSession}
  514. if srv.DecorateWriter != nil {
  515. w.writer = srv.DecorateWriter(w)
  516. } else {
  517. w.writer = w
  518. }
  519. srv.serveDNS(m, w)
  520. wg.Done()
  521. }
  522. func (srv *Server) serveDNS(m []byte, w *response) {
  523. dh, off, err := unpackMsgHdr(m, 0)
  524. if err != nil {
  525. // Let client hang, they are sending crap; any reply can be used to amplify.
  526. return
  527. }
  528. req := new(Msg)
  529. req.setHdr(dh)
  530. switch action := srv.MsgAcceptFunc(dh); action {
  531. case MsgAccept:
  532. if req.unpack(dh, m, off) == nil {
  533. break
  534. }
  535. fallthrough
  536. case MsgReject, MsgRejectNotImplemented:
  537. opcode := req.Opcode
  538. req.SetRcodeFormatError(req)
  539. req.Zero = false
  540. if action == MsgRejectNotImplemented {
  541. req.Opcode = opcode
  542. req.Rcode = RcodeNotImplemented
  543. }
  544. // Are we allowed to delete any OPT records here?
  545. req.Ns, req.Answer, req.Extra = nil, nil, nil
  546. w.WriteMsg(req)
  547. fallthrough
  548. case MsgIgnore:
  549. if w.udp != nil && cap(m) == srv.UDPSize {
  550. srv.udpPool.Put(m[:srv.UDPSize])
  551. }
  552. return
  553. }
  554. w.tsigStatus = nil
  555. if w.tsigProvider != nil {
  556. if t := req.IsTsig(); t != nil {
  557. w.tsigStatus = TsigVerifyWithProvider(m, w.tsigProvider, "", false)
  558. w.tsigTimersOnly = false
  559. w.tsigRequestMAC = t.MAC
  560. }
  561. }
  562. if w.udp != nil && cap(m) == srv.UDPSize {
  563. srv.udpPool.Put(m[:srv.UDPSize])
  564. }
  565. srv.Handler.ServeDNS(w, req) // Writes back to the client
  566. }
  567. func (srv *Server) readTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
  568. // If we race with ShutdownContext, the read deadline may
  569. // have been set in the distant past to unblock the read
  570. // below. We must not override it, otherwise we may block
  571. // ShutdownContext.
  572. srv.lock.RLock()
  573. if srv.started {
  574. conn.SetReadDeadline(time.Now().Add(timeout))
  575. }
  576. srv.lock.RUnlock()
  577. var length uint16
  578. if err := binary.Read(conn, binary.BigEndian, &length); err != nil {
  579. return nil, err
  580. }
  581. m := make([]byte, length)
  582. if _, err := io.ReadFull(conn, m); err != nil {
  583. return nil, err
  584. }
  585. return m, nil
  586. }
  587. func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
  588. srv.lock.RLock()
  589. if srv.started {
  590. // See the comment in readTCP above.
  591. conn.SetReadDeadline(time.Now().Add(timeout))
  592. }
  593. srv.lock.RUnlock()
  594. m := srv.udpPool.Get().([]byte)
  595. n, s, err := ReadFromSessionUDP(conn, m)
  596. if err != nil {
  597. srv.udpPool.Put(m)
  598. return nil, nil, err
  599. }
  600. m = m[:n]
  601. return m, s, nil
  602. }
  603. func (srv *Server) readPacketConn(conn net.PacketConn, timeout time.Duration) ([]byte, net.Addr, error) {
  604. srv.lock.RLock()
  605. if srv.started {
  606. // See the comment in readTCP above.
  607. conn.SetReadDeadline(time.Now().Add(timeout))
  608. }
  609. srv.lock.RUnlock()
  610. m := srv.udpPool.Get().([]byte)
  611. n, addr, err := conn.ReadFrom(m)
  612. if err != nil {
  613. srv.udpPool.Put(m)
  614. return nil, nil, err
  615. }
  616. m = m[:n]
  617. return m, addr, nil
  618. }
  619. // WriteMsg implements the ResponseWriter.WriteMsg method.
  620. func (w *response) WriteMsg(m *Msg) (err error) {
  621. if w.closed {
  622. return &Error{err: "WriteMsg called after Close"}
  623. }
  624. var data []byte
  625. if w.tsigProvider != nil { // if no provider, dont check for the tsig (which is a longer check)
  626. if t := m.IsTsig(); t != nil {
  627. data, w.tsigRequestMAC, err = TsigGenerateWithProvider(m, w.tsigProvider, w.tsigRequestMAC, w.tsigTimersOnly)
  628. if err != nil {
  629. return err
  630. }
  631. _, err = w.writer.Write(data)
  632. return err
  633. }
  634. }
  635. data, err = m.Pack()
  636. if err != nil {
  637. return err
  638. }
  639. _, err = w.writer.Write(data)
  640. return err
  641. }
  642. // Write implements the ResponseWriter.Write method.
  643. func (w *response) Write(m []byte) (int, error) {
  644. if w.closed {
  645. return 0, &Error{err: "Write called after Close"}
  646. }
  647. switch {
  648. case w.udp != nil:
  649. if u, ok := w.udp.(*net.UDPConn); ok {
  650. return WriteToSessionUDP(u, m, w.udpSession)
  651. }
  652. return w.udp.WriteTo(m, w.pcSession)
  653. case w.tcp != nil:
  654. if len(m) > MaxMsgSize {
  655. return 0, &Error{err: "message too large"}
  656. }
  657. msg := make([]byte, 2+len(m))
  658. binary.BigEndian.PutUint16(msg, uint16(len(m)))
  659. copy(msg[2:], m)
  660. return w.tcp.Write(msg)
  661. default:
  662. panic("dns: internal error: udp and tcp both nil")
  663. }
  664. }
  665. // LocalAddr implements the ResponseWriter.LocalAddr method.
  666. func (w *response) LocalAddr() net.Addr {
  667. switch {
  668. case w.udp != nil:
  669. return w.udp.LocalAddr()
  670. case w.tcp != nil:
  671. return w.tcp.LocalAddr()
  672. default:
  673. panic("dns: internal error: udp and tcp both nil")
  674. }
  675. }
  676. // RemoteAddr implements the ResponseWriter.RemoteAddr method.
  677. func (w *response) RemoteAddr() net.Addr {
  678. switch {
  679. case w.udpSession != nil:
  680. return w.udpSession.RemoteAddr()
  681. case w.pcSession != nil:
  682. return w.pcSession
  683. case w.tcp != nil:
  684. return w.tcp.RemoteAddr()
  685. default:
  686. panic("dns: internal error: udpSession, pcSession and tcp are all nil")
  687. }
  688. }
  689. // TsigStatus implements the ResponseWriter.TsigStatus method.
  690. func (w *response) TsigStatus() error { return w.tsigStatus }
  691. // TsigTimersOnly implements the ResponseWriter.TsigTimersOnly method.
  692. func (w *response) TsigTimersOnly(b bool) { w.tsigTimersOnly = b }
  693. // Hijack implements the ResponseWriter.Hijack method.
  694. func (w *response) Hijack() { w.hijacked = true }
  695. // Close implements the ResponseWriter.Close method
  696. func (w *response) Close() error {
  697. if w.closed {
  698. return &Error{err: "connection already closed"}
  699. }
  700. w.closed = true
  701. switch {
  702. case w.udp != nil:
  703. // Can't close the udp conn, as that is actually the listener.
  704. return nil
  705. case w.tcp != nil:
  706. return w.tcp.Close()
  707. default:
  708. panic("dns: internal error: udp and tcp both nil")
  709. }
  710. }
  711. // ConnectionState() implements the ConnectionStater.ConnectionState() interface.
  712. func (w *response) ConnectionState() *tls.ConnectionState {
  713. type tlsConnectionStater interface {
  714. ConnectionState() tls.ConnectionState
  715. }
  716. if v, ok := w.tcp.(tlsConnectionStater); ok {
  717. t := v.ConnectionState()
  718. return &t
  719. }
  720. return nil
  721. }