见字如面,大家好,我是小斐,这篇主要针对PowerDNS的管理做简单介绍。背景 PowerDNS日常管理使用命令行不太便捷,而且在公司内部,可能还需要给其他运维或者研发人员开通添加域名管理权限,在此我推荐一套针对PDNS可视化UI管理工具PowerDNSAdmin。 可以结合SAMLLDAPActiveDirectory用户认证,可以解决多人登录该域名管理系统的权限问题。部署 前文提到安装PowerDNS后,域名区域数据不在使用bind文件格式存储,而直接使用后端连接MySQL数据库。 已配置好相关数据库表格式,和数据库用户,在这在此示例下:PowerDNSAdmin的数据库不能使用PowerDNS的数据库必须分开到前文所说的主库中root登录mysql数据库创建powerdnsadmin数据库CREATEDATABASEpowerdnsadminCHARACTERSETutf8mb4COLLATEutf8mb4unicodeci;GRANTALLPRIVILEGESONpowerdnsadmin。TOpdnsadminuserIDENTIFIEDBYPowerDNSAdmin987;FLUSHPRIVILEGES;安装 安装方式:docker和dockercompose或本地化部署 系统:Ubuntu22。04。1LTS 本地化部署说明:安装构建python库所需的包sudoaptinstallypython3devgitlibsasl2devlibldap2devlibssldevlibxml2devlibxslt1devlibxmlsec1devlibffidevpkgconfigapttransporthttpsvirtualenvbuildessentialcurl安装Node。jscurlfsSLhttps:deb。nodesource。comsetuplts。xsudoEbashsudoaptgetinstallynodejs安装yarn构建依赖文件sudocurlsShttps:dl。yarnpkg。comdebianpubkey。gpgaptkeyaddechodebhttps:dl。yarnpkg。comdebianstablemainsudoteeetcaptsources。list。dyarn。listsudoaptupdatesudoaptinstallyarn检查源代码并创建virtualenv源代码放在optwebpowerdnsadmin目录下gitclonehttps:github。comPowerDNSAdminPowerDNSAdmin。gitoptwebpowerdnsadmin安装virtualenv包创建virtualenvaptinstallpython3。10venv创建虚拟环境目录venv虚拟环境目录名称可自定义python3mvenv。venv或者virtualenvppython3venv激活虚拟环境source。venvbinactivatepipinstallupgradepip数据库依赖包安装aptinstalllibmysqlclientdevpip3installmysqlclient2。0。1安装python项目依赖包pipinstallrrequirements。txt配置文件位置cpoptwebpowerdnsadminconfigsdevelopment。pyoptwebpowerdnsadminconfigsproduction。py修改配置文件在下面说明vimoptwebpowerdnsadminconfigsproduction。py 配置环境启动文件:vimoptwebpowerdnsadminconfigsproduction。pyimportosimporturllib。parsebasediros。path。abspath(os。path。dirname(file))BASICAPPCONFIGSALT随机加密字符串SALT2b12yLUMTIfl21FKJQpTkRQXCu安全密钥可以用Python生成pythoncimportsecrets;print(secrets。tokenhex(16))SECRETKEY3f17176a67336b4112b524295cc0e48a监听地址BINDADDRESS0。0。0。0监听端口PORT9191OFFLINEMODEFalseFILESYSTEMSESSIONSENABLEDFalseSESSIONCOOKIESAMESITELaxCSRFCOOKIEHTTPONLYTrueDATABASECONFIG配置MySQL数据库的基本信息SQLADBUSERpdnsadminuserSQLADBPASSWORDPowerDNSAdmin987SQLADBHOST192。168。10。120SQLADBNAMEpowerdnsadminSQLALCHEMYTRACKMODIFICATIONSTrueDATABASEMySQL启动MySQL数据库SQLALCHEMYDATABASEURImysql:{}:{}{}{}。format(urllib。parse。quoteplus(SQLADBUSER),urllib。parse。quoteplus(SQLADBPASSWORD),SQLADBHOST,SQLADBNAME)DATABASESQLiteSQLite数据库注释关闭SQLALCHEMYDATABASEURIsqlite:os。path。join(basedir,pdns。db)SAMLENABLEDFalseSAMLASSERTIONENCRYPTEDTrue 手动启动:切换到目录optwebpowerdnsadminsource。venvbinactivate导入启动配置文件exportFLASKCONF。。configsproduction。py数据库表格式生成exportFLASKAPPpowerdnsadmininit。pyflaskdbupgradeyarn包管理器安裝一些JavaScript依赖项以及为PowerDNSAdmin生成静态文件yarninstallpurelockfileflaskassetsbuild前台运行。run。py退出虚拟环境deactivate 到此已把环境准备好,包括相关数据库配置和应用程序配置,可以直接启动。 但是在实际生成环境中,前面肯定还是需要Web服务器,比如nginx,但是Python应用程序如何和Web服务器进行交互呢,故需要一套WSGI容器链接Web服务器和Python应用程序,如下图: 这里将采用NginxGunicorn,由于PowerDNSAdmin是基于Flask框架实现的,同时把应用服务器的启停注册为systemd管理。flaskvirtualenv中安装了gunicorn切换到venv环境下cdoptwebpowerdnsadminsource。venvbinactivatepipinstallgunicorn 配置系统服务:创建运行服务的系统用户和组sudogroupaddpowerdnsadminsystem创建一个没有登录shell和密码的用户,适用于运行系统服务sudouseraddsystemgpowerdnsadminpowerdnsadmin授权新用户应用程序目录权限chownRpowerdnsadmin:powerdnsadminoptwebpowerdnsadmin创建系统用户sudovimetcsystemdsystempowerdnsadmin。service〔Unit〕DescriptionPowerDNSAdminRequirespowerdnsadmin。socketAfternetwork。target〔Service〕PIDFilerunpowerdnsadminpidUserpowerdnsadminGrouppowerdnsadminWorkingDirectoryoptwebpowerdnsadminEnvironmentFLASKCONF。。configsproduction。pyExecStartPremkdirprunpowerdnsadminExecStartPrechownpdns:pdnsRrunpowerdnsadminExecStartoptwebpowerdnsadminvenvbingunicornpidrunpowerdnsadminpidbindunix:runpowerdnsadminsocketpowerdnsadmin:createapp()ExecReloadbinkillsHUPMAINPIDExecStopbinkillsTERMMAINPIDPrivateTmptrue〔Install〕WantedBymultiuser。target 环境说明:EnvironmentFLASKCONF。。configsproduction。py,这里是基于Python的运行环境venv;由于实际代码在optwebpowerdnsadminpowerdnsadmin中,故启动配置文件写相对路径放置在optwebpowerdnsadminconfigs中,故配置文件环境变量设置相对路径:。。configsproduction。py 新建套接字单元配置:powerdnsadmin。socket套接字单元配置:powerdnsadmin。socket以。socket为后缀的单元文件,封装了一个用于进程间通信的套接字(socket)或管道(FIFO),以支持基于套接字的启动。sudovimetcsystemdsystempowerdnsadmin。socket〔Unit〕DescriptionPowerDNSAdminsocket〔Socket〕ListenStreamrunpowerdnsadminsocket〔Install〕WantedBysockets。target 新建配置文件:sudovimetctmpfiles。dpowerdnsadmin。confpowerdnsadmin。conf必须新建runpowerdnsadmin自动创建并授权正确权限sudovimetctmpfiles。dpowerdnsadmin。confdrunpowerdnsadmin0755powerdnsadminpowerdnsadmin 启动:sudosystemctldaemonreloadsudosystemctlstartpowerdnsadmin。socketsudosystemctlenablepowerdnsadmin。socket启动服务sudosystemctlstartpowerdnsadmin。servicesudosystemctlenablepowerdnsadmin。service反向代理配置 安装nginx安装nginxaptinstallnginx配置80端口vimetcnginxconf。dpdns。confserver{listen:80;servername192。168。10。200;indexindex。htmlindex。htm;accesslogvarlognginxpowerdnsadmin。local。access。logcombined;errorlogvarlognginxerrorpowerdnsadmin。logerror;clientmaxbodysize10m;clientbodybuffersize128k;proxyredirectoff;proxyconnecttimeout90;proxysendtimeout90;proxyreadtimeout90;proxybuffers324k;proxybuffersize8k;proxysetheaderHosthttphost;proxysetheaderXSchemescheme;proxysetheaderXRealIPremoteaddr;proxysetheaderXForwardedForproxyaddxforwardedfor;proxysetheaderXForwardedProtoscheme;proxyheadershashbucketsize64;locationstatic{includeetcnginxmime。types;rootoptwebpowerdnsadminpowerdnsadmin;location。(jpgjpegpnggif){expires365d;}location。。(cssjs){expires7d;}}location{proxypasshttp:unix:runpowerdnsadminsocket;proxyreadtimeout120;proxyconnecttimeout120;proxyredirectoff;}} 如果需要443域名并证书加密访问:server{listen80;servernamepdns。itkmi。net;return301https:httphostrequesturi;}server{listen443sslhttp2;servernamepdns。itkmi。net;indexindex。htmlindex。htm;errorlogvarlognginxerrorpowerdnsadmin。logerror;accesslogoff;sslcertificateetcletsencryptlivepdns。hwdomain。iofullchain。pem;sslcertificatekeyetcletsencryptlivepdns。hwdomain。ioprivkey。pem;ssldhparampathtoyourdhparam。pem;sslpreferservercipherson;sslciphersEECDHAESGCM:EDHAESGCM:AES256EECDH:AES256EDH;sslsessioncacheshared:SSL:10m;clientmaxbodysize10m;clientbodybuffersize128k;proxyredirectoff;proxyconnecttimeout90;proxysendtimeout90;proxyreadtimeout90;proxybuffers324k;proxybuffersize8k;proxysetheaderHosthttphost;proxysetheaderXSchemescheme;proxysetheaderXRealIPremoteaddr;proxysetheaderXForwardedForproxyaddxforwardedfor;proxysetheaderXForwardedProtoscheme;proxyheadershashbucketsize64;locationstatic{includeetcnginxmime。types;rootoptpowerdnsadminpowerdnsadmin;location。(jpgjpegpnggif){expires365d;}location。。(cssjs){expires7d;}}locationupload{includeetcnginxmime。types;rootoptpowerdnsadmin;location。(jpgjpegpnggif){expires365d;}location。。(cssjs){expires7d;}}location{proxypasshttp:unix:runpowerdnsadminsocket;proxyreadtimeout120;proxyconnecttimeout120;proxyredirecthttp:scheme:;}} 至此完成PowerDNSAdmin的搭建,打开PowerDNSAdmin服务:先注册用户,第一个用户将处于管理员角色。第一次登录时,将被重定向到设置页面以配置PDNSAPI信息。 我这里是80端口和IP访问打开的:http:192。168。10。200 单击:Createanaccount账户,创建新账户,这第一个账户就是默认管理员账户。 你现在应该获得PowerDNSAdmin仪表板。PowerDNSAdmin正在运行,但仍未连接到PowerDNS服务器。 要使用PowerDNSAdmin设置PowerDNS服务器,你必须将通过PowerDNS服务器配置的API密钥添加到PowerDNSAdmin。 这里需要修改下PowerDNS服务器的配置文件:启用webserverwebserveryeswebserver监听地址从127。0。0。1改为0。0。0。0webserveraddress0。0。0。0默认任意地址都可以访问实际环境建议限制下webserverallowfrom0。0。0。00 添加域名: 到此就完成PowerDNSAdmin的安装和配置,后续讲解下域名记录添加和解析相关问题。