dns.go 1018 B

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