Architecture and Ports¶
What Poweradmin connects to, and over which ports. Useful when writing firewall rules, planning a split deployment, or answering a security review.
Poweradmin is a PHP web application. It has no daemon or background worker of its own - everything happens inside a request from a browser or an API client, so there are no outbound connections except the ones listed here.
Components¶
| Component | What it is |
|---|---|
| Browser / API client | Talks to Poweradmin over HTTP |
| Poweradmin | The PHP application, served by Apache, nginx + php-fpm, Caddy, or the bundled FrankenPHP container |
| Poweradmin database | Users, permissions, templates, logs. May be the same database as PowerDNS or a separate one |
| PowerDNS database | Zones and records, in PowerDNS's own schema |
| PowerDNS Authoritative Server | Answers DNS queries; optionally exposes its HTTP API |
Connections¶
| From | To | Port | Protocol | Notes |
|---|---|---|---|---|
| Browser / API client | Poweradmin | 80 / 443 | HTTP(S) | Whatever your web server listens on. Put TLS in front of it - see Reverse Proxy |
| Poweradmin | Poweradmin database | 3306 (MySQL/MariaDB), 5432 (PostgreSQL) | TCP | SQLite instead uses a local file, so there is no network hop |
| Poweradmin | PowerDNS database | same as above | TCP | Only when dns.backend = 'sql' |
| Poweradmin | PowerDNS API | 8081 | HTTP | Only when the API is configured. Authenticated with an X-API-Key header |
| PowerDNS | PowerDNS database | same as above | TCP | PowerDNS's own connection; nothing to do with Poweradmin |
| Resolvers / secondaries | PowerDNS | 53 | UDP + TCP | Normal DNS traffic |
Ports are the defaults. database.port is empty by default, in which case Poweradmin uses 3306 for
MySQL/MariaDB and 5432 for PostgreSQL. PowerDNS's API port comes from its own webserver-port
setting, which defaults to 8081.
The two data paths¶
dns.backend decides how Poweradmin reads and writes zone data, and it changes which connections
exist. This is the single most important thing to know before drawing firewall rules.
SQL backend (dns.backend = 'sql', the default)¶
Poweradmin writes zones and records straight into the PowerDNS database.
Browser ──443──▶ Poweradmin ──3306/5432──▶ PowerDNS database ◀──3306/5432── PowerDNS ──53──▶ Resolvers
│
└──8081──▶ PowerDNS API (optional: DNSSEC, server status)
The API connection is optional here but not merely cosmetic: DNSSEC operations go through it
exclusively, and without pdns_api.url and pdns_api.key every DNSSEC action silently does
nothing. See DNSSEC Configuration.
API backend (dns.backend = 'api')¶
Poweradmin does not touch the PowerDNS database at all. Zone and record operations become API calls, and its own database holds only users, permissions, templates and logs.
Browser ──443──▶ Poweradmin ──8081──▶ PowerDNS ──53──▶ Resolvers
│ │
│ └──3306/5432──▶ PowerDNS database
└──3306/5432──▶ Poweradmin database
This mode was added in 4.3.0 and is still marked experimental. It is the right choice when Poweradmin has no network route to the PowerDNS database - see Remote Setup and PowerDNS API.
Hardening notes¶
- The PowerDNS API is unauthenticated apart from the API key, and the key grants full control of
every zone. Bind
webserver-addressto an address Poweradmin can reach and no one else can, and restrictwebserver-allow-fromto Poweradmin's address. See Enabling the API. - Port 8081 should never be reachable from the internet. It is a plain HTTP endpoint; if Poweradmin and PowerDNS are on different hosts, put the connection on a private network or tunnel it.
- The database ports do not need to be public either. A single-host install can bind both the
database and the PowerDNS API to
127.0.0.1and expose only 80/443 and 53. - If Poweradmin sits behind a proxy, configure
security.trusted_proxiesso client addresses in the logs and in rate limiting are the real ones - see Reverse Proxy.
Related Documentation¶
- Installation Overview
- Remote Setup - Poweradmin and PowerDNS on separate hosts
- PowerDNS API Configuration
- Database Configuration
- Reverse Proxy