我已连接到局域网,并通过网关访问 Internet。本地网络中有 DNS 服务器,它能够从本地网络解析计算机的主机名。
我想配置systemd-resolved和systemd-networkd,以便本地主机名的查找请求将专门定向(路由)到本地 DNS 服务器,而所有其他主机名的查找请求将专门定向到另一个远程 DNS 服务器。
假设我不知道配置文件在哪里,或者我是否应该添加更多文件并要求在答案中指定它们的路径。
长话短说
sudo cp -p /etc/network/if-up.d/resolved /etc/network/if-up.d/.resolved.broken-orig
#Edit /etc/network/if-up.d/resolved and take out the extraneous quotes on lines 48 and 52
#The fix looks like:
diff /etc/network/if-up.d/.resolved.broken-orig /etc/network/if-up.d/resolved
48c48
< "$DNS"="$NEW_DNS"
---
> $DNS="$NEW_DNS"
52c52
< "$DOMAINS"="$NEW_DOMAINS"
---
> $DOMAINS="$NEW_DOMAINS"
Run Code Online (Sandbox Code Playgroud)
至少,这看起来是有效的。
最近通过将旧系统升级到 Ubuntu 22.04.1 LTSdo-release-upgrade并遇到 DNS 问题,错误消息为:
nslookup google.com
Server: 127.0.0.53
Address: 127.0.0.53#53
** server can't find google.com: SERVFAIL
Run Code Online (Sandbox Code Playgroud)
和
/etc/network/if-down.d/resolved: 12: mystatedir: not found
/etc/network/if-up.d/resolved: 71: DNS: not found
/etc/network/if-up.d/resolved: 1: /run/network/ifupdown-inet-em1: DNS=8.8.8.8: not found
/etc/network/if-up.d/resolved: 2: /run/network/ifupdown-inet-em1: DOMAINS=local_search_domain.com: …Run Code Online (Sandbox Code Playgroud) 我正在使用本地 BIND9 服务器来托管一些本地 dns 记录。在尝试挖掘本地域名时,如果我没有明确告诉 dig 使用我的本地 BIND9 服务器,我将无法找到它。
user@heimdal:~$ dig +short heimdal.lan.se
user@heimdal:~$ dig +short @192.168.1.7 heimdal.lan.se
192.168.1.2
Run Code Online (Sandbox Code Playgroud)
使用 Ubuntu 17.04 和 systemd-resolved。这是我的/etc/resolved的内容
# 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.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 127.0.0.53
Run Code Online (Sandbox Code Playgroud)
以及 systemd-resolve --status 的输出
Global
DNS Servers: 192.168.1.7
192.168.1.1
DNSSEC NTA: 10.in-addr.arpa …Run Code Online (Sandbox Code Playgroud) systemd-resolved 是一个守护进程,除其他外,它通过侦听本地环回接口上的 IP 地址 127.0.0.53 充当 DNS 服务器。
我想让守护进程监听另一个接口。我的用例是将它公开给 docker 容器,以便 docker 容器共享由 systemd-resolved 提供的 DNS 缓存。我知道如何将主机配置为 docker 容器的 DNS 服务器,但至少在默认情况下,systemd-resolved 拒绝这些 DNS 查询,因为它们不是来自环回接口,而是来自 docker 桥接接口。
使用 dnsmasq(类似于 systemd-resolved 的工具),我通过添加listen-address=172.17.0.1到配置文件. 不幸的是,我找不到 systemd 解析的等效项。
由于 systemd-resolved 至少在 Ubuntu 18.04 上是默认设置,因此我想要一个适用于此配置的解决方案。
有没有办法配置 systemd-resolved 侦听的接口?
要在全新的 Kubuntu 19.10 笔记本电脑中配置自定义 DNS 服务器,仅添加以下内容是不够的/etc/systemd/resolved.conf:
DNS=77.88.8.7 77.88.8.3 #Yandex 的 DNS,即使在 Google 图片上也没有色情内容
我还必须更改符号链接 /etc/resolv.conf
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 37 oct 26 01:48 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)
/run/systemd/resolve/stub-resolv.conf只有 ISP 给定的 DNS,而自定义 DNS 仅在/run/systemd/resolve/resolv.conf.
看的时候:
man systemd-resolved.service
Run Code Online (Sandbox Code Playgroud)
它说推荐的文件是/run/systemd/resolve/stub-resolv.conf,但我不明白它们的区别(可以理解和简单的解释应该是公认的答案)。如果是这样,我如何将系统设置为使用该文件而不是其他文件使用全局配置的 DNS?
注意:在有大量 WiFi 连接的笔记本电脑上,配置每个连接的 DNS 是不可行的,就像许多站点中所建议的那样,这些站点说明了我刚刚描述的如何实现这一点
好奇的补充信息:
/run/systemd/resolve/$ diff stub-resolv.conf resolv.conf
3,8c3,4
< # This is a dynamic resolv.conf file for connecting local clients …Run Code Online (Sandbox Code Playgroud) 如何配置 Ubuntu 20.04 系统以覆盖默认 DNS?
似乎默认情况下有一个全局和每个链接的 DNS 设置。
我尝试了一些不起作用的事情:
/etc/systemd/resolved.conf使用 DNS 服务器进行编辑/etc/systemd/network/enp0s3.conf使用配置的 DNS 服务器创建/etc/dhcp/dhclient.conf所有这些更改(和组合)都会导致 DNS 服务器被添加到全球 DNS 服务器列表中。
大多数“解决方案”是安装resolvconf或用/etc/resolv.conf文件替换符号链接,并在那里设置 DNS 服务器。这两个似乎都是一种解决方法。
我想使用现有工具 ( systemd-resolved) 来覆盖 DNS 服务器。
正如@xenoid 在评论中所建议的那样:通过 GUI 设置接口的 DNS 会生成一个/etc/NetworkManager/system-connections/enp0s3.nmconnection包含正确 DNS 服务器的文件,输出resolvectl status包括正确的 DNS 服务器,但这不是我的想法。我正在寻找一种使用 进行配置的解决方案,这在systemd-resolved我能找到的情况下是可能的,但目前尚不清楚如何。因为这需要 GUI 安装。
Ubuntu 18
我已经做了大量的研究,并且接近把这张图片拼凑起来,但不太明白:
如何为 mdns 配置 systemd-resolved?
我的目标具体是:
谁能告诉我如何专门使用 systemd-resolved 来实现这一点?
谢谢
到目前为止,我已经在下面配置了resolved.conf
ubuntu@ip-10-0-0-229:/etc$ --> CHROME -> cat /etc/systemd/resolved.conf
# 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. …Run Code Online (Sandbox Code Playgroud) https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html#Description说
此外,systemd-resolved 在本地环回接口上的 IP 地址 127.0.0.53 上提供本地 DNS 存根侦听器。直接发出 DNS 请求、绕过任何本地 API 的程序可能会被定向到这个存根,以便将它们连接到 systemd-resolved。
我该如何理解`/etc/resolv.conf` 的格式?说
DNS 服务器和解析器(“存根解析器”)可以不同,您可以将 DNS 请求传递给 127.0.0.53,后者将它们传递给您的路由器以获得实际的 DNS(例如,它可以处理本地主机但传递对远程主机的请求以获得完整的 DNS) )。
什么是 DNS 服务器、解析器和存根解析器?
我也听说过两种 DNS 服务器(一种叫做“解析器”,另一种我忘记了)。这两种是什么意思?
我希望我较新的 GNU/Linux 系统 (Ubuntu 18.04 LTS) 对所有DNS 查询使用单个手动配置的 DNS 服务器。在过去,我可以简单echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf地破坏/etc/resolv.conf文件并为我的整个系统持久设置 DNS 服务器的 IP 地址。
在这个(以及许多较新的 GNU/Linux 发行版)上,/etc/resolv.conf由resolvconf(8)实用程序管理。在 Ubuntu 18.04 上,此文件包含如下一行:
nameserver 127.0.0.53
Run Code Online (Sandbox Code Playgroud)
从 中可以看出sudo ss --listening --numeric --processes,本地系统的systemd-resolvedDNS 存根解析器绑定到此 IP 地址,并在端口53上侦听传入的 DNS 请求。因此,文件中的上述nameserver行通过“正常”DNS 请求/etc/resolv.conf将所有不使用systemd-resolvedD-Bus 或 glibc API 的应用程序定向到systemd-resolved服务。
这一切都很好,但这一切都意味着我不能再简单地将持久更改写入/etc/resolv.conf文件以影响名称服务器更改。
所以我正在测试一个路由器,它向我网络上的所有机器添加了一些随机的 IPv6 地址,包括我的 DNS 服务器。不知何故,这些 IP 作为有效的 DNS 服务器被广播(不确定只有真正的路由器如何发送 IPv6 RA 数据包)但长话短说,现在我所有的机器都向一个不存在的 IP 地址发送 DNS 查询。
如果我重新启动resolved,systemctl restart systemd-resolved那么resolvectl仍然将这些虚假 IP 显示为有效的名称服务器。
它们被列在/etc/resolv.conf所以如果我在那里删除它们并重新启动systemd-resolved它只会再次添加虚假的 IP。
如果我查看日志,journalctl --unit=systemd-resolved它会告诉我虚假 IP 正在“降级功能模式”下运行,但没有告诉我从哪里找到这些 IP。
它从哪里获取这些错误的 IP 地址?是否有一些缓存文件我需要删除才能让它回到仅使用 IPv6 路由器广告提供的 IP?
systemd-resolved ×10
dns ×6
ubuntu ×4
systemd ×3
bind ×1
dig ×1
docker ×1
ifupdown ×1
ipv6 ×1
linux ×1
mdns ×1
resolv.conf ×1
terminology ×1