DNS کتابخانه باید نام سرویس را پاسخ بدهد، اما نباید برای تمام اینترنت recursive resolver باشد یا فایل کامل zone را به هر رهگذری تحویل بدهد. یک BIND کوچک روی loopback می‌سازیم و انتقال zone را با TSIG محدود می‌کنیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: Ubuntu 24.04؛ bind9 و bind9-utils و dnsutils؛ BIND 9.18؛ اجرای آزمایش روی 127.0.0.1:5353.

جایگاه در دوره: هدف‌های 331.4 آزمون 303-300.

سه نقش، سه نوع اعتماد#

سرور authoritative دربارهٔ zone خودش جواب می‌دهد؛ recursive resolver جواب را از منابع دیگر پیدا می‌کند. انتقال zone یا AXFR برای همگام‌سازی سرورهاست. TSIG، امضای تراکنش با راز مشترک، اصالت یک تبادل را بررسی می‌کند؛ DNSSEC اصالت دادهٔ DNS را در زنجیرهٔ اعتماد بررسی می‌کند. هیچ‌کدام به‌خودی‌خود محتوای پرس‌وجو را رمز نمی‌کنند.

آزمایشگاه بدون دست‌کاری DNS سیستم#

سرویس سیستم را تغییر نده؛ فرایند جدا روی پورت غیرممتاز اجرا می‌کنیم. پوشهٔ اختصاصی را زیر /var/lib/bind می‌سازیم تا با محدودهٔ فایل مجازِ profile بستهٔ BIND در Ubuntu سازگار باشد؛ تنها همین زیرپوشه متعلق به کاربر تمرین است:

umask 077
sudo install -d -m 700 -o "$USER" -g "$(id -gn)" /var/lib/bind/lpic303
cd /var/lib/bind/lpic303
tsig-keygen -a hmac-sha256 lab-transfer > transfer.key

فایل db.example.test:

$TTL 300
@ IN SOA ns.example.test. admin.example.test. (1 300 300 3600 300)
  IN NS ns.example.test.
ns IN A 192.168.56.10
library IN A 192.168.56.10

فایل named.conf در همان پوشه:

include "transfer.key";
options {
    directory ".";
    listen-on port 5353 { 127.0.0.1; };
    listen-on-v6 { none; };
    recursion no;
    dnssec-validation no;
    pid-file "named.pid";
    session-keyfile "session.key";
    allow-transfer { none; };
};
controls {};
zone "example.test" {
    type primary;
    file "db.example.test";
    allow-transfer { key lab-transfer; };
};

خالی بودن controls فقط رابط مدیریتی این فرایند آموزشی را خاموش می‌کند. در سرویس واقعی، rndc را با کلید و محدودیت دسترسی مدیریت کن. validation این سرور authoritative غیرفعال است؛ این گزینه امضای zone را حذف نمی‌کند و اعتبارسنجی درس بعد در کلاینت انجام می‌شود. مسیرها نسبی‌اند؛ همهٔ فرمان‌ها باید از همین پوشه اجرا شوند.

named-checkconf named.conf
named-checkzone example.test db.example.test
named -g -c "$PWD/named.conf"

فرایند foreground می‌ماند. در ترمینال دوم، از همان پوشه:

dig @127.0.0.1 -p 5353 library.example.test A
dig @127.0.0.1 -p 5353 example.test AXFR
dig @127.0.0.1 -p 5353 -k transfer.key example.test AXFR

نام library باید پاسخ بگیرد؛ AXFR بدون کلید باید شکست بخورد؛ AXFR با کلید باید رکوردها را تحویل دهد. اگر sandbox توزیع باز هم عملیات لازم را رد می‌کند، denial و مسیر دقیق را بررسی کن؛ سیاست سیستم را کور خاموش نکن.

تمرین خرابی#

کلید دیگری با همان نام بساز و از آن برای AXFR استفاده کن. نام کلید یکسان، راز یکسان نمی‌سازد. در سرور عمومی، دسترسی فایل‌ها، recursion، انتقال zone و رابط مدیریتی را جدا کنترل کن. راز TSIG وارد zone عمومی نمی‌شود. برای پایان، فرایند را با Ctrl+C ببند.

مرجع: پیکربندی BIND 9.18 و راهنمای ابزارهای BIND .