قمت بتجهيز سيرفرين يقومون بالعمل كـDNS، أحدهما أساسي Master، والآخر ثانوي Slave (سيد وخادم إن ترجمناهما حرفيًا). السيرفرين يستخدمان bind لتشغيل خدمة الدي إن اس. لاحظت ظهور رسالة الخطأ التالية في سجلات السيرفر الثانوي:
Error: dumping master file: tmp-g5x9Gx6CFq: open: permission denied
ولنفهم الخطأ سأتحدث قليلًا عن كيفية عمل الـDNS:
توجد في السيرفر الاساسي Master ملفات للنطاقات Zone Files يتم فيها تعريف جميع الأجهزة أو السيرفرات التابعة للنطاق، ولها صيغة معينة تتبعها. وعند القيام على سبيل المثال بطلب موقع mail.google.com، يذهب خادم الدي إن اس الأساسي لقوقل بالذهاب لملف النطاق Zone File الخاص بدومين google.com، ومن ثم البحث عن تعريف mail وتحويل المستخدم إلى الآي بي الخاص بهذه الخدمة، مثلما ترى في الصورة الخاصة بالتدوينة.
السيرفرات الثانوية تعمل بطريقة مشابهة، ولكنها في الأساس لا تحتوي على ملفات Zone Files الخاصة بالنطاقات، فتقوم بإجراء نقل لملفات النطاقات Zone Transfer من السيرفر الأساسي وتخزينها لديها لكي تقوم بتنفيذ طلبات المستخدمين. وهنا بالضبط – أثناء تخزين ملفات النطاقات – يحدث الخطأ المذكور في بداية التدوينة.
الحلول المقترحة للمشكلة:
الحل الأول: SELinux
SELinux بحد ذاتها هي أداة ممتازة لزيادة الأمان في أنظمة لينكس، ولكنها تتطلب الكثير من الوقت والخبرة من أجل إعدادها بشكل صحيح مع الخدمات الموجودة على النظام. يلجأ الكثير من مدراء الأنظمة إلى إيقاف SELinux قبل البدء في العمل على السيرفرات وذلك لتجنب ظهور المشاكل الخاصة بها.
عمومًا: إن كنت ممن يستخدمون SELinux في البيئة الخاصة بك، فتستطيع حل مشكلة كتابة ملفات النطاقات بتنفيذ الأمر التالي في التيرمينال:
# setsebool -P named_write_master_zones 1
أما إن لم تستخدم SELinux، فقم بإضافة هذا السطر في ملف etc/sysconfig/named/:
ENABLE_ZONE_WRITE=yes
قم بعدها بإعادة تشغيل الخدمة عبر الأمر:
# service named restart
تذكير: إذا قمت بإيقاف SELinux بتحويل وضعه من Enforcing إلى Disabled، فلا تنسى إعادة تشغيل النظام. وقم بالتأكد من وضع SELinux باستخدام الأمر التالي بدلًا من ملف الإعدادات:
# getenforce
الحل الثاني: صلاحيات الكتابة
أحد مسببات ظهور المشكلة هم عدم إمكانية مستخدم named الخاص بالدي إن اس (bind) من الكتابة في المجلد الخاص بملفات النطاقات الذي قمت بتحديده مسبقًا.
قم بالتأكد أولًا من إعدادات bind ومعرفة أين ستكتب الملفات، وملف الاعدادات هو etc/named.conf/:
options {
directory "/var/named";
};
حسنًا، قم بتنفيذ الأمر التالي لمشاهدة صلاحيات الكتابة في المجلد:
# ls -l /var/
على الأغلب أن النتيجة ستكون مقاربة للتالي:
drwxr-x--- 1 root named 5 Sep 5 08:33 named
ستلاحظ أن المجموعة named لا تمتلك صلاحيات الكتابة داخل المجلد، قم بتنفيذ الأمر التالي:
# chmod g+w /var/named
قم بعدها بإعادة تشغيل الخدمة عبر الأمر:
# service named restart
ختامًا، قرأت في بعض المواقع أن بعض المستخدمين احتاجوا لتغيير ملكية المستخدم من الروت إلى named لحل المشكلة عبر الأمر التالي:
# chown named:named /var/named/
إن واجهتك المشكلة واستطعت أن تحلها بطريقة أخرى، أرجو أن تخبرني كي أضيفها للقائمة.