up
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user