You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

server.go 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  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 cancelation 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. tsigSecret map[string]string // the tsig secrets
  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. // Secret(s) for Tsig map[<zonename>]<base64 secret>. The zonename must be in canonical form (lowercase, fqdn, see RFC 4034 Section 6.2).
  185. TsigSecret map[string]string
  186. // If NotifyStartedFunc is set it is called once the server has started listening.
  187. NotifyStartedFunc func()
  188. // DecorateReader is optional, allows customization of the process that reads raw DNS messages.
  189. DecorateReader DecorateReader
  190. // DecorateWriter is optional, allows customization of the process that writes raw DNS messages.
  191. DecorateWriter DecorateWriter
  192. // Maximum number of TCP queries before we close the socket. Default is maxTCPQueries (unlimited if -1).
  193. MaxTCPQueries int
  194. // Whether to set the SO_REUSEPORT socket option, allowing multiple listeners to be bound to a single address.
  195. // It is only supported on go1.11+ and when using ListenAndServe.
  196. ReusePort bool
  197. // AcceptMsgFunc will check the incoming message and will reject it early in the process.
  198. // By default DefaultMsgAcceptFunc will be used.
  199. MsgAcceptFunc MsgAcceptFunc
  200. // Shutdown handling
  201. lock sync.RWMutex
  202. started bool
  203. shutdown chan struct{}
  204. conns map[net.Conn]struct{}
  205. // A pool for UDP message buffers.
  206. udpPool sync.Pool
  207. }
  208. func (srv *Server) isStarted() bool {
  209. srv.lock.RLock()
  210. started := srv.started
  211. srv.lock.RUnlock()
  212. return started
  213. }
  214. func makeUDPBuffer(size int) func() interface{} {
  215. return func() interface{} {
  216. return make([]byte, size)
  217. }
  218. }
  219. func (srv *Server) init() {
  220. srv.shutdown = make(chan struct{})
  221. srv.conns = make(map[net.Conn]struct{})
  222. if srv.UDPSize == 0 {
  223. srv.UDPSize = MinMsgSize
  224. }
  225. if srv.MsgAcceptFunc == nil {
  226. srv.MsgAcceptFunc = DefaultMsgAcceptFunc
  227. }
  228. if srv.Handler == nil {
  229. srv.Handler = DefaultServeMux
  230. }
  231. srv.udpPool.New = makeUDPBuffer(srv.UDPSize)
  232. }
  233. func unlockOnce(l sync.Locker) func() {
  234. var once sync.Once
  235. return func() { once.Do(l.Unlock) }
  236. }
  237. // ListenAndServe starts a nameserver on the configured address in *Server.
  238. func (srv *Server) ListenAndServe() error {
  239. unlock := unlockOnce(&srv.lock)
  240. srv.lock.Lock()
  241. defer unlock()
  242. if srv.started {
  243. return &Error{err: "server already started"}
  244. }
  245. addr := srv.Addr
  246. if addr == "" {
  247. addr = ":domain"
  248. }
  249. srv.init()
  250. switch srv.Net {
  251. case "tcp", "tcp4", "tcp6":
  252. l, err := listenTCP(srv.Net, addr, srv.ReusePort)
  253. if err != nil {
  254. return err
  255. }
  256. srv.Listener = l
  257. srv.started = true
  258. unlock()
  259. return srv.serveTCP(l)
  260. case "tcp-tls", "tcp4-tls", "tcp6-tls":
  261. if srv.TLSConfig == nil || (len(srv.TLSConfig.Certificates) == 0 && srv.TLSConfig.GetCertificate == nil) {
  262. return errors.New("dns: neither Certificates nor GetCertificate set in Config")
  263. }
  264. network := strings.TrimSuffix(srv.Net, "-tls")
  265. l, err := listenTCP(network, addr, srv.ReusePort)
  266. if err != nil {
  267. return err
  268. }
  269. l = tls.NewListener(l, srv.TLSConfig)
  270. srv.Listener = l
  271. srv.started = true
  272. unlock()
  273. return srv.serveTCP(l)
  274. case "udp", "udp4", "udp6":
  275. l, err := listenUDP(srv.Net, addr, srv.ReusePort)
  276. if err != nil {
  277. return err
  278. }
  279. u := l.(*net.UDPConn)
  280. if e := setUDPSocketOptions(u); e != nil {
  281. u.Close()
  282. return e
  283. }
  284. srv.PacketConn = l
  285. srv.started = true
  286. unlock()
  287. return srv.serveUDP(u)
  288. }
  289. return &Error{err: "bad network"}
  290. }
  291. // ActivateAndServe starts a nameserver with the PacketConn or Listener
  292. // configured in *Server. Its main use is to start a server from systemd.
  293. func (srv *Server) ActivateAndServe() error {
  294. unlock := unlockOnce(&srv.lock)
  295. srv.lock.Lock()
  296. defer unlock()
  297. if srv.started {
  298. return &Error{err: "server already started"}
  299. }
  300. srv.init()
  301. if srv.PacketConn != nil {
  302. // Check PacketConn interface's type is valid and value
  303. // is not nil
  304. if t, ok := srv.PacketConn.(*net.UDPConn); ok && t != nil {
  305. if e := setUDPSocketOptions(t); e != nil {
  306. return e
  307. }
  308. }
  309. srv.started = true
  310. unlock()
  311. return srv.serveUDP(srv.PacketConn)
  312. }
  313. if srv.Listener != nil {
  314. srv.started = true
  315. unlock()
  316. return srv.serveTCP(srv.Listener)
  317. }
  318. return &Error{err: "bad listeners"}
  319. }
  320. // Shutdown shuts down a server. After a call to Shutdown, ListenAndServe and
  321. // ActivateAndServe will return.
  322. func (srv *Server) Shutdown() error {
  323. return srv.ShutdownContext(context.Background())
  324. }
  325. // ShutdownContext shuts down a server. After a call to ShutdownContext,
  326. // ListenAndServe and ActivateAndServe will return.
  327. //
  328. // A context.Context may be passed to limit how long to wait for connections
  329. // to terminate.
  330. func (srv *Server) ShutdownContext(ctx context.Context) error {
  331. srv.lock.Lock()
  332. if !srv.started {
  333. srv.lock.Unlock()
  334. return &Error{err: "server not started"}
  335. }
  336. srv.started = false
  337. if srv.PacketConn != nil {
  338. srv.PacketConn.SetReadDeadline(aLongTimeAgo) // Unblock reads
  339. }
  340. if srv.Listener != nil {
  341. srv.Listener.Close()
  342. }
  343. for rw := range srv.conns {
  344. rw.SetReadDeadline(aLongTimeAgo) // Unblock reads
  345. }
  346. srv.lock.Unlock()
  347. if testShutdownNotify != nil {
  348. testShutdownNotify.Broadcast()
  349. }
  350. var ctxErr error
  351. select {
  352. case <-srv.shutdown:
  353. case <-ctx.Done():
  354. ctxErr = ctx.Err()
  355. }
  356. if srv.PacketConn != nil {
  357. srv.PacketConn.Close()
  358. }
  359. return ctxErr
  360. }
  361. var testShutdownNotify *sync.Cond
  362. // getReadTimeout is a helper func to use system timeout if server did not intend to change it.
  363. func (srv *Server) getReadTimeout() time.Duration {
  364. if srv.ReadTimeout != 0 {
  365. return srv.ReadTimeout
  366. }
  367. return dnsTimeout
  368. }
  369. // serveTCP starts a TCP listener for the server.
  370. func (srv *Server) serveTCP(l net.Listener) error {
  371. defer l.Close()
  372. if srv.NotifyStartedFunc != nil {
  373. srv.NotifyStartedFunc()
  374. }
  375. var wg sync.WaitGroup
  376. defer func() {
  377. wg.Wait()
  378. close(srv.shutdown)
  379. }()
  380. for srv.isStarted() {
  381. rw, err := l.Accept()
  382. if err != nil {
  383. if !srv.isStarted() {
  384. return nil
  385. }
  386. if neterr, ok := err.(net.Error); ok && neterr.Temporary() {
  387. continue
  388. }
  389. return err
  390. }
  391. srv.lock.Lock()
  392. // Track the connection to allow unblocking reads on shutdown.
  393. srv.conns[rw] = struct{}{}
  394. srv.lock.Unlock()
  395. wg.Add(1)
  396. go srv.serveTCPConn(&wg, rw)
  397. }
  398. return nil
  399. }
  400. // serveUDP starts a UDP listener for the server.
  401. func (srv *Server) serveUDP(l net.PacketConn) error {
  402. defer l.Close()
  403. reader := Reader(defaultReader{srv})
  404. if srv.DecorateReader != nil {
  405. reader = srv.DecorateReader(reader)
  406. }
  407. lUDP, isUDP := l.(*net.UDPConn)
  408. readerPC, canPacketConn := reader.(PacketConnReader)
  409. if !isUDP && !canPacketConn {
  410. return &Error{err: "PacketConnReader was not implemented on Reader returned from DecorateReader but is required for net.PacketConn"}
  411. }
  412. if srv.NotifyStartedFunc != nil {
  413. srv.NotifyStartedFunc()
  414. }
  415. var wg sync.WaitGroup
  416. defer func() {
  417. wg.Wait()
  418. close(srv.shutdown)
  419. }()
  420. rtimeout := srv.getReadTimeout()
  421. // deadline is not used here
  422. for srv.isStarted() {
  423. var (
  424. m []byte
  425. sPC net.Addr
  426. sUDP *SessionUDP
  427. err error
  428. )
  429. if isUDP {
  430. m, sUDP, err = reader.ReadUDP(lUDP, rtimeout)
  431. } else {
  432. m, sPC, err = readerPC.ReadPacketConn(l, rtimeout)
  433. }
  434. if err != nil {
  435. if !srv.isStarted() {
  436. return nil
  437. }
  438. if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
  439. continue
  440. }
  441. return err
  442. }
  443. if len(m) < headerSize {
  444. if cap(m) == srv.UDPSize {
  445. srv.udpPool.Put(m[:srv.UDPSize])
  446. }
  447. continue
  448. }
  449. wg.Add(1)
  450. go srv.serveUDPPacket(&wg, m, l, sUDP, sPC)
  451. }
  452. return nil
  453. }
  454. // Serve a new TCP connection.
  455. func (srv *Server) serveTCPConn(wg *sync.WaitGroup, rw net.Conn) {
  456. w := &response{tsigSecret: srv.TsigSecret, tcp: rw}
  457. if srv.DecorateWriter != nil {
  458. w.writer = srv.DecorateWriter(w)
  459. } else {
  460. w.writer = w
  461. }
  462. reader := Reader(defaultReader{srv})
  463. if srv.DecorateReader != nil {
  464. reader = srv.DecorateReader(reader)
  465. }
  466. idleTimeout := tcpIdleTimeout
  467. if srv.IdleTimeout != nil {
  468. idleTimeout = srv.IdleTimeout()
  469. }
  470. timeout := srv.getReadTimeout()
  471. limit := srv.MaxTCPQueries
  472. if limit == 0 {
  473. limit = maxTCPQueries
  474. }
  475. for q := 0; (q < limit || limit == -1) && srv.isStarted(); q++ {
  476. m, err := reader.ReadTCP(w.tcp, timeout)
  477. if err != nil {
  478. // TODO(tmthrgd): handle error
  479. break
  480. }
  481. srv.serveDNS(m, w)
  482. if w.closed {
  483. break // Close() was called
  484. }
  485. if w.hijacked {
  486. break // client will call Close() themselves
  487. }
  488. // The first read uses the read timeout, the rest use the
  489. // idle timeout.
  490. timeout = idleTimeout
  491. }
  492. if !w.hijacked {
  493. w.Close()
  494. }
  495. srv.lock.Lock()
  496. delete(srv.conns, w.tcp)
  497. srv.lock.Unlock()
  498. wg.Done()
  499. }
  500. // Serve a new UDP request.
  501. func (srv *Server) serveUDPPacket(wg *sync.WaitGroup, m []byte, u net.PacketConn, udpSession *SessionUDP, pcSession net.Addr) {
  502. w := &response{tsigSecret: srv.TsigSecret, udp: u, udpSession: udpSession, pcSession: pcSession}
  503. if srv.DecorateWriter != nil {
  504. w.writer = srv.DecorateWriter(w)
  505. } else {
  506. w.writer = w
  507. }
  508. srv.serveDNS(m, w)
  509. wg.Done()
  510. }
  511. func (srv *Server) serveDNS(m []byte, w *response) {
  512. dh, off, err := unpackMsgHdr(m, 0)
  513. if err != nil {
  514. // Let client hang, they are sending crap; any reply can be used to amplify.
  515. return
  516. }
  517. req := new(Msg)
  518. req.setHdr(dh)
  519. switch action := srv.MsgAcceptFunc(dh); action {
  520. case MsgAccept:
  521. if req.unpack(dh, m, off) == nil {
  522. break
  523. }
  524. fallthrough
  525. case MsgReject, MsgRejectNotImplemented:
  526. opcode := req.Opcode
  527. req.SetRcodeFormatError(req)
  528. req.Zero = false
  529. if action == MsgRejectNotImplemented {
  530. req.Opcode = opcode
  531. req.Rcode = RcodeNotImplemented
  532. }
  533. // Are we allowed to delete any OPT records here?
  534. req.Ns, req.Answer, req.Extra = nil, nil, nil
  535. w.WriteMsg(req)
  536. fallthrough
  537. case MsgIgnore:
  538. if w.udp != nil && cap(m) == srv.UDPSize {
  539. srv.udpPool.Put(m[:srv.UDPSize])
  540. }
  541. return
  542. }
  543. w.tsigStatus = nil
  544. if w.tsigSecret != nil {
  545. if t := req.IsTsig(); t != nil {
  546. if secret, ok := w.tsigSecret[t.Hdr.Name]; ok {
  547. w.tsigStatus = TsigVerify(m, secret, "", false)
  548. } else {
  549. w.tsigStatus = ErrSecret
  550. }
  551. w.tsigTimersOnly = false
  552. w.tsigRequestMAC = req.Extra[len(req.Extra)-1].(*TSIG).MAC
  553. }
  554. }
  555. if w.udp != nil && cap(m) == srv.UDPSize {
  556. srv.udpPool.Put(m[:srv.UDPSize])
  557. }
  558. srv.Handler.ServeDNS(w, req) // Writes back to the client
  559. }
  560. func (srv *Server) readTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
  561. // If we race with ShutdownContext, the read deadline may
  562. // have been set in the distant past to unblock the read
  563. // below. We must not override it, otherwise we may block
  564. // ShutdownContext.
  565. srv.lock.RLock()
  566. if srv.started {
  567. conn.SetReadDeadline(time.Now().Add(timeout))
  568. }
  569. srv.lock.RUnlock()
  570. var length uint16
  571. if err := binary.Read(conn, binary.BigEndian, &length); err != nil {
  572. return nil, err
  573. }
  574. m := make([]byte, length)
  575. if _, err := io.ReadFull(conn, m); err != nil {
  576. return nil, err
  577. }
  578. return m, nil
  579. }
  580. func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
  581. srv.lock.RLock()
  582. if srv.started {
  583. // See the comment in readTCP above.
  584. conn.SetReadDeadline(time.Now().Add(timeout))
  585. }
  586. srv.lock.RUnlock()
  587. m := srv.udpPool.Get().([]byte)
  588. n, s, err := ReadFromSessionUDP(conn, m)
  589. if err != nil {
  590. srv.udpPool.Put(m)
  591. return nil, nil, err
  592. }
  593. m = m[:n]
  594. return m, s, nil
  595. }
  596. func (srv *Server) readPacketConn(conn net.PacketConn, timeout time.Duration) ([]byte, net.Addr, error) {
  597. srv.lock.RLock()
  598. if srv.started {
  599. // See the comment in readTCP above.
  600. conn.SetReadDeadline(time.Now().Add(timeout))
  601. }
  602. srv.lock.RUnlock()
  603. m := srv.udpPool.Get().([]byte)
  604. n, addr, err := conn.ReadFrom(m)
  605. if err != nil {
  606. srv.udpPool.Put(m)
  607. return nil, nil, err
  608. }
  609. m = m[:n]
  610. return m, addr, nil
  611. }
  612. // WriteMsg implements the ResponseWriter.WriteMsg method.
  613. func (w *response) WriteMsg(m *Msg) (err error) {
  614. if w.closed {
  615. return &Error{err: "WriteMsg called after Close"}
  616. }
  617. var data []byte
  618. if w.tsigSecret != nil { // if no secrets, dont check for the tsig (which is a longer check)
  619. if t := m.IsTsig(); t != nil {
  620. data, w.tsigRequestMAC, err = TsigGenerate(m, w.tsigSecret[t.Hdr.Name], w.tsigRequestMAC, w.tsigTimersOnly)
  621. if err != nil {
  622. return err
  623. }
  624. _, err = w.writer.Write(data)
  625. return err
  626. }
  627. }
  628. data, err = m.Pack()
  629. if err != nil {
  630. return err
  631. }
  632. _, err = w.writer.Write(data)
  633. return err
  634. }
  635. // Write implements the ResponseWriter.Write method.
  636. func (w *response) Write(m []byte) (int, error) {
  637. if w.closed {
  638. return 0, &Error{err: "Write called after Close"}
  639. }
  640. switch {
  641. case w.udp != nil:
  642. if u, ok := w.udp.(*net.UDPConn); ok {
  643. return WriteToSessionUDP(u, m, w.udpSession)
  644. }
  645. return w.udp.WriteTo(m, w.pcSession)
  646. case w.tcp != nil:
  647. if len(m) > MaxMsgSize {
  648. return 0, &Error{err: "message too large"}
  649. }
  650. msg := make([]byte, 2+len(m))
  651. binary.BigEndian.PutUint16(msg, uint16(len(m)))
  652. copy(msg[2:], m)
  653. return w.tcp.Write(msg)
  654. default:
  655. panic("dns: internal error: udp and tcp both nil")
  656. }
  657. }
  658. // LocalAddr implements the ResponseWriter.LocalAddr method.
  659. func (w *response) LocalAddr() net.Addr {
  660. switch {
  661. case w.udp != nil:
  662. return w.udp.LocalAddr()
  663. case w.tcp != nil:
  664. return w.tcp.LocalAddr()
  665. default:
  666. panic("dns: internal error: udp and tcp both nil")
  667. }
  668. }
  669. // RemoteAddr implements the ResponseWriter.RemoteAddr method.
  670. func (w *response) RemoteAddr() net.Addr {
  671. switch {
  672. case w.udpSession != nil:
  673. return w.udpSession.RemoteAddr()
  674. case w.pcSession != nil:
  675. return w.pcSession
  676. case w.tcp != nil:
  677. return w.tcp.RemoteAddr()
  678. default:
  679. panic("dns: internal error: udpSession, pcSession and tcp are all nil")
  680. }
  681. }
  682. // TsigStatus implements the ResponseWriter.TsigStatus method.
  683. func (w *response) TsigStatus() error { return w.tsigStatus }
  684. // TsigTimersOnly implements the ResponseWriter.TsigTimersOnly method.
  685. func (w *response) TsigTimersOnly(b bool) { w.tsigTimersOnly = b }
  686. // Hijack implements the ResponseWriter.Hijack method.
  687. func (w *response) Hijack() { w.hijacked = true }
  688. // Close implements the ResponseWriter.Close method
  689. func (w *response) Close() error {
  690. if w.closed {
  691. return &Error{err: "connection already closed"}
  692. }
  693. w.closed = true
  694. switch {
  695. case w.udp != nil:
  696. // Can't close the udp conn, as that is actually the listener.
  697. return nil
  698. case w.tcp != nil:
  699. return w.tcp.Close()
  700. default:
  701. panic("dns: internal error: udp and tcp both nil")
  702. }
  703. }
  704. // ConnectionState() implements the ConnectionStater.ConnectionState() interface.
  705. func (w *response) ConnectionState() *tls.ConnectionState {
  706. type tlsConnectionStater interface {
  707. ConnectionState() tls.ConnectionState
  708. }
  709. if v, ok := w.tcp.(tlsConnectionStater); ok {
  710. t := v.ConnectionState()
  711. return &t
  712. }
  713. return nil
  714. }