如何正确配置搜索域?

我最近在我的工作电脑上安装了Ubuntu GNOME,取代了Windows 7,因为我将要进行大量的Linux开发工作。
我们许多配置和开发脚本都使用缩短的URL来连接公司网络中的服务器。也就是说,它们使用http://server而不是http://server.location.company.com。在Windows中,我从来没有遇到过这些URL的问题,但在Ubuntu中我无法正确地使它们工作。对我来说,简单地输入完整的URL是不可行的,因为缩写形式在各种脚本中广泛使用,但我可以访问完整的URL。
当我使用Dell SonicWall NetExtender VPN Client连接到公司的VPN时,缩写的URL可以正常工作。
根据我目前的研究,我认为我需要在Ubuntu上配置location.company.com作为搜索域,但我迄今为止尝试失败了。以下是我尝试过的方法:
在“网络连接”应用程序中,编辑我的无线连接。在IPv4选项卡下,仅选择自动(DHCP)地址。然后输入location.company.com作为搜索域,并将我们的DNS服务器也放入其中。但这并没有产生明显的差异。
按照此处所述修改dhclient.conf文件。
运行dpkg-reconfigure resolvconf以确保它会动态更新resolv.conf文件。
我还担心目前我已经尝试了几种不同的方法,它们可能会相互干扰。我知道Ubuntu在过去几年中有些配置发生了变化,很难找到最新的信息。对于最新版本的Ubuntu,网络管理器、resolvconf、dhclient和其他配置文件如何协同工作还不完全清楚。
所以,我的问题是:我该如何配置我的计算机才能使短网址在Ubuntu 14.10上正常工作?
或者,我应该使用哪些网络配置程序来完成这个任务,如何配置它们,并且如何验证它们是否正常工作?
谢谢你的帮助!如果有需要提供任何额外信息,请告诉我。
编辑:这是我的/etc/resolv.conf文件,我相信是由resolvconf生成的。
# Add Company Nameservers and Domain
nameserver 192.168.200.53
nameserver 192.168.200.65
search location.company.com
nameserver 127.0.1.1
search location.company.com
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search hsd1.co.comcast.net

你解决过这个问题吗? - Hitechcomputergeek
快速更新:在某个时间点,我进行了一次更高版本的Ubuntu的全新安装。可能是16.04吧?无论如何,自那时以来,我没有遇到任何问题,也没有重新配置过任何东西,现在我已经升级到18.10了。 - mkasberg
5个回答

搜索域是指当您仅使用主机名来查找特定主机或计算机时,将自动添加的域。这基本上是在本地网络中使用的。
假设您有一个域名,比如xyz.com(它可能在全球范围内可用,也可能仅限于本地),并且您的局域网中有100台计算机。现在,您希望当您通过计算机的主机名查找任何计算机时,该域名会自动添加。如果要添加的域名是xyz.com,那么搜索域应该是这样的:
dns-search xyz.com ##If you put this into /etc/network/interfaces

或者

search xyz.com ##If you put this into /etc/resolvconf/resolv.conf.d/base|head|tail

现在要如何检查它是否正常工作呢?只需使用“ping”或任何DNS解析程序,例如“host”,“nslookup”或“dig”。
例如,如果主机名为“test”,IP地址为“192.168.1.5”,则可以使用“host”命令进行检查:
host test
test.xyz.com has address 192.168.1.5

现在,由于dig默认不使用搜索列表/域,您需要像dig +search test这样使用它,以启用附加搜索域。
使用nslookup
nslookup test
Server:     192.168.1.11
Address:    192.168.1.11#53

Name:   test.xyz.com
Address: 192.168.1.5

这里的 192.168.1.11 是你的本地 DNS 服务器,它拥有主机 test.xyz.com(注意完整形式)的 IP 地址,即 192.168.1.5。DNS 服务器将把主机名 test.xyz.com 解析为 IP 地址 192.168.1.5,但对于仅有 test 的情况,它不会解析任何内容,因为没有相应的条目。

所以,在我们的情况下,搜索域的作用是自动添加一个域名,使其成为一个完全限定的域名(FQDN),当我们只使用主机名来查找计算机时。


1默认情况下,dig不会像其他工具那样自动添加域名相关的内容。然而,“dig +search test”命令会这样做。 - Doug Smythies
@DougSmythies: 已添加.. - heemayl
我在/etc/resolvconf/resolv.conf.d/base中修改了nameserver和search条目。现在我看到以下行为: $ host server server.location.company.com是server001.location.company.com的别名。 server001.location.company.com的地址是192.168.200.103 $ ping server ping: 无法识别主机 server。你有什么想法是什么原因导致这个问题的吗? - mkasberg
3@mkasberg:你上一条消息中有一部分缺失了。另外请注意,在对resolvconf进行任何更改后,请运行sudo resolvconf -u命令。 - heemayl
@mkasberg: 把它放在/etc/resolvconf/resolv.conf.d/head里面...你的 DNS 服务器上有关于server.location.company.com的条目对吧? - heemayl
将其放在head中并运行sudo resolvconf -u似乎没有效果。host有相同的输出,ping仍然无法工作。我可以 ping server.location.company.com,所以我知道FQDN正常工作。我不明白为什么host会工作而ping不会,并且我陷入困境,因为我不知道如何“调试”这种类型的问题。 - mkasberg
@mkasberg:请将关于server的条目从您的/etc/hosts文件中注释掉(禁用)。 - heemayl
我的/etc/hosts文件中没有关于server的行。 - mkasberg
请发布您的/etc/resolv.conf文件。 - heemayl
请参见我上面的编辑。 - mkasberg
@mkasberg:在resolv.conf中保留前三行,并将其余条目注释掉。最好是通过禁用network-manager中的条目来实现,而不是直接编辑文件。 - heemayl
谢谢你提醒我需要使用dig +search来使用后缀。 - RichVel
虽然此回答中提供了更多有关“搜索”域的信息,但未回答如何配置系统以添加搜索域来解析未带域名的主机的问题。 - Suncat2000

我正在运行Bionic Beaver,我的resolv.conf文件显示:
# This file is managed by man:systemd-resolved(8). Do not edit.

所以我的解决方案是根据docs编辑/etc/systemd/resolved.conf文件中的Domains=选项,然后重新启动systemd-resolved服务。
systemctl restart systemd-resolved

1systemctl 的语法是 COMMAND [UNIT],所以应该是 systemctl restart systemd.resolved - karatedog
3不完全是@karatedog,应该是systemctl restart systemd-resolvedsystemctl restart systemd-resolved.service - OscarGarcia
1@OscarGarcia 你说得对,我过于关注顺序,错过了破折号而使用了句点。 - karatedog

我正在寻找解决这个问题的方法,针对的是Ubuntu Focal 20.04版本,因为我的本地域名没有附加到主机名上。
在大多数类Unix操作系统(如Solaris、Debian等)中,解决方法是在/etc/resolv.conf文件中添加一行“search domain.name”。但是现代的Ubuntu发行版现在使用systemd-resolved,所以我必须弄清楚该怎么做。
幸运的是,它仍然只需要一行代码 - 现在只需使用resolvectl命令而不是编辑文本文件:
# resolvectl domain <ifname> domain.name

(您可以通过调用ip addrresolvectl status找到您的ifname)

注意:此更改不是永久性的,如需永久解决方案,请参见下面的更新

要验证它是否正常工作,请确保域名在调用systemd-resolved时列出:

user@host:/$ resolvectl status | tail

DefaultRoute setting: yes
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
  Current DNS Server: 192.168.1.2
         DNS Servers: 192.168.1.2
                      192.168.1.3
          **DNS Domain: domain.name**

并且它是通过调用自动生成的/etc/resolv.conf中的内容。
user@host:/$ tail /etc/resolv.conf

nameserver 127.0.0.53
options edns0
**search domain.name**

尝试使用主机名而不是FQDN来使用sshhttp,以查看是否配置的本地域名会自动解析。
我认为我的解决方案是最简单和最不令人困惑的选择 - 在探索其他答案中提出的解决方案之前,首先尝试一下它可能值得一试。
更新2020年2月20日:
我注意到这种更改并非永久性的。根据这个问题DNS set to systemd's 127.0.0.53 - how to change permanently?,我了解到永久配置存储在/etc/systemd/resolved.conf中 - 只需取消注释Domains=并在其中写入您的域名:
[Resolve]
#DNS=
#FallbackDNS=
Domains=domain.name
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=yes
#DNSStubListener=yes
#ReadEtcHosts=yes

@AveryFreedman 非常感谢你的更新。它终于给了我一些在配置自己的网络时所缺少的信息。我花了9个月才让本地DNS解析正常工作。我从事网络管理已经有几十年了,这种难度是Linux无法取代Windows的原因之一 - Linux仍然相当不友好。 - Suncat2000
关于resolved.conf的观点很好,但是应用配置更改的魔法命令是什么?我尝试使用/etc/resolved.conf.d/中的drop-in文件,但不确定具体的咒语是什么。 - undefined

从16.04版本开始,只能通过命令行访问高级网络配置工具: sudo nm-connection-editor 可以在IPvX设置选项卡上配置搜索域。

enter image description here

详细信息请参阅Thomas Ward的精彩回答

在我的情况下, 在/etc/resolvconf/resolv.conf.d/tail下添加搜索域名 然后重新启动网络管理器 再重新启动我的VPN就可以了。
我遇到的问题是,我的组织提供的自定义DNS无法访问。
解决方案:
在/etc/resolvconf/resolv.conf.d/tail中添加 search my.orgdomain.com 保存后运行 sudo service network-manager restart 重新启动VPN。