SYSTEMD-RESOLVED.SERVICE(8) systemd-resolved.service SYSTEMD-RESOLVED.SERVICE(8)

systemd-resolved.service, systemd-resolved - سرویس تحلیل و کش‌گذاری محلی نام‌های شبکه (DNS/LLMNR/mDNS)

systemd-resolved.service

/usr/lib/systemd/systemd-resolved

systemd-resolved یک سرویس سیستمی است که تفکیک و تحلیل نام شبکه را برای برنامه‌های کاربردی محلی فراهم می‌کند. این سرویس یک تفکیک‌کنندهٔ فرعی (stub resolver) اعتبارسنج و ذخیره‌ساز موقت (caching) برای DNS/DNSSEC و همچنین تفکیک‌کننده و پاسخ‌دهندهٔ LLMNR و MulticastDNS را پیاده‌سازی می‌نماید. برنامه‌های کاربردی محلی می‌توانند درخواست‌های تفکیک نام شبکه را از طریق سه رابط ارسال کنند:

•رابط برنامه‌نویسی (API) بومی و با امکانات کامل که systemd-resolved از طریق D-Bus ارائه می‌دهد؛ برای جزئیات به org.freedesktop.resolve1(5) و org.freedesktop.LogControl1(5) مراجعه کنید. استفاده از این رابط برنامه‌نویسی عموماً به کلاینت‌ها توصیه می‌شود چرا که ناهمگام (asynchronous) و دارای تمامی قابلیت‌ها است (برای نمونه، وضعیت اعتبارسنجی DNSSEC و دامنهٔ رابط را برای نشانی‌ها در صورت نیاز جهت پشتیبانی از شبکه‌بندی پیوند-محلی به درستی بازمی‌گرداند).
•رابط برنامه‌نویسی بومی که systemd-resolved از طریق Varlink روی سوکت AF_UNIX به نشانی /run/systemd/resolve/io.systemd.Resolve ارائه می‌دهد. این رابط عملکرد مشابهی با رابط D-Bus ارائه می‌کند، اما در تمام طول زمان اجرا بدون نیاز به اجرای سرویس کارگزار گذرگاه سیستم D-Bus در دسترس است.
•رابط برنامه‌نویسی getaddrinfo(3) در glibc مطابق با تعریف RFC3493[1] و توابع تفکیک‌کنندهٔ مرتبط با آن، از جمله gethostbyname(3). این رابط به‌طور گسترده، از جمله فراتر از پلتفرم لینوکس، پشتیبانی می‌شود. با این حال، در شکل کنونی خود اطلاعات وضعیت اعتبارسنجی DNSSEC را ارائه نمی‌دهد و تنها همگام (synchronous) است. این رابط برنامه‌نویسی توسط سوئیچ سرویس نام glibc (nss(5)) پشتیبانی می‌شود. استفاده از ماژول NSS گلیبک nss-resolve(8) برای اینکه توابع تفکیک‌کنندهٔ NSS در glibc بتوانند نام‌های میزبان را از طریق systemd-resolved تفکیک کنند، الزامی است.
•علاوه بر این، systemd-resolved یک شنوندهٔ فرعی (stub listener) محلی DNS روی نشانی‌های IP با مقادیر 127.0.0.53 و 127.0.0.54 بر روی رابط محلی لوپ‌بک فراهم می‌کند. برنامه‌هایی که درخواست‌های DNS را مستقیماً ارسال کرده و هرگونه API محلی را دور می‌زنند، می‌توانند به این تفکیک‌کنندهٔ فرعی هدایت شوند تا به systemd-resolved متصل گردند. با این حال توجه داشته باشید که اکیداً توصیه می‌شود برنامه‌های محلی در عوض از رابط‌های برنامه‌نویسی NSS گلیبک یا گذرگاه (همان‌طور که در بالا توضیح داده شد) استفاده کنند، زیرا مفاهیم گوناگون تفکیک شبکه (مانند نشانی‌دهی پیوند-محلی یا دامنه‌های یونیکد LLMNR) را نمی‌توان به پروتکل تک‌پخشی (unicast) DNS نگاشت کرد.

تفکیک‌کنندهٔ فرعی DNS روی 127.0.0.53 مجموعه ویژگی‌های کامل تفکیک‌کننده محلی را ارائه می‌دهد که شامل ارائه تفکیک LLMNR/MulticastDNS نیز می‌شود. تفکیک‌کنندهٔ فرعی DNS روی 127.0.0.54 تفکیک‌کنندهٔ محدودتری فراهم می‌کند که تنها در حالت «پروکسی» عمل می‌نماید، یعنی اکثر پیام‌های DNS را نسبتاً بدون تغییر به سرورهای بالادستی DNS فعلی و برعکس منتقل می‌کند، اما تلاش نمی‌کند پیام‌ها را به‌طور محلی پردازش کند، و بنابراین DNSSEC را اعتبارسنجی نکرده و LLMNR/MulticastDNS را ارائه نمی‌دهد. (با این حال در صورت نیاز، ارتباط را به پروتکل DNS-over-TLS تبدیل خواهد کرد.)

سرورهای DNS مورد تماس بر اساس تنظیمات سراسری در /etc/systemd/resolved.conf، تنظیمات ایستا به ازای هر پیوند در فایل‌های /etc/systemd/network/*.network (در صورتی که از systemd-networkd.service(8) استفاده شود)، تنظیمات پویای به ازای هر پیوند دریافتی از طریق DHCP، اطلاعات ارائه‌شده از طریق resolvectl(1) و هرگونه اطلاعات سرور DNS که توسط سایر سرویس‌های سیستمی در دسترس قرار گرفته است، تعیین می‌شوند. برای جزئیات مربوط به فایل‌های پیکربندی خود systemd برای سرورهای DNS، به resolved.conf(5) و systemd.network(5) مراجعه کنید. برای بهبود سازگاری، /etc/resolv.conf جهت کشف سرورهای DNS پیکربندی‌شده سیستم خوانده می‌شود، اما تنها در صورتی که یک پیوند نمادین (symlink) به /run/systemd/resolve/stub-resolv.conf، /usr/lib/systemd/resolv.conf یا /run/systemd/resolve/resolv.conf نباشد (به زیر مراجعه کنید).

systemd-resolved رکوردهای منبع (RRها) DNS را برای موارد زیر به صورت ساختگی (synthesize) تولید می‌کند:

•نام میزبان محلی و پیکربندی‌شده به تمام نشانی‌های IP محلی پیکربندی‌شده به ترتیب دامنه (scope) آن‌ها تفکیک می‌شود، یا — در صورتی که هیچ نشانی‌ای پیکربندی نشده باشد — به نشانی IPv4 با مقدار 127.0.0.2 (که روی رابط لوپ‌بک محلی است) و نشانی IPv6 با مقدار ::1 (که میزبان محلی است) تفکیک می‌گردد.
•نام‌های میزبان "localhost" و "localhost.localdomain" و همچنین هر نام میزبانی که به ".localhost" یا ".localhost.localdomain" ختم شود، به نشانی‌های IP با مقادیر 127.0.0.1 و ::1 تفکیک می‌شوند.
•نام میزبان "_gateway" به تمام نشانی‌های درگاه (gateway) مسیریابی پیش‌فرض فعلی، به ترتیب سنجه (metric) آن‌ها تفکیک می‌شود. این کار یک نام میزبان پایدار به درگاه فعلی اختصاص می‌دهد که برای ارجاع به آن مستقل از وضعیت پیکربندی فعلی شبکه مفید است.
•نام میزبان "_outbound" به نشانی‌های IPv4 و IPv6 محلی که به احتمال زیاد برای ارتباط با سایر میزبان‌ها استفاده می‌شوند، تفکیک می‌گردد. این نشانی‌ها همان نشانی‌های مبدأ ترجیحی درگاه‌های پیش‌فرض در صورت مشخص شدن هستند، یا با درخواست یک تصمیم‌گیری مسیریابی برای درگاه‌های پیش‌فرض پیکربندی‌شده از هسته و سپس استفاده از نشانی‌های IP محلی انتخاب‌شده توسط این تصمیم‌گیری تعیین می‌شوند. این نام میزبان تنها در صورتی در دسترس است که حداقل یک درگاه پیش‌فرض محلی پیکربندی شده باشد. این کار یک نام میزبان پایدار به نشانی‌های IP خروجی محلی اختصاص می‌دهد که برای ارجاع به آن‌ها مستقل از وضعیت پیکربندی شبکه فعلی سودمند است.
•نام میزبان "_localdnsstub" به نشانی IP با مقدار 127.0.0.53، یعنی نشانی‌ای که خادم فرعی محلی DNS (به بالا مراجعه کنید) روی آن گوش می‌دهد، تفکیک می‌شود.
•نام میزبان "_localdnsproxy" به نشانی IP با مقدار 127.0.0.54، یعنی نشانی‌ای که پروکسی محلی DNS (به بالا مراجعه کنید) روی آن گوش می‌دهد، تفکیک می‌شود.
•نگاشت‌های تعریف‌شده در /etc/hosts به نشانی‌های پیکربندی‌شده‌شان و برعکس تفکیک می‌شوند، اما بر جستجوهای مربوط به انواع غیرنشانی (مانند MX) تأثیری نخواهند داشت. پشتیبانی از /etc/hosts را می‌توان با ReadEtcHosts=no غیرفعال کرد، به resolved.conf(5) مراجعه کنید.

درخواست‌های جستجویی که systemd-resolved.service دریافت می‌کند، بر اساس قواعد زیر به سرورهای DNS موجود، و رابط‌های LLMNR و MulticastDNS هدایت می‌شوند:

•نام‌هایی که رکوردهای ساختگی برای آن‌ها تولید می‌شود (نام میزبان محلی، "localhost" و "localdomain"، درگاه محلی، همان‌طور که در بخش پیش فهرست شد) و نشانی‌های پیکربندی‌شده در /etc/hosts هرگز به شبکه هدایت نمی‌شوند و یک پاسخ بلافاصله ارسال می‌گردد.
•نام‌های تک‌بخشی (Single-label) با استفاده از LLMNR روی تمامی رابط‌های محلی که LLMNR در آن‌ها فعال است تفکیک می‌شوند. جستجوها برای نشانی‌های IPv4 تنها از طریق LLMNR روی IPv4 و جستجوها برای نشانی‌های IPv6 تنها از طریق LLMNR روی IPv6 ارسال می‌گردند. توجه داشته باشید که جستجوها برای نام‌های ساختگی تک‌بخشی به LLMNR، MulticastDNS یا DNS تک‌پخشی هدایت نمی‌شوند.
•پرس‌وجوها برای رکوردهای نشانی (A و AAAA) نام‌های تک‌بخشی غیرساختگی از طریق DNS تک‌پخشی (unicast) با استفاده از دامنه‌های جستجو (search domains) تفکیک می‌شوند. برای هر رابطی که دامنه‌های جستجو تعریف کرده باشد، چنین جستجوهایی به سرورهای تعریف‌شده برای آن رابط هدایت می‌شوند و با هر یک از آن دامنه‌های جستجو پسوندگذاری می‌گردند. هنگامی که دامنه‌های جستجوی سراسری تعریف شده باشند، این جستجوها به سرورهای سراسری هدایت می‌شوند. برای هر دامنه جستجو، پرس‌وجوها با افزودن هر یک از دامنه‌های جستجو به نوبت به انتهای نام انجام می‌شوند. علاوه بر این، جستجوی نام‌های تک‌بخشی از طریق DNS تک‌پخشی را می‌توان با تنظیم ResolveUnicastSingleLabel=yes فعال کرد. جزئیات مربوط به اینکه کدام سرورها مورد پرس‌وجو قرار می‌گیرند و پاسخ نهایی چگونه انتخاب می‌شود، در ادامه شرح داده شده است. توجه داشته باشید این بدین معناست که پرس‌وجوهای نشانی برای نام‌های تک‌بخشی به‌طور پیش‌فرض هرگز به سرورهای راه دور DNS ارسال نمی‌شوند و تفکیک تنها در صورتی امکان‌پذیر است که دامنه‌های جستجو تعریف شده باشند.
•نام‌های چندبخشی (Multi-label) با پسوند دامنهٔ ".local" با استفاده از MulticastDNS روی تمامی رابط‌های محلی که MulticastDNS در آن‌ها فعال است تفکیک می‌شوند. همانند LLMNR، جستجوهای نشانی IPv4 از طریق IPv4 و جستجوهای نشانی IPv6 از طریق IPv6 ارسال می‌گردند.
•پرس‌وجوها برای نام‌های چندبخشی از طریق DNS تک‌پخشی روی رابط‌های محلی که سرور DNS برای آن‌ها پیکربندی شده است، به علاوه سرورهای DNS پیکربندی‌شدهٔ سراسری (در صورت وجود) هدایت می‌شوند. اینکه از کدام رابط‌ها استفاده شود، بر اساس منطق مسیریابی مبتنی بر دامنه‌های جستجو و دامنه‌های صرفاً مسیریابی (route-only) که در زیر شرح داده شده، تعیین می‌گردد. توجه داشته باشید که به‌طور پیش‌فرض، جستجوها برای دامنه‌های دارای پسوند ".local" به سرورهای DNS هدایت نمی‌شوند، مگر اینکه آن دامنه به صراحت به عنوان دامنهٔ مسیریابی یا جستجو برای سرور DNS و رابط مشخص شده باشد. این بدان معناست که در شبکه‌هایی که دامنهٔ ".local" در یک سرور DNS ویژهٔ آن پایگاه تعریف شده است، باید دامنه‌های جستجو یا مسیریابی صریح پیکربندی شوند تا جستجوها در آن دامنه DNS کار کنند. توجه داشته باشید که امروزه عموماً توصیه می‌شود از تعریف ".local" در سرور DNS خودداری شود، زیرا RFC6762[2] این دامنه را منحصراً برای استفاده MulticastDNS رزرو کرده است.
•جستجوهای نشانی (جستجوهای معکوس یا reverse lookups) مشابه با نام‌های چندبخشی هدایت می‌شوند، با این استثنا که نشانی‌های محدوده نشانی پیوند-محلی هرگز به DNS تک‌پخشی هدایت نمی‌شوند و تنها با استفاده از LLMNR و MulticastDNS (در صورت فعال بودن) تفکیک می‌گردند.

اگر جستجوها به چندین رابط هدایت شوند، نخستین پاسخ موفق بازگردانده می‌شود (بدین ترتیب مناطق جستجو روی تمامی رابط‌های منطبق عملاً با یکدیگر ادغام می‌شوند). اگر جستجو روی همهٔ رابط‌ها با شکست مواجه شود، آخرین پاسخ ناموفق بازگردانده می‌شود.

مسیریابی جستجوها توسط دامنه‌های مسیریابی به ازای هر رابط (جستجو و صرفاً مسیریابی) و دامنه‌های جستجوی سراسری تعیین می‌شود. برای شرح چگونگی تنظیم پویای این گزینه‌ها به systemd.network(5) و resolvectl(1) و برای بحث دربارهٔ Domains= در resolved.conf(5) جهت شرح تنظیمات DNS پیکربندی‌شده سراسری مراجعه کنید.

منطق مسیریابی پرس‌وجوی زیر برای جستجوهای DNS تک‌پخشی که توسط systemd-resolved.service آغاز می‌شوند اعمال می‌گردد:

•اگر یک نام مورد جستجو با هر یک از دامنه‌های مسیریابی پیکربندی‌شده (جستجو یا صرفاً مسیریابی) در هر پیوند، یا تنظیمات DNS سراسری پیکربندی‌شده مطابقت داشته باشد (یعنی: برابر با آن باشد یا آن را به عنوان پسوند داشته باشد)، «بهترین دامنهٔ منطبق» تعیین می‌شود: دامنه منطبقی که بیشترین برچسب‌ها (labels) را دارد. سپس پرس‌وجو به تمام سرورهای DNS در هر پیوند یا سرورهای DNS سراسریِ پیکربندی‌شده مرتبط با این «بهترین دامنه منطبق» ارسال می‌گردد. (توجه داشته باشید که ممکن است بیش از یک پیوند دارای همین «بهترین دامنه منطبق» پیکربندی شده باشد، که در این صورت پرس‌وجو به همهٔ آن‌ها به صورت موازی ارسال می‌شود).

در مورد نام‌های تک‌بخشی، هنگامی که دامنه‌های جستجو تعریف شده باشند، همین منطق اعمال می‌شود، با این تفاوت که ابتدا نام با هر یک از دامنه‌های جستجو به نوبت پسوندگذاری می‌گردد. توجه داشته باشید که این منطق جستجو برای نام‌هایی با حداقل یک نقطه اعمال نمی‌شود. همچنین بحث مربوط به سازگاری با تفکیک‌کننده سنتی glibc در زیر را ببینید.

•اگر پرس‌وجویی با هیچ‌یک از دامنه‌های مسیریابی پیکربندی‌شده (چه به ازای هر پیوند یا سراسری) مطابقت نداشته باشد، به تمامی سرورهای DNS که روی پیوندهای پیکربندی‌شده به عنوان مسیر پیش‌فرض تنظیم شده‌اند و همچنین سرور DNS پیکربندی‌شده سراسری ارسال می‌شود.
•اگر هیچ سرور DNS روی هیچ پیوندی که به عنوان مسیر پیش‌فرض نیز پیکربندی شده باشد وجود نداشته باشد و هیچ سرور DNS سراسری نیز پیکربندی نشده باشد، یکی از سرورهای DNS جایگزینِ درون‌ساخت (fallback) استفاده می‌شود.
•در غیر این صورت، پرس‌وجوی DNS تک‌پخشی با شکست مواجه می‌شود، زیرا هیچ سرور DNS مناسبی تعیین نمی‌گردد.

اینکه یک پیوند مسیر پیش‌فرض است یا خیر را می‌توان با دستور resolvectl default-route یا تنظیم DNSDefaultRoute= در فایل‌های .network پیکربندی کرد. در صورت عدم پیکربندی صریح، بر اساس دامنه‌های DNS پیکربندی‌شده برای یک پیوند به‌طور ضمنی تعیین می‌شود: اگر یک دامنهٔ صرفاً مسیریابی غیر از "~." وجود داشته باشد، مقدار پیش‌فرض آن نادرست (false) و در غیر این صورت درست (true) خواهد بود.

در عمل این بدان معناست: به منظور پشتیبانی از نام‌های تک‌بخشی غیرساختگی، دامنه‌های جستجوی مناسب را تعریف کنید. به منظور هدایت ترجیحی تمام پرس‌وجوهای DNS که به‌طور صریح با پیکربندی دامنهٔ مسیریابی مطابقت ندارند به یک پیوند خاص، یک دامنهٔ صرفاً مسیریابی "~." روی آن پیکربندی کنید. این کار تضمین می‌کند که سایر پیوندها برای این پرس‌وجوها در نظر گرفته نخواهند شد (مگر اینکه آن‌ها نیز چنین دامنهٔ مسیریابی را داشته باشند). برای هدایت تمام این پرس‌وجوهای DNS به یک پیوند خاص تنها در صورتی که هیچ پیوند دیگری ترجیح داده نشده باشد، پیوند را به عنوان مسیر پیش‌فرض پیکربندی کنید و دامنهٔ صرفاً مسیریابی "~." را روی آن پیکربندی نکنید. در نهایت، به منظور جلوگیری از دریافت هرگونه ترافیک DNS توسط یک پیوند خاص که با هیچ‌یک از دامنه‌های مسیریابی پیکربندی‌شده آن مطابقت ندارد، آن را به یک مسیر پیش‌فرض تبدیل نکنید.

برای اطلاعات درباره رابط‌های برنامه‌نویسی D-Bus که systemd-resolved ارائه می‌دهد، به org.freedesktop.resolve1(5) مراجعه کنید.

این بخش خلاصه‌ای کوتاه از تفاوت‌های تفکیک‌کنندهٔ پیاده‌سازی‌شده توسط nss-resolve(8) همراه با systemd-resolved و تفکیک‌کنندهٔ فرعی سنتی پیاده‌سازی‌شده در nss-dns را ارائه می‌دهد.

•برخی نام‌ها همواره به صورت داخلی تفکیک می‌شوند (به بخش رکوردهای ساختگی در بالا مراجعه کنید). به‌طور سنتی در صورتی که این نام‌ها در /etc/hosts ارائه شده بودند، توسط nss-files تفکیک می‌شدند. اما توجه داشته باشید که جزئیات چگونگی ساخته شدن یک پرس‌وجو تحت کنترل کتابخانهٔ کلاینت است. nss-dns ابتدا تلاش می‌کند نام‌ها را با استفاده از دامنه‌های جستجو تفکیک کند و حتی اگر آن پرس‌وجوها به systemd-resolved هدایت شوند، آن‌ها را با استفاده از قواعد معمول برای مسیریابی نام‌های چندبخشی از طریق شبکه به بیرون ارسال خواهد کرد [3].
•نام‌های تک‌بخشی برای رکوردهای A و AAAA با استفاده از DNS تک‌پخشی تفکیک نمی‌شوند (مگر اینکه با ResolveUnicastSingleLabel= لغو شده باشد، به resolved.conf(5) مراجعه کنید). این شبیه به تنظیم گزینهٔ no-tld-query در resolv.conf(5) است.
•دامنه‌های جستجو برای پسوندگذاری (suffixing) نام‌های چندبخشی استفاده نمی‌شوند. (با این حال دامنه‌های جستجو برای مسیریابی جستجو، برای نام‌هایی که در ابتدا به صورت تک‌بخشی یا چندبخشی مشخص شده بودند استفاده می‌شوند). هر نامی که حداقل یک نقطه داشته باشد همواره به عنوان یک نام دامنه کاملاً واجد شرایط (FQDN) تفسیر می‌شود. nss-dns نام‌ها را هم به عنوان نسبی (با استفاده از دامنه‌های جستجو) و هم به عنوان نام‌های FQDN مطلق تفکیک می‌کرد. برخی نام‌ها ابتدا به صورت نسبی و پس از ناموفق بودن آن پرس‌وجو، به صورت مطلق تفکیک می‌شدند، در حالی که نام‌های دیگر به ترتیب معکوس تفکیک می‌شدند. گزینهٔ ndots در /etc/resolv.conf برای کنترل اینکه نام به چند نقطه نیاز دارد تا ابتدا به صورت نسبی تفکیک شود، استفاده می‌شد. این تفکیک‌کنندهٔ فرعی این رفتار را اصلاً پیاده‌سازی نمی‌کند: نام‌های چندبخشی تنها به عنوان FQDN تفکیک می‌شوند[4].
•این تفکیک‌کننده شناختی از دامنهٔ ویژهٔ ".local" مورد استفاده برای MulticastDNS دارد، و پرس‌وجوهای دارای این پسوند را به سرورهای DNS تک‌پخشی هدایت نمی‌کند مگر اینکه صراحتاً پیکربندی شده باشد، به بالا مراجعه کنید. همچنین، جستجوهای معکوس برای نشانی‌های پیوند-محلی به سرورهای DNS تک‌پخشی ارسال نمی‌شوند.
•این تفکیک‌کننده /etc/hosts را به صورت داخلی خوانده و در حافظه موقت (کش) قرار می‌دهد. (به عبارت دیگر، nss-resolve علاوه بر nss-dns، جایگزین nss-files نیز می‌شود). مدخل‌های موجود در /etc/hosts دارای بالاترین اولویت هستند.
•این تفکیک‌کننده علاوه بر پروتکل کلاسیک DNS تک‌پخشی، LLMNR و MulticastDNS را نیز پیاده‌سازی می‌کند، و نام‌های تک‌بخشی را با استفاده از LLMNR (در صورت فعال بودن) و نام‌های ختم‌شده به ".local" را با استفاده از MulticastDNS (در صورت فعال بودن) تفکیک خواهد کرد.
•متغیرهای محیطی $LOCALDOMAIN و $RES_OPTIONS توضیح داده شده در resolv.conf(5) در حال حاضر پشتیبانی نمی‌شوند.
•تفکیک‌کنندهٔ nss-dns وضعیت بسیار کمی را بین پرس‌وجوهای متوالی DNS نگهداری می‌کند، و برای هر پرس‌وجو همیشه ابتدا با نخستین سرور DNS فهرست‌شده از /etc/resolv.conf گفتگو می‌کند، و در صورت شکست با سرور بعدی ادامه می‌دهد تا به انتهای فهرست برسد که در آن هنگام پرس‌وجو با شکست مواجه می‌شود. تفکیک‌کننده در systemd-resolved با این حال وضعیت را حفظ می‌کند، و برای تمام پرس‌وجوها در یک محدودهٔ جستجوی خاص، پیوسته با همان سرور گفتگو خواهد کرد تا زمانی که نوعی خطا مشاهده شود، که در این نقطه به سرور بعدی سوئیچ می‌کند، و سپس برای تمام پرس‌وجوها در آن محدوده روی آن باقی می‌ماند تا شکست بعدی رخ دهد، و به همین ترتیب ادامه می‌دهد تا در نهایت به نخستین سرور پیکربندی‌شده بازگردد. این کار برای بهینه‌سازی زمان‌های جستجو انجام می‌شود، به‌ویژه با توجه به اینکه تفکیک‌کننده هنگام گفتگو با یک سرور معمولاً ابتدا باید مجموعه ویژگی‌های سرور را بررسی کند، که زمان‌بر است. این رفتار متفاوت ایجاب می‌کند که سرورهای DNS فهرست‌شده به ازای هر محدودهٔ جستجو در مناطقی (zones) که به آن‌ها سرویس می‌دهند معادل باشند، به طوری که ارسال یک پرس‌وجو به یکی از آن‌ها نتایج یکسانی با ارسال آن به سرور DNS پیکربندی‌شدهٔ دیگری به همراه داشته باشد.

چهار حالت مدیریت /etc/resolv.conf (به resolv.conf(5) مراجعه کنید) پشتیبانی می‌شود:

•systemd-resolved فایل /run/systemd/resolve/stub-resolv.conf را جهت سازگاری با برنامه‌های سنتی لینوکس نگهداری می‌کند. این فایل، تفکیک‌کنندهٔ فرعی DNS روی 127.0.0.53 (به بالا مراجعه کنید) را به عنوان تنها سرور DNS فهرست می‌کند. همچنین شامل فهرستی از دامنه‌های جستجو است که توسط systemd-resolved استفاده می‌شوند. فهرست دامنه‌های جستجو همواره به‌روز نگه داشته می‌شود. توجه داشته باشید که /run/systemd/resolve/stub-resolv.conf نباید مستقیماً توسط برنامه‌ها استفاده شود، بلکه تنها از طریق یک پیوند نمادین از /etc/resolv.conf به کار رود. این فایل می‌تواند از /etc/resolv.conf پیوند نمادین داده شود تا تمامی کلاینت‌های محلی که APIهای محلی DNS را دور می‌زنند، با تنظیمات صحیح دامنه‌های جستجو به systemd-resolved متصل شوند. این حالت عملیاتی توصیه می‌شود.
•یک فایل ایستا به نام /usr/lib/systemd/resolv.conf ارائه شده است که تفکیک‌کنندهٔ فرعی DNS روی 127.0.0.53 (به بالا مراجعه کنید) را به عنوان تنها سرور DNS فهرست می‌کند. این فایل می‌تواند از /etc/resolv.conf پیوند نمادین داده شود تا تمامی کلاینت‌های محلی که APIهای محلی DNS را دور می‌زنند به systemd-resolved متصل شوند. این فایل شامل هیچ دامنهٔ جستجویی نیست.
•systemd-resolved فایل /run/systemd/resolve/resolv.conf را جهت سازگاری با برنامه‌های سنتی لینوکس نگهداری می‌کند. این فایل می‌تواند از /etc/resolv.conf پیوند نمادین داده شود و همواره به‌روز نگه داشته می‌شود، و حاوی اطلاعاتی دربارهٔ تمامی سرورهای شناخته‌شدهٔ DNS است. به محدودیت‌های قالب این فایل توجه داشته باشید: قالبی از مفهوم سرورهای DNS به ازای هر رابط نمی‌شناسد و بنابراین تنها شامل تعاریف سرور DNS در سطح سیستم است. توجه داشته باشید که /run/systemd/resolve/resolv.conf نباید مستقیماً توسط برنامه‌ها استفاده شود، بلکه تنها از طریق یک پیوند نمادین از /etc/resolv.conf به کار رود. اگر از این حالت عملیاتی استفاده شود، کلاینت‌های محلی که هرگونه API محلی DNS را دور می‌زنند، همچنین systemd-resolved را نیز دور خواهند زد و مستقیماً با سرورهای DNS شناخته‌شده گفتگو می‌کنند.
•به عنوان روش دیگر، /etc/resolv.conf ممکن است توسط سایر بسته‌ها مدیریت شود، که در این صورت systemd-resolved آن را برای داده‌های پیکربندی DNS خواهد خواند. در این حالت عملیاتی systemd-resolved به جای ارائه‌دهنده، مصرف‌کنندهٔ این فایل پیکربندی است.

توجه داشته باشید که حالت عملیاتی انتخاب‌شده برای این فایل به‌طور کاملاً خودکار شناسایی می‌شود، بسته به اینکه /etc/resolv.conf یک پیوند نمادین به /run/systemd/resolve/resolv.conf باشد یا 127.0.0.53 را به عنوان سرور DNS فهرست کرده باشد.

SIGUSR1

به محض دریافت سیگنال فرآیند SIGUSR1، systemd-resolved محتویات تمامی حافظه‌های موقت (کش‌ها) رکوردهای منبع DNS را که نگهداری می‌کند، و همچنین تمامی اطلاعات سطح ویژگی را که دربارهٔ سرورهای DNS پیکربندی‌شده آموخته است در لاگ‌های سیستم تخلیه می‌کند (dump می‌نماید).

افزوده‌شده در نسخهٔ 231.

SIGUSR2

به محض دریافت سیگنال فرآیند SIGUSR2، systemd-resolved تمام حافظه‌های موقت (کش‌ها) که نگهداری می‌کند را پاک‌سازی (flush) خواهد کرد. توجه داشته باشید که معمولاً درخواست صریح این مورد ضروری نیست – مگر برای اهداف اشکال‌زدایی – زیرا systemd-resolved به هر حال هر بار که پیکربندی شبکهٔ میزبان تغییر می‌کند، حافظه‌های موقت را به صورت خودکار پاک‌سازی می‌نماید. ارسال این سیگنال به systemd-resolved معادل با دستور resolvectl flush-caches است، با این حال دومی توصیه می‌شود زیرا به صورت همگام (synchronous) عمل می‌کند.

افزوده‌شده در نسخهٔ 231.

SIGRTMIN+1

به محض دریافت سیگنال فرآیند SIGRTMIN+1، systemd-resolved هر آنچه را که درباره سرورهای DNS پیکربندی‌شده آموخته است فراموش خواهد کرد. به‌ویژه هرگونه اطلاعات دربارهٔ پشتیبانی از ویژگی‌های سرور پاک‌سازی می‌شود، و منطق بررسی ویژگی‌های سرور در درخواست بعدی مجدداً راه‌اندازی می‌شود و با کامل‌ترین سطح ویژگی‌ها آغاز می‌گردد. توجه داشته باشید که معمولاً درخواست صریح این مورد ضروری نیست – مگر برای اهداف اشکال‌زدایی – زیرا systemd-resolved به صورت خودکار با هر بار تغییر پیکربندی سرور DNS، اطلاعات آموخته‌شده را فراموش می‌کند. ارسال این سیگنال به systemd-resolved معادل با دستور resolvectl reset-server-features است، با این حال دومی توصیه می‌شود زیرا به صورت همگام عمل می‌کند.

افزوده‌شده در نسخهٔ 235.

SIGHUP

به محض دریافت سیگنال فرآیند SIGHUP، systemd-resolved تمام حافظه‌های موقتی را که نگهداری می‌کند پاک‌سازی خواهد کرد، تمام اتصالات باز TCP (در صورت وجود) را قطع نموده، و فایل‌های پیکربندی خود را دوباره بارگذاری می‌کند.

افزوده‌شده در نسخهٔ 256.

systemd-resolved از منطق اعتبارنامه‌های سرویس همان‌طور که توسط ImportCredential=/LoadCredential=/SetCredential= پیاده‌سازی شده است پشتیبانی می‌کند (برای جزئیات به systemd.exec(5) مراجعه کنید). اعتبارنامه‌های زیر در صورت ارسال استفاده می‌شوند:

network.dns, network.search_domains

می‌تواند حاوی فهرستی از نشانی‌های IP سرور DNS و دامنه‌های جستجوی DNS باشد که با فاصله از هم جدا شده‌اند. این اطلاعات تنها زمانی استفاده می‌شود که هیچ پیکربندی صریحی از طریق /etc/systemd/resolved.conf، /etc/resolv.conf یا خط فرمان هسته ارائه نشده باشد.

افزوده‌شده در نسخهٔ 253.

systemd-resolved همچنین از دو گزینهٔ خط فرمان هسته پیروی می‌کند:

nameserver=, domain=

نشانی IP یک سرور DNS (در مورد nameserver=) و یک دامنهٔ جستجوی DNS (در مورد domain=) را می‌پذیرد. می‌تواند چندین بار برای تعریف چندین سرور DNS/دامنهٔ جستجو استفاده شود. اگر هر یک از این گزینه‌ها مشخص شوند، /etc/resolv.conf خوانده نخواهد شد و تنظیمات DNS= و Domains= در resolved.conf(5) نادیده گرفته می‌شوند. بنابراین این دو گزینهٔ خط فرمان هسته، پیکربندی سیستم را لغو (override) می‌کنند.

افزوده‌شده در نسخهٔ 253.

سرویس systemd-resolved روی درگاه‌های IP زیر گوش می‌دهد:

•درگاه 53 روی نشانی‌های IPv4 با مقادیر 127.0.0.53 و 127.0.0.54 (هر دو روی رابط لوپ‌بک محلی "lo"). این همان تفکیک‌کنندهٔ فرعی محلی DNS است، همان‌طور که در بالا مورد بحث قرار گرفت. هر دو پروتکل UDP و TCP تحت پوشش هستند.
•درگاه 5353 روی تمامی نشانی‌های محلی، هم IPv4 و هم IPv6 (مقادیر 0.0.0.0 و ::0)، برای MulticastDNS روی UDP. توجه داشته باشید اگرچه سوکت از طریق نشانی‌های IP نویسه عمومی (wildcard) به تمامی رابط‌های محلی مقید شده است، اما دیتاگرام‌های ورودی توسط رابط شبکه‌ای که از آن وارد می‌شوند فیلتر می‌گردند، و دامنه‌های پیوند-محلی مجزای MulticastDNS برای هر یک نگهداری می‌شود و با در نظر گرفتن اینکه MulticastDNS برای آن رابط فعال است یا خیر، عمل می‌کند.
•درگاه 5355 روی تمامی نشانی‌های محلی، هم IPv4 و هم IPv6 (مقادیر 0.0.0.0 و ::0)، برای LLMNR، روی هر دو پروتکل TCP و UDP. همانند MulticastDNS فیلتر کردن بر اساس رابط شبکه ورودی اعمال می‌شود.

systemd(1), resolved.conf(5), dnssec-trust-anchors.d(5), nss-resolve(8), resolvectl(1), resolv.conf(5), hosts(5), systemd.network(5), systemd-networkd.service(8), org.freedesktop.resolve1(5)

1.
RFC3493
2.
RFC6762
3.
برای نمونه، اگر /etc/resolv.conf حاوی این مورد باشد:
nameserver 127.0.0.53
search foobar.com barbar.com

و ما "localhost" را جستجو کنیم، nss-dns پرس‌وجوهای زیر را به systemd-resolved که روی 127.0.0.53:53 گوش می‌دهد ارسال خواهد کرد: ابتدا "localhost.foobar.com"، سپس "localhost.barbar.com"، و در نهایت "localhost". اگر (امیدوارانه) دو پرس‌وجوی اول ناموفق باشند، systemd-resolved پاسخی را برای پرس‌وجوی سوم به صورت ساختگی (synthesize) تولید خواهد کرد.

هنگام استفاده از nss-dns با هرگونه دامنه جستجو، بنابراین بسیار حیاتی است که همواره nss-files با اولویت بالاتر پیکربندی شود و نگاشت‌هایی برای نام‌هایی که نباید با استفاده از دامنه‌های جستجو تفکیک شوند ارائه دهد.
4.
در حال حاضر بیش از ۱۵۰۰ نام دامنه سطح بالا تعریف شده است، و موارد جدید مرتباً اضافه می‌شوند، که اغلب از نام‌های «جذاب» استفاده می‌کنند که احتمالاً به صورت محلی نیز استفاده می‌شوند. عدم جستجوی نام‌های چندبخشی به این شیوه از شکنندگی در هر دو جهت جلوگیری می‌کند: یک نام معتبر سراسری می‌تواند توسط یک نام محلی مبهم شود، و تفکیک یک نام محلی نسبی ممکن است هنگام ایجاد یک دامنه سطح بالای جدید یا هنگام ثبت یک زیردامنه جدید از یک دامنه سطح بالا در رجیستری، ناگهان از کار بیفتد. تفکیک هر نام داده‌شده به عنوان نسبی یا مطلق از این ابهام جلوگیری می‌کند.
systemd 257.13