Sign inSign up

chrisss404/powerdns

By chrisss404

•Updated 21 minutes ago

PowerDNS dnsdist, recursor, authoritative, and admin interface. Supports DNSCrypt, DoH, and DoT.

Image
4

100K+

chrisss404/powerdns repository overview

⁠Introduction

Get your own secure nameserver up and running within minutes, using this dockerized installation of the PowerDNS nameserver.

Source code of PowerDNS here: https://github.com/PowerDNS/pdns⁠

⁠Private Recursor

Simple example of an ad blocking private recursor that is listening for DNSCrypt and DNS-over-TLS (DoT) queries. Easy setup for any desktop OS using dnscrypt-proxy⁠ and Android 9 has native support for DoT⁠.

Create private-recursor.yml like this:

version: '2.1'

services:

  gateway:
    image: jwilder/nginx-proxy:alpine
    volumes:
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
      - "/etc/nginx/vhost.d"
      - "/usr/share/nginx/html"
      - "/etc/nginx/certs"
    ports:
      - "80:80"

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion:latest
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    volumes_from:
      - gateway

  dnsdist:
    image: chrisss404/powerdns:latest-dnsdist
    environment:
      - VIRTUAL_HOST=dot.example.com
      - VIRTUAL_PORT=9999
      - [email protected]
      - LETSENCRYPT_HOST=dot.example.com
      - DNSDIST_DNSCRYPT=yes
      - DNSDIST_DNS_OVER_TLS=yes
      - DNSDIST_DNS_OVER_TLS_DOMAIN=dot.example.com
    volumes:
      - "./blacklist.txt:/etc/dnsdist/blacklist.txt:ro"
    volumes_from:
      - gateway:ro
    networks:
      - recursor
    ports:
      - "853:853/tcp"
      - "8443:8443/udp"
      - "8443:8443/tcp"

  recursor:
    image: chrisss404/powerdns:latest-recursor
    sysctls:
      - net.ipv6.route.max_size=16384
    networks:
      recursor:
        ipv4_address: 172.31.117.117

networks:
  recursor:
    ipam:
      driver: default
      config:
        - subnet: "172.31.117.0/24"

Create blacklist.txt like this:

googleadservices.com
...

Then you can do the following:

# start secure recursor (restart dnsdist after the let's encrypt certificate is created)
docker-compose -f private-recursor.yml up

# get DNSCrypt provider public key fingerprint
docker-compose -f private-recursor.yml exec dnsdist dnsdist -e 'printDNSCryptProviderFingerprint("/var/lib/dnsdist/providerPublic.key")'

# create DNS stamp using python dnsstamps library or visit https://dnscrypt.info/stamps
dnsstamp.py dnscrypt -s -a 1.2.3.4:8443 -n 2.dnscrypt-cert.example.com -k 2251:468C:FE4C:C39F:9DF3:C2BA:7C95:ED8F:94F6:06BC:7A24:0493:D168:DE9E:7682:E8AD
⁠Connect using DNSCrypt Proxy
  • Install dnscrypt proxy as described here⁠.
  • Configure dnscrypt proxy to use previously created dnsstamp, e.g.: vim /etc/dnscrypt-proxy/dnscrypt-proxy.toml
-server_names = ['cisco', 'cloudflare']
+server_names = ['example']

[static]
+  [static.'example']
+  stamp = 'sdns://AQEAAAAAAAAADDEuMi4zLjQ6ODQ0MyAiUUaM_kzDn53zwrp8le2PlPYGvHokBJPRaN6edoLorRsyLmRuc2NyeXB0LWNlcnQuZXhhbXBsZS5jb20'
⁠Connect using Android
  • Go to Settings > Network & Internet > Advanced > Private DNS > Private DNS provider hostname
  • Enter DoT hostname: dot.example.com

⁠Private Authoritative Server

Simple example of full powerdns stack including private authoritative nameserver and admin interface for editing DNS records.

Create private-authoritative.yml like this:

version: '2.1'

services:

  admin:
    image: chrisss404/powerdns:latest-admin
    depends_on:
      - admin-db
      - authoritative
    environment:
      - ADMIN_PDNS_API_KEY=api-secret-authoritative
      - ADMIN_USER_PASSWORD=very-secret
    networks:
      - admin-db
      - authoritative
    ports:
      - "80:3031"

  admin-db:
    image: postgres:12.1-alpine
    environment:
      - POSTGRES_DB=pda
      - POSTGRES_INITDB_ARGS=--data-checksums
      - POSTGRES_PASSWORD=pda
      - POSTGRES_USER=pda
    networks:
      - admin-db

  authoritative:
    image: chrisss404/powerdns:latest-authoritative
    depends_on:
      - authoritative-db
    environment:
      - AUTHORITATIVE_API=yes
      - AUTHORITATIVE_API_KEY=api-secret-authoritative
      - AUTHORITATIVE_WEBSERVER=yes
      - AUTHORITATIVE_WEBSERVER_PASSWORD=web-secret-authoritative
    networks:
      authoritative:
        ipv4_address: 172.31.118.118
      authoritative-db:
    ports:
      - "8081:8081/tcp"

  authoritative-db:
    image: postgres:12.1-alpine
    environment:
      - POSTGRES_DB=pdns
      - POSTGRES_INITDB_ARGS=--data-checksums
      - POSTGRES_PASSWORD=pdns
      - POSTGRES_USER=pdns
    networks:
      - authoritative-db

  dnsdist:
    image: chrisss404/powerdns:latest-dnsdist
    environment:
      - DNSDIST_API_KEY=api-secret-dnsdist
      - DNSDIST_PLAIN=yes
      - DNSDIST_QUIET=no
      - DNSDIST_WEBSERVER=yes
      - DNSDIST_WEBSERVER_PASSWORD=web-secret-dnsdist
    networks:
      - recursor
    ports:
      - "1053:53/tcp"
      - "1053:53/udp"
      - "8083:8083/tcp"

  recursor:
    image: chrisss404/powerdns:latest-recursor
    environment:
      - RECURSOR_API_KEY=api-secret-recursor
      - RECURSOR_DNSSEC=validate
      - RECURSOR_FORWARD_ZONES=sys=172.31.118.118
      - RECURSOR_QUIET=no
      - RECURSOR_TRUST_ANCHORS=sys=54970 13 1 27efe1c1a790c3cbb43b947d6d6dfac62507097e
      - RECURSOR_WEBSERVER=yes
      - RECURSOR_WEBSERVER_PASSWORD=web-secret-recursor
    sysctls:
      - net.ipv6.route.max_size=16384
    networks:
      recursor:
        ipv4_address: 172.31.117.117
      authoritative:
    ports:
      - "8082:8082/tcp"

networks:
  admin-db:
  authoritative:
    ipam:
      driver: default
      config:
        - subnet: "172.31.118.0/24"
  authoritative-db:
  recursor:
    ipam:
      driver: default
      config:
        - subnet: "172.31.117.0/24"

Then you can do the following:

# start powerdns stack
docker-compose -f private-authoritative.yml up

# send DNS queries
dig -p 1053 example.com

# PowerDNS admin interface
http://localhost:80

# PowerDNS authoritative stats
http://localhost:8081

# PowerDNS recursor stats
http://localhost:8082

# PowerDNS dnsdist stats
http://localhost:8083

⁠Settings

⁠Admin
Env-VariableDescription
ADMIN_DB_HOSTPostgres host (default: admin-db)
ADMIN_DB_NAMEPostgres database (default: pda)
ADMIN_DB_PASSPostgres password (default: pda)
ADMIN_DB_PORTPostgres port (default: 5432)
ADMIN_DB_USERPostgres username (default: pda)
ADMIN_PDNS_API_KEYPowerDNS API key (default: pdns)
ADMIN_PDNS_API_URLPowerDNS API URL (default: http://authoritative:8081/⁠)
ADMIN_PDNS_VERSIONPowerDNS version number (default: 4.2.1)
ADMIN_SIGNUP_ENABLEDAllow users to sign up (default: no)
ADMIN_USER_EMAILEmail address of admin user (default: [email protected]⁠)
ADMIN_USER_FIRSTNAMEFirst name of admin user (default: Administrator)
ADMIN_USER_LASTNAMELast name of admin user (default: User)
ADMIN_USER_PASSWORDPassword of admin user (default: admin)
⁠Authoritative
Env-VariableDescription
AUTHORITATIVE_ALLOW_AXFR_IPSAllow zonetransfers only to these subnets (default: 127.0.0.0/8,::1)
AUTHORITATIVE_ALLOW_NOTIFY_FROMAllow AXFR NOTIFY from these IP ranges (default: 0.0.0.0/0,::/0)
AUTHORITATIVE_APIEnable/disable the REST API (default: no)
AUTHORITATIVE_API_KEYStatic pre-shared authentication key for access to the REST API (default: pdns)
AUTHORITATIVE_API_READONLYDisallow data modification through the REST API when set (default: no)
AUTHORITATIVE_DB_HOSTPostgres host (default: authoritative-db)
AUTHORITATIVE_DB_NAMEPostgres database (default: pdns)
AUTHORITATIVE_DB_PASSPostgres password (default: pdns)
AUTHORITATIVE_DB_PORTPostgres port (default: 5432)
AUTHORITATIVE_DB_USERPostgres username (default: pdns)
AUTHORITATIVE_DEFAULT_KSK_ALGORITHMDefault KSK algorithm (default: ecdsa256)
AUTHORITATIVE_DEFAULT_KSK_SIZEDefault KSK size (default: 0)
AUTHORITATIVE_DEFAULT_PUBLISH_CDNSKEYDefault value for PUBLISH-CDNSKEY (default: )
AUTHORITATIVE_DEFAULT_PUBLISH_CDSDefault value for PUBLISH-CDS (default: )
AUTHORITATIVE_DEFAULT_ZSK_ALGORITHMDefault ZSK algorithm (default: )
AUTHORITATIVE_DEFAULT_ZSK_SIZEDefault ZSK size (default: 0)
AUTHORITATIVE_DIRECT_DNSKEYFetch DNSKEY, CDS and CDNSKEY RRs from backend during DNSKEY or CDS/CDNSKEY synthesis (default: no)
AUTHORITATIVE_DISABLE_AXFRDisable zonetransfers but do allow TCP queries (default: yes)
AUTHORITATIVE_DNAME_PROCESSINGIf we should support DNAME records (default: no)
AUTHORITATIVE_EXPAND_ALIASExpand ALIAS records (default: no)
AUTHORITATIVE_LOG_DNS_DETAILSIf PDNS should log DNS non-erroneous details (default: no)
AUTHORITATIVE_LOG_DNS_QUERIESIf PDNS should log all incoming DNS queries (default: no)
AUTHORITATIVE_LOGLEVELAmount of logging. Higher is more. Do not set below 3 (default: 4)
AUTHORITATIVE_MASTERAct as a master (default: no)
AUTHORITATIVE_MAX_TCP_CONNECTION_DURATIONMaximum time in seconds that a TCP DNS connection is allowed to stay open (default: 0)
AUTHORITATIVE_MAX_TCP_CONNECTIONSMaximum number of TCP connections (default: 20)
AUTHORITATIVE_QUERY_LOGGINGHint backends that queries should be logged (default: no)
AUTHORITATIVE_RECEIVER_THREADSDefault number of receiver threads to start (default: 1)
AUTHORITATIVE_RESOLVERUse this resolver for ALIAS and the internal stub resolver (default: no)
AUTHORITATIVE_RETRIEVAL_THREADSNumber of AXFR-retrieval threads for slave operation (default: 2)
AUTHORITATIVE_REUSEPORTEnable higher performance on compliant kernels by using SO_REUSEPORT allowing each receiver thread to open its own socket (default: no)
AUTHORITATIVE_SLAVEAct as a slave (default: no)
AUTHORITATIVE_SIGNING_THREADSDefault number of signer threads to start (default: 3)
AUTHORITATIVE_TCP_FAST_OPENEnable TCP Fast Open support on the listening sockets (default: 0)
AUTHORITATIVE_WEBSERVERStart a webserver for monitoring on port 8081 (default: no)
AUTHORITATIVE_WEBSERVER_PASSWORDPassword required for accessing the webserver (default: pdns)
⁠Dnsdist
Env-VariableDescription
DNSDIST_API_KEYStatic pre-shared authentication key for access to the REST API (default: pdns)
DNSDIST_DNSCRYPTListen for DNSCrypt queries on port 8443 (default: no)
DNSDIST_DNSCRYPT_PROVIDER_NAMEDNSCrypt provider name (default: 2.dnscrypt-cert.example.com)
DNSDIST_DNS_OVER_HTTPSListen for DNS-over-HTTPS queries on port 443 (default: no)
DNSDIST_DNS_OVER_HTTPS_DOMAINDomain name of DNS server.
DNSDIST_DNS_OVER_HTTPS_PATHThe absolute URI path. (default: /dns-query)
DNSDIST_DNS_OVER_TLSListen for DNS-over-TLS queries on port 853 (default: no)
DNSDIST_DNS_OVER_TLS_DOMAINDomain name of DNS server.
DNSDIST_PLAINListen for plain DNS queries on port 53 (default: no)
DNSDIST_QUIETSuppress logging of questions and answers (default: no)
DNSDIST_WEBSERVERStart a webserver for REST API on port 8083 (default: no)
DNSDIST_WEBSERVER_PASSWORDPassword required for accessing the webserver (default: pdns)
⁠Recursor
Env-VariableDescription
RECURSOR_ALLOW_FROMIf set, only allow these comma separated netmasks to recurse
RECURSOR_API_KEYStatic pre-shared authentication key for access to the REST API (default: pdns)
RECURSOR_API_READONLYDisallow data modification through the REST API when set (default: yes)
RECURSOR_DNSSECDNSSEC mode: off / process-no-validate (default) / process / log-fail / validate
RECURSOR_FORWARD_ZONESZones for which we forward queries, comma separated domain=ip pairs
RECURSOR_FORWARD_ZONES_RECURSEZones for which we forward queries with recursion bit, comma separated domain=ip pairs
RECURSOR_LOGLEVELAmount of logging. Higher is more. Do not set below 3 (default: 3)
RECURSOR_QUIETSuppress logging of questions and answers (default: no)
RECURSOR_TCP_FAST_OPENEnable TCP Fast Open support on the listening sockets, using the supplied numerical value as the queue size
RECURSOR_THREADSLaunch this number of threads
RECURSOR_TRUST_ANCHORSTrust anchors for private zones when using DNSSEC validation, comma separated domain=ds-key pairs
RECURSOR_WEBSERVERStart a webserver for REST API on port 8082 (default: no)
RECURSOR_WEBSERVER_PASSWORDPassword required for accessing the webserver (default: pdns)

Tag summary

Content type

Image

Digest

sha256:b9c25652f…

Size

75.4 MB

Last updated

21 minutes ago

docker pull chrisss404/powerdns:latest-admin