89 lines
1.8 KiB
Go
89 lines
1.8 KiB
Go
package resolver
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
var resolvers = []string{"1.1.1.1:53", "8.8.8.8:53"}
|
|
|
|
func lookupTXT(domain string) ([]string, error) {
|
|
for _, server := range resolvers {
|
|
m := new(dns.Msg)
|
|
m.SetQuestion(dns.Fqdn(domain), dns.TypeTXT)
|
|
resp, err := dns.Exchange(m, server)
|
|
if err != nil || resp == nil {
|
|
continue
|
|
}
|
|
var results []string
|
|
for _, ans := range resp.Answer {
|
|
if txt, ok := ans.(*dns.TXT); ok {
|
|
results = append(results, txt.Txt...)
|
|
}
|
|
}
|
|
if len(results) > 0 {
|
|
return results, nil
|
|
}
|
|
}
|
|
return nil, fmt.Errorf("no TXT records found")
|
|
}
|
|
|
|
func CheckSPF(domain string) (string, bool) {
|
|
txts, err := lookupTXT(domain)
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
for _, txt := range txts {
|
|
if strings.HasPrefix(txt, "v=spf1") {
|
|
return txt, true
|
|
}
|
|
}
|
|
return "", false
|
|
}
|
|
|
|
func CheckDMARC(domain string) (string, bool) {
|
|
dmarc := "_dmarc." + domain
|
|
txts, err := lookupTXT(dmarc)
|
|
if err != nil || len(txts) == 0 {
|
|
return "", false
|
|
}
|
|
return txts[0], true
|
|
}
|
|
|
|
var rbls = []string{
|
|
"zen.spamhaus.org",
|
|
"bl.spamcop.net",
|
|
"b.barracudacentral.org",
|
|
}
|
|
|
|
func CheckBlacklists(ip string) []string {
|
|
var listed []string
|
|
parts := strings.Split(ip, ".")
|
|
if len(parts) != 4 {
|
|
return listed
|
|
}
|
|
reversed := fmt.Sprintf("%s.%s.%s.%s", parts[3], parts[2], parts[1], parts[0])
|
|
for _, rbl := range rbls {
|
|
query := fmt.Sprintf("%s.%s.", reversed, rbl)
|
|
m := new(dns.Msg)
|
|
m.SetQuestion(query, dns.TypeA)
|
|
for _, resolver := range resolvers {
|
|
resp, err := dns.Exchange(m, resolver)
|
|
if err == nil && resp != nil && len(resp.Answer) > 0 {
|
|
for _, ans := range resp.Answer {
|
|
if a, ok := ans.(*dns.A); ok {
|
|
ip := a.A.String()
|
|
if strings.HasPrefix(ip, "127.0.0.") {
|
|
listed = append(listed, rbl)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return listed
|
|
}
|