DNS là gì? DNS Server là gì? #
DNS là viết tắt của cụm từ Domain Name System, mang ý nghĩa đầy đủ là hệ thống phân giải tên miền. Hiểu một cách ngắn gọn nhất, DNS cơ bản là một hệ thống chuyển đổi các tên miền website mà chúng ta đang sử dụng, ở dạng www.tel4vn.edu.vn sang một địa chỉ IP dạng số tương ứng với tên miền đó và ngược lại.
DNS Server là Server vận hành các công cụ hỗ trợ phân giải tên miền. DNS Server sẽ lập một cuốn danh bạ (hay bản đồ) cho một địa chỉ IP và gán nó cho tên miền tương ứng với mục đích tiện cho việc tìm kiếm trong hệ thống mạng. DNS Server sẽ tìm tên miền trong cuốn danh bạ đó để xem là địa chỉ IP nào tương ứng khi người dùng truy cập vào tên miền. Từ đây sẽ đưa bạn đến với thiết bị có IP đó.
Giới thiệu PowerDNS và PowerDNS Admin #
PowerDNS là một công cụ mã nguồn mở giúp bạn xây dựng một DNS Server. Ngoài ra, PowerDNS Admin là công cụ giúp quản lý PowerDNS thông qua trình duyệt web. Do đó, bạn có thể dễ dàng tạo và quản lý các DNS Record mà không cần thao tác câu lệnh. Trong bài viết hôm nay, mình sẽ hướng dẫn bạn cách cài PowerDNS và PowerDNS Admin trên Ubuntu 20.04.
Chuẩn bị môi trường #
- Server chạy Ubuntu 20.04
- Một domain trỏ tới địa chỉ IP của Server
- Người dùng root
Cài đặt và cấu hình MariaDB Server #
Trước tiên, bạn cần cài đặt MariaDB Server cho PowerDNS. Để cài đặt, thực hiện import repository như bên dưới:
apt-get install software-properties-common gnupg2 -y |
Thêm Maria signing key:
apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc' |
Sau đó cài đặt MariaDB Server:
apt-get install mariadb-server -y |
Sau khi cài đặt xong, bạn hãy mở MySQL lên:
mysql |
Thực hiện các câu lệnh SQL sau để tạo database và gán cho user mới:
MariaDB [(none)]> create database pdns; MariaDB [(none)]> grant all on pdns.* to pdnsadmin@localhost identified by 'password'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> exit; |
Cài đặt PowerDNS #
Trước hết, cần tắt dịch vụ phân dải tên miền mặc định của hệ thống:
systemctl disable --now systemd-resolved |
Sau đó xoá file resolv.conf và tạo mới:
rm -rf /etc/resolv.conf echo "nameserver 8.8.8.8" > /etc/resolv.conf |
Cuối cùng là cài đặt PowerDNS:
apt-get install pdns-server pdns-backend-mysql -y |
Cấu hình PowerDNS #
Đầu tiên, bạn cần phải import database schema vào database:
mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql |
Tiếp theo là điền thông tin kết nối tới database vào file cấu hình:
vi /etc/powerdns/pdns.d/pdns.local.gmysql.conf |
Thay đổi theo cấu hình sau:
# 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= |
Lưu lại thay đổi và thực hiện chỉnh quyền của file như bên dưới:
chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf |
Tiếp theo cần tạm dừng dịch vụ và kiểm tra:
systemctl stop pdns pdns_server --daemon=no --guardian=no --loglevel=9 |
Nếu thông tin cấu hình kết nối database của bạn đúng thì sẽ có thông báo như bên dưới:
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 |
Bật lại dịch vụ:
systemctl start pdns |
Lúc này, PowerDNS sẽ lắng nghe trên port 53. Bạn có thể kiểm tra với câu lệnh dưới:
ss -alnp4 | grep pdns |
Thì màn hình sẽ hiện ra tương tự như sau:
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)) |
Cài đặt PowerDNS Admin #
Để cài đặt PowerAdmin, trước hết bạn cần cài đặt các gói cần thiết:
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 |
Tiếp tục thực hiện thêm Node.js repository như bên dưới:
curl -sL https://deb.nodesource.com/setup_14.x | bash - |
Sau đó cài đặt Node.js:
apt-get install nodejs -y |
Tiếp theo thêm Yarn repository:
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 |
Sau đó cài đặt Yarn:
apt-get update -y apt-get install yarn -y |
Như vậy các gói cần thiết đã được cài đặt xong, tiếp theo bạn cần tải xuống từ git:
git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns |
Sau đó thực hiện cài đặt như sau:
cd /var/www/html/pdns/ virtualenv -p python3 flask source ./flask/bin/activate pip install -r requirements.txt deactivate |
Sau bước trên, bạn cấu hình kết nối tới database như sau:
vi /var/www/html/pdns/powerdnsadmin/default_config.py |
Thay đổi theo cấu hình bên dưới:
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 |
Lưu lại thay đổi và thực hiện tiếp như sau:
cd /var/www/html/pdns/ source ./flask/bin/activate |
Tiếp tục cập nhật dữ liệu vào database:
export FLASK_APP=powerdnsadmin/__init__.py flask db upgrade yarn install --pure-lockfile flask assets build |
Sau khi cập nhật xong thì deactive môi trường ảo của Python:
deactivate |
Tiếp tục bạn cần kích hoạt API:
vi /etc/powerdns/pdns.conf |
Thay đổi cấu hình như sau:
api=yes api-key=yoursecretekey |
Lưu lại thay đổi và khởi động lại dịch vụ:
systemctl restart pdns |
Cấu hình Nginx cho PowerDNS Admin #
Tạo mới một file cấu hình cho PowerDNS Admin như sau:
vi /etc/nginx/conf.d/pdns-admin.conf |
Thêm đoạn cấu hình:
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; } } |
Lưu lại thay đổi rồi kiểm tra cú pháp của Nginx với:
nginx -t |
Sau khi chắc chắn file cấu hình đã đúng, thực hiện thay đổi quyền của file:
chown -R www-data:www-data /var/www/html/pdns |
Cuối cùng là khởi động lại Nginx:
systemctl restart nginx |
Tạo dịch vụ cho PowerDNS Admin #
Để có thể bật PowerDNS Admin mỗi khi hệ thống khởi động, bạn cần tạo file dịch vụ với Systemd như sau:
vi /etc/systemd/system/pdnsadmin.service |
Thêm đoạn cấu hình sau:
[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 |
Lưu lại file và tiếp tục tạo file socket:
vi /etc/systemd/system/pdnsadmin.socket |
Với đoạn cấu hình sau:
[Unit] Description=PowerDNS-Admin socket [Socket] ListenStream=/run/pdnsadmin/socket [Install] WantedBy=sockets.target |
Lưu lại thay đổi của file và tạo các file và thư mục cần thiết như sau:
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/ |
Làm mới systemd để lấy dach sách các dịch vụ:
systemctl daemon-reload |
Kích hoạt dịch vụ vừa tạo:
systemctl enable --now pdnsadmin.service pdnsadmin.socket |
Từ đó bạn có thể kiểm tra trạng thái với systemd:
systemctl status pdnsadmin.service pdnsadmin.socket |
Nếu dịch vụ đã chạy, bạn sẽ có thông báo màn hình như sau:
? 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. |
Cuối cùng, bạn có thể truy cập với đường dẫn là domain đã trỏ tới địa chỉ IP từ đầu:
Kết luận #
Thông qua bài viết này, bạn đã có thể cài đặt PowerDNS và PowerDNS Admin trên Ubuntu 20.04. Nếu có bất kì lỗi nào trong quá trình cài đặt, bạn hãy bình luận bên dưới để mình hỗ trợ nhé.
Nguồn bài viết: https://www.howtoforge.com