مقدمة
Bind (Berkeley Internet Name Domain) هو برنامج مفتوح المصدر يقوم بتنفيذ بروتوكولات نظام أسماء النطاقات (DNS) للإنترنت. إنه البرنامج الأكثر استخدامًا على نطاق واسع لخوادم DNS على الإنترنت.
إعداد Bind كخادم DNS خاص للشبكة يوفر عددًا من المزايا:
- يسمح بترجمة أسماء المضيف إلى عناوين IP للآلات على الشبكة الخاصة دون الاعتماد على خادم DNS خارجي
- يتيح لك سيطرة وتخصيص أكبر على نطاق DNS الخاص الخاص بك
- يحسن الأمان والخصوصية من خلال تجنب استعلامات DNS الذاهبة إلى الخوادم الخارجية
- يعزز الموثوقية من خلال الحد من الاعتماد على خوادم DNS الخارجية
في هذا الدليل ، سنغطي الخطوات اللازمة لتثبيت وتهيئة وإعداد Bind كخادم DNS ذاكرة تخزين مؤقت وسلطة على شبكة خاصة.
المتطلبات الأساسية
قبل البدء بإعداد Bind ، نحتاج إلى التأكد من توفر ما يلي:
- خادم لينكس مع تثبيت نظام لينكس مثل أوبونتو20.04 /22.04 أو دبيان11/12 أو CentOS 7/8 إلخ.
- يجب أن يكون للجهاز اللينكس عنوان IP ثابت واتصال شبكة على الشبكة الخاصة.
- اسم النطاق الذي تريد استخدامه لشبكتك الخاصة. سيكون هذا بمثابة النطاق الجذر في تكوين Bind. على سبيل المثال ، إذا اخترت
home.net
كنطاقك ، فسيكون خادم DNS الخاص بك مسؤولاً عنhome.net
وأي نطاقات فرعية تحته مثلserver1.home.net
وprinters.home.net
إلخ.
تثبيت Bind
Bind متاح في مستودعات التثبيت الافتراضية لمعظم توزيعات لينكس.
أوبونتو / دبيان
في أوبونتو أو دبيان ، قم بتثبيت Bind باستخدام apt:
$ sudo apt update
$ sudo apt install bind9 bind9utils
سيقوم هذا بتثبيت Bind 9 وبعض الأدوات مثل dig و nslookup إلخ.
CentOS / RHEL
في CentOS أو RHEL ، قم بتثبيت Bind باستخدام yum:
$ sudo yum update
$ sudo yum install bind bind-utils
مرة أخرى سيقوم هذا بتثبيت حزم bind9 والأدوات.
التحقق من التثبيت
للتحقق من تثبيت Bind:
$ dig -v
يجب أن يعرض هذا إصدار Bind الذي تم تثبيته الآن:
;; BIND version: 9.11.3-1ubuntu1.2-Ubuntu
هذا يؤكد أن Bind مثبت وجاهز للتكوين.
يمكن بعد ذلك الانتقال إلى تكوين الدليل كما هو موضح. أخبرني إذا كنت ترغب في إضافة أي تفاصيل أخرى إلى قسم التثبيت!
التكوين الأساسي لـ Bind
ملفات التكوين الرئيسية لـ Bind هي:
/etc/bind/named.conf
– ملف تكوين Bind الرئيسي الذي يتضمن جميع ملفات التكوين الأخرى/etc/bind/named.conf.options
– خيارات عامة لـ Bind/etc/bind/named.conf.local
– تكوين لخادم DNS المحلي نفسه/etc/bind/db.root
– ملف تلميحات الجذر يشير إلى خوادم الجذر DNS/var/cache/bind
– الدليل العامل لـ Bind مع الذاكرة المؤقتة والبيانات الأخرى
دعونا نلقي نظرة على بعض الخيارات الرئيسية التي نحتاج إلى تكوينها في هذه الملفات.
في named.conf.options
:
options {
directory "/var/cache/bind";
forwarders {
8.8.8.8;
8.8.4.4;
};
allow-query { any; };
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
هذا يقوم بتعيين الدليل العامل لـ Bind ، ويكوّن خوادم DNS العامة لشركة جوجل كموجّهات لإجراء الاستعلامات الخارجية ، ويسمح بالاستعلامات من أي عنوان IP ، ويمكّن التحقق من DNSSEC ، ويستمع على كل من عناوين IPv4 و IPv6.
في named.conf.local
، قم بتكوين منطقة الجذر الخاصة بك وتفاصيل خادم DNS المحلي:
// تعريف المنطقة الجذرية
zone "home.net" IN {
type master;
file "/etc/bind/db.home.net";
};
// إعلان خادم DNS المحلي نفسه
zone "dns1.home.net" {
type master;
file "/etc/bind/db.dns1.home.net";
};
هذا يعرّف home.net
كمنطقة جذر مهيأة كمنطقة ماستر ، مما يعني أن خادم DNS الخاص بنا سيكون الخادم المعتمد لهذا المجال. سيتم تحميل تفاصيل المنطقة من الملف db.home.net
.
كما نضيف إعلان منطقة لاسم خادم DNS المحلي dns1.home.net
مع تفاصيله في ملف db.dns1.home.net
.
تكوين المنطقة الجذرية
بعد ذلك ، نحتاج إلى تعريف تفاصيل منطقتنا الجذرية home.net
في ملف db.home.net
:
$TTL 604800
@ IN SOA dns1.home.net. admin.home.net. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS dns1.home.net.
@ IN A 192.168.1.100
هذا يقوم بتعيين TTL الافتراضي ، وتسجيل SOA الذي يحدد خصائص المنطقة ، وخادم DNS الخاص بنا كخادم اسم لـ home.net
وعنوان IP الخاص به.
بالنسبة لخادم DNS المحلي ، يكون ملف db.dns1.home.net
:
$TTL 604800
@ IN SOA dns1.home.net. admin.home.net. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS dns1
@ IN A 192.168.1.100
هذا يكوّن سجلات SOA و A لخادم DNS المحلي الخاص بنا.
تكوين التوجيه المتكرر
في الشبكة الخاصة ، قد لا يكون بإمكان خادم DNS المحلي حل جميع أسماء المضيفين إلى عناوين IP بنفسه. في تلك الحالة ، نحتاج إلى تكوين توجيه متكرر لإرسال استعلامات DNS الخارجية إلى محللي DNS عامة.
يتم تعريف هذا في named.conf.options
في وقت سابق باستخدام بيان forwarders
. هنا نقوم بتكوين خوادم DNS العامة لشركة جوجل 8.8.8.8
و 8.8.4.4
للتعامل مع الاستعلامات الخارجية.
بهذه الطريقة ، إذا تلقى خادم DNS الخاص بنا استعلامًا لا يستطيع حله من مناطقه المحلية ، فسيقوم بتوجيهه بشكل متكرر إلى خوادم DNS الخارجية لإيجاد الإجابة.
تأمين خادم DNS
نظرًا لأن خادم DNS يوفر خدمات شبكة حساسة ، نحتاج إلى تأمينه مثل أي خادم آخر. وتشمل بعض الخطوات الرئيسية:
- استخدام حساب مستخدم مخصص غير جذر لعملية Bind
- تقييد الوصول إلى ملفات ومجلدات تكوين Bind
- تكوين قواعد الجدار الناري للسماح فقط بحركة DNS على المنفذ 53 لكل من UDP و TCP
- تمكين SELinux أو AppArmor للحصول على أمان إضافي
- استخدام TLS لتشفير حركة DNS إذا لزم الأمر
- إعداد التحديثات الديناميكية الآمنة باستخدام TSIG إذا احتاجت العملاء إلى تحديث سجلات DNS بشكل ديناميكي
- تمكين التحقق من صحة DNSSEC لتعزيز أمن بيانات DNS
- Configure rate-limiting in
named.conf.options
to prevent DNS amplification attacks
إليك بعض قواعد الجدار الناري للسماح فقط بحركة DNS:
# السماح باستعلامات DNS
$ iptables -A INPUT -p udp --dport 53 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# السماح بتحويلات المنطقة
$ iptables -A INPUT -p tcp --dport 53 -m state --state ESTABLISHED -j ACCEPT
# السماح بالاستجابات
$ iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT
اختبار الإعداد
بمجرد تثبيت Bind وإتمام التكوين الأساسي ، يمكننا تشغيل الخدمة والتحقق من أنها تعمل بشكل صحيح.
على أنظمة Systemd ، قم بتشغيل:
# systemctl start bind9
# systemctl enable bind9
على أنظمة init.d ، قم بتشغيل:
# service bind9 start
# chkconfig bind9 on
تحقق من الحالة باستخدام:
# systemctl status bind9
# service bind9 status
يجب أن تكون خدمة Bind نشطة وقيد التشغيل.
الآن يمكننا اختبار البحث باستخدام أوامر dig
و nslookup
و host
:
# dig @192.168.1.100 home.net
# nslookup dns1.home.net 192.168.1.100
# host google.com 192.168.1.100
يجب أن يعيد الاستعلام الأول سجلات SOA و NS لـ home.net
. ويجب أن يعرض الثاني سجل A لـ dns1.home.net
. والأخير هو استعلام متكرر لـ google.com
والذي يجب أن يعيد عنوان IP الخارجي بعد التوجيه إلى خادم Google DNS.
إذا كانت كل هذه تعمل بشكل جيد ، فإن خادم DNS الخاص بك مهيأ بشكل صحيح لإجراء البحث الأساسي عن DNS والتوجيه!
تكوين المناطق للشبكات المحلية
في هذه المرحلة ، لا يعرف خادم DNS الخاص بنا سوى منطقة الجذر home.net
مع تفاصيل خادم DNS المحلي. نحتاج إلى إضافة المزيد من المناطق لتوفير تسمية إجراء البحث لشبكتنا الخاصة.
دعنا نفترض أن لدينا الشبكة 192.168.1.0/24
مع بعض المضيفين المحددين:
192.168.1.100
– خادم DNS نفسهdns1.home.net
192.168.1.101
– خادم ويب باسمweb1.home.net
192.168.1.102
– خادم قاعدة بياناتdb1.home.net
192.168.1.103
– خادم ملفاتfiles.home.net
يمكننا إضافة كل من هذه الخوادم كسجل A داخل منطقة home.net
نفسها في db.home.net
:
web1 IN A 192.168.1.101
db1 IN A 192.168.1.102
files IN A 192.168.1.103
بعد إعادة تحميل خدمة Bind ، يمكننا الآن البحث عن هذه المضيفين والحصول على عنوان IP:
# dig @192.168.1.100 web1.home.net
# nslookup db1.home.net 192.168.1.100
# host files.home.net 192.168.1.100
بدلاً من إضافة جميع المضيفين في المنطقة الجذرية ، يمكننا أيضًا تكوين منطقة منفصلة جديدة لشبكتنا الداخلية.
قم بإضافة هذا التعريف المنطقة إلى named.conf.local
:
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192";
};
هنا نعرّف منطقة بحث عكسية لعناوين IP تحت 192.168.1.0/24 معيّنة إلى نطاق .arpa
.
ملف المنطقة /etc/bind/db.192
:
$TTL 604800
@ IN SOA home.net. admin.home.net. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS dns1.
100 IN PTR dns1.home.net.
101 IN PTR web1.home.net.
102 IN PTR db1.home.net.
103 IN PTR files.home.net.
وهذا يحدد عملية التعيين العكسية من عناوين IP إلى أسماء للمضيفين في شبكة 192.168.1.0/24.
بعد إعادة تحميل Bind ، ستعمل البحوث العكسية:
# dig -x 192.168.1.101 @192.168.1.100
# nslookup -query=PTR 192.168.1.102 192.168.1.100
# host 192.168.1.103 192.168.1.100
يمكن إضافة ملفات مناطق إضافية مماثلة لأي شبكات فرعية خاصة ومضيفين مهيئين على الشبكة.
وهذا يوفر خدمة DNS محلية معتمدة دون الاعتماد على أي خوادم DNS خارجية.
التحديثات الديناميكية للمنطقة
في البيئات الأكبر ، يمكن أن يكون الحفاظ على سجلات DNS لبنية تحتية متغيرة أمرًا صعبًا. يوفر Bind طريقتين لتحديث مناطق DNS بشكل ديناميكي – DNS الديناميكي (DDNS) والتحديثات الموقّعة DNSSEC.
مع DDNS ، يمكن للعملاء تحديث سجلات DNS الخاصة بهم مباشرةً داخل منطقة عن طريق إرسال طلبات UPDATE خاصة إلى خادم DNS. هذا أبسط في الإعداد ولكنه غير آمن.
تستخدم التحديثات الموقعة DNSSEC توقيعات معاملات (TSIG) لتوقيع طلبات التحديث توقيعًا تشفيريًا. لا يقبل خادم DNS إلا التحديثات ذات التوقيع الصالح.
فيما يلي مثال على تمكين تحديثات DDNS للعملاء في الشبكة الفرعية 192.168.1.0/24:
في named.conf.local
:
zone "home.net" {
type master;
allow-update { 192.168.1/24; };
file "/etc/bind/db.home.net";
};
تمكّن خيارات allow-update
التحديثات من الشبكة الفرعية.
يمكن للآلات العميل استخدام أمر nsupdate
لإضافة/تعديل/حذف السجلات. على سبيل المثال:
# nsupdate
> update add web2.home.net 3600 A 192.168.1.105
> send
سيضيف هذا سجل A لـ web2.home.net
. يمكن حذف السجلات عن طريق تحديد اسمها وقيمة ttl
فقط.
بالنسبة للتحديثات الموقعة TSIG ، يشترك كل من الخادم والعملاء في مفتاح TSIG مشترك. يمكن إنشاء المفتاح باستخدام dnssec-keygen
. يوقّع العملاء حزمة UPDATE بتوقيع TSIG.
على الخادم ، يحدد ملف named.conf
مفتاح TSIG ويمكّن التحديثات الموقّعة:
key "tsig-key" {
algorithm hmac-sha256;
secret "b3BlbnNlc2FtZTAwMA==";
};
zone "home.net" {
type master;
allow-update { key tsig-key; };
...
}
يمكن للعملاء استخدام نفس المفتاح لتوقيع طلبات التحديث. هذا يضمن إمكانية تحديث سجلات DNS بشكل ديناميكي فقط من قبل المضيفين المصرّح لهم.
DNS منقسم الأفق
في بعض الأحيان ، قد تعيد خوادم DNS الداخلية الخاصة نتائج مختلفة عن DNS العامة الخارجية لتوفير تكوين DNS منقسم. وهذا يُعرف باسم DNS منقسم الأفق.
على سبيل المثال ، webserver.company.com
داخليًا يمكن أن يحل إلى عنوان IP الخاص 192.168.1.101
في حين أنه خارجيًا يحل إلى العنوان IP العام 1.2.3.4
.
يمكننا تحقيق ذلك مع Bind عن طريق تعريف منطقة company.com
كمنطقة توجيه لعناوين IP العامة وكمنطقة عكسية منفصلة لعناوين IP الداخلية.
في named.conf.local
:
// منطقة التوجيه
zone "company.com" {
type master;
file "/etc/bind/db.company.com.public";
}
// منطقة عكسية
zone "1.168.192.in-addr.arpa"{
type master;
file "/etc/bind/db.company.com.private";
}
يسمح هذا بتعريف سجلات A مختلفة لـ webserver.company.com
في ملفات منطقة العامة والخاصة. يمكن تكوين خادم BIND للاستماع على واجهات شبكة مختلفة لتقديم البيانات الصحيحة.
يعد DNS المنقسم مفيدًا للأمان والعزل والتحكم في السياسات بين بيانات DNS العامة والخاصة.
الذاكرة المؤقتة والاستباق
تمكين الذاكرة المؤقتة والاستباق على خادم DNS يمكن أن يحسن الأداء. بشكل افتراضي ، يقوم Bind بتخزين نتائج الاستعلام في الذاكرة المؤقتة لتحسين سرعة الاستعلام.
يمكننا ضبط قيم TTL للذاكرة المؤقتة في named.conf.options
:
dnssec-validation auto;
recursion yes;
cache-size 500m;
cache-file "/var/cache/bind/db.cache";
prefetch 2;
prefetch-key no-edns;
dnssec-accept-expired yes;
max-cache-ttl 600; # 10 دقائق
max-ncache-ttl 90; # 1.5 دقيقة
هذا يمكّن التخزين المؤقت لما يصل إلى 500 ميغابايت من البيانات على القرص ، ويحدد مستوى الاستباق ، وحدود مدة صلاحية الذاكرة المؤقتة ويسمح باستخدام السجلات المنتهية الصلاحية أثناء تحديث بيانات DNSSEC.
يحسن الاستباق عملية الاستعلام للنطاقات الشقيقة عن طريق استعلام السجلات التابعة المطلوبة استباقيًا.
التسجيل والمراقبة
مثل أي خادم آخر ، يجب مراقبة خادم DNS عن كثب. يوفر Bind إمكانيات تسجيل جيدة يمكن إرسالها إلى خادم تسجيل مركزي.
في named.conf.options
:
logging {
channel query_log {
file "/var/log/query.log" versions 3 size 20m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category queries { query_log; };
};
المقاييس الرئيسية التي يجب مراقبتها هي:
- معدلات الاستعلام وأوقات الاستجابة
- استخدام الذاكرة المؤقتة ونسب الإصابة
- أخطاء التحقق من صحة DNSSEC
- فشل التحديثات أو تحويلات المنطقة
- أحداث التقييد المعدل أو انتهاكات الوصول
- أخطاء الشبكة ومهل الانتظار
دمج خادم DNS مع نظام مراقبة يوفر رؤية مهمة حول عمليات وأداء DNS.
الاختبار والتحقق
بمجرد نشر خادم DNS وتهيئته ، يجب علينا اختباره بشكل شامل لاكتشاف أي مشاكل:
- استخدم أدوات البحث مثل
dig
وnslookup
وhost
لاختبار استعلامات سجلات مختلفة - أجر بحوثًا عكسية للتأكد من تعريف سجلات PTR بشكل صحيح
- تحقق من عمل تحويلات المنطقة بأمان للخوادم الثانوية
- اختبر التحديثات الديناميكية عن طريق إضافة/حذف سجلات باستخدام
nsupdate
- تحقق من تكوينات DNS منقسمة الأفق تعيد النتائج الداخلية والخارجية الصحيحة
- تأكد من عمل التحقق من صحة DNSSEC للمناطق الموقعة
- اختبر أداء خادم DNS باستخدام أدوات مثل
dnsperf
وnamebench
- تحقق من السجلات وعمليات المراقبة أثناء الاختبار لاكتشاف أي أخطاء
- امسح بحثًا عن مشاكل الأمان مثل إصدارات البرامج المعرضة للخطر ، قوة التشفير
- أجر اختبار اختراق لتحديد وإصلاح نقاط الضعف
يقلل الاختبار والتحقق الشاملان لخادم DNS من المخاطر ويوفران الثقة في توفر وأداء وأمن ودقة بنية DNS.
ملخص
في هذا الدليل المفصل ، غطينا كيفية تثبيت وتهيئة وإعداد Bind 9 كخادم DNS محلي للشبكات الخاصة.
قمنا بتثبيت حزم Bind ، وتكوين ملفات named.conf
الأساسية ، وإعداد التوجيه الأمامي ، وقوائم التحكم في الوصول ، وخيارات أخرى. أضفنا مناطق البحث الأساسية والعكسية لنطاقات ومضيفي الشبكة الداخلية. كما تم تكوين التحديثات الديناميكية و DNS منقسم الأفق والذاكرة المؤقتة والتسجيل والمراقبة.
يوفر نشر Bind كخادم DNS محلي خدمات تسمية مركزية لبيئتك الخاصة. إنه يوفر مزيدًا من التحكم والتخصيص والخصوصية والأمان والاستقلالية عن بنيتك الأساسية لـ DNS الخاصة مقارنة بالاعتماد فقط على مزودي الخدمة الخارجيين.
بالطبع ، من الضروري توفير أمان صارم ، ومراقبة قوية ، واختبار ، واحتياطي ، وصيانة مناسبة للحفاظ على خدمات DNS الخاصة بك قيد التشغيل بشكل موثوق. ولكن مع تكويناته المرنة ، يمكن لـ Bind تلبية متطلبات DNS المحلية حتى للشبكات الخاصة الكبيرة والنشر المخصص.