通过 Cisco IPSec 连接时,应用程序无法解析内部 DNS 条目

Posted

技术标签:

【中文标题】通过 Cisco IPSec 连接时,应用程序无法解析内部 DNS 条目【英文标题】:App doesn't resolve an internal DNS entry when connecting via Cisco IPSec 【发布时间】:2016-08-28 02:53:56 【问题描述】:

我使用 Cisco IPsec 连接到我的工作场所 ***。我使用 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()

但是,尝试在 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))
    

在连接到 *** 时运行上述程序会产生以下输出:

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

其中 10.135.1.1 是我本地网络的 DNS 服务器。据我了解,纯 Go DNS 解析器在 OS X 上不可用。通过设置 GODEBUG=netdns=cgo 强制 Go 使用 cgo DNS 解析器没有任何区别。

【问题讨论】:

这个帖子可能对你有帮助:***.com/questions/30043248/… 这似乎是一个错误,所以你应该提交一个issue,也尝试从 git 编译 go,看看问题是否在其中修复(前几天在 git 中有一些 DNS 工作)。 OSX 默认使用 cgo golang.org/src/net/conf.go#L68 这可能是相关的:serverfault.com/questions/478534/… 请在连接到 *** 和断开连接时从 OSX 命令行提供host -a scotty.infinidat.com 的输出。 (假设无论是否连接行为都不同) 【参考方案1】:

您可能已经这样做了,但在我这边执行 dig scotty.infinidat.com 时,我没有得到任何记录(与您的结果相符):

$ dig scotty.infinidat.com

; <<>> DiG 9.8.3-P1 <<>> scotty.infinidat.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 53313
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;scotty.infinidat.com.          IN      A

;; AUTHORITY SECTION:
infinidat.com.          155     IN      SOA     ns1.dnsimple.com. admin.dnsimple.com. 1438782431 86400 7200 604800 300

;; Query time: 234 msec
;; SERVER: 10.132.0.1#53(10.132.0.1)
;; WHEN: Sun Jul 30 21:37:14 2017
;; MSG SIZE  rcvd: 93

因此,如果 www.google.com 有效,那么更改可能与您的 DNS/ZONE 更相关。

【讨论】:

【参考方案2】:

或许你可以先用一个完整的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)
    
 

【讨论】:

以上是关于通过 Cisco IPSec 连接时,应用程序无法解析内部 DNS 条目的主要内容,如果未能解决你的问题,请参考以下文章

CIsco路由器实现IPSec 虚拟专用网原理及配置详解

Cisco ASA 实现 IPSec 虚拟专用网(内附故障排查)

Cisco ASA 5505配置Ipsec VPN,Cisco vpn客户端可以拔上来,也可以获取IP,但是无法访问内网。

Cisco ASA防火墙实现IPSec 虚拟专用网,可跟做!!!

CISCO IOS 与 USG6KV IPSEC ×××

Cisco的ASA防火墙和路由器上实现IPSec虚拟专用网