mirror of
https://github.com/systemd/systemd.git
synced 2025-03-09 12:58:26 +03:00
Merge pull request #25325 from yuwata/resolve-cap-per-link-setting-by-global
resolve: provide effective mDNS or LLMNR settings
This commit is contained in:
commit
021397f776
@ -33,6 +33,7 @@
|
||||
#include "pretty-print.h"
|
||||
#include "process-util.h"
|
||||
#include "resolvconf-compat.h"
|
||||
#include "resolve-util.h"
|
||||
#include "resolvectl.h"
|
||||
#include "resolved-def.h"
|
||||
#include "resolved-dns-packet.h"
|
||||
@ -2277,6 +2278,8 @@ static int verb_default_route(int argc, char **argv, void *userdata) {
|
||||
|
||||
static int verb_llmnr(int argc, char **argv, void *userdata) {
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
_cleanup_free_ char *global_llmnr_support_str = NULL;
|
||||
ResolveSupport global_llmnr_support, llmnr_support;
|
||||
sd_bus *bus = ASSERT_PTR(userdata);
|
||||
int r;
|
||||
|
||||
@ -2292,6 +2295,22 @@ static int verb_llmnr(int argc, char **argv, void *userdata) {
|
||||
if (argc < 3)
|
||||
return status_ifindex(bus, arg_ifindex, NULL, STATUS_LLMNR, NULL);
|
||||
|
||||
llmnr_support = resolve_support_from_string(argv[2]);
|
||||
if (llmnr_support < 0)
|
||||
return log_error_errno(llmnr_support, "Invalid LLMNR setting: %s", argv[2]);
|
||||
|
||||
r = bus_get_property_string(bus, bus_resolve_mgr, "LLMNR", &error, &global_llmnr_support_str);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to get the global LLMNR support state: %s", bus_error_message(&error, r));
|
||||
|
||||
global_llmnr_support = resolve_support_from_string(global_llmnr_support_str);
|
||||
if (global_llmnr_support < 0)
|
||||
return log_error_errno(global_llmnr_support, "Received invalid global LLMNR setting: %s", global_llmnr_support_str);
|
||||
|
||||
if (global_llmnr_support < llmnr_support)
|
||||
log_warning("Setting LLMNR support level \"%s\" for \"%s\", but the global support level is \"%s\".",
|
||||
argv[2], arg_ifname, global_llmnr_support_str);
|
||||
|
||||
r = bus_call_method(bus, bus_resolve_mgr, "SetLinkLLMNR", &error, NULL, "is", arg_ifindex, argv[2]);
|
||||
if (r < 0 && sd_bus_error_has_name(&error, BUS_ERROR_LINK_BUSY)) {
|
||||
sd_bus_error_free(&error);
|
||||
@ -2311,6 +2330,8 @@ static int verb_llmnr(int argc, char **argv, void *userdata) {
|
||||
|
||||
static int verb_mdns(int argc, char **argv, void *userdata) {
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
_cleanup_free_ char *global_mdns_support_str = NULL;
|
||||
ResolveSupport global_mdns_support, mdns_support;
|
||||
sd_bus *bus = ASSERT_PTR(userdata);
|
||||
int r;
|
||||
|
||||
@ -2326,6 +2347,22 @@ static int verb_mdns(int argc, char **argv, void *userdata) {
|
||||
if (argc < 3)
|
||||
return status_ifindex(bus, arg_ifindex, NULL, STATUS_MDNS, NULL);
|
||||
|
||||
mdns_support = resolve_support_from_string(argv[2]);
|
||||
if (mdns_support < 0)
|
||||
return log_error_errno(mdns_support, "Invalid mDNS setting: %s", argv[2]);
|
||||
|
||||
r = bus_get_property_string(bus, bus_resolve_mgr, "MulticastDNS", &error, &global_mdns_support_str);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to get the global mDNS support state: %s", bus_error_message(&error, r));
|
||||
|
||||
global_mdns_support = resolve_support_from_string(global_mdns_support_str);
|
||||
if (global_mdns_support < 0)
|
||||
return log_error_errno(global_mdns_support, "Received invalid global mDNS setting: %s", global_mdns_support_str);
|
||||
|
||||
if (global_mdns_support < mdns_support)
|
||||
log_warning("Setting mDNS support level \"%s\" for \"%s\", but the global support level is \"%s\".",
|
||||
argv[2], arg_ifname, global_mdns_support_str);
|
||||
|
||||
r = bus_call_method(bus, bus_resolve_mgr, "SetLinkMulticastDNS", &error, NULL, "is", arg_ifindex, argv[2]);
|
||||
if (r < 0 && sd_bus_error_has_name(&error, BUS_ERROR_LINK_BUSY)) {
|
||||
sd_bus_error_free(&error);
|
||||
|
@ -22,6 +22,8 @@
|
||||
|
||||
static BUS_DEFINE_PROPERTY_GET(property_get_dnssec_supported, "b", Link, link_dnssec_supported);
|
||||
static BUS_DEFINE_PROPERTY_GET2(property_get_dnssec_mode, "s", Link, link_get_dnssec_mode, dnssec_mode_to_string);
|
||||
static BUS_DEFINE_PROPERTY_GET2(property_get_llmnr_support, "s", Link, link_get_llmnr_support, resolve_support_to_string);
|
||||
static BUS_DEFINE_PROPERTY_GET2(property_get_mdns_support, "s", Link, link_get_mdns_support, resolve_support_to_string);
|
||||
|
||||
static int property_get_dns_over_tls_mode(
|
||||
sd_bus *bus,
|
||||
@ -864,8 +866,8 @@ static const sd_bus_vtable link_vtable[] = {
|
||||
SD_BUS_PROPERTY("CurrentDNSServerEx", "(iayqs)", property_get_current_dns_server_ex, offsetof(Link, current_dns_server), 0),
|
||||
SD_BUS_PROPERTY("Domains", "a(sb)", property_get_domains, 0, 0),
|
||||
SD_BUS_PROPERTY("DefaultRoute", "b", property_get_default_route, 0, 0),
|
||||
SD_BUS_PROPERTY("LLMNR", "s", bus_property_get_resolve_support, offsetof(Link, llmnr_support), 0),
|
||||
SD_BUS_PROPERTY("MulticastDNS", "s", bus_property_get_resolve_support, offsetof(Link, mdns_support), 0),
|
||||
SD_BUS_PROPERTY("LLMNR", "s", property_get_llmnr_support, 0, 0),
|
||||
SD_BUS_PROPERTY("MulticastDNS", "s", property_get_mdns_support, 0, 0),
|
||||
SD_BUS_PROPERTY("DNSOverTLS", "s", property_get_dns_over_tls_mode, 0, 0),
|
||||
SD_BUS_PROPERTY("DNSSEC", "s", property_get_dnssec_mode, 0, 0),
|
||||
SD_BUS_PROPERTY("DNSSECNegativeTrustAnchors", "as", property_get_ntas, 0, 0),
|
||||
|
@ -140,8 +140,7 @@ void link_allocate_scopes(Link *l) {
|
||||
l->unicast_scope = dns_scope_free(l->unicast_scope);
|
||||
|
||||
if (link_relevant(l, AF_INET, true) &&
|
||||
l->llmnr_support != RESOLVE_SUPPORT_NO &&
|
||||
l->manager->llmnr_support != RESOLVE_SUPPORT_NO) {
|
||||
link_get_llmnr_support(l) != RESOLVE_SUPPORT_NO) {
|
||||
if (!l->llmnr_ipv4_scope) {
|
||||
r = dns_scope_new(l->manager, &l->llmnr_ipv4_scope, l, DNS_PROTOCOL_LLMNR, AF_INET);
|
||||
if (r < 0)
|
||||
@ -151,9 +150,7 @@ void link_allocate_scopes(Link *l) {
|
||||
l->llmnr_ipv4_scope = dns_scope_free(l->llmnr_ipv4_scope);
|
||||
|
||||
if (link_relevant(l, AF_INET6, true) &&
|
||||
l->llmnr_support != RESOLVE_SUPPORT_NO &&
|
||||
l->manager->llmnr_support != RESOLVE_SUPPORT_NO &&
|
||||
socket_ipv6_is_supported()) {
|
||||
link_get_llmnr_support(l) != RESOLVE_SUPPORT_NO) {
|
||||
if (!l->llmnr_ipv6_scope) {
|
||||
r = dns_scope_new(l->manager, &l->llmnr_ipv6_scope, l, DNS_PROTOCOL_LLMNR, AF_INET6);
|
||||
if (r < 0)
|
||||
@ -163,8 +160,7 @@ void link_allocate_scopes(Link *l) {
|
||||
l->llmnr_ipv6_scope = dns_scope_free(l->llmnr_ipv6_scope);
|
||||
|
||||
if (link_relevant(l, AF_INET, true) &&
|
||||
l->mdns_support != RESOLVE_SUPPORT_NO &&
|
||||
l->manager->mdns_support != RESOLVE_SUPPORT_NO) {
|
||||
link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) {
|
||||
if (!l->mdns_ipv4_scope) {
|
||||
r = dns_scope_new(l->manager, &l->mdns_ipv4_scope, l, DNS_PROTOCOL_MDNS, AF_INET);
|
||||
if (r < 0)
|
||||
@ -174,8 +170,7 @@ void link_allocate_scopes(Link *l) {
|
||||
l->mdns_ipv4_scope = dns_scope_free(l->mdns_ipv4_scope);
|
||||
|
||||
if (link_relevant(l, AF_INET6, true) &&
|
||||
l->mdns_support != RESOLVE_SUPPORT_NO &&
|
||||
l->manager->mdns_support != RESOLVE_SUPPORT_NO) {
|
||||
link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) {
|
||||
if (!l->mdns_ipv6_scope) {
|
||||
r = dns_scope_new(l->manager, &l->mdns_ipv6_scope, l, DNS_PROTOCOL_MDNS, AF_INET6);
|
||||
if (r < 0)
|
||||
@ -192,8 +187,7 @@ void link_add_rrs(Link *l, bool force_remove) {
|
||||
link_address_add_rrs(a, force_remove);
|
||||
|
||||
if (!force_remove &&
|
||||
l->mdns_support == RESOLVE_SUPPORT_YES &&
|
||||
l->manager->mdns_support == RESOLVE_SUPPORT_YES) {
|
||||
link_get_mdns_support(l) == RESOLVE_SUPPORT_YES) {
|
||||
|
||||
if (l->mdns_ipv4_scope) {
|
||||
r = dns_scope_add_dnssd_services(l->mdns_ipv4_scope);
|
||||
@ -652,13 +646,13 @@ int link_update(Link *l) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (l->llmnr_support != RESOLVE_SUPPORT_NO) {
|
||||
if (link_get_llmnr_support(l) != RESOLVE_SUPPORT_NO) {
|
||||
r = manager_llmnr_start(l->manager);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
if (l->mdns_support != RESOLVE_SUPPORT_NO) {
|
||||
if (link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) {
|
||||
r = manager_mdns_start(l->manager);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -803,6 +797,24 @@ bool link_dnssec_supported(Link *l) {
|
||||
return true;
|
||||
}
|
||||
|
||||
ResolveSupport link_get_llmnr_support(Link *link) {
|
||||
assert(link);
|
||||
assert(link->manager);
|
||||
|
||||
/* This provides the effective LLMNR support level for the link, instead of the 'internal' per-link setting. */
|
||||
|
||||
return MIN(link->llmnr_support, link->manager->llmnr_support);
|
||||
}
|
||||
|
||||
ResolveSupport link_get_mdns_support(Link *link) {
|
||||
assert(link);
|
||||
assert(link->manager);
|
||||
|
||||
/* This provides the effective mDNS support level for the link, instead of the 'internal' per-link setting. */
|
||||
|
||||
return MIN(link->mdns_support, link->manager->mdns_support);
|
||||
}
|
||||
|
||||
int link_address_new(Link *l, LinkAddress **ret, int family, const union in_addr_union *in_addr) {
|
||||
LinkAddress *a;
|
||||
|
||||
@ -886,8 +898,7 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
|
||||
if (!force_remove &&
|
||||
link_address_relevant(a, true) &&
|
||||
a->link->llmnr_ipv4_scope &&
|
||||
a->link->llmnr_support == RESOLVE_SUPPORT_YES &&
|
||||
a->link->manager->llmnr_support == RESOLVE_SUPPORT_YES) {
|
||||
link_get_llmnr_support(a->link) == RESOLVE_SUPPORT_YES) {
|
||||
|
||||
if (!a->link->manager->llmnr_host_ipv4_key) {
|
||||
a->link->manager->llmnr_host_ipv4_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, a->link->manager->llmnr_hostname);
|
||||
@ -940,8 +951,7 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
|
||||
if (!force_remove &&
|
||||
link_address_relevant(a, true) &&
|
||||
a->link->mdns_ipv4_scope &&
|
||||
a->link->mdns_support == RESOLVE_SUPPORT_YES &&
|
||||
a->link->manager->mdns_support == RESOLVE_SUPPORT_YES) {
|
||||
link_get_mdns_support(a->link) == RESOLVE_SUPPORT_YES) {
|
||||
if (!a->link->manager->mdns_host_ipv4_key) {
|
||||
a->link->manager->mdns_host_ipv4_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, a->link->manager->mdns_hostname);
|
||||
if (!a->link->manager->mdns_host_ipv4_key) {
|
||||
@ -996,8 +1006,7 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
|
||||
if (!force_remove &&
|
||||
link_address_relevant(a, true) &&
|
||||
a->link->llmnr_ipv6_scope &&
|
||||
a->link->llmnr_support == RESOLVE_SUPPORT_YES &&
|
||||
a->link->manager->llmnr_support == RESOLVE_SUPPORT_YES) {
|
||||
link_get_llmnr_support(a->link) == RESOLVE_SUPPORT_YES) {
|
||||
|
||||
if (!a->link->manager->llmnr_host_ipv6_key) {
|
||||
a->link->manager->llmnr_host_ipv6_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, a->link->manager->llmnr_hostname);
|
||||
@ -1050,8 +1059,7 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
|
||||
if (!force_remove &&
|
||||
link_address_relevant(a, true) &&
|
||||
a->link->mdns_ipv6_scope &&
|
||||
a->link->mdns_support == RESOLVE_SUPPORT_YES &&
|
||||
a->link->manager->mdns_support == RESOLVE_SUPPORT_YES) {
|
||||
link_get_mdns_support(a->link) == RESOLVE_SUPPORT_YES) {
|
||||
|
||||
if (!a->link->manager->mdns_host_ipv6_key) {
|
||||
a->link->manager->mdns_host_ipv6_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, a->link->manager->mdns_hostname);
|
||||
|
@ -104,6 +104,9 @@ bool link_dnssec_supported(Link *l);
|
||||
|
||||
DnsOverTlsMode link_get_dns_over_tls_mode(Link *l);
|
||||
|
||||
ResolveSupport link_get_llmnr_support(Link *link);
|
||||
ResolveSupport link_get_mdns_support(Link *link);
|
||||
|
||||
int link_save_user(Link *l);
|
||||
int link_load_user(Link *l);
|
||||
void link_remove_user(Link *l);
|
||||
|
@ -25,10 +25,11 @@ typedef enum ResolveSupport ResolveSupport;
|
||||
typedef enum DnssecMode DnssecMode;
|
||||
typedef enum DnsOverTlsMode DnsOverTlsMode;
|
||||
|
||||
/* Do not change the order, see link_get_llmnr_support() or link_get_mdns_support(). */
|
||||
enum ResolveSupport {
|
||||
RESOLVE_SUPPORT_NO,
|
||||
RESOLVE_SUPPORT_YES,
|
||||
RESOLVE_SUPPORT_RESOLVE,
|
||||
RESOLVE_SUPPORT_YES,
|
||||
_RESOLVE_SUPPORT_MAX,
|
||||
_RESOLVE_SUPPORT_INVALID = -EINVAL,
|
||||
};
|
||||
|
@ -55,6 +55,79 @@ echo nameserver 10.0.3.1 10.0.3.2 | "$RESOLVCONF" -a hoge.inet.ipsec.192.168.35
|
||||
echo nameserver 10.0.3.3 10.0.3.4 | "$RESOLVCONF" -a hoge.foo.dhcp
|
||||
assert_in '10.0.3.1 10.0.3.2' "$(resolvectl dns hoge)"
|
||||
assert_in '10.0.3.3 10.0.3.4' "$(resolvectl dns hoge.foo)"
|
||||
|
||||
# Tests for mDNS and LLMNR settings
|
||||
mkdir -p /run/systemd/resolved.conf.d
|
||||
{
|
||||
echo "[Resolve]"
|
||||
echo "MulticastDNS=yes"
|
||||
echo "LLMNR=yes"
|
||||
} >/run/systemd/resolved.conf.d/mdns-llmnr.conf
|
||||
systemctl restart systemd-resolved.service
|
||||
systemctl service-log-level systemd-resolved.service debug
|
||||
# make sure networkd is not running.
|
||||
systemctl stop systemd-networkd.service
|
||||
# defaults to yes (both the global and per-link settings are yes)
|
||||
assert_in 'yes' "$(resolvectl mdns hoge)"
|
||||
assert_in 'yes' "$(resolvectl llmnr hoge)"
|
||||
# set per-link setting
|
||||
resolvectl mdns hoge yes
|
||||
resolvectl llmnr hoge yes
|
||||
assert_in 'yes' "$(resolvectl mdns hoge)"
|
||||
assert_in 'yes' "$(resolvectl llmnr hoge)"
|
||||
resolvectl mdns hoge resolve
|
||||
resolvectl llmnr hoge resolve
|
||||
assert_in 'resolve' "$(resolvectl mdns hoge)"
|
||||
assert_in 'resolve' "$(resolvectl llmnr hoge)"
|
||||
resolvectl mdns hoge no
|
||||
resolvectl llmnr hoge no
|
||||
assert_in 'no' "$(resolvectl mdns hoge)"
|
||||
assert_in 'no' "$(resolvectl llmnr hoge)"
|
||||
# downgrade global setting to resolve
|
||||
{
|
||||
echo "[Resolve]"
|
||||
echo "MulticastDNS=resolve"
|
||||
echo "LLMNR=resolve"
|
||||
} >/run/systemd/resolved.conf.d/mdns-llmnr.conf
|
||||
systemctl restart systemd-resolved.service
|
||||
systemctl service-log-level systemd-resolved.service debug
|
||||
# set per-link setting
|
||||
resolvectl mdns hoge yes
|
||||
resolvectl llmnr hoge yes
|
||||
assert_in 'resolve' "$(resolvectl mdns hoge)"
|
||||
assert_in 'resolve' "$(resolvectl llmnr hoge)"
|
||||
resolvectl mdns hoge resolve
|
||||
resolvectl llmnr hoge resolve
|
||||
assert_in 'resolve' "$(resolvectl mdns hoge)"
|
||||
assert_in 'resolve' "$(resolvectl llmnr hoge)"
|
||||
resolvectl mdns hoge no
|
||||
resolvectl llmnr hoge no
|
||||
assert_in 'no' "$(resolvectl mdns hoge)"
|
||||
assert_in 'no' "$(resolvectl llmnr hoge)"
|
||||
# downgrade global setting to no
|
||||
{
|
||||
echo "[Resolve]"
|
||||
echo "MulticastDNS=no"
|
||||
echo "LLMNR=no"
|
||||
} >/run/systemd/resolved.conf.d/mdns-llmnr.conf
|
||||
systemctl restart systemd-resolved.service
|
||||
systemctl service-log-level systemd-resolved.service debug
|
||||
# set per-link setting
|
||||
resolvectl mdns hoge yes
|
||||
resolvectl llmnr hoge yes
|
||||
assert_in 'no' "$(resolvectl mdns hoge)"
|
||||
assert_in 'no' "$(resolvectl llmnr hoge)"
|
||||
resolvectl mdns hoge resolve
|
||||
resolvectl llmnr hoge resolve
|
||||
assert_in 'no' "$(resolvectl mdns hoge)"
|
||||
assert_in 'no' "$(resolvectl llmnr hoge)"
|
||||
resolvectl mdns hoge no
|
||||
resolvectl llmnr hoge no
|
||||
assert_in 'no' "$(resolvectl mdns hoge)"
|
||||
assert_in 'no' "$(resolvectl llmnr hoge)"
|
||||
|
||||
# Cleanup
|
||||
rm -f /run/systemd/resolved.conf.d/mdns-llmnr.conf
|
||||
ip link del hoge
|
||||
ip link del hoge.foo
|
||||
|
||||
@ -79,11 +152,13 @@ DNSSEC=allow-downgrade
|
||||
DNS=10.0.0.1
|
||||
EOF
|
||||
|
||||
mkdir -p /run/systemd/resolved.conf.d
|
||||
{
|
||||
echo "[Resolve]"
|
||||
echo "FallbackDNS="
|
||||
echo "DNSSEC=allow-downgrade"
|
||||
echo "DNSOverTLS=opportunistic"
|
||||
} >>/etc/systemd/resolved.conf
|
||||
} >/run/systemd/resolved.conf.d/test.conf
|
||||
ln -svf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
|
||||
# Override the default NTA list, which turns off DNSSEC validation for (among
|
||||
# others) the test. domain
|
||||
|
Loading…
x
Reference in New Issue
Block a user