From 308041d4405b88046722506c730633bb6a515c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20K=C3=A1roly=20G=C3=A1briel?= Date: Sun, 20 Jan 2019 13:02:46 +0200 Subject: [PATCH] gip: rework giplib in a more propper library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit and add Akamai for IPv4 Signed-off-by: Nagy Károly Gábriel --- giplib/giplib.go | 100 +++++++++++++++++++++++------------------------ main.go | 8 ++-- 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/giplib/giplib.go b/giplib/giplib.go index 7b5c1a4..a5e4707 100644 --- a/giplib/giplib.go +++ b/giplib/giplib.go @@ -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 diff --git a/main.go b/main.go index 11bc684..7f9f725 100644 --- a/main.go +++ b/main.go @@ -31,15 +31,15 @@ func main() { all = true } if all { - fmt.Println(giplib.GetIPv4()) - fmt.Println(giplib.GetIPv6()) + fmt.Println(giplib.GetOpenDNS4()) + fmt.Println(giplib.GetGoogle6()) os.Exit(0) } if *ptr4 { - fmt.Println(giplib.GetIPv4()) + fmt.Println(giplib.GetOpenDNS4()) } if *ptr6 { - fmt.Println(giplib.GetIPv6()) + fmt.Println(giplib.GetOpenDNS6()) } }