基于gin框架开发的内网dns管理系统后端demo, 支持动态dns修改(RFC 2136标准)、dns探测等功能. 提供dns解析的基础服务为bind. 支持多节点部署.
启动方式: go run cmd/main.go
, 本地swagger查看api详情
项目项目结构如下:
intranet-dns/
├── apis # 控制器
├── cmd # main.go
├── config # 配置文件
├── ctx # gin上下文
├── database # 数据库初始化
├── docs # swagger
├── middleware # gin中间件
├── models # 数据库表结构, dao函数
├── router # 路由控制
├── service # 服务代码
│ ├── cronjob # 定时任务
│ ├── dnslib # dns服务
│ └── redis # redis服务
└── utils # 工具函数
表结构:
mysql> show tables;
+-----------------------+
| Tables_in_dns_service |
+-----------------------+
| apis | # 路由
| audit_logs | # 审计日志
| cronjobs | # 定时任务
| dns_probes | # dns探测
| dns_records | # dns rr
| dns_zones | # dns zone
| sys_roles | # 系统角色
| sys_users | # 系统用户
+-----------------------+
功能点:
- api管理: 路由自动录入数据库, 支持禁用单个api, 支持api限速, 接入go-swagger注解
- 用户管理: 用户可绑定多个角色, 角色可绑定多个api接口, 实现rbac权限模型管控. 单个用户可禁用, 统计登录次数以及登录时间. 利用go-jwt token来实现登录鉴权等.
- 日志审计: os.stdout支持输出api访问日志, 包含来源ip、请求耗时等. 数据库存储具体的body日志用于审计
- 定时任务管理: 支持动态的增删改查定时任务, 定时任务可控制是否启动, 可查看最近的运行结果
- dns管理: bind9+go miekg/dns实现dns动态增删改查, dns探测等. dynamic dns rfc2136
golang: gin, gorm, go-swagger, go-jwt, go-redis, miekg/dns
database: mysql, redis
nameserver: bind dynamic update, bind key配置
tsig-keygen funny.com > /etc/funny.com.key
cat /etc/named.conf |grep -A 5 'funny.com'
include "/etc/funny.com.key";
zone "funny.com." {
type master;
file "funny.com.zone";
allow-update { key funny.com; };
};
如增加dns记录:
# dig不存在的记录, NXDOMAIN
dig a.b.c.funny.com @your_dns_server
"->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24423
flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1"
# call api to add dns record
curl -X 'POST' \
'http://localhost:8008/api/v1/dns/records' \
-H 'accept: application/json' \
-H 'token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzM2NTExMDc4LCJpc3MiOiJpbnRyYW5ldC1kbnMifQ.Gqubkw1gNICcH-X90FDVWMFHClJhhyn0ljUafRh7xZk' \
-H 'Content-Type: application/json' \
-d '{
"record_content": "110.110.110.110",
"record_name": "a.b.c.funny.com",
"record_ttl": 120,
"record_type": "A",
"zone": "funny.com"
}'
# 内网dns记录已经动态添加成功
dig a.b.c.funny.com @your_dns_server +short
110.110.110.110
# 查看named zone文件
cat funny.com.zone|grep a.b.c
a.b.c A 110.110.110.110