名称解析不起作用,但 nslookup 起作用

名称解析不起作用,但 nslookup 起作用

我在安装 Solaris 11 时遇到了一个非常奇怪的问题。DNS 解析不起作用,但奇怪的是,nslookup 可以并且连接正常:

root@solarisxyz:~# ping stackexchange.com
ping: unknown host stackexchange.com
root@solarisxyz:~# nslookup stackexchange.com
Server:         10.x.x.x (DNS)
Address:        10.x.x.x#y

Non-authoritative answer:
Name:   stackexchange.com
Address: 64.34.119.12

root@solarisxyz:~# ping 64.34.119.12
64.34.119.12 is alive

文件的相关部分:

  • /etc/resolv.conf:(这和我们的 Linux 盒子有一样的东西)

    domain us.oracle.com
    nameserver 10.x.x.x
    nameserver 10.x.x.x  
    
  • /etc/主机:

    # ::1 solarisxyz localhost (commented out)
    127.0.0.1 localhost loghost solarisxyz
    
  • /etc/nsswitch.conf:

    hosts:    files dns
    # pretty much everything else set to files
    

答案1

从 Solaris 11 开始,网络配置发生了根本性的变化。nsswitch.conf 现在仅提供信息。假设您未处于自动模式,在这种情况下 DNS 已正确配置,以下是新过程:

http://docs.oracle.com/cd/E23824_01/html/E24456/gliyc.html#OSTELgllcu

答案2

使用 SMF 配置命名服务

以下示例显示如何使用 SMF 命令配置 DNS。

# svccfg
svc:> select dns/client
svc:/network/dns/client> setprop config/search = astring: \
("us.company.com" "eu.company.com" "companya.com" "companyb.com" "company.com" )
svc:/network/dns/client> setprop config/nameserver = net_address: \
( 138.2.202.15 138.2.202.25 )
svc:/network/dns/client> select dns/client:default
svc:/network/dns/client:default> refresh
svc:/network/dns/client:default> validate
svc:/network/dns/client:default> select name-service/switch
svc:/system/name-service/switch> setprop config/host = astring: "files dns"
svc:/system/name-service/switch> select system/name-service/switch:default
svc:/system/name-service/switch:default> refresh
svc:/system/name-service/switch:default> validate
svc:/system/name-service/switch:default> 
# svcadm enable dns/client
# svcadm refresh name-service/switch
# grep host /etc/nsswitch.conf
hosts:  files dns
# cat /etc/resolv.conf

答案3

我认为您的问题与 Solaris 名称服务守护程序有关,或者更准确地说,与这个野兽的配置有关。也许您已经手动编辑了 /etc/nsswitch.conf ?这可以解释为什么名称服务守护进程没有接收到它。

据我所知,nslookup 命令不使用 Solaris 名称服务。这可能解释了为什么您会看到 nslookup 按预期工作,而其他所有内容却不然。

在 Solaris 上,使用命令验证查找服务是否按预期工作始终是一个好主意getent。在你的例子中它将是:

getent 主机 stackexchange.com

因此,问题是如何确保 Solaris 名称服务知道它必须在两个本地文件中查找主机名在 DNS 中。请记住,在 Solaris 11 中,您不再应该/允许直接编辑 /etc/nsswitch.conf 等文件。它们由在 SMF 下运行的守护进程控制。以下是更改方法:

# svccfg
svc:> 选择名称服务/交换机
svc:/system/name-service/switch> setprop config/host = astring: "文件 dns"
svc:/system/name-service/switch> 选择 system/name-service/switch:default
svc:/system/name-service/switch:default> 刷新
svc:/system/name-service/switch:default> 验证
svc:/system/name-service/switch:default> 退出
# svcadm 刷新名称服务/开关

此后,您会注意到您的/etc/nsswitch.conf文件已被重新写入磁盘。如果您之前手动编辑过,您可能看不到任何实际变化。重新发出该getent命令,希望它现在可以工作。

祝你好运。

答案4

首先请trussnscd

truss -aefld -vall -wall -rall -o truss-nscd.out -u nss_\*:: -u libnsl:: -p `pgrep nscd`

当上述truss命令运行时,请尝试

truss -aefld -vall -wall -rall -o truss-getent_1.out -u a.out,libnsl:: getent hosts ANY_HOSTNAME

那么请暂时禁用nscd

svcadm disable name-service-cache

并运行:

truss -aefld -vall -wall -rall -o truss-getent_2.out -u a.out,libnsl:: -u nss_\*:: getent hosts ANY_HOSTNAME

现在您可以重新启用名称服务缓存:

svcadm enable name-service-cache

现在尝试...希望它会起作用。

相关内容