A sleek, modern web interface for managing BIND DNS zones and records. This application combines the power of BIND9 DNS server with an intuitive Python Flask web interface, all packaged together in a convenient Docker container.
- π¨ Modern UI - Beautiful, responsive interface built with Tailwind CSS
- π Easy to Use - Intuitive zone and record management
- π§ Zone Management - Create and delete DNS zones with ease
- π Record Management - Create, edit, and delete DNS records (A, AAAA, CNAME, MX, TXT, NS, PTR, SRV)
- π³ Docker Ready - Runs BIND and the web interface together in one container
- π Auto-reload - Changes are automatically applied to BIND using
rndc - π₯ Health Checks - Built-in monitoring of BIND and application status
- π REST API - Full-featured API for automation and integration
docker run -d \
--name dns-gui-for-bind \
-p 53:53/tcp \
-p 53:53/udp \
-p 5000:5000 \
awkto/dns-gui-for-bind:latestThen open your browser to http://localhost:5000
git clone https://github.com/awkto/dns-gui-for-bind.git
cd dns-gui-for-bind
docker-compose up -dAccess the web interface at http://localhost:5000
- Docker 20.10+
- Docker Compose 2.0+ (optional)
- Python 3.8+
- BIND9 DNS server
- pip (Python package manager)
| Variable | Default | Description |
|---|---|---|
BIND_ZONES_DIR |
/etc/bind/zones |
Directory for zone files |
BIND_CONFIG_FILE |
/etc/bind/named.conf.local |
BIND local configuration file |
USE_RNDC |
true |
Use rndc for reloading BIND |
PORT |
5000 |
Web interface port |
To persist your DNS zones and configurations, use Docker volumes:
docker run -d \
--name dns-gui-for-bind \
-p 53:53/tcp \
-p 53:53/udp \
-p 5000:5000 \
-v dns-zones:/etc/bind/zones \
-v dns-config:/etc/bind \
awkto/dns-gui-for-bind:latest- Click the "+ Add Zone" button in the Zones panel
- Enter the zone name (e.g.,
example.com) - Optionally set admin email and TTL
- Click "Create Zone"
The zone will be created with default NS and SOA records.
- Select a zone from the Zones panel
- Click "+ Add Record" in the Records panel
- Fill in the record details:
- Name: Record name (e.g.,
www,mail, or@for root) - Type: Record type (A, AAAA, CNAME, MX, TXT, etc.)
- Value: Record value (IP address, hostname, etc.)
- TTL: Time to live in seconds
- Name: Record name (e.g.,
- Click "Save Record"
- Click the edit icon (βοΈ) next to any record
- Modify the values as needed
- Click "Save Record"
- Click the delete icon (ποΈ) next to a record or zone
- Confirm the deletion
GET /api/zonesPOST /api/zones
Content-Type: application/json
{
"zone_name": "example.com",
"admin_email": "[email protected]",
"ttl": 86400
}DELETE /api/zones/{zone_name}GET /api/zones/{zone_name}/recordsPOST /api/zones/{zone_name}/records
Content-Type: application/json
{
"name": "www",
"type": "A",
"value": "192.168.1.1",
"ttl": 3600
}PUT /api/zones/{zone_name}/records/{record_id}
Content-Type: application/json
{
"name": "www",
"type": "A",
"value": "192.168.1.2",
"ttl": 3600
}DELETE /api/zones/{zone_name}/records/{record_id}GET /api/healthIf you prefer to run the application without Docker:
# Ubuntu/Debian
sudo apt-get install bind9 bind9utils
# CentOS/RHEL
sudo yum install bind bind-utilspip install -r requirements.txtexport BIND_ZONES_DIR=/etc/bind/zones
export BIND_CONFIG_FILE=/etc/bind/named.conf.local
export USE_RNDC=true
export PORT=5000python3 app.pydns-gui-for-bind/
βββ app.py # Flask application and API routes
βββ bind_manager.py # BIND management logic
βββ requirements.txt # Python dependencies
βββ static/
β βββ index.html # Frontend UI
β βββ app.js # Frontend JavaScript
βββ bind-config/
β βββ named.conf # Main BIND configuration
β βββ named.conf.local # Local zones configuration
β βββ named.conf.default-zones # Default zones
βββ Dockerfile # Container build instructions
βββ docker-compose.yml # Docker Compose configuration
βββ start.sh # Container startup script
βββ .github/
βββ workflows/
βββ docker-build.yml # CI/CD pipeline
git clone https://github.com/awkto/dns-gui-for-bind.git
cd dns-gui-for-bind
docker build -t dns-gui-for-bind .
docker run -d -p 53:53/tcp -p 53:53/udp -p 5000:5000 dns-gui-for-bindContributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- The default configuration allows queries from any source - adjust in production
- Consider implementing authentication for the web interface in production
- Use firewall rules to restrict access to ports 53 and 5000
- Regularly update the container to get security patches
- Check configuration:
named-checkconf /etc/bind/named.conf - Check logs:
docker logs dns-gui-for-bind - Ensure ports 53 and 5000 are not already in use
- Verify BIND is running:
rndc status - Check that
USE_RNDCis set totrue - Review application logs for errors
- Ensure port 5000 is not blocked by firewall
- Check that the Flask application started successfully
- Verify Docker port mapping is correct
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- BIND9 DNS Server by ISC
- Flask web framework
- Tailwind CSS for the beautiful UI
- Docker for containerization
Made with β€οΈ for the DNS community