powerdns是一个跨平台的开源DNS服务组件,PowerDNS的用户和客户包括领先的电信服务提供商,大型集成商,cloudfalre内容分发等网络公司。
包括:权威服务器、Recursor、dnsdist全部都已经开源。
权威服务器:
PowerDNS权威服务器是一种通用的名称服务器,它支持大量后端。这些后端可以是纯区域文件,也可以是更具动态性的。
PowerDNS具有“后端”的概念。后端是服务器将查询的数据存储,其中包含DNS记录(和一些元数据)。
递归服务器:
PowerDNS Recurso是高性能的解析名称服务器,可为至少一亿个订户的DNS提供解析服务。
利用多个处理器并支持权威服务器相同的强大脚本编写功能,Recursor可以在保持最佳性能的同时保留现代DNS部署所需的灵活性。
dnsdist服务:
dnsdist是高度支持DNS、DoS和滥用负载平衡器。目标是将流量路由到最佳服务器,在分流或阻止滥用流量的同时,为合法用户提供最佳性能。
dnsdist是动态的配置语言是Lua,可以在运行时进行更改,可以从控制台或HTTP API查询其统计信息。
例如:dnsdist -l 127.0.0.1:5300 9.9.9.9 2620:fe::fe2620:fe::9
这将使dnsdist在IP地址127.0.0.1,端口5300上侦听并将所有查询转发负载均衡到两个IP地址。
powerdns信息查询
我们可以使用此配置文件进行激活,这是我们通过解决开发团队的第一个请求API服务来满足PDNS的“要求”的时候。 此功能使我们能够发送请求,以简单,干净地创建,修改或删除DNS服务器中的记录。
启用API之后方可调用API,启用方式和API说明地址Built-in Webserver and HTTP API — PowerDNS Recursor documentation
区域API,区域对象代表权威的DNS区域。资源记录集(以下称为rrset)是给定名称和类型的所有记录。
Zone
表示PowerDNS服务器中的已配置区域。获取所有已配置的区域,然后遍历区域列表中的区域id,进而获取每个区的dns解析信息。代码如下:
package main
import (
//"bytes"
"encoding/json"
"crypto/tls"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
url := "https://powerdns.it.oa.com/api/v1/servers/localhost/zones"
reqest, err := http.NewRequest("GET", url, nil)
//增加header选项
reqest.Header.Add("X-API-Key", "YlRyWDExxxxxxxxx")
reqest.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)")
if err != nil {
panic(err)
}
response, err := client.Do(reqest)
if err != nil {
fmt.Println(err)
}
defer response.Body.Close()
body, err2 := ioutil.ReadAll(response.Body)
if err2 != nil {
fmt.Println(err2)
}
var res_json []map[string]interface{}
json.Unmarshal(body, &res_json)
for _, v := range res_json {
client := &http.Client{Transport: tr}
url := "https://powerdns.it.oa.com/api/v1/servers/localhost/zones/" + v["id"].(string)
reqest, err := http.NewRequest("GET", url, nil)
//增加header选项
reqest.Header.Add("X-API-Key", "YlRyWDExxxxxxxxxxx") //管理员权限申请的key
reqest.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)")
if err != nil {
panic(err)
}
response, err := client.Do(reqest)
if err != nil {
fmt.Println(err)
}
defer response.Body.Close()
body, err2 := ioutil.ReadAll(response.Body)
if err2 != nil {
fmt.Println(err2)
}
var tmp_json map[string]interface{}
json.Unmarshal(body, &tmp_json)
vv := tmp_json["rrsets"].([]interface{})
for _, v := range vv {
row := v.(map[string]interface{})
for _, v := range row["records"].([]interface{}) {
res := v.(map[string]interface{})
fmt.Println(res["name"], res["type"], res["content"])
}
}
}
}