如何配置 Ubuntu 20.04 系统以覆盖默认 DNS?
似乎默认情况下有一个全局和每个链接的 DNS 设置。
我尝试了一些不起作用的方法:
/etc/systemd/resolved.conf
使用 DNS 服务器进行编辑/etc/systemd/network/enp0s3.conf
使用配置的 DNS 服务器创建- 通过编辑从 DHCP 请求中删除所有与 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 安装。
答案1
更新
/etc/systemd/resolved.conf
[Resolve] DNS=1.1.1.1 8.8.8.8 FallbackDNS=8.8.4.4
重启系统解决:
service systemd-resolved restart
运行
systemd-resolve --status
(或resolvectl status
在较新版本的 systemd 中)。输出应如下所示:Global DNS Servers: 1.1.1.1 8.8.8.8 ...
答案2
这评论来自@David R 非常有帮助:
rm -f /etc/resolv.conf
ln -sv /run/systemd/resolve/resolv.conf /etc/resolv.conf
答案3
让iface
变量包含您的主界面名称,然后您可以这样设置您的 DNS 地址:
$ sudo resolvectl dns $iface x.y.z.t1 x.y.z.t2
$ sudo resolvectl domain $iface "myDomain.lan"
$ resolvectl dns $iface
Link 2 (ensX): x.y.z.t1 x.y.z.t2
$ resolvectl status $iface
Link 2 (ensX)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
Current DNS Server: x.y.z.t1
DNS Servers: x.y.z.t1
x.y.z.t2
DNS Domain: myDomain.lan
答案4
您应该在此文件中明确指定/etc/systemd/network/enp0s3.conf
忽略来自 DHCP 的 DNS。在大多数情况下,我倾向于忽略 dhcp 的所有内容,因为我更喜欢通过配置管理工具来控制它。例如,上述文件中的 DHCPv4 部分如下所示:
[DHCPv4]
UseHostname=no
UseDNS=no
UseNTP=no
UseDomains=no
另请注意,您应该使用.network
文件的扩展名。该[Match]
部分还可以帮助您,这样您就无需关心设备名称的实际含义。就我而言,我没有任何单独的设备文件,而是在 aws 中进行覆盖:
section of /etc/systemd/network/01-ec2-overrides.network
[Match]
Driver=ena ixgbevf vif
[DHCPv4]
UseHostname=no
UseDNS=no
UseNTP=no
UseDomains=no
[DHCPv6]
UseHostname=no
UseDNS=no
UseNTP=no