dns.go 748 B

123456789101112131415161718192021222324252627282930313233
  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, []netaddr.IP) {
  8. var msg dnsmessage.Message
  9. if err := msg.Unpack(payload); err != nil {
  10. return "", "", nil
  11. }
  12. if len(msg.Questions) < 1 {
  13. return "", "", nil
  14. }
  15. var ips []netaddr.IP
  16. for _, a := range msg.Answers {
  17. switch a.Header.Type {
  18. case dnsmessage.TypeA:
  19. if r, ok := a.Body.(*dnsmessage.AResource); ok {
  20. ips = append(ips, netaddr.IPFrom4(r.A))
  21. }
  22. case dnsmessage.TypeAAAA:
  23. if r, ok := a.Body.(*dnsmessage.AAAAResource); ok {
  24. ips = append(ips, netaddr.IPFrom16(r.AAAA))
  25. }
  26. }
  27. }
  28. q := msg.Questions[0]
  29. return q.Type.String(), strings.TrimSuffix(q.Name.String(), "."), ips
  30. }