如何与systemd-resolved集成

如果运行Incus的系统使用systemd-resolved执行DNS查找,则应通知resolvedIncus可以解析的域名。为此,请将Incus网络桥提供的DNS服务器和域名添加到resolved配置中。

注意

如果您想使用此功能,则必须将dns.mode选项(请参阅配置选项)设置为manageddynamic

配置resolved

要将网络桥添加到resolved配置中,请为相应的桥指定DNS地址和域名。

DNS地址

您可以使用IPv4地址、IPv6地址或两者。必须在没有子网掩码的情况下指定地址。

要检索桥的IPv4地址,请使用以下命令

incus network get <network_bridge> ipv4.address

要检索桥的IPv6地址,请使用以下命令

incus network get <network_bridge> ipv6.address
DNS域名

要检索桥的DNS域名,请使用以下命令

incus network get <network_bridge> dns.domain

如果未设置此选项,则默认域名是incus

使用以下命令配置resolved

resolvectl dns <network_bridge> <dns_address>
resolvectl domain <network_bridge> ~<dns_domain>

注意

使用DNS域名配置resolved时,应在名称前加上~~告诉resolved仅使用相应的名称服务器查找此域名。

根据您使用的shell,您可能需要将DNS域名包含在引号中,以防止扩展~

DNSSEC和DNS over TLS

incusDNS服务器不支持DNSSEC或DNS over TLS。

根据您的resolved配置,配置将失败,因为服务器不支持DNSSEC或DNS over TLS。

要仅对桥禁用两者,请使用以下命令

resolvectl dnssec <network_bridge> off
resolvectl dnsovertls <network_bridge> off

例如

resolvectl dns incusbr0 192.0.2.10
resolvectl domain incusbr0 '~incus'
resolvectl dnssec incusbr0 off
resolvectl dnsovertls incusbr0 off

注意

或者,您可以使用systemd-resolve命令。此命令在较新版本的systemd中已弃用,但仍出于向后兼容性而提供。

systemd-resolve --interface <network_bridge> --set-domain ~<dns_domain> --set-dns <dns_address> --set-dnsovertls=off --set-dnssec=off

resolved配置在桥存在期间一直有效。您必须在每次重新引导后和Incus重新启动后重复这些命令,或者使其持久化,如下所述。

使resolved配置持久化

您可以自动化systemd-resolvedDNS配置,以便在系统启动时应用并于Incus创建网络接口时生效。

为此,请创建一个名为/etc/systemd/system/incus-dns-<network_bridge>.servicesystemd单元文件,内容如下

[Unit]
Description=Incus per-link DNS configuration for <network_bridge>
BindsTo=sys-subsystem-net-devices-<network_bridge>.device
After=sys-subsystem-net-devices-<network_bridge>.device

[Service]
Type=oneshot
ExecStart=/usr/bin/resolvectl dns <network_bridge> <dns_address>
ExecStart=/usr/bin/resolvectl domain <network_bridge> ~<dns_domain>
ExecStart=/usr/bin/resolvectl dnssec <network_bridge> off
ExecStart=/usr/bin/resolvectl dnsovertls <network_bridge> off
ExecStopPost=/usr/bin/resolvectl revert <network_bridge>
RemainAfterExit=yes

[Install]
WantedBy=sys-subsystem-net-devices-<network_bridge>.device

将文件名和内容中的<network_bridge>替换为您的桥的名称(例如,incusbr0)。还应替换<dns_address><dns_domain>,如配置resolved中所述。

然后使用以下命令启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable --now incus-dns-<network_bridge>

如果相应的桥已存在(因为Incus已在运行),则可以使用以下命令检查新服务是否已启动

sudo systemctl status incus-dns-<network_bridge>.service

您应该会看到类似以下的输出

user@host:~$ sudo systemctl status incus-dns-incusbr0.service
incus-dns-incusbr0.service - Incus per-link DNS configuration for incusbr0     Loaded: loaded (/etc/systemd/system/incus-dns-incusbr0.service; enabled; vendor preset: enabled)     Active: inactive (dead) since Mon 2021-06-14 17:03:12 BST; 1min 2s ago    Process: 9433 ExecStart=/usr/bin/resolvectl dns incusbr0 n.n.n.n (code=exited, status=0/SUCCESS)    Process: 9434 ExecStart=/usr/bin/resolvectl domain incusbr0 ~incus (code=exited, status=0/SUCCESS)   Main PID: 9434 (code=exited, status=0/SUCCESS)

要检查resolved是否已应用设置,请使用resolvectl status <network_bridge>

user@host:~$ resolvectl status incusbr0
Link 6 (incusbr0)      Current Scopes: DNSDefaultRoute setting: no       LLMNR setting: yesMulticastDNS setting: no  DNSOverTLS setting: no      DNSSEC setting: no    DNSSEC supported: no  Current DNS Server: n.n.n.n         DNS Servers: n.n.n.n          DNS Domain: ~incus