1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| package main
import ( "fmt" "log" "net" "strings"
"github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcap" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" )
type DNSPacket struct { ID uint16 `gorm:"primary_key"` Queries string Answers string }
func main() { handle, err := pcap.OpenLive("en0", 65535, true, pcap.BlockForever) if err != nil { log.Fatal(err) } defer handle.Close()
filter := "udp and port 53" err = handle.SetBPFFilter(filter) if err != nil { log.Fatal(err) }
db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local") if err != nil { log.Fatal(err) } defer db.Close()
db.AutoMigrate(&DNSPacket{})
packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) for packet := range packetSource.Packets() { dnsLayer := packet.Layer(layers.LayerTypeDNS) if dnsLayer != nil { dnsPacket := dnsLayer.(*layers.DNS) if dnsPacket.QR == false && dnsPacket.OpCode == layers.DNSOpCodeQuery { queries := make([]string, len(dnsPacket.Questions))
for i, question := range dnsPacket.Questions { queries[i] = string(question.Name) fmt.Println((question)) }
var count int db.Model(&DNSPacket{}).Where("id = ?", dnsPacket.ID).Count(&count) if count == 0 { answers := make([]string, 0) for _, query := range queries { ips, err := resolveDNS(query) if err == nil { answers = append(answers, ips...) } }
dnsPacket := DNSPacket{ ID: dnsPacket.ID, Queries: strings.Join(queries, ","), Answers: strings.Join(answers, ","), } db.Create(&dnsPacket) } } } } }
func resolveDNS(query string) ([]string, error) { ips := make([]string, 0) addrs, err := net.LookupHost(query) if err != nil { return ips, err } for _, addr := range addrs { ips = append(ips, addr) } return ips, nil }
|