GDNSD-PLUGIN-GEOIP(8) gdnsd GDNSD-PLUGIN-GEOIP(8)

gdnsd-plugin-geoip - افزونه متا برای تفکیک جغرافیایی بار سرور (GSLB) و جایگزینی اضطراری از طریق پایگاه‌های داده GeoIP2 مکسماید

نمونه حداقلی فایل پیکربندی gdnsd با استفاده از این افزونه:

plugins => { geoip => {
  maps => {
    my_prod_map => {
      geoip2_db => GeoIP2-City.mmdb,
      datacenters => [dc-03, dc-02, dc-01, dc-fail],
      map => {
          EU => {
              DE => [dc-03, dc-01, dc-fail],
              CH => [dc-01, dc-03, dc-fail]
          },
          NA => { MX => [dc-02, dc-fail] }
      }
    },
    my_auto_map => {
      geoip2_db => GeoIP2-Country.mmdb,
      datacenters => [dc1, dc2],
      auto_dc_coords => {
         dc1 => [ 38.9, -77 ],
         dc2 => [ 50.1, 8.7 ],
      }
    }
  },
  resources => {
    prod_www => {
      map => my_prod_map
      service_types => up
      dcmap => {
        dc-01 => 192.0.2.1,
        dc-02 => { lb01 => 192.0.2.2, lb02 => 192.0.2.3 },
        dc-03 => [ 192.0.2.4, 192.0.2.5, 192.0.2.6 ],
        dc-fail => last.resort.cname.example.net.
      }
    }
    corp_www => {
      map => my_auto_map
      dcmap => {
        dc1 => 192.0.2.100,
        dc2 => 192.0.2.101
      }
    }
  }
}}

نمونه رکوردهای منبع (RR) در فایل ناحیه برای ناحیه example.com:

www      600 DYNA geoip!prod_www
www-dc01 600 DYNA geoip!prod_www/dc-01
www.corp 600 DYNA geoip!corp_www

gdnsd-plugin-geoip از پایگاه‌های داده باینری GeoIP2 شرکت MaxMind برای نگاشت نتایج نشانی و CNAME بر اساس موقعیت جغرافیایی و دسترسی‌پذیری پایش‌شده سرویس‌ها استفاده می‌کند. این افزونه به طور کامل از هر دو استاندارد IPv6 و استاندارد نوظهور edns-client-subnet پشتیبانی می‌نماید. چنانچه درخواستی حاوی گزینه edns-client-subnet با ماسک شبکه مبدأ بزرگ‌تر از صفر باشد، اطلاعات edns-client-subnet به جای IP مبدأ درخواست (IP کش پرس‌وجوکننده) استفاده خواهد شد.

این افزونه از پایگاه‌های داده با فرمت GeoIP2 که معمولاً به .mmdb ختم می‌شوند پشتیبانی می‌کند. از پایگاه‌های داده قدیمی با فرمت GeoIP1 (که معمولاً به .dat ختم می‌شوند) پشتیبانی نمی‌شود.

این افزونه همچنین می‌تواند بدون هیچ پایگاه داده GeoIP استفاده شود، که در این حالت تنها ورودی نگاشت شبکه از داده‌های پیکربندی "nets" یا یک فایل خارجی "nets" تأمین می‌شود که به طور صریح زیرشبکه‌ها را به فهرست‌هایی از مراکز داده نگاشت می‌کنند.

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

این دو حالت می‌توانند در مرزهای جغرافیایی نیز به طور موثر با یکدیگر ترکیب شوند.

به ازای هر "map" که تعریف می‌کنید (که کدهای موقعیت جغرافیایی را به فهرست‌های اولویت‌بندی‌شده از مراکز داده شما نگاشت می‌کند)، این افزونه تمام زیرشبکه‌های خام GeoIP را در بزرگ‌ترین ابرشبکه‌های (supernets) ممکن که پاسخ‌های یکسانی در پیکربندی شما دارند ادغام می‌کند. این ابرشبکه‌ها به نوبه خود برای تنظیم ماسک‌های دامنه edns-client-subnet بزرگ‌تر نسبت به بازگرداندن ساده نتایج خام GeoIP استفاده می‌شوند.

مطالعه مستندات gdnsd-plugin-metafo(8) برای درک مستندات افزونه geoip در اینجا الزامی است. افزونه geoip یک ابرمجموعه دقیق از افزونه metafo است و تقریباً از تمام کد منبع افزونه metafo مجدداً استفاده می‌کند. افزونه metafo عمل جایگزینی اضطراری (failover) را در امتداد یک فهرست سراسری و مرتب‌شده منفرد از مراکز داده انجام می‌دهد. آنچه plugin_geoip به قابلیت‌های metafo اضافه می‌کند، امکان پویایی ترتیب فهرست جایگزینی مراکز داده بر اساس هر درخواست و متکی بر سرنخ‌های جغرافیایی استخراج‌شده از نشانی شبکه کلاینت است.

پیکربندی این افزونه می‌تواند به چندین فایل پیکربندی و/یا فایل داده خارجی ارجاع دهد. به طور پیش‌فرض، تمام فایل‌های ارجاع‌شده در پیکربندی این افزونه از زیرپوشه geoip در دایرکتوری پیکربندی دیمون (پیش‌فرض /etc/gdnsd) بارگذاری می‌شوند. با مشخص کردن مسیرهای مطلق فایل می‌توانید آن‌ها را از مکان‌های دیگر بارگذاری کنید.

سطح بالای پیکربندی افزونه geoip (یعنی "plugins => { geoip => { ... } }") تنها از سه کلید صریح پشتیبانی می‌کند. یکی از آن‌ها تنظیم اختیاری "undefined_datacenters_ok" است.

دو کلید دیگر الزامی هستند و در دو بخش بعدی با جزئیات شرح داده شده‌اند: "maps" و "resources". بخش "maps" یک یا چند نگاشت نام‌گذاری‌شده از اطلاعات موقعیت مکانی پایگاه‌های داده باینری GeoIP به زیرمجموعه‌های مرتب‌شده از نام‌های مراکز داده را تعریف می‌کند. بخش "resources" یک یا چند منبع نام‌گذاری‌شده را تعریف می‌کند که هر کدام به یکی از نقشه‌های نام‌گذاری‌شده ارجاع داده و نام‌های مراکز داده را به مجموعه‌های مشخصی از نشانی‌ها یا CNAMEها تجزیه می‌کنند.

هر کلید دیگری که در این سطح موجود باشد به داخل هر هش به ازای منبع در بلوک "resources" به ارث برده می‌شود و به عنوان مقادیر پیش‌فرض به ازای هر منبع برای مواردی که صراحتاً در آنجا تعریف نشده‌اند عمل می‌کند.

بولی، پیش‌فرض false. در صورت تنظیم روی true، به منابع geoip اجازه داده می‌شود که برخی از مراکز داده مشخص‌شده در "map" خود را در "dcmap" سطح منبع تعریف‌نشده باقی بگذارند. به عنوان مثال، یک نقشه M ممکن است ۳ مرکز داده به نام‌های A، B و C تعریف کند، اما یک منبع با استفاده از نقشه M فقط آدرس‌های نتیجه را برای مراکز داده B و C در "dcmap" خود تعریف نماید. در غیر این صورت، این وضعیت یک خطای سخت پیکربندی خواهد بود.

!!! خطر !!! - تنظیم این مقدار روی true اگر در مورد نحوه پیکربندی نقشه‌ها و منابع نسبت به یکدیگر بسیار محتاط نباشید، به ویژه در «حالت خودکار شهری» (City Auto Mode)، می‌تواند شما را با خطرات جدی مواجه کند. نقشه‌ها بدون هیچ‌گونه آگاهی از منابعی که از آن‌ها استفاده می‌کنند محاسبه می‌شوند. اگر یک شبکه یا موقعیت مکانی خاص به فهرستی از مراکز داده نگاشت شود که شامل هیچ‌یک از مراکز داده تعریف‌شده برای یک منبع مفروض نباشد، نتایج پرس‌وجوهای زمان اجرا برای آن منبع از آن مکان یا شبکه برابر با مجموعه تهی خواهد بود (هیچ رکورد پاسخی وجود نخواهد داشت). این اتفاق در «حالت خودکار شهری» در صورتی که تعداد مراکز داده تعریف‌نشده در یک منبع بزرگ‌تر یا مساوی با "auto_dc_limit" نقشه باشد، عملاً قطعی است.

تمام کلیدهای پیکربندی در سطح "maps" نام‌های نقشه‌هایی هستند که شما برای تعریف انتخاب می‌کنید. یک نقشه، از نظر مفهومی، نگاشتی میان جغرافیا و/یا توپولوژی شبکه به زیرمجموعه‌های مرتب متغیر از مراکز داده است. مقدار هر نقشه نام‌گذاری‌شده باید یک هش باشد و کلیدهای پیکربندی زیر در داخل آن اعمال می‌شوند:

رشته، نام فایل، اختیاری. این نام فایل یک پایگاه داده با فرمت GeoIP2 مکسماید است. باید مدل داده City یا Country را شامل شود. در اینجا هیچ تفاوتی برای نسخه IP قائل نمی‌شود و معمول است که این پایگاه‌های داده، داده‌های هر دو پروتکل IPv4 و IPv6 را در کنار هم داشته باشند. در صورت فقدان یکی از آن‌ها، کلاینت‌های استفاده‌کننده از آن خانواده آدرس به مقادیر پیش‌فرض ارجاع داده می‌شوند.

آرایه‌ای از رشته‌ها، الزامی. این مجموعه کل نام‌های مراکز داده استفاده‌شده توسط این نقشه است. باید حداقل یک نام مرکز داده تعریف کنید (هرچند ۲ یا بیشتر بسیار مفیدتر خواهد بود). در حال حاضر، محدودیت حداکثر ۲۵۴ نام مرکز داده به ازای هر نقشه وجود دارد، اگرچه در صورت نیاز این سقف قابل افزایش است. ترتیب مشخص‌شده در اینجا، ترتیب پیش‌فرض نتایج در موارد پیش‌فرض مختلف است (مثلاً در صورتی که هیچ فهرست پیش‌فرض صریحی در سطح بالای نقشه داده نشود).

بولی، پیش‌فرض false. چنانچه این گزینه روی "true" تنظیم شود، تمام منابعی که از این نقشه استفاده می‌کنند، هنگام جستجو در نقشه اطلاعات زیرشبکه کلاینت EDNS (یا ECS) را نادیده گرفته و تنها بر IP مبدأ DNS برای جستجو تکیه می‌کنند. اگر کلاینت در چنین پرس‌وجویی ECS ارسال کرده باشد، پاسخ همچنان حاوی گزینه ECS خواهد بود تا نشان دهد ما به طور کلی از ECS آگاه هستیم، اما ماسک دامنه پاسخ روی صفر تنظیم می‌شود تا به کش پیام دهد که داده‌های ECS استفاده نشده و نتیجه به صورت سراسری قابل ذخیره در کش است.

این قابلیت برای شرایطی مفید است که در آن نقشه عمداً فقط بر اساس IPهای بازگشتی (recursor) عمل می‌کند نه IPهای ECS، اما نقشه‌های دیگر تحت پوشش همان سرور معتبر از داده‌های ECS استفاده می‌کنند و بنابراین نمی‌توان از گزینه پیکربندی سراسری edns_client_subnet برای غیرفعال کردن کامل پردازش این گزینه در کل سرور استفاده کرد.

هش کلید-مقدار، اختیاری (فرم جایگزین را در زیر ببینید). در صورت تعیین، محتویات باید جفت‌های کلید-مقدار از "network/netmask" نگاشت‌شده به یک نام مرکز داده (یا آرایه‌ای از نام‌های مراکز داده) باشند. هرگونه نگاشت شبکه به مرکز داده که در اینجا مشخص شود، نگاشت‌های تعیین‌شده از طریق GeoIP را بازنویسی (override) خواهد کرد. توجه داشته باشید که تعیین شبکه‌ها در زیرفضاهای IPv4-مانند در IPv6 به جز v4compat غیرمجاز است، اما تعیین شبکه‌های واقعی IPv4 (که کاملاً مشابه با v4compat رفتار می‌شوند) مجاز است. برای جزئیات بیشتر بخش مربوط به نشانی‌های سازگار با IPv4 را در ادامه این سند ببینید. ترتیب شبکه‌ها اهمیتی ندارد؛ آن‌ها همیشه مرتب و درج می‌شوند به طوری که یک مدخل که زیرشبکه مدخل دیگری است توسط ابرشبکه والد مخدوش نشود.

nets => {
    10.0.0.0/8 => [ dc1, dc2 ],
    192.0.2.128/25 => dc3
    2001:DB8::/32 => [ dc4, dc5, dc6 ],
}

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

مسیر رشته‌ای، اختیاری. گونه‌ای از مورد بالا است، اما محتویات هش کلید-مقدار از فایل خارجی نام‌برده بارگذاری می‌شود. این امر کار را برای ابزارها و اسکریپت‌های خارجی که مجموعه‌های بزرگی از مدخل‌های nets را تولید می‌کنند (مثلاً از داده‌های BGP) آسان‌تر می‌سازد. فایل برای تغییرات پایش شده و همانند پایگاه‌های داده GeoIP در زمان اجرا مجدداً بارگذاری می‌شود.

هش کلید-مقدار، اختیاری. این هسته اصلی یک نقشه نام‌گذاری‌شده است که از GeoIP استفاده می‌کند: خود نقشه، که مکان‌ها را به فهرست‌های مرتب از مراکز داده نگاشت می‌کند. نیازمند تعیین "geoip2_db" نیز هست و بدون آن مفهومی ندارد.

این یک هش کلید-مقدار تو در تو است. در هر سطح، کلیدها کدهای مکان (اطلاعات قاره، کشور، منطقه/تقسیمات کشوری، یا شهر بسته به عمق) هستند و مقادیر یا یک آرایه مرتب از مراکز داده (مثلاً "[ dc03, dc01, dc04 ]") یا یک زیر-هش حاوی سطح عمیق‌تری از تفکیک هستند. در هر لایه، یک کلید ویژه به نام "default" در دسترس است که مقدار پیش‌فرض را برای همه چیز در دامنه جاری تنظیم می‌کند. مقدار پیش‌فرض سطح بالا نیز در حالت عادی به فهرست مرتب "datacenters" برمی‌گردد. اگر کل بخش "map" حذف شده یا خالی باشد، تنها رفتار پیش‌فرض "default" را دریافت می‌کنید. یک آرایه مرکز داده همچنین می‌تواند خالی باشد، که نشان می‌دهد این مکان نگاشت شده تا هیچ داده پاسخی دریافت نکند (سرور همچنان به پرس‌وجو پاسخ می‌دهد و خطای NXDOMAIN صادر نمی‌کند؛ بلکه صرفاً پاسخی از نوع NODATA/NOERROR خواهد بود مشابه زمانی که هیچ رکوردی از این نوع وجود ندارد، اما رکوردهایی از انواع دیگر برای همین نام وجود دارد).

بالاترین سطح سلسله‌مراتب نقشه از هفت کد قاره مکسماید تشکیل شده است: "AF" برای آفریقا، "AS" برای آسیا، "NA" برای آمریکای شمالی، "SA" برای آمریکای جنوبی، "EU" برای اروپا، "OC" برای اقیانوسیه و "AN" برای جنوبگان. سطح بعدی کد دو حرفی کشور طبق استاندارد ISO 3166-1 است.

از اینجا به بعد تعدادی از سطوح تقسیمات کشوری (Subdivision) وجود دارد که تعداد آن‌ها برای مدخل‌های مختلف پایگاه داده شبکه متفاوت است. به عنوان مثال، در ایالات متحده فقط یک سطح از داده‌های تقسیمات برای ایالت‌های آمریکا وجود دارد. در جمهوری چک دو سطح تقسیمات وجود دارد: ابتدا به ۱۴ منطقه و سپس به ۹۱ شهرستان. تمام تقسیمات مستقیماً با استفاده از کدهای ISO 3166-2 مشخص می‌شوند.

پس از تمام سطوح تقسیمات کشوری، سطح نهایی سطح شهر (City) است. نام شهرها همگی در مجموعه نویسه‌های UTF-8 هستند. در حال حاضر این افزونه فقط از نام‌های انگلیسی شهرها از پایگاه داده استفاده می‌کند، حتی اگر زبان‌های دیگر بسته به پایگاه داده در دسترس باشند.

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

به عنوان مثال، این پیکربندی شورای منطقه‌ای اوتاگو در نیوزیلند را بدون تعیین صریح تقسیمات احاطه‌کننده جزیره جنوبی هدف قرار می‌دهد:

{ OC => { NZ => { OTA => [...] } } }

به عنوان مثالی دیگر، این پیکربندی برای هدف قرار دادن شهر پاریس بدون اهمیت دادن به لایه‌های تقسیماتی که بین آن و FR قرار دارند به درستی کار می‌کند:

{ EU => { FR => { Paris => [...] } } }

«حالت خودکار شهری» (City-auto-mode) یک حالت ویژه عملیاتی است که جهان را بر اساس محاسبات مختصات به طور خودکار به مراکز داده شما نگاشت می‌کند، به طوری که نیازی به ساخت دستی یک "map" سلسله‌مراتبی پیچیده نداشته باشید. البته این حالت هنوز هم می‌تواند با "map" ترکیب شود و به شما امکان می‌دهد در صورت تمایل از حالت خودکار فقط برای مناطق جغرافیایی خاص استفاده کنید (یا با تعیین فهرست‌های دستی آن را برای مناطق خاص غیرفعال نمایید). پارامتر کلیدی "auto_dc_coords" است که حالت خودکار شهری را فعال می‌کند. این قابلیت نیازمند پایگاه داده GeoIP2 در سطح City است؛ پایگاه‌های داده Country فاقد اطلاعات مختصات هستند.

"auto_dc_coords = { ... }"
هش کلید-مقدار، اختیاری. اگر این گزینه مشخص شود، حالت پایه عملیاتی کل نقشه به «city-auto-mode» تغییر می‌یابد. محتویات هش شامل یک کلید برای هر مرکز داده نام‌گذاری‌شده در "datacenters" است که مقادیر آن‌ها روی آرایه‌ای از "[lat, lon]" بر حسب واحدهای درجه اعشاری تنظیم شده است. هنگامی که حالت خودکار شهری توسط این گزینه فعال می‌شود، تغییرات اعتبارسنجی پیکربندی زیر نسبت به حالت پیش‌فرض و نگاشت ایستا رخ می‌دهد: پایگاه(های) داده بارگذاری‌شده GeoIP2 باید حتماً پایگاه‌های داده در سطح City باشند، و کلمه کلیدی ویژه "auto" به یک «فهرست مرکز داده» معتبر در بلوک "map" تبدیل می‌شود.

با فعال شدن حالت خودکار شهری، مقدار پیش‌فرض "default" در سطح بالای نقشه به "auto" تغییر می‌یابد، اما می‌توان آن را با یک فهرست دستی بازنویسی کرد. برای هر مکانی که به "auto" نگاشت می‌شود، مختصات مشخص‌شده در اینجا در "auto_dc_coords" با مختصات پایگاه(های) داده در سطح City مقایسه می‌شود تا یک فهرست مراکز داده مرتب‌شده بر اساس فاصله به طور خودکار تعیین گردد.

اگر یک یا چند مرکز داده تعریف‌شده را از فهرست مختصات در "auto_dc_coords" حذف کنید، آن مراکز داده در نتایج خودکار استفاده نخواهند شد، اما همچنان برای استفاده دستی از طریق مدخل‌های "map" و/یا "nets" در دسترس خواهند بود.

"auto_dc_limit = N"
عدد صحیح بدون علامت، اختیاری، پیش‌فرض ۳. هنگامی که حالت خودکار شهری فعال است، این گزینه حد بالای طول برای فهرست‌های تولیدشده خودکار است. مقدار ۳ یک پیش‌فرض معقول است حتی اگر مجموعه مراکز داده بسیار طولانی‌تری داشته باشید، زیرا این امر یک مرکز اصلی و همچنین دو مرکز جایگزین را فراهم می‌کند. افزایش این مقدار به عددی بزرگ در حضور یک فهرست طولانی از مراکز داده باعث افزایش سریع مجموعه‌ای از فهرست‌های مراکز داده با نتیجه یکتا شده و در نتیجه بهینه‌سازی پایگاه داده نتیجه نهایی را برای اهداف edns-client-subnet کاهش می‌دهد. افزایش این مقدار تقریباً در هیچ حالتی ارزشی ندارد، مگر اینکه واقعاً نیاز داشته باشید از کار افتادن همزمان بیش از ۳ مرکز داده تصادفی را مدیریت کنید و همچنان کلاینت‌ها به جای دیگر منتقل شوند. مقدار صفر به عنوان نامحدود تلقی می‌شود (به هیچ وجه توصیه نمی‌شود).

در حالت خودکار شهری، زمانی که پیش‌فرض سطح بالا (به طور صریح یا ضمنی) "auto" باشد، همچنان یک ترتیب ایستای پشتیبان وجود دارد که کل فهرست مرتب "datacenters" است؛ همان "default" ایستای عادی زمانی که در حالت خودکار شهری نیستیم. این پشتیبان زمانی استفاده می‌شود که هیچ اطلاعات مکانی اصلاً در دسترس نباشد (مثلاً کلاینت IPv6 در برابر پایگاه داده GeoIP اختصاصی IPv4، پروکسی‌های ناشناس و غیره).

یک برنامه باینری به نام "gdnsd_geoip_test" گنجانده شده است. این برنامه می‌تواند مستقیماً از خط فرمان استفاده شود، بخش‌های مربوطه از فایل پیکربندی gdnsd شما را برای اطلاعات نقشه geoip تجزیه کرده و سپس نتایج فهرست مراکز داده را برای ترکیب‌های آدرس IP و نقشه ارائه‌شده توسط کاربر فراهم می‌کند. این ابزار برای خطایابی نقشه‌های شما و آزمایش نگاشت IPهای کلاینت مفید است. این برنامه یک صفحه راهنمای جداگانه gdnsd_geoip_test(1) دارد.

پیکربندی در سطح منبع در بلوک "resources" تقریباً مشابه پیکربندی منابع در افزونه metafo است، با تمام همان رفتارهای اساسی در مورد ترکیب یا ارجاع مستقیم به پیکربندی سایر افزونه‌ها به ازای هر مرکز داده.

یک تفاوت این است که آرایه "datacenters" به ازای هر منبع در metafo با "map => mapname" جایگزین شده است که به یکی از نقشه‌های تعریف‌شده در بلوک "maps" که قبلاً به تفصیل شرح داده شد ارجاع می‌دهد. مجموعه مراکز داده تعریف‌شده در بلوک "dcmap" باید با مجموعه کل مراکز داده تعریف‌شده توسط نقشه ارجاع‌شده مطابقت داشته باشد، مگر اینکه "undefined_datacenters_ok" روی "true" تنظیم شده باشد (هشدارها و مستندات بالا را ببینید).

فلگ "skip_first" را نیز می‌توان به ازای هر منبع تنظیم کرد، و با افزونه geoip بسیار مفیدتر از افزونه پایه metafo است. اگر این فلگ تنظیم شود، اولین مرکز داده در فهرست جایگزینی برای یک جستجوی مفروض نادیده گرفته می‌شود و امکان تعریف یک منبع «انتخاب دوم» را با استفاده از همان تعریف نقشه پایه انتخاب اول فراهم می‌کند. در این حالت انتخاب اول اصلی *هرگز* یک پاسخ ممکن نیست و بقیه منطق (مانند نادیده گرفتن مراکز داده مشخص‌شده به عنوان غیرفعال) با فهرست باقی‌مانده به طور عادی ادامه می‌یابد. اگر مدخل نقشه و/یا تعریف منبع قبلاً تعداد موثر مراکز داده را به یک کاهش داده باشد، فلگ هیچ اثری ندارد.

هر دو افزونه متا ("metafo" و "geoip") می‌توانند تا زمانی که یک منبع مستقیماً به خودش ارجاع ندهد، از طریق ارجاع مستقیم درون یک "dcmap" به منابع خود و همچنین منابع یکدیگر ارجاع دهند. این قابلیت امکان پیکربندی لایه‌بندی افزونه‌ها مانند geoip -> metafo -> weighted یا metafo -> geoip -> multifo یا حتی metafo -> metafo -> simplefo و غیره را فراهم می‌سازد.

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

علاوه بر این، "geoip" می‌تواند پیکربندی را برای منابع "metafo" بسازد، اما عکس آن صادق نیست؛ "metafo" نمی‌تواند پیکربندی را برای منابع "geoip" تولید کند.

این افزونه شش روش مختلف نسبتاً ساده را برای نگاشت آدرس‌های IPv4 به فضای آدرس IPv6 می‌شناسد. این روش‌ها در زیر با همان میزانی از جزئیات که برای این افزونه اهمیت دارد نشان داده شده‌اند و به جای بایت‌های کپی‌شده آدرس IPv4 از "NNNN:NNNN" استفاده شده است:

     ::0000:NNNN:NNNN/96   # RFC 4291 - v4compat (منسوخ‌شده)
     ::ffff:NNNN:NNNN/96   # RFC 4291 - v4mapped
::ffff:0000:NNNN:NNNN/96   # RFC 2765 - SIIT (از رده خارج)
   64:ff9b::NNNN:NNNN/96   # RFC 6052 - Well-Known Prefix
2001:0000:X:NNNN:NNNN/32   # RFC 4380 - Teredo (بیت‌های IPv4 وارونه می‌شوند)
       2002:NNNN:NNNN::/16 # RFC 3056 - 6to4
(در حالت Teredo در بالا، "X" نشان‌دهنده برخی بایت‌های غیرصفر متغیر است
 که ۶۴ بیت میانی آدرس را اشغال می‌کنند).

تمام پایگاه‌های داده جستجوی داخلی این افزونه، پایگاه‌های داده IPv6 هستند و هرگونه اطلاعات شبیه به IPv4 همیشه در فضای v4compat در این پایگاه‌های داده ذخیره می‌شود. هنگام انجام جستجوهای زمان اجرا، سایر آدرس‌های شبه-v4 (آدرس‌های خام IPv4، v4mapped، SIIT، WKP، Teredo و 6to4) قبل از پرس‌وجو از پایگاه‌های داده داخلی به نمایش استاندارد v4compat در IPv6 تبدیل می‌شوند. سایر نمایش‌ها (v4mapped، SIIT، WKP، Teredo، 6to4) در داخل تعریف‌نشده هستند و با توجه به تبدیل v4compat که قبلاً ذکر شد، هرگز در زمان جستجو به آن‌ها ارجاع داده نخواهد شد.

بخش "nets" مجاز به تعیین مدخل‌ها در پنج فضای تعریف‌نشده شبه-v4 در IPv6 (آن‌هایی غیر از v4compat) نیست. در عوض آن شبکه‌ها را به عنوان شبکه‌های معمولی IPv4 یا شبکه‌های v4compat مشخص کنید. مدخل‌های مشروع IPv6 در "nets" که تصادفاً یک ابرشبکه از هر فضای شبه-v4 باشند، تأثیر منفی بر جستجوهای شبه-v4 *نخواهند* گذاشت. هیچ تفاوت عملکردی بین فرم‌های v4compat و فرم بومی v4 در "nets" وجود ندارد، مثلاً "192.0.2.0/24" و "::C000:0200/120" کاملاً یکسان هستند.

پایگاه‌های داده GeoIP که ذاتاً فقط IPv4 هستند، تمام داده‌هایشان فقط در فضای v4compat بارگذاری می‌شود. برای پایگاه‌های داده معمولی IPv6 در GeoIP، به طور پیش‌فرض فضای v4compat را مستقیماً بارگذاری می‌کنیم (جایی که MaxMind داده‌های IPv4 را در پایگاه‌های داده IPv6 خود ذخیره می‌کند)، اما از فضاهای v4mapped/SIIT/Teredo/6to4 صرف‌نظر می‌نماییم (که برخی از آن‌ها در پایگاه‌های داده MaxMind خالی هستند و برخی دیگر صرفاً نام مستعاری برای فضای v4compat محسوب می‌شوند).

یک نمونه پیکربندی نسبتاً جامع که تعامل بخش‌های معتبر "maps" و "resources" را نشان می‌دهد:

service_types => {
  xmpp_svc => { plugin => "tcp_connect", ... }
  www_svc => { plugin => "http_status", ... }
}
plugins => {
  geoip => {
    maps => {
      my_prod_map => {
        geoip2_db => GeoIP2-City.mmdb,
        datacenters => [us-01, de-01, sg-01],
        map => {
            # سلسله‌مراتب عبارت است از: Continent -> Country -> Region -> City
            NA => {
              US => {
                Dallas => [sg-01],
              }
            }
            SA => [us-01, sg-01, de-01],
            EU => {
              default => [de-01, us-01, sg-01],
              CH => {
                Geneve => {
                  Geneva => [sg-01],
                }
              }
            }
            AF => [de-01, us-01, sg-01],
            AS => [sg-01, de-01, us-01],
            OC => [sg-01, us-01, de-01],
        }
        nets => {
            10.0.0.0/8 => [ de-01 ],
            2001:DB8::/32 => [ us-01 ],
        }
      }
      my_auto_map => {
        geoip2_db => GeoIP2-City.mmdb,
        datacenters => [us-01, de-01, sg-01],
        auto_dc_coords => {
           us-01 => [ 38.9, -77 ],
           de-01 => [ 50.1, 8.7 ],
           sg-01 => [ 1.3, 103.9 ],
        }
      }
    }
    resources => {
      prod_app => {
        map => my_auto_map
        # این دو مورد کلیدهای پیکربندی به ارث برده شده از multifo
        #  برای تمام dcmap زیر هستند:
        service_types => [www_svc, xmpp_svc],
        up_thresh => 0.4,
        dcmap => {
          us-01 => {
            lb01 => 192.0.2.1,
            lb02 => 192.0.2.2,
            lb03 => 192.0.2.3,
            lb01.v6 => 2001:DB8::1,
            lb02.v6 => 2001:DB8::2,
            lb03.v6 => 2001:DB8::3,
          },
          sg-01 => {
            lb01 => 192.0.2.4,
            lb02 => 192.0.2.5,
            lb03 => 192.0.2.6,
            lb01.v6 => 2001:DB8::4,
            lb02.v6 => 2001:DB8::5,
            lb03.v6 => 2001:DB8::6,
          },
          de-01 => {
            lb01 => 192.0.2.7,
            lb02 => 192.0.2.8,
            lb03 => 192.0.2.9,
            lb01.v6 => 2001:DB8::7,
            lb02.v6 => 2001:DB8::8,
            lb03.v6 => 2001:DB8::9,
          },
        }
      },
      prod_cdn => {
        map => my_prod_map,
        dcmap => {
          us-01 => us-cdn-provider.example.net.
          sg-01 => asia-cdn-provider.example.net.
          de-01 => europe-cdn-provider.example.net.
        }
      }
    }
  }
}

نمونه رکوردهای منبع (RR) در فایل ناحیه برای ناحیه example.com:

app     600 DYNA geoip!prod_app
app.us  600 DYNA geoip!prod_app/us-01
app.sg  600 DYNA geoip!prod_app/sg-01
app.de  600 DYNA geoip!prod_app/de-01
content 600 DYNC geoip!prod_cdn

plugins => {
  geoip => {
    maps => {
      auto_map => {
        geoip2_db => GeoIP2-City.mmdb,
        datacenters => [dc1, dc2, dc3, dc4],
        auto_dc_coords => {
           dc1 => [ 38.9, -77 ],
           dc2 => [ 50.1, 8.7 ],
           dc3 => [ 20.2, 88.9 ],
           dc4 => [ 39.0, -20 ],
        },
        # فقط ۲ مورد نزدیک‌تر بررسی شوند قبل از تسلیم شدن:
        auto_dc_limit => 2,
      }
    },
    resources => {
      www_real => {
        map => my_auto_map,
        service_types => [ http, xmpp ],
        dcmap => {
          dc1 => 192.0.2.100,
          dc2 => 192.0.2.101,
          dc3 => 192.0.2.102,
          dc4 => 192.0.2.103
        }
      }
    }
  },
  metafo => {
    resources => {
      www => {
        datacenters => [ real, backup ],
        dcmap => {
          real => %geoip!www_real,
          backup => backup-host.example.net.
        }
      }
    }
  }
}
و در فایل ناحیه example.com:
; نزدیک‌ترین ۲ مرکز از ۴ مرکز داده را به کلاینت
; از نقشه geoip امتحان می‌کند، و اگر هر دوی آن‌ها از کار افتاده باشند
; یک CNAME به backup-host.example.net بازمی‌گرداند
; برای نمایش پیام قطعی یا موارد مشابه:
www DYNC metafo!www

gdnsd-plugin-metafo(8), gdnsd_geoip_test(1), gdnsd.config(5), gdnsd.zonefile(5), gdnsd(8)

راهنمای gdnsd.

کپی‌رایت (c) ۲۰۱۲ Brandon L Black <blblack@gmail.com>

این فایل بخشی از gdnsd است.

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

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

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

2026-04-04 gdnsd 3.8.3