PowerDNS
هو خادم مجاني ومفتوح المصدر (open-source).
يعمل على أنظمة تشغيل Unix و Linux و macOS.
يستخدم MySQL و MariaDB و PostgreSQL و Oracle لتخزين ملفات وسجلات الـ zone.
PowerDNS Admin
هي أداة قائمة على الويب تستخدم لإدارة PowerDNS.
يمكنك إنشاء وإدارة DNS zones باستخدام متصفح الويب.
يأتي مع مجموعة غنية من الميزات:
يدعم IPv4 و IPv6.
صفحة الحالة (Status page) تعرض معلومات مفيدة.
إنشاء / تحديث تلقائي لسجلات PTR.
يدعم إنشاء bulk domain.
يدعم domain templates.
يدعم DNSSec.
يدعم DB و SAML و LDAP ومصادقة Active Directory.
في هذا البرنامج التعليمي ، سنشرح هنا تثبيت PowerDNS admin و PowerDNS على خادم Ubuntu 20.04.
المتطلبات الأساسية
خادم يعمل بنظام التشغيل Ubuntu 20.04.
اسم مجال (domain name) صالح يشير إلى عنوان IP الخاص بالخادم.
إعداد كلمة مرور الـ root للخادم.
تثبيت وإعداد MariaDB Server
سنحتاج إلى تثبيت خادم قاعدة بيانات MariaDB.
بشكل افتراضي لا يتوفر أحدث إصدار من MariaDB في مستودع Ubuntu 20.04 الافتراضي..
قم بتثبيت الحزم المطلوبة بالأمر التالي:
apt-get install software-properties-common gnupg2 -y
أضف MariaDB signing key باستخدام الأمر التالي:
apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
أضف مستودع MariaDB باستخدام الأمر التالي:
add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirrors.ukfast.co.uk/sites/mariadb/repo/10.5/ubuntu focal main'
قم بتثبيت خادم MariaDB عن طريق تشغيل الأمر التالي:
apt-get install mariadb-server -y
سنحتاج إلى إنشاء قاعدة بيانات ومستخدم لـ PowerDNS.
قم بتسجيل الدخول إلى MariaDB باستخدام الأمر التالي:
mysql
قم بإنشاء قاعدة بيانات ومستخدم:
MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to pdnsadmin@localhost identified by 'password';
امسح الامتيازات واخرج من MariaDB shell باستخدام الأمر التالي:
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;
تثبيت PowerDNS
قم بتعطيل systemd-resolved من نظامك:
systemctl disable --now systemd-resolved
قم بإزالة ملف resolv.conf الافتراضي وإنشاء ملف جديد:
rm -rf /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf
قم بتثبيت خادم PowerDNS باستخدام الأمر التالي:
apt-get install pdns-server pdns-backend-mysql -y
إعداد PowerDNS
أولاً ، ستحتاج إلى استيراد PowerDNS database schema إلى قاعدة بيانات PowerDNS.
يمكنك استيراده بالأمر التالي:
mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
سنحتاج إلى تعريف تفاصيل PowerDNS database connection.
يمكنك القيام بذلك عن طريق تعديل الملف pdns.local.gmysql.conf:
nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf
قم بتغيير الأسطر التالية:
# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql
# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdnsadmin
gmysql-password=password
gmysql-dnssec=yes
# gmysql-socket=
احفظ وأغلق الملف ثم امنح الإذن المناسب للملف pdns.local.gmysql.conf:
chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
أوقف خادم PowerDNS وتحقق من PowerDNS باستخدام الأمر التالي:
systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9
ستحصل على النتيجة التالية:
Nov 02 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Nov 02 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Nov 02 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Nov 02 10:43:47 Done launching threads, ready to distribute questions
ابدأ خادم PowerDNS بالأمر التالي:
systemctl start pdns
تم بدء تشغيل PowerDNS والاستماع على المنفذ 53.
يمكنك التحقق من ذلك باستخدام الأمر التالي:
ss -alnp4 | grep pdns
ستحصل على النتيجة التالية:
udp UNCONN 0 0 0.0.0.0:53 0.0.0.0:* users:(("pdns_server",pid=33140,fd=5))
tcp LISTEN 0 128 0.0.0.0:53 0.0.0.0:* users:(("pdns_server",pid=33140,fd=7))
تثبيت PowerDNS Admin
تثبيت التبعيات المطلوبة
قم بتثبيت جميع التبعيات المطلوبة لمسؤول PowerDNS باستخدام الأمر التالي:
apt-get install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask -y
أضف مستودع Node.js باستخدام الأمر التالي:
curl -sL https://deb.nodesource.com/setup_14.x | bash -
قم بتثبيت Node.js باستخدام الأمر التالي:
apt-get install nodejs -y
بعد ذلك ، أضف مستودع yarn بالأمر التالي:
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
قم بتحديث المستودع وتثبيت Yarn باستخدام الأمر التالي:
apt-get update -y
apt-get install yarn -y
تحميل PowerDNS Admin
قم بتنزيل أحدث إصدار من PowerDNS admin من مستودع Git إلى مجلد Nginx root:
git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns
قم بتغيير المجلد إلى المجلد الذي تم تنزيله وإنشاء Python virtual environment باستخدام الأمر التالي:
cd /var/www/html/pdns/
virtualenv -p python3 flask
قم بتنشيط virtual environment وقم بتثبيت جميع تبعيات Python باستخدام الأمر التالي:
source ./flask/bin/activate
pip install -r requirements.txt
قم بإلغاء التنشيط من Virtual environment باستخدام الأمر التالي:
deactivate
تحديد Database Connection
ستحتاج إلى تحديد Database Connection الـ PowerDNS إلى ملف default_config.py:
nano /var/www/html/pdns/powerdnsadmin/default_config.py
قم بتغيير الأسطر التالية:
SALT = 'yoursecretekey'
SECRET_KEY = 'yoursecretekey'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
HSTS_ENABLED = False
OFFLINE_MODE = False
SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'password'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True
احفظ وأغلق الملف.
قم بتغيير المجلد إلى pdns وقم بتنشيط virtual environment:
cd /var/www/html/pdns/
source ./flask/bin/activate
قم بتحديث قاعدة البيانات بالأمر التالي:
export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
yarn install --pure-lockfile
flask assets build
قم بإلغاء تنشيط virtual environment باستخدام الأمر التالي:
deactivate
تمكين PowerDNS Admin API
يستخدم PowerDNS admin واجهة برمجة تطبيقات JSON.
يمكنك تفعيله عن طريق تعديل الملف pdns.conf:
nano /etc/powerdns/pdns.conf
قم بتغيير الأسطر التالية:
api=yes
api-key=yoursecretekey
احفظ وأغلق الملف.
أعد تشغيل خدمة PowerDNS لتطبيق التغييرات:
systemctl restart pdns
إعداد Nginx لـ PowerDNS Admin
بعد ذلك ، سنحتاج إلى إعداد Nginx لـ PowerDNS admin.
أنشئ ملف Nginx virtual host باستخدام الأمر التالي:
nano /etc/nginx/conf.d/pdns-admin.conf
أضف الأسطر التالية:
server {
listen *:80;
server_name pdnsadmin.example.com;
index index.html index.htm index.php;
root /var/www/html/pdns;
access_log /var/log/nginx/pdnsadmin_access.log combined;
error_log /var/log/nginx/pdnsadmin_error.log;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_redirect off;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
proxy_buffer_size 8k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_headers_hash_bucket_size 64;
location ~ ^/static/ {
include /etc/nginx/mime.types;
root /var/www/html/pdns/powerdnsadmin;
location ~* \.(jpg|jpeg|png|gif)$ {
expires 365d;
}
location ~* ^.+.(css|js)$ {
expires 7d;
}
}
location / {
proxy_pass http://unix:/run/pdnsadmin/socket;
proxy_read_timeout 120;
proxy_connect_timeout 120;
proxy_redirect off;
}
}
احفظ الملف وأغلقه.
افحص Nginx بحثًا عن أي خطأ باستخدام الأمر التالي:
nginx -t
ستحصل على النتيجة التالية:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
قم بتغيير ملكية pdns إلى www-data:
chown -R www-data:www-data /var/www/html/pdns
أعد تشغيل خدمة Nginx لتطبيق التغييرات:
systemctl restart nginx
إنشاء ملف خدمة Systemd لـ PowerDNS Admin
سنحتاج إلى إنشاء ملف خدمة systemd لإدارة خدمة PowerDNS.
قم بإنشاء ملف خدمة pdns باستخدام الأمر التالي:
nano /etc/systemd/system/pdnsadmin.service
أضف الأسطر التالية:
[Unit]
Description=PowerDNS-Admin
Requires=pdnsadmin.socket
After=network.target
[Service]
PIDFile=/run/pdnsadmin/pid
User=pdns
Group=pdns
WorkingDirectory=/var/www/html/pdns
ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
أنشئ ملف pdnsadmin sockt بالأمر التالي:
nano /etc/systemd/system/pdnsadmin.socket
أضف الأسطر التالية:
[Unit]
Description=PowerDNS-Admin socket
[Socket]
ListenStream=/run/pdnsadmin/socket
[Install]
WantedBy=sockets.target
احفظ وأغلق الملف.
أنشئ الملفات والمجلدات المطلوبة بالأمر التالي:
echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
mkdir /run/pdnsadmin/
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/
أعد تحميل systemd daemon بالأمر التالي:
systemctl daemon-reload
قم بتمكين خدمة pdnsadmin للبدء عند إعادة تشغيل النظام باستخدام الأمر التالي:
systemctl enable --now pdnsadmin.service pdnsadmin.socket
تحقق من حالة كلتا الخدمتين باستخدام الأمر التالي:
systemctl status pdnsadmin.service pdnsadmin.socket
ستحصل على النتيجة التالية:
? pdnsadmin.service - PowerDNS-Admin
Loaded: loaded (/etc/systemd/system/pdnsadmin.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-11-02 10:54:19 UTC; 5s ago
TriggeredBy: ? pdnsadmin.socket
Main PID: 38881 (gunicorn)
Tasks: 2 (limit: 2353)
Memory: 62.5M
CGroup: /system.slice/pdnsadmin.service
??38881 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>
??38898 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>
Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Started PowerDNS-Admin.
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Starting gunicorn 20.0.4
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Listening at: unix:/run/pdnsadmin/socket (38881)
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Using worker: sync
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38898]: [2020-11-02 10:54:19 +0000] [38898] [INFO] Booting worker with pid: 38898
? pdnsadmin.socket - PowerDNS-Admin socket
Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-11-02 10:54:19 UTC; 5s ago
Triggers: ? pdnsadmin.service
Listen: /run/pdnsadmin/socket (Stream)
CGroup: /system.slice/pdnsadmin.socket
Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Listening on PowerDNS-Admin socket.
الوصول إلى واجهة PowerDNS Admin Web UI
افتح متصفح الويب الخاص بك وقم بالوصول إلى واجهة ويب PowerDNS admin باستخدام العنوان http://pdnsadmin.example.com.
ستتم إعادة توجيهك إلى الصفحة التالية:
انقر فوقCreate an account.
سترى الشاشة التالية:
قدم تفاصيل المستخدم المسؤول (admin) الخاص بك وانقر على Register لإنشاء حساب.
ستشاهد صفحة تسجيل دخول PowerDNS admin في الشاشة التالية:
أدخل اسم مستخدم المسؤول (admin) وكلمة المرور وانقر على Sign.
قم بإدخال عنوان URL الخاص بواجهة PowerDNS API للاتصال بـ PowerDNS وإدارته.
انقر على Dashboard.