dns.go 1013 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package l7
  2. import (
  3. "strings"
  4. "golang.org/x/net/dns/dnsmessage"
  5. "inet.af/netaddr"
  6. )
  7. func ParseDns(payload []byte) (string, string, uint32, []netaddr.IP) {
  8. var msg dnsmessage.Message
  9. if err := msg.Unpack(payload); err != nil {
  10. return "", "", 0, nil
  11. }
  12. if len(msg.Questions) < 1 {
  13. return "", "", 0, nil
  14. }
  15. var ips []netaddr.IP
  16. var ttl uint32
  17. for _, a := range msg.Answers {
  18. ttl = a.Header.TTL
  19. switch a.Header.Type {
  20. case dnsmessage.TypeA:
  21. if r, ok := a.Body.(*dnsmessage.AResource); ok {
  22. ips = append(ips, netaddr.IPFrom4(r.A))
  23. }
  24. case dnsmessage.TypeAAAA:
  25. if r, ok := a.Body.(*dnsmessage.AAAAResource); ok {
  26. ips = append(ips, netaddr.IPFrom16(r.AAAA))
  27. }
  28. }
  29. }
  30. //if len(msg.Answers) == 0 {
  31. // for _, a := range msg.Authorities {
  32. // ttl = a.Header.TTL
  33. // }
  34. //}
  35. q := msg.Questions[0]
  36. qType := q.Type.String()
  37. if len(qType) > 4 {
  38. qType = qType[4:]
  39. }
  40. //fmt.Println("gostring", msg.GoString())
  41. return qType, strings.TrimSuffix(q.Name.String(), "."), ttl, ips
  42. }