웹사이트 검색

Ubuntu 22.04에 PowerDNS 및 PowerDNS-Admin을 설치하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 20.04(Focal Fossa)

이 페이지에서

  1. 전제 조건
  2. MariaDB 서버 설치 및 구성
  3. PowerDNS 설치
  4. PowerDNS 구성
  5. PowerDNS 관리자 설치
    1. 필수 종속성 설치\n

    1. 데이터베이스 연결 구성
    2. PowerDNS 관리 API 활성화\n

    PowerDNS는 C++로 작성된 무료 오픈 소스 권한 이름 서버입니다. 크로스 플랫폼이며 Unix, Linux 및 macOS 운영 체제에서 실행할 수 있습니다. 영역 파일 및 레코드를 저장하기 위해 MySQL, MariaDB, PostgreSQL 및 Oracle과 같은 여러 데이터베이스를 지원합니다.

    PowerDNS Admin은 웹 브라우저를 통해 PowerDNS를 관리하는 데 사용할 수 있는 웹 기반 애플리케이션입니다. PowerDNS 웹 인터페이스를 사용하여 DNS 영역을 만들고 관리할 수 있습니다. IPv4 및 IPv6 지원, 대량 도메인, DNSSec 지원, AD, LDAP, SAML 인증 등 매우 유용한 기능을 제공합니다.

    이 게시물에서는 Ubuntu 22.04 서버에 PowerDNS 및 PowerDNS admin을 설치하는 방법에 대해 설명합니다.

    전제 조건

    • Ubuntu 22.04를 실행하는 서버.\n
    • 서버 IP를 가리키는 유효한 도메인 이름입니다.\n
    • 루트 암호는 서버에서 구성됩니다.\n

    MariaDB 서버 설치 및 구성

    먼저 시스템에 MariaDB 데이터베이스 서버를 설치해야 합니다.

    apt-get install mariadb-server -y

    MariaDB가 설치되면 PowerDNS용 데이터베이스와 사용자를 생성해야 합니다.

    먼저 다음 명령을 사용하여 MariaDB에 로그인합니다.

    mysql

    로그인 후 다음 명령을 사용하여 데이터베이스와 사용자를 생성합니다.

    MariaDB [(none)]> create database pdns;
    MariaDB [(none)]> grant all on pdns.* to identified by 'password';

    그런 다음 권한을 플러시하고 다음 명령을 사용하여 MariaDB 셸을 종료합니다.

    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 구성

    먼저 다음 명령을 사용하여 PowerDNS 데이터베이스 스키마를 PowerDNS 데이터베이스로 가져옵니다.

    mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

    다음으로 PowerDNS 구성 파일을 만들고 PowerDNS 데이터베이스 연결 세부 정보를 정의해야 합니다.

    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
    chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

    그런 다음 PowerDNS 서버를 중지하고 다음 명령을 사용하여 PowerDNS를 테스트합니다.

    systemctl stop pdns
    pdns_server --daemon=no --guardian=no --loglevel=9

    모든 것이 정상이면 다음과 같은 결과가 표시됩니다.

    Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
    Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
    Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
    Aug 06 10:43:47 Done launching threads, ready to distribute questions
    

    그런 다음 다음 명령을 사용하여 PowerDNS 서버를 시작합니다.

    systemctl start pdns

    이제 다음 명령을 사용하여 PowerDNS의 상태를 확인할 수 있습니다.

    systemctl status pdns

    다음 출력이 표시되어야 합니다.

    ? pdns.service - PowerDNS Authoritative Server
         Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2022-08-06 10:37:28 UTC; 8s ago
           Docs: man:pdns_server(1)
                 man:pdns_control(1)
                 https://doc.powerdns.com
       Main PID: 93982 (pdns_server)
          Tasks: 8 (limit: 2242)
         Memory: 43.1M
            CPU: 166ms
         CGroup: /system.slice/pdns.service
                 ??93982 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no
    
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: UDP server bound to [::]:53
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to 0.0.0.0:53
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to [::]:53
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS Authoritative Server 4.5.3 (C) 2001-2021 PowerDNS.COM BV
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: Using 64-bits mode. Built using gcc 11.2.0.
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redi>
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: Creating backend connection for TCP
    Aug 06 10:37:28 ubuntu2204 systemd[1]: Started PowerDNS Authoritative Server.
    Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: About to create 3 backend threads for UDP
    Aug 06 10:37:29 ubuntu2204 pdns_server[93982]: Done launching threads, ready to distribute questions

    이 시점에서 PowerDNS가 시작되고 포트 53에서 수신 대기합니다. 다음 명령으로 확인할 수 있습니다.

    ss -alnp4 | grep pdns

    다음 출력이 표시되어야 합니다.

    udp   UNCONN 0      0             0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=5))
    tcp   LISTEN 0      128           0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=7))

    PowerDNS 관리자 설치

    이 섹션에서는 Nginx로 PowerDNS 관리자를 설치하는 방법을 보여줍니다.

    필수 종속성 설치

    먼저 다음 명령을 사용하여 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_16.x | bash -

    다음으로 다음 명령을 사용하여 Node.js를 설치합니다.

    apt-get install nodejs -y

    그런 다음 다음 명령을 사용하여 원사 리포지토리를 추가합니다.

    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 관리자 다운로드

    그런 다음 Git 리포지토리에서 Nginx 루트 디렉터리로 최신 버전의 PowerDNS 관리자를 다운로드합니다.

    git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns

    다음으로 디렉토리를 다운로드한 디렉토리로 변경하고 다음 명령을 사용하여 Python 가상 환경을 만듭니다.

    cd /var/www/html/pdns/
    virtualenv -p python3 flask

    다음으로 가상 환경을 활성화하고 다음 명령을 사용하여 모든 Python 종속성을 설치합니다.

    source ./flask/bin/activate
    pip install -r requirements.txt

    그런 다음 다음 명령을 사용하여 가상 환경을 비활성화합니다.

    deactivate

    데이터베이스 연결 구성

    다음으로 default_config.py 파일에 대한 PowerDNS 데이터베이스 연결 세부 정보를 정의해야 합니다.

    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로 변경하고 가상 환경을 활성화합니다.

    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

    그런 다음 다음 명령을 사용하여 가상 환경을 비활성화합니다.

    deactivate

    PowerDNS 관리 API 활성화

    PowerDNS 관리자는 JSON API를 사용하여 통계를 읽고 영역 콘텐츠, 메타데이터 및 DNSSEC 키 자료를 수정합니다. pdns.conf 파일을 편집하여 활성화할 수 있습니다.

    nano /etc/powerdns/pdns.conf

    다음 줄을 변경합니다.

    api=yes
    api-key=yoursecretekey
    

    파일을 저장하고 닫은 다음 PowerDNS 서비스를 다시 시작하여 변경 사항을 적용합니다.

    systemctl restart pdns

    Nginx를 PowerDNS 관리자용 역방향 프록시로 구성

    다음으로 Nginx를 PowerDNS 관리자를 위한 역방향 프록시로 구성해야 합니다. 이렇게 하려면 다음 명령을 사용하여 Nginx 가상 호스트 구성 파일을 만듭니다.

    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

    PowerDNS 관리를 위한 Systemd 서비스 파일 생성

    다음으로 PowerDNS 서비스를 관리하기 위해 systemd 서비스 파일을 생성해야 합니다.

    먼저 다음 명령을 사용하여 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 데몬을 다시 로드합니다.

    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 Sat 2022-08-06 10:52:44 UTC; 9s ago
    TriggeredBy: ? pdnsadmin.socket
       Main PID: 98696 (gunicorn)
          Tasks: 2 (limit: 2242)
         Memory: 63.1M
            CPU: 913ms
         CGroup: /system.slice/pdnsadmin.service
                 ??98696 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>
                 ??98697 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>
    
    Aug 06 10:52:44 ubuntu2204 systemd[1]: Started PowerDNS-Admin.
    Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Starting gunicorn 20.0.4
    Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Listening at: unix:/run/pdnsadmin/socket (98696)
    Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Using worker: sync
    Aug 06 10:52:44 ubuntu2204 gunicorn[98697]: [2022-08-06 10:52:44 +0000] [98697] [INFO] Booting worker with pid: 98697
    
    ? pdnsadmin.socket - PowerDNS-Admin socket
         Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2022-08-06 10:52:44 UTC; 9s ago
       Triggers: ? pdnsadmin.service
         Listen: /run/pdnsadmin/socket (Stream)
         CGroup: /system.slice/pdnsadmin.socket
    
    Aug 06 10:52:44 ubuntu2204 systemd[1]: Listening on PowerDNS-Admin socket.
    
    

    PowerDNS 관리자 액세스

    이제 웹 브라우저를 열고 URL http://pdnsadmin.example.com을 사용하여 PowerDNS 관리 웹 인터페이스에 액세스할 수 있습니다. 다음 페이지로 리디렉션됩니다.

    계정 만들기 버튼을 클릭합니다. 다음 화면이 표시됩니다.

    관리자 사용자 세부 정보를 제공하고 등록 버튼을 클릭하여 계정을 만듭니다. 다음 화면에 PowerDNS 관리 웹 인터페이스가 표시되어야 합니다.

    PowerDNS에 연결하고 관리하기 위한 PowerDNS API URL을 제공합니다. 그런 다음 업데이트 버튼을 클릭하여 변경 사항을 저장하십시오. 다음 페이지가 표시됩니다.

    대시보드 버튼을 클릭합니다. 다음 화면에 PowerDNS 관리 대시보드가 표시되어야 합니다.

    결론

    축하합니다! Ubuntu 22.04 서버에서 Nginx와 함께 PowerDNS 및 PowerDNS 관리자를 성공적으로 설치 및 구성했습니다. 이제 PowerDNS 관리 웹 인터페이스를 통해 영역을 생성하고 레코드를 추가한 다음 테스트할 수 있습니다. 궁금한 점이 있으면 언제든지 문의해 주세요.