我在 GCP 中有一些服务器,它们在私有 DNS 区域中使用私有 DNS 服务器(它们使用领事)。
为了解析 DNS,我使用了systemd-resolved
,我的resolv.conf
是到的软链接/run/systemd/resolve/stub-resolv.conf
,其内容是:
nameserver 127.0.0.53
options edns0
search c.guardicore-guardicore-mgmt.internal google.internal
所以这意味着所有 DNS 请求都会转发到 systemd-resolved 守护进程。此守护进程的配置如下所示(输出systemd-resolve --status
)
Global
DNS Servers: 127.0.0.1 # (consul)
169.254.169.254 # (google's DNS)
发生的事情是,当我的服务尝试解析 DNS 记录时,它们会查询systemd-resolved
,然后由 Google 的 DNS 服务器获取答案,然后该答案被缓存在中systemd-resolve
。Google 的 DNS 不知道这个私有 DNS,因此它返回NXDOMAIN
答案。
有没有办法绕过 Google 的 DNS?我希望请求只通过 consul。
我试图更改文件的内容resolv.conf
,但它一直被 GCP 代理所覆盖。
答案1
首先进行测试。您是否尝试过消除缓存 DNS,即注释掉 Google DNS 服务器,这样如果本地 DNS 服务不知道 IP/名称,它就不会尝试在该范围之外查找;您也可以检查 /etc/resolv.conf 以显示
user@machine ~#: cat /etc/resolv.conf
order hosts bind
然后,您可以在 hosts 文件中添加内容,这样它会首先被检查(根据 resolv.conf 设置)并完全绕过 Google 的 DNS。
user@machine ~#: cat /etc/hosts
127.0.0.1 localhost.localdomain localhost consul consul.local
::1 localhost6.localdomain6 localhost6
192.168.1.100 node0 node0.local
192.168.1.101 node1 node1.local
192.168.1.102 node2 node2.local
最后,如果完全必要的话,您可以安装 BIND 并创建两个区域(consul.local 和 reverse.local),这样您就可以拥有完整的权威 DNS 服务并对每个查询都有 AUTH 响应)可以找到一个很好的例子:这里
如果这对您有用或者缺少了某些内容,请告诉我,我会尝试深入挖掘以便给您更好的答案:):)
问候
-JP