diff --git a/man/nss-resolve.xml b/man/nss-resolve.xml
index 39d4405b27..d2fef03c58 100644
--- a/man/nss-resolve.xml
+++ b/man/nss-resolve.xml
@@ -141,6 +141,17 @@
+
+
+
+ $SYSTEMD_NSS_RESOLVE_INTERFACE
+
+ Takes an interface name or index as an argument. When specified, answers will only be
+ obtained from name servers belonging to the specified interface.
+
+
+
+
diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c
index f842e0cf57..ea60727e90 100644
--- a/src/nss-resolve/nss-resolve.c
+++ b/src/nss-resolve/nss-resolve.c
@@ -12,6 +12,7 @@
#include "glyph-util.h"
#include "in-addr-util.h"
#include "json-util.h"
+#include "netlink-util.h"
#include "nss-util.h"
#include "resolved-def.h"
#include "signal-util.h"
@@ -188,6 +189,23 @@ static uint64_t query_flags(void) {
query_flag("SYSTEMD_NSS_RESOLVE_NETWORK", 0, SD_RESOLVED_NO_NETWORK);
}
+static int query_ifindex(void) {
+ int ifindex;
+ const char *e;
+
+ e = secure_getenv("SYSTEMD_NSS_RESOLVE_INTERFACE");
+ if (!e)
+ return 0;
+
+ ifindex = rtnl_resolve_interface(/* rtnl= */ NULL, e);
+ if (ifindex < 0) {
+ log_debug_errno(ifindex, "Failed to resolve $SYSTEMD_NSS_RESOLVE_INTERFACE, ignoring: %m");
+ ifindex = 0;
+ }
+
+ return ifindex;
+}
+
enum nss_status _nss_resolve_gethostbyname4_r(
const char *name,
struct gaih_addrtuple **pat,
@@ -217,7 +235,8 @@ enum nss_status _nss_resolve_gethostbyname4_r(
r = sd_json_buildo(
&cparams,
SD_JSON_BUILD_PAIR_STRING("name", name),
- SD_JSON_BUILD_PAIR_UNSIGNED("flags", query_flags()));
+ SD_JSON_BUILD_PAIR_UNSIGNED("flags", query_flags()),
+ SD_JSON_BUILD_PAIR_UNSIGNED("ifindex", query_ifindex()));
if (r < 0)
goto fail;
@@ -386,7 +405,8 @@ enum nss_status _nss_resolve_gethostbyname3_r(
&cparams,
SD_JSON_BUILD_PAIR_STRING("name", name),
SD_JSON_BUILD_PAIR_INTEGER("family", af),
- SD_JSON_BUILD_PAIR_UNSIGNED("flags", query_flags()));
+ SD_JSON_BUILD_PAIR_UNSIGNED("flags", query_flags()),
+ SD_JSON_BUILD_PAIR_UNSIGNED("ifindex", query_ifindex()));
if (r < 0)
goto fail;
@@ -606,7 +626,8 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
&cparams,
SD_JSON_BUILD_PAIR_BYTE_ARRAY("address", addr, len),
SD_JSON_BUILD_PAIR_INTEGER("family", af),
- SD_JSON_BUILD_PAIR_UNSIGNED("flags", query_flags()));
+ SD_JSON_BUILD_PAIR_UNSIGNED("flags", query_flags()),
+ SD_JSON_BUILD_PAIR_UNSIGNED("ifindex", query_ifindex()));
if (r < 0)
goto fail;