|
|
|
@ -1,45 +1,44 @@
|
|
|
|
|
/* |
|
|
|
|
Package giplib implements simple routines for |
|
|
|
|
retrieving one's IPv4 and IPv6 addresses from |
|
|
|
|
various DNS providers. For now it implements |
|
|
|
|
OpenDNS for IPv4 and IPv6, Google for IPv4 and |
|
|
|
|
IPv6 and Akamai for IPv4 |
|
|
|
|
*/ |
|
|
|
|
package giplib |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"github.com/miekg/dns" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
c *dns.Client |
|
|
|
|
m *dns.Msg |
|
|
|
|
ipv4, ipv6 string |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
dig {-4,-6} +short myip.opendns.com @resolver1.opendns.com |
|
|
|
|
dig {-4,-6} TXT +short o-o.myaddr.l.google.com @ns1.google.com |
|
|
|
|
dig -4 @ns1-1.akamaitech.net whoami.akamai.net +short |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
func GetIPv4() string { |
|
|
|
|
o4 := getO4() |
|
|
|
|
g4 := getG4() |
|
|
|
|
if o4 == g4 { |
|
|
|
|
return o4 |
|
|
|
|
} |
|
|
|
|
return "" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func GetIPv6() string { |
|
|
|
|
o6 := getO6() |
|
|
|
|
g6 := getG6() |
|
|
|
|
if o6 == g6 { |
|
|
|
|
return o6 |
|
|
|
|
} |
|
|
|
|
return "" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func getO4() string { |
|
|
|
|
var ipv4 string |
|
|
|
|
nameserver := dns.Fqdn("resolver1.opendns.com") + ":53" |
|
|
|
|
|
|
|
|
|
c := new(dns.Client) |
|
|
|
|
m := &dns.Msg{ |
|
|
|
|
func init() { |
|
|
|
|
c = new(dns.Client) |
|
|
|
|
m = &dns.Msg{ |
|
|
|
|
MsgHdr: dns.MsgHdr{ |
|
|
|
|
RecursionDesired: true, |
|
|
|
|
}, |
|
|
|
|
Question: make([]dns.Question, 1), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//GetOpenDNS4 will retrieve the IPv4 public IP as seen by OpenDNS
|
|
|
|
|
func GetOpenDNS4() string { |
|
|
|
|
nameserver := dns.Fqdn("ns1-1.akamaitech.net") + ":53" |
|
|
|
|
c.Net = "udp4" |
|
|
|
|
m.SetQuestion("myip.opendns.com.", dns.TypeA) |
|
|
|
|
m.SetQuestion("whoami.akamai.net.", dns.TypeA) |
|
|
|
|
r4, _, e4 := c.Exchange(m, nameserver) |
|
|
|
|
|
|
|
|
|
if e4 != nil { |
|
|
|
@ -51,17 +50,10 @@ func getO4() string {
|
|
|
|
|
return ipv4 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func getO6() string { |
|
|
|
|
var ipv6 string |
|
|
|
|
//GetOpenDNS6 will retrieve the IPv6 IP as seen by OpenDNS
|
|
|
|
|
func GetOpenDNS6() string { |
|
|
|
|
nameserver := dns.Fqdn("resolver1.opendns.com") + ":53" |
|
|
|
|
|
|
|
|
|
c := new(dns.Client) |
|
|
|
|
m := &dns.Msg{ |
|
|
|
|
MsgHdr: dns.MsgHdr{ |
|
|
|
|
RecursionDesired: true, |
|
|
|
|
}, |
|
|
|
|
Question: make([]dns.Question, 1), |
|
|
|
|
} |
|
|
|
|
c.Net = "udp6" |
|
|
|
|
m.SetQuestion("myip.opendns.com.", dns.TypeAAAA) |
|
|
|
|
r6, _, e6 := c.Exchange(m, nameserver) |
|
|
|
@ -75,17 +67,10 @@ func getO6() string {
|
|
|
|
|
return ipv6 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func getG4() string { |
|
|
|
|
var ipv4 string |
|
|
|
|
//GetGoogle4 will retrieve the IPv4 public IP as seen by Google
|
|
|
|
|
func GetGoogle4() string { |
|
|
|
|
nameserver := dns.Fqdn("ns1.google.com") + ":53" |
|
|
|
|
|
|
|
|
|
c := new(dns.Client) |
|
|
|
|
m := &dns.Msg{ |
|
|
|
|
MsgHdr: dns.MsgHdr{ |
|
|
|
|
RecursionDesired: true, |
|
|
|
|
}, |
|
|
|
|
Question: make([]dns.Question, 1), |
|
|
|
|
} |
|
|
|
|
c.Net = "udp4" |
|
|
|
|
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT) |
|
|
|
|
r4, _, e4 := c.Exchange(m, nameserver) |
|
|
|
@ -99,17 +84,10 @@ func getG4() string {
|
|
|
|
|
return ipv4 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func getG6() string { |
|
|
|
|
var ipv6 string |
|
|
|
|
//GetGoogle6 will retrieve the IPv6 IP as seen by Google
|
|
|
|
|
func GetGoogle6() string { |
|
|
|
|
nameserver := dns.Fqdn("ns1.google.com") + ":53" |
|
|
|
|
|
|
|
|
|
c := new(dns.Client) |
|
|
|
|
m := &dns.Msg{ |
|
|
|
|
MsgHdr: dns.MsgHdr{ |
|
|
|
|
RecursionDesired: true, |
|
|
|
|
}, |
|
|
|
|
Question: make([]dns.Question, 1), |
|
|
|
|
} |
|
|
|
|
c.Net = "udp6" |
|
|
|
|
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT) |
|
|
|
|
r6, _, e6 := c.Exchange(m, nameserver) |
|
|
|
@ -123,6 +101,24 @@ func getG6() string {
|
|
|
|
|
return ipv6 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//GetAkamai4 will retrieve the IPv4 public IP as seen by Akamai
|
|
|
|
|
func GetAkamai4() string { |
|
|
|
|
nameserver := dns.Fqdn("ns1.google.com") + ":53" |
|
|
|
|
|
|
|
|
|
c.Net = "udp4" |
|
|
|
|
m.SetQuestion("o-o.myaddr.l.google.com.", dns.TypeTXT) |
|
|
|
|
r4, _, e4 := c.Exchange(m, nameserver) |
|
|
|
|
|
|
|
|
|
if e4 != nil { |
|
|
|
|
ipv4 = "" |
|
|
|
|
} else { |
|
|
|
|
ipv4 = getIP(r4.Answer) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ipv4 |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func getIP(ra []dns.RR) string { |
|
|
|
|
//the answer will always be one IP or none
|
|
|
|
|
var ip string |
|
|
|
|