+ whois: add WHOIS information for a client

+ return WHOIS info in GET /clients response
This commit is contained in:
Simon Zolin
2019-09-18 18:44:27 +03:00
parent f6404ef181
commit fd592b4dc8
10 changed files with 300 additions and 35 deletions

View File

@@ -25,6 +25,8 @@ type dnsContext struct {
rdnsIP map[string]bool
rdnsLock sync.Mutex // synchronize access to rdnsIP
upstream upstream.Upstream // Upstream object for our own DNS server
whois *Whois
}
// initDNSServer creates an instance of the dnsforward.Server
@@ -56,6 +58,7 @@ func initDNSServer(baseDir string) {
config.Users = nil
initRDNS()
config.dnsctx.whois = initWhois(&config.clients)
initFiltering()
}
@@ -63,6 +66,59 @@ func isRunning() bool {
return config.dnsServer != nil && config.dnsServer.IsRunning()
}
// Return TRUE if IP is within public Internet IP range
func isPublicIP(ip net.IP) bool {
ip4 := ip.To4()
if ip4 != nil {
switch ip4[0] {
case 0:
return false //software
case 10:
return false //private network
case 127:
return false //loopback
case 169:
if ip4[1] == 254 {
return false //link-local
}
case 172:
if ip4[1] >= 16 && ip4[1] <= 31 {
return false //private network
}
case 192:
if (ip4[1] == 0 && ip4[2] == 0) || //private network
(ip4[1] == 0 && ip4[2] == 2) || //documentation
(ip4[1] == 88 && ip4[2] == 99) || //reserved
(ip4[1] == 168) { //private network
return false
}
case 198:
if (ip4[1] == 18 || ip4[2] == 19) || //private network
(ip4[1] == 51 || ip4[2] == 100) { //documentation
return false
}
case 203:
if ip4[1] == 0 && ip4[2] == 113 { //documentation
return false
}
case 224:
if ip4[1] == 0 && ip4[2] == 0 { //multicast
return false
}
case 255:
if ip4[1] == 255 && ip4[2] == 255 && ip4[3] == 255 { //subnet
return false
}
}
} else {
if ip.IsLoopback() || ip.IsLinkLocalMulticast() || ip.IsLinkLocalUnicast() {
return false
}
}
return true
}
func onDNSRequest(d *proxy.DNSContext) {
qType := d.Req.Question[0].Qtype
if qType != dns.TypeA && qType != dns.TypeAAAA {
@@ -79,6 +135,9 @@ func onDNSRequest(d *proxy.DNSContext) {
if !ipAddr.IsLoopback() {
beginAsyncRDNS(ip)
}
if isPublicIP(ipAddr) {
config.dnsctx.whois.Begin(ip)
}
}
func generateServerConfig() (dnsforward.ServerConfig, error) {