文章目录
  1. 1. Corefile中配置redis插件
  2. 2. redis中DNS记录的保存格式
  3. 3. 使用python将DNS记录写入redis

为corends安装了redis插件,需要在配置文件Corefile中添加redis插件的配置项。 另外, DNS记录保存于redis, 需要了redis中保存数据的结构、完成写入redis记录的操作。

Corefile中配置redis插件

配置文件的格式,在redis插件描述中写的很清楚了。使用本机Redis的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
.:53 {
redis {
address 127.0.0.1:6379
#password ''
prefix _dns:
#suffix SUFFIX
connect_timeout 60
read_timeout 60
ttl 600
}
}

address 指定redis的连接地址, prefix是redis中key的前缀, 这里用于保存DNS域名的键都会以_dns:开头。

redis中DNS记录的保存格式

redis是一个内存数据库、缓存, 数据都是以健-值对值的形式保存, 支持多种数据类型,如string,list,hash等。 coredns的redis插件将域名作,值类型hash, 值hash中又保存子域名与DNS记录之间的对应关系。

1
_dns:域名 -> { "子域名": "json({'a':[{'ip':'xx'}]})" }

值中hash类型的值,是一个JSON化之后的字符串。记录类型对应于一个列表。 这一点在coredns redis插件的文档中是错误的,但在最后查询redis结果部分给出了正确的示例。

比如A记录, 正确的结构如下(a的值是一个列表, ip而不是ip4):

1
2
3
4
5
6
{
"a":[{
"ip" : "1.2.3.4",
"ttl" : 360
}]
}

使用python将DNS记录写入redis

需要在python中预先安装redis库, 转json串使用python自带的json库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import redis
import json
redis_client = redis.Redis(host='localhost', port='6379', decode_responses=True)
def add_app_sub_domain(domain: str, subdomain: str, ip: str):
h_value = {
'a': [{
'ip': ip,
'ttl': 360
}],
}
redis_key = '_dns:' + domain
redis_client.hset(redis_key, mapping={subdomain: json.dumps(h_value)})
add_app_sub_domain('example.com.', 'sub-domain', '1.2.3.4')
文章目录
  1. 1. Corefile中配置redis插件
  2. 2. redis中DNS记录的保存格式
  3. 3. 使用python将DNS记录写入redis