diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 852829569d..4f744499aa 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -424,7 +424,7 @@ static int dns_scope_socket( return r; } - if (s->link) { + if (ifindex != 0) { r = socket_set_unicast_if(fd, sa.sa.sa_family, ifindex); if (r < 0) return r; diff --git a/src/resolve/resolved-dns-server.c b/src/resolve/resolved-dns-server.c index 04a4f53ed0..8ff513fa33 100644 --- a/src/resolve/resolved-dns-server.c +++ b/src/resolve/resolved-dns-server.c @@ -648,6 +648,11 @@ int dns_server_adjust_opt(DnsServer *server, DnsPacket *packet, DnsServerFeature int dns_server_ifindex(const DnsServer *s) { assert(s); + /* For loopback addresses, go via the loopback interface, regardless which interface this is linked + * to. */ + if (in_addr_is_localhost(s->family, &s->address)) + return LOOPBACK_IFINDEX; + /* The link ifindex always takes precedence */ if (s->link) return s->link->ifindex;