+ whois: add WHOIS information for a client
+ return WHOIS info in GET /clients response
This commit is contained in:
59
home/dns.go
59
home/dns.go
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user