我使用Cisco IPsec连接到我的工作场所VPN.我使用OS X的本机Cisco IPSec客户端进行连接.我们有一个内部DNS服务器,用于保存内部站点的记录,例如scotty.infinidat.com.使用curl联系内部站点按预期工作.使用以下Python代码也可以:
import requests
resp = requests.get("http://www.google.com")
resp.raise_for_status()
resp = requests.get("http://scotty.infinidat.com")
resp.raise_for_status()
Run Code Online (Sandbox Code Playgroud)
但是,尝试在Go中实现等效操作失败:
包主
import (
"fmt"
"net/http"
)
func main() {
_, err := http.Get("http://google.com/") // This works
if err != nil {
panic(fmt.Sprintf("Error contacting Google: %s", err))
}
_, err = http.Get("http://scotty.infinidat.com/") // This doesn't
if err != nil {
panic(fmt.Sprintf("Error contacting an internal site: %s", err))
}
}
Run Code Online (Sandbox Code Playgroud)
连接到VPN时运行上面的程序会产生以下输出:
panic: Error contacting internal site: Get http://scotty.infinidat.com/: dial tcp: lookup scotty.infinidat.com on 10.135.1.1:53: no such host
goroutine 1 [running]:
panic(0x290ca0, 0xc82010a490)
/usr/local/Cellar/go/1.6.2/libexec/src/runtime/panic.go:481 +0x3e6
main.main()
/Users/roeyd/src/go/src/webtest/main.go:16 +0x2af
Run Code Online (Sandbox Code Playgroud)
10.135.1.1是我本地网络的DNS服务器.根据我的理解,OS X上不提供纯Go DNS解析器.强制Go通过设置使用cgo DNS解析器GODEBUG=netdns=cgo没有任何区别.
也许你可以使用完整的DNS库来首先解析IP:
package main
import (
"log"
"github.com/miekg/dns"
)
func main() {
c := dns.Client{}
m := dns.Msg{}
m.SetQuestion("scotty.infinidat.com.", dns.TypeA)
r, t, err := c.Exchange(&m, "10.135.1.1:53")
if err != nil {
log.Fatal(err)
}
log.Printf("Took %v", t)
for _, ans := range r.Answer {
Arecord := ans.(*dns.A)
log.Printf("%s", Arecord.A)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |