很多时候我们自建的DNS服务器都是递归DNS,其实权威DNS也可以很方便自建的,PowerDNS+PowerDNS-Admin就是一套现成的开源方案。
这篇文章水一下PowerDNS+PowerDNS-Admin的搭建过程,为了让大家能够快速部署起来,避免踩坑,这里我尽量用简单(偷懒)的方法来部署。
开始之前,你首先要准备一个顶级域名,并且这个域名的服务商要支持添加Glue Record(胶水记录)
这里我拿gandi.net的DNS管理界面演示(草,特地花了11块钱注册了这个域名,11块钱买包薯片它不香嘛)
每个域名注册局的界面肯定都大同小异,gandi.net就这个样子:
然后随便填个你喜欢的主机名,下面IP地址就填你要搭建权威DNS的这台服务器IP:
最后把域名的NS的服务器地址改成你刚添加的胶水记录的值:
域名这块就设置好了。接下来就可以着手安装PowerDNS了。
系统使用Debian10,先把需要用到的基本工具装一哈:
apt -y update apt -y install curl gnupg
这里添加官方的存储库安装最新版:
echo "deb [arch=amd64] http://repo.powerdns.com/debian buster-auth-master main" > /etc/apt/sources.list.d/pdns.list
新建一个pdns软件包优先级的配置文件:
nano /etc/apt/preferences.d/pdns
写入如下配置,让apt始终从powerdns的源安装软件包:
Package: pdns-* Pin: origin repo.powerdns.com Pin-Priority: 600
添加密钥/安装:
curl https://repo.powerdns.com/CBC8B383-pub.asc | apt-key add - apt -y update apt -y install pdns-server pdns-backend-sqlite3 sqlite3
注:PowerDNS支持很多种数据库后端,这里为了简单,我选择使用sqlite3,如果你的域名数量相当多,这里建议你使用mysql或者pgsql。
配置sqlite3数据库:
mkdir -p /powerdns-db sqlite3 /powerdns-db/pdns.sqlite3 < /usr/share/doc/pdns-backend-sqlite3/schema.sqlite3.sql chown -R pdns:pdns /powerdns-db
编辑PowerDNS的主配置文件:
nano /etc/powerdns/pdns.conf
修改launch的值为如下所示:
launch=gsqlite3
新建一个PowerDNS的配置文件:
nano /etc/powerdns/pdns.d/imlala.conf
写入如下配置:
gsqlite3-database=/powerdns-db/pdns.sqlite3 gsqlite3-pragma-synchronous=0 gsqlite3-pragma-foreign-keys=yes gsqlite3-dnssec=yes api=yes api-key=设置你的api密码 webserver-address=0.0.0.0 webserver-allow-from=0.0.0.0/0,::/0
重启PowerDNS使之前更改的配置生效/设置开机自启:
systemctl restart pdns systemctl enable pdns
PowerDNS的配置就OK了,接下来是PowerDNS-Admin,这是PowerDNS的WEB面板,基于Python开发的。由于安装过程很繁琐,这里为了简单直接用Docker一把梭!
首先把docker和docker-compose装好:
curl -sSL https://get.docker.com/ | sh systemctl start docker systemctl enable docker curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
创建一个目录:
mkdir -p /opt/powerdns-admin && cd /opt/powerdns-admin
新建docker-compose:
nano docker-compose.yml
直接粘贴下面的配置即可:
version: '3.5' volumes: pda-data: services: powerdns-admin: image: ngoduykhanh/powerdns-admin:latest container_name: powerdns_admin ports: - 9191:80 environment: - GUNICORN_TIMEOUT=60 - GUNICORN_WORKERS=2 - OFFLINE_MODE=False volumes: - pda-data:/data restart: unless-stopped
启动:
docker-compose up -d
访问你的VPSIP:9191能看到PowerDNS-Admin的WEB面板说明一切正常:
注:初次访问,注册的第一个账号默认就是管理员权限。
登录进去之后,默认会跳转到pdns的api配置界面,这里填写之前配置的api信息:
安装的软件版本号一定要填写正确,查看你当前安装的版本:
apt-cache policy pdns-server
可以看到当前安装的版本是4.4.0:
pdns-server: Installed: 4.4.0~alpha0+master.404.ga0289598b-1pdns.buster Candidate: 4.4.0~alpha0+master.404.ga0289598b-1pdns.buster
如果PowerDNS-Admin和PowerDNS对接正常的话,点击如图所示的菜单,应该能看到PowerDNS的运行状态:
现在找到Settings-Records,把Forward Zone内的SOA记录勾上:
如果你不想公开给别人使用你的DNS服务器,现在应该把注册功能关掉:
现在我们就可以添加域名了:
添加域名之后,默认应该就有一条SOA解析记录,编辑这个记录,把Primary Name Server的值改成如下图所示(改成你自己的NS服务器地址):
现在在这个域名下面添加一条A记录,记录的值是NS服务器的地址:
等待解析生效后,你的NS服务器就搭建完成了。对于我文中的这个域名而言,我的NS服务器地址就是:sometimesnaive.imlala.best
你的其他域名都可以把NS服务器地址换成这个,例如我的另外一个域名,在域名服务商那里修改NS服务器地址:
这其实就和你平常把域名接入到CloudFlare的操作是一样的,只不过这次是修改成你自己的NS服务器。
然后我们就可以在PowerDNS-Admin内添加新的域名了,设置你自己的解析记录:
最后测试一下是否能够正常工作:
在全新DD的Debian10 64bit机器上测试,pdns启动报错
Fatal error: Trying to set unknown parameter ‘bind-config’
我更新了一下文章,再试试看应该没问题了。
成功了,非常感谢您!
套路云的域名有胶水记录吗?
大厂应该是有的,但国内的DNS管理界面不一定叫胶水记录,这个你要问下他们客服,我基本没在国内注册过域名,不是很清楚。。。
大学选修课作业
橘酱做作业都这么销魂的嘛,我在想国内现在搭建DNS是违法的,你这作业怕不是有点难度。。
咋设置多个dns服务器嘞
配置powerdns的主从同步。。
lala哪个dns程序支持doh啊
adguardhome,blocky都支持。
我很好奇能不能这个加上 shell实现ddns 哈哈
真心请教,我实测搭建成功了,IPV4应该没问题。IPV6也能正常吗?不是很懂这些哈哈哈
添加lua類型的記錄,一直解析不成功。用nslookup提示 Non-existent domain。 A記錄OK.