在我的 中,/etc/network/interfaces
我在 上列出了多个服务器dns-nameservers
,一组 ubuntu 服务器有 3 个,另一组有 4 个。我们没有遇到任何问题,直到我们被迫向每个服务器添加 2 个,但我们仍然无法使用新的 DNS 服务器成功解析。经过一番调查,我们发现只有 3 个 DNS 服务器被复制到 中/etc/resolv.conf
。我们可以通过将 3 个主服务器放入其中并省略备份 DNS 服务器来解决我们当前的问题,但我想让所有必要的 DNS 服务器都可用。
至于为什么这么多:
- 使用 8.8.8.8 是因为它比我们的内部信息获取速度更快
- 我们的内部网络 DNS
- 数据库群集的另一个 DNS
答案1
您可以使用dnsmasq
添加任意数量的其他 DNS 服务器。操作方法如下。
首先安装 dnsmasq:
sudo apt install dnsmasq
编辑配置文件并在其中添加您的 DNS 服务器(例如在文件末尾):
sudo nano /etc/dnsmasq.conf
server=8.8.8.8
server=8.8.4.4
保存文件并编辑文件(并添加 127.0.0.1 作为名称服务器):
sudo nano /etc/resolv.conf
nameserver 127.0.0.1
重新启动 dnsmasq(或者更好的是重新启动 PC):
sudo service dnsmasq restart
验证 dnsmasq 是否响应 DNS 查询(查找 SERVER,应该是 127.0.0.1):
dig google.pl
;; SERVER: 127.0.0.1#53(127.0.0.1)
注意:有时网络管理器可以覆盖该/etc/resolv.conf
文件,因此您可以将其设为只读:
sudo chmod -w /etc/resolv.conf
注意 2:您可能需要禁用内置 DNS
sudo systemctl disable systemd-resolved.service
sudo systemctl stop systemd-resolved
答案2
这听起来像是对您的需求“过度杀伤”,但实际上,这可能是迄今为止根据您的具体请求处理 DNS 请求路由最“稳定”的解决方案。
这可以部署在独立的服务器上,也可以部署在本地服务器上。
设置一个bind9
作为转发器的 DNS 服务器,以便根据请求的域将请求正确地路由到正确的 DNS 服务器。
这听起来可能有点过分,但这实际上是一个明智的解决方案。不过,我们必须做一些改变才能使其正常工作。
步骤 0:由于您使用的是 16.04,我们需要将服务器绑定bind9
到 127.0.2.1 上的单独localhost
地址,以供本地侦听器使用。
仅当您在服务器本身上运行此步骤时才执行此步骤,而不是将其作为您的服务器将查询的独立 DNS 服务器。如果您在单独的服务器上运行此步骤,因此您投诉的服务器将向此服务器发送查询,请跳至步骤 1。否则,请在您投诉的服务器上执行这些更改。
首先,我们需要添加127.0.2.1
到您的系统中。这样,您就可以正确绑定到该地址。
编辑您的/etc/network/interfaces
文件,并在该iface lo inet loopback
行下面添加以下内容:
up ip -4 addr add 127.0.2.1/8 dev lo
down ip -4 addr del 127.0.2.1/8 dev lo
您可以立即重新启动系统以添加此地址,或者如果您不想重新启动,则可以手动添加:
sudo ip -4 addr add 127.0.2.1/8 dev lo
一旦您验证该地址已设置(ip -4 addr list
现在将显示 127.0.2.1),我们就可以继续。
步骤 1:安装bind9
首先,安装bind9
。
sudo apt install bind9
接下来,安装完成后,我们需要对其进行配置。为了回答这个问题,我将使用以下示例:
*.db.example.com is served by DNS server 10.3.2.1
*.internal.example.com is served by DNS server 10.2.3.4
Internet nameservers are serviced by 8.8.8.8 and 8.8.4.4 (Google)
步骤 2:配置bind9
编辑该/etc/bind/named.conf.options
文件,使其看起来像这样:
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
forwarders {
8.8.8.8;
8.8.4.4;
};
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-enable yes;
dnssec-validation yes;
minimal-responses yes;
auth-nxdomain no; # conform to RFC1035
// If this bind9 instance is acting as a standalone server for
// multiple systems to query to, then omit 127.0.2.1 here and
// adjust 10.10.1.0 to be the server's actual IP address on network.
//
// If this bind9 instance is ONLY serving the local server you were
// trying to get 5 Nameservers onto, then only use 127.0.2.1 here.
listen-on { 127.0.2.1; 10.10.1.0; };
// If you don't have IPv6 set up, then leave this like this:
listen-on-v6 { none; };
allow-query { 127.0.0.0/8; 192.168.0.0/16;
10.0.0.0/8; 172.16.0.0/12; };
allow-transfer { 127.0.0.0/8; 192.168.0.0/16;
10.0.0.0/8; 172.16.0.0/12; };
allow-recursion { 127.0.0.0/8; 192.168.0.0/16;
10.0.0.0/8; 172.16.0.0/12; };
};
这样设置后bind9
,所有不匹配的请求将按顺序转发到 8.8.8.8 和 8.8.4.4 上的 Google 名称服务器。
现在,我提到“不匹配的请求”。我们必须为上述“示例”范围配置另外两个内部转发器区域。
编辑/etc/bind/named.conf.local
。我们现在需要添加一些内容。
在文件末尾添加以下内容:
zone "db.example.com" {
type forward;
forwarders { 10.3.2.1; };
};
zone "internal.example.com" {
type forward;
forwarders { 10.2.3.4; };
};
然后,完成后我们需要重新启动bind9
服务。
sudo systemctl restart bind9
一旦重新启动,我们应该看到它根据上述配置在其服务器的本地主机和/或系统的 IP 地址上进行监听。
步骤3:确保服务器解析正确。
针对此服务器运行一些 DNS 查询(您可能需要dnsutils
为此安装)。对于“地址”,如果它是独立服务器,请使用运行服务器的 IP 地址;如果您在与所询问的服务器相同的服务器上运行,bind9
请使用的 IP 地址。127.0.2.1
bind9
dig @ADDRESS +short server.db.example.com
dig @ADDRESS +short system.internal.example.com
dig @ADDRESS +short google.com
这三个查询都应该可以正确解析。不过,请使用适合您环境的主机名。
如果所有这一切有效,那么继续。
步骤 4:设置您的服务器以正确使用此名称服务器
如果此名称服务器现在设置在与您最初谈论的服务器不同的服务器上,那么代替您之前使用的 5 个名称服务器,仅使用运行此bind9
实例的服务器的 IP 地址。
如果此名称服务器与您询问的服务器在同一台服务器上本地设置,则使用它127.0.2.1
来代替 5 个 IP 地址。
然后重启。然后 DNS 应该会按预期工作,但使用bind9
作为机制而不是尝试让 resolvconf 正常工作。
这看起来似乎是一个复杂的设置,但实际上效果非常好。我对“多环境”设置使用了类似的设置,其中我需要在 VPN 上使用内部 DNS 服务器来处理某些子网范围,但对其他所有子网使用 Internet 地址,同时绕过其他 DNS 服务器。这似乎是一个过度的解决方案,但确实有效。
祝你好运,如果你对我的回答有任何疑问,请随时提出!
答案3
对于 Ubuntu 16.04 之后的版本:
只需编辑文件/etc/systemd/resolved.conf
取消注释DNS和域,输入 IP 和搜索域(以空格分隔)并重新启动 systemd-resolv 或重新启动主机。
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details
[Resolve]
DNS=<IP> <IP>
#FallbackDNS=
Domains=<domain> <domain>
#LLMNR=yes
#MulticastDNS=yes
#DNSSEC=no
#Cache=yes
#DNSStubListener=udp
对于 Ubuntu 16.04 或更早版本
使用resolvconf
:
sudo apt-get install resolvconf
编辑/etc/resolvconf/resolv.conf.d/tail
以包含您的 DNS 服务器和域
nameserver 8.8.8.8
nameserver 4.4.4.4
nameserver 192.168.1.1
search mydomain.com myotherdomain.com corporatedomain.local
然后重启服务
/etc/init.d/resolvconf restart
你/etc/resolv.conf
应该看起来像这样
# 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
# 127.0.0.53 is the systemd-resolved stub resolver.
nameserver 8.8.8.8
nameserver 4.4.4.4
nameserver 192.168.1.1
search mydomain.com myotherdomain.com corporatedomain.local
答案4
对于按照 Michal Przybylowicz 的答案中的步骤操作并在 NetworkManager 用/etc/resolv.conf
127.0.0.53 重写 时遇到问题的人 - 添加dns=dnsmasq
到 中的 [main] 部分/etc/NetworkManager/NetworkManager.conf
。然后执行:
systemctl restart NetworkManager
systemctl restart dnsmasq