GDNSD(8) gdnsd GDNSD(8)

gdnsd - دیمن معتبر (authoritative) برای سامانه نام دامنه (DNS)

کاربرد: gdnsd [-c /etc/gdnsd] [-D] [-l] [-S] [-R | -i] <action>
  -c - دایرکتوری پیکربندی (پیش‌فرض /etc/gdnsd)
  -D - فعال‌سازی خروجی اشکال‌زدایی (debug) با جزئیات بیشتر
  -l - ارسال گزارش‌ها به syslog به جای stderr
  -S - اجبار کردن 'zones_strict_data = true' برای این فراخوانی
  -R - تلاش برای جایگزینی بدون وقفه (downtimeless) یک نمونه دیگر
  -i - حالت تکرارپذیر (idempotent) برای start/daemonize: در صورت اجرا بودن، خروج با وضعیت صفر
       (گزینه‌های -R و -i نمی‌توانند با هم استفاده شوند)
کنش‌ها (Actions):
  checkconf - بررسی درستی پرونده‌های پیکربندی و زون
  start - اجرا به صورت یک فرآیند عادی در پیش‌زمینه (foreground)
  daemonize - اجرا به صورت یک دیمن در پس‌زمینه (متضمن -l)

gdnsd یک دیمن بسیار سریع، سبک و افزونه‌پذیر (pluggable) معتبر (authoritative) برای سامانه نام دامنه (DNS) است.

پرونده اصلی پیکربندی، پرونده‌ای به نام config در دایرکتوری پیکربندی است.

توجه داشته باشید که برای راه‌اندازی موفقیت‌آمیز، نیازی به وجود حتمی پرونده پیکربندی نیست. بدون پرونده پیکربندی، gdnsd تمامی منطقه‌ها (zones) موجود در دایرکتوری زون‌ها (پیش‌فرض "/etc/gdnsd/zones/") را بارگذاری کرده و روی درگاه ۵۳ از 0.0.0.0 و "::" با استفاده از تنظیمات پیش‌فرض گوش فرا می‌دهد.

دایرکتوری پیکربندی را تعیین می‌کند که پیش‌فرض آن /etc/gdnsd است. دایرکتوری زون‌ها، زیردایرکتوری zones/ از دایرکتوری پیکربندی است.
در صورت نیاز، خروجی گزارش سطح اشکال‌زدایی (debug) اضافی را فعال می‌کند.
خروجی گزارش را به جای پیش‌فرض stderr، به syslog ارسال می‌کند. این گزینه به صورت ضمنی توسط کنش "daemonize" فعال می‌شود و همچنین هنگام اجرا به عنوان یک سرویس systemd برای ثبت اطلاعات اولویت توصیه می‌گردد.
گزینه پیکربندی "zones_strict_data" را برای این فراخوانی بدون در نظر گرفتن مقدار آن در پرونده پیکربندی، روی true اجبار می‌کند. این گزینه عمدتاً برای اعتبارسنجی در هنگام استفاده از گزینه "checkconf" کاربرد دارد.
حالت جایگزینی (Replace) برای "start" و "daemonize":

در حالت عادی، اگر نمونه دیگری از سرور سوکت کنترلی سرور را قفل کرده باشد، تلاش برای "start" یا "daemonize" با شکست مواجه می‌شود. با تنظیم این پرچم، سرور جدید از طریق سوکت کنترلی خود به سرور قدیمی متصل شده و تلاش می‌کند تا تحویل بی‌وقفه (downtime-less) و همواری از عملیات را انجام دهد. این امر به تغییرات کد و پیکربندی اجازه می‌دهد تا در بیشتر موارد بدون از دست رفتن درخواست‌ها انجام شود و به طور کلی کاملاً یکپارچه و روان است. برای اطلاعات بیشتر به مستندات "replace" در gdnsdctl(8) مراجعه کنید، زیرا رابط ترجیحی برای این قابلیت است.

حالت تکرارپذیر (Idempotent) برای "start" و "daemonize":

در حالت عادی، اگر نمونه دیگری از سرور سوکت کنترلی سرور را قفل کرده باشد، تلاش برای "start" یا "daemonize" با شکست مواجه خواهد شد. با تنظیم این پرچم، چنانچه نمونه دیگری از قبل در حال اجرا باشد، این نمونه موفقیت را گزارش کرده و بلافاصله با وضعیت صفر خارج می‌شود.

اعتبار پرونده پیکربندی و پرونده‌های زون را بررسی کرده و وضعیت خروج را متناسب با آن تنظیم می‌کند (۰ برای موفقیت). همین کد به صورت ضمنی در هنگام راه‌اندازی اجرا می‌شود؛ "checkconf" صرفاً در آخرین نقطه پیش از نیاز به انجام اقدامات واقعی زمان اجرا (مانند اختصاص سوکت‌ها) خارج می‌شود.
برنامه gdnsd را به عنوان یک فرآیند پیش‌زمینه سرور DNS در زمان اجرا راه‌اندازی می‌کند و خروجی گزارش را به stderr ارسال می‌نماید.
برنامه gdnsd را به عنوان یک فرآیند دیمن مجزاشده در پس‌زمینه در یک نشست (session) جدید با والد فرآیند ۱ (init) راه‌اندازی می‌کند و خروجی گزارش را مستقیماً به syslog می‌فرستد. فرآیند اولیه پیش‌زمینه در صورت موفقیت هیچ خروجی در ترمینال تولید نمی‌کند، اما پیش از خروج با وضعیت صفر منتظر می‌ماند تا دیمن پس‌زمینه عملیات راه‌اندازی را با موفقیت تکمیل کند (یا در صورت عدم موفقیت، با وضعیتی غیرصفر خارج شده و نوعی خروجی شکست را به stderr یا syslog ارسال می‌نماید).

هر گزینه خط فرمان دیگری به عنوان نامعتبر تلقی خواهد شد که منجر به نمایش یک متن راهنمای کوتاه در STDERR و خروج با وضعیت غیرصفر می‌شود. این موارد شامل گزینه‌های متداولی نظیر --help و --version نیز می‌گردد.

این سرویس به محیط امنیتی زمان اجرا یا مجموعه امتیازات، یا اینکه آیا تحت کاربر "root" اجرا می‌شود یا خیر توجهی نمی‌کند و تلاشی برای بررسی یا تغییر آن‌ها انجام نمی‌دهد؛ و همچنین هیچ اقدامی را که معمولاً نیازمند امتیازات "root" باشد (مانند تغییر محدودیت‌های memlock rlimits خود یا افزایش اولویت فرآیند خود) انجام نمی‌دهد. تنها استثنا این است که کد کورکورانه فرض می‌کند که اتصال به درگاه‌های شنیداری DNS خود، که به طور پیش‌فرض در محدوده ممتاز (privileged) قرار دارند، به سادگی و بدون مشکل کار خواهد کرد (Just Work).

این سرویس انتظار دارد تمام این موارد توسط سازوکارهای بیرونی مدیریت شوند: یا یک سیستم init شبیه systemd که می‌تواند همه این کارها را به صورت اعلانی انجام دهد، یا ترکیبی از ابزارها در یک اسکریپت init برای یک سیستم سنتی init جهت رسیدگی به تنظیمات ممتاز لازم و/یا زندان امنیتی (security-jailing) / فهرست‌های کنترل دسترسی (ACLها) و غیره.

هنگام اجرا به عنوان یک سرویس systemd، باید از "start" به جای "daemonize" استفاده شود، پرچم "-l" به کار رود، و نوع سرویس با "Type=notify" و "NotifyAccess=all" تنظیم گردد. بخش‌های اخیر باعث می‌شوند تا systemd متغیر $NOTIFY_SOCKET را برای دیمن تنظیم کند، و دیمن نیز به نوبه خود پس از اتمام وظایف راه‌اندازی اولیه و آمادگی برای پاسخ‌دهی به درخواست‌ها، از آن برای ارسال اعلان آمادگی استفاده خواهد کرد. برای دستور "ExecStop=" نیز باید از "gdnsdctl -l stop"; استفاده شود.

درخت کد منبع حاوی یک نمونه پرونده واحد (unit file) برای systemd با مقادیر پیش‌فرض معقول برای به‌کارگیری در محیط عملیاتی است.

دایرکتوری پرونده‌های استاندارد زون بر پایه RFC1035 (بک‌اند پیش‌فرض داده‌های زون)، زیردایرکتوری به نام zones/ در دایرکتوری پیکربندی است، بنابراین مسیر پیش‌فرض /etc/gdnsd/zones/ خواهد بود.

پرونده‌های منطقه RFC1035، قالب سنتی پرونده‌های زون هستند که معمولاً با برنامه‌هایی مانند BIND استفاده می‌شوند. برای اطلاعات بیشتر در مورد قالب درونی و پردازش این پرونده‌ها، به gdnsd.zonefile(5) مراجعه کنید. این بخش به نحوه مدیریت خود دایرکتوری می‌پردازد.

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

به منظور پشتیبانی بهتر از حالت خاص زون‌های تفویض بدون کلاس in-addr.arpa به سبک RFC 2137 (که شامل اسلش رو به جلو هستند)، هر نماد "@" در نام پرونده هنگام تبدیل نام پرونده به نام زون مربوطه به یک اسلش رو به جلو ("/") ترجمه خواهد شد.

به دلایل مشابه، اگر قرار است سرور شما ریشه (root) DNS را سرویس‌دهی کند، نام پرونده برای زون ریشه باید نام پرونده خاص ROOT_ZONE باشد، به جای نام پرونده تحت‌اللفظی ناممکن .. از آنجا که سرورهای معتبر نمی‌توانند به دو دامنه با رابطه والد<->فرزند به درستی سرویس دهند، یک سرور ریشه نمی‌تواند به هیچ زون دیگری سرویس دهد، بنابراین این تنها پرونده زون خواهد بود.

دنباله‌های فرار (escape sequences) استاندارد پرونده‌های زون DNS در نام پرونده‌ها شناسایی می‌شوند (به عنوان مثال "\." برای یک نقطه درون برچسب، یا "\NNN" که در آن NNN یک عدد صحیح دهدهی در محدوده 0 - 255 است)، در صورتی که به هر دلیلی نیاز به یک نویسه غیرمعمول در نام زون خود داشته باشید.

نقطه‌های پایانی در نام پرونده‌های زون نادیده گرفته می‌شوند؛ برای مثال example.com و example.com. از نظر عملکردی معادل هستند.

زون‌های تکراری (برای مثال وجود هر دو قالب بالا برای "example.com" در دایرکتوری زون‌ها، و/یا افزودن حالت متفاوت حروف بزرگ و کوچک مانند EXample.Com) غیرمجاز هستند.

زیرزون‌ها (subzones) (برای مثال داشتن پرونده‌های زون برای هر دو مورد "example.com" و "subz.example.com") نیز غیرمجاز هستند.

دستور "gdnsdctl reload-zones" بازخوانی مجدد تمام داده‌های زون را آغاز می‌کند. عملیات بازخوانی مجدد در یک ریسه (thread) جداگانه از سرور اصلی انجام می‌شود و جریان درخواست‌های DNS را قطع نمی‌کند.

ابزار "gdnsdctl" منتظر می‌ماند تا سرور عملیات بارگذاری را تکمیل کند و موفقیت یا شکست تراکنش بازخوانی مجدد را از طریق خروجی استاندارد (stdout) و وضعیت خروج فرآیند خود گزارش دهد.

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

مسیرهای دایرکتوری مهم برای کد هسته دیمن:

/etc/gdnsd
دایرکتوری پیش‌فرض پیکربندی، مگر اینکه با گزینه "-c" بازنویسی شود. پرونده اصلی پیکربندی همیشه پرونده config در دایرکتوری پیکربندی است.
//run/gdnsd
مقدار پیش‌فرض run_dir. این مکانی است که سوکت کنترلی و پرونده‌های قفل دیمن در آن ایجاد می‌شوند. برای اطلاعات بیشتر درباره این دایرکتوری به بخش مربوط به "run_dir" در صفحه راهنمای gdnsd.config(5) مراجعه کنید.
//lib/gdnsd
مقدار پیش‌فرض state_dir. پرونده admin_state از این دایرکتوری برای بازنویسی‌های مدیریتی وضعیت بر روی منابع پایش‌شده خوانده می‌شود؛ به بخش پرونده‌ها (FILES) در ادامه مراجعه کنید. برای اطلاعات بیشتر درباره این دایرکتوری به بخش مربوط به "state_dir" در صفحه راهنمای gdnsd.config(5) مراجعه کنید.
/usr/lib/gdnsd
این مسیر پیش‌فرض برای پرونده‌های اجرایی خصوصی دیمن است که کاربران نباید آن‌ها را اجرا کنند. تنها مورد فعلی gdnsd_extmon_helper برای افزونه extmon است و مسیر آن را می‌توان در پیکربندی آن افزونه که در gdnsd-plugin-extmon(8) مستند شده است، بازنویسی کرد.

این پرونده ورودیِ بازنویسی‌های وضعیت مدیریتی است که بر تصمیمات تفکیک و پاسخ‌دهی (resolution) افزونه‌ها تأثیر می‌گذارد. هدف از این پرونده این است که به تصمیمات صریح و انسانی مدیر سیستم اجازه دهد تا وضعیت‌های مؤثر بر تصمیم‌گیری افزونه در موارد تغییر مسیر خودکار (failover) و/یا توزیع جغرافیایی را به طور موقت بازنویسی کند. یک پرونده ناموجود مانند یک پرونده خالی در نظر گرفته می‌شود. این پرونده در زمان اجرا برای تشخیص تغییرات تحت پایش قرار می‌گیرد و هر وضعیت بازنویسی‌شده‌ای که یافت شود به سرعت اعمال خواهد شد. انتظار می‌رود این پرونده در برابر راه‌اندازی‌های مجدد سیستم و بازراه‌اندازی‌های دیمن پابرجا بماند تا مقصود مدیر در طول این رویدادها حفظ شود.

آشنایی اولیه با نحوه کار افزونه‌های پایش (monitoring) و تفکیک (resolution) در gdnsd فرض شده است (به gdnsd.config(5) مراجعه کنید). این پرونده به عنوان یک ساختار داده درهم‌سازی (hash) به قالب vscf تجزیه می‌شود (باز هم برای جزئیات عمیق‌تر آن قالب، gdnsd.config(5) را ببینید). کلیدها نام منابع پایش‌شده یا مجازی هستند، و مقادیر وضعیت‌های اجباری (اختیاراً همراه با مقادیر TTL پایش‌شده) می‌باشند. کلیدها همچنین می‌توانند با استفاده از نحو تطبیق پوسته (glob) نویسه‌های عام (wildcard) باشند که بر چندین منبع تأثیر می‌گذارند.

برای منابع پایش‌شده عادی، قالب متداول یک کلید به صورت "THING/service_type" خواهد بود، که در آن "THING" نشانی یا مقدار CNAME پایش‌شده است و "service_type" نوع سرویسی است که توسط یک یا چند افزونه تفکیک برای پایش آن نشانی یا مقدار CNAME پیکربندی شده است. بخش مقدار به صورت "STATE[/TTL]" است، که در آن "STATE" می‌تواند "UP" یا "DOWN" باشد و بخش TTL یک بازنویسی اختیاری از TTL پایش‌شده است.

ترتیب خطوط در پرونده اهمیت دارد؛ آن‌ها به ترتیب پردازش و اعمال می‌شوند، به طوری که خطوط بعدی می‌توانند اقدامات خطوط قبلی را بازنویسی کنند. این امر به ویژه برای ایجاد استثناها در تطبیق الگوهای سراسری (glob-matches) بسیار کاربردی است.

مثال:

//lib/gdnsd/admin_state:
    2001:db8::2:123/my_http_check => DOWN # غیرفعال کردن یک res+stype مشخص
    foo.example.com./extmon_ping => UP # فعال کردن یک res+stype مشخص
    192.0.2.1/* => DOWN # غیرفعال کردن تمام service_typeها برای این نشانی
    */xmpp => UP/30 # فعال کردن تمام منابع پایش‌شده با xmpp با مقدار TTL برابر با 30 ...
    192.0.2.2/xmpp => DOWN # ... به جز این یکی

برخی از افزونه‌های تفکیک می‌توانند منابع مجازی (که توسط هیچ "service_type" پایش نمی‌شوند) را صرفاً به منظور بازنویسی مدیریتیِ تصمیم‌گیری ثبت کنند. در حال حاضر افزونه‌های geoip و metafo این کار را برای "datacenters" خود انجام می‌دهند، و کلیدهایی که ایجاد می‌کنند برای اجبار وضعیت یک مرکز داده در سطح هر منبع، به شکل "plugin_name/resname/dcname" هستند. افزونه geoip همچنین از کلیدهایی به شکل "plugin_name/mapname/dcname" برای اجبار وضعیت یک مرکز داده در سطح هر نگاشت (map) پشتیبانی می‌کند. این اجبارها بر وضعیت تجمیعیِ ارسال‌شده به geoip/metafo از سوی افزونه‌های به ازای هر مرکز داده (برای مثال multifo یا weighted که چندین نشانی را در یک مرکز داده پایش می‌کنند) اولویت دارند، و در مورد geoip، وضعیت اجباری خاص‌تر به ازای هر منبع، هر وضعیت اجباری به ازای هر نگاشت را بازنویسی خواهد کرد.

مثال:

//lib/gdnsd/admin_state:
    geoip/map3/dc-us => DOWN # غیرفعال کردن dc-us در نقشه geoip map3
    */dc-jp => DOWN # غیرفعال کردن تمام مراکز داده با نام dc-jp برای geoip و metafo
    metafo/res_www/dc-jp => UP # استثنایی برای مورد بالا

تمامی کلیدهای پایش‌شده و مجازی موجود که می‌توانند در این پرونده مطابقت داده شوند، و همچنین وضعیت‌های پایش‌شده و/یا اجباری فعلی آن‌ها، در خروجی دستور "gdnsdctl states" با قالب JSON قابل مشاهده هستند.

هر سیگنالی که صریحاً ذکر نشده باشد، به طور صریح رسیدگی نمی‌شود؛ به این معنا که آن‌ها اقدامات پیش‌فرض خود را خواهند داشت که اغلب شامل توقف اجرای برنامه است.

باعث خروج هموار و تمیز دیمن به همراه خروجی گزارش مربوطه می‌شود. وضعیت خروج سیگنال پایان‌دهنده را به درستی منعکس خواهد کرد.
نادیده گرفته می‌شود.
اگر برنامه از طریق "daemonize" راه‌اندازی شده باشد، سیگنال "SIGHUP" توسط دیمن پس‌زمینه صریحاً نادیده گرفته می‌شود، اما توسط فرآیند موقت پیش‌زمینه در طول مقداردهی اولیه نادیده گرفته نمی‌شود. هنگام راه‌اندازی از طریق "start"، رسیدگی به "SIGHUP" در حالت‌های پیش‌فرض رها می‌شود که معمولاً هنگام دریافت آن به خاتمه ناگهانی و ناپاک فرآیند منجر خواهد شد.
این سیگنال به دلایل سازگاری با گذشته توسط دیمن اصلی رسیدگی می‌شود، زیرا نگارش‌های قبلی از آن برای درخواست بازخوانی ناهمگام داده‌های زون استفاده می‌کردند. در حال حاضر صرفاً خطایی را در گزارش ثبت می‌کند که به سازوکار جدید "gdnsdctl" اشاره دارد، و هیچ اثر واقعی ندارد. این سازوکار سازگاری ممکن است در یک به‌روزرسانی عمده آینده حذف شود.
به عنوان یک سیگنال بین‌ریسه‌ای (inter-thread) در داخل برنامه استفاده می‌شود و هیچ کاربرد مستندشده‌ای از بیرون ندارد. این سیگنال را به هیچ ریسه‌ای از دیمن ارسال نکنید.

وضعیت خروج صفر نشان‌دهنده موفقیت است و هر مقدار دیگری نشان‌دهنده شکست می‌باشد.

برای "daemonize"، وضعیت خروج فرآیند اولیه پیش‌زمینه نشان می‌دهد که آیا دیمن پس‌زمینه با موفقیت راه‌اندازی شده است یا خیر.

برای "start"، فرآیند اولیه پیش‌زمینه همان دیمن است، و وضعیت خروج حتی در صورت خاموش‌شدن منظم، سیگنال پایان‌دهنده را به درستی منعکس می‌کند، یا در صورت خاموش‌شدن منظم با سازوکارهای غیرسیگنالی برابر با صفر خواهد بود.

gdnsd.config(5), gdnsd.zonefile(5)

راهنمای gdnsd.

Copyright (c) 2012 Brandon L Black <blblack@gmail.com>

این پرونده بخشی از gdnsd است.

نرم‌افزار gdnsd یک نرم‌افزار آزاد است: می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو (GNU General Public License) همان‌گونه که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، چه نگارش ۳ مجوز و چه (به انتخاب خودتان) هر نگارش بالاتری بازتوزیع کنید و/یا تغییر دهید.

نرم‌افزار gdnsd به این امید توزیع شده است که مفید واقع شود، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابل فروش بودن یا مناسب بودن برای یک هدف مشخص. برای جزئیات بیشتر مجوز عمومی همگانی گنو را ببینید.

شما باید همراه با gdnsd نسخه‌ای از مجوز عمومی همگانی گنو را دریافت کرده باشید. در غیر این صورت، نشانی http://www.gnu.org/licenses/ را ببینید.

2026-04-04 gdnsd 3.8.3