





使用nginx作为前端代理, intranet-dns-web为前端项目, intranet-dns-backend为后端项目, named为权威dns服务器. intranet-dns-backend遵循rfc2136等规范向named权威dns服务器发起动态dns请求, 二者之间定期进行dns记录的校验同步.
基于Vue3、Vite、Vue-Router4、Pina、ant-design-vue3开发的内网dns管理系统前端界面.
内部域名管理演示: 域名的查询、域名记录的搜索、named zone管理
系统管理演示: 用户管理、角色管理、api管理、审计日志管理
项目结构如下:
├── src
│ ├── App.vue # 根组件
│ ├── apis # axios request api
│ ├── assets # 静态资源
│ ├── components # 布局组件
│ ├── hooks # hook js
│ ├── main.js # main.js
│ ├── router # router.js
│ ├── store # pina store.js
│ └── views # router pages
基于gin框架开发的内网dns管理系统后端demo, 支持动态dns修改(RFC 2136标准)、dns探测等功能. 提供dns解析的基础服务为bind. 支持多节点部署.
后端服务启动后, 本地swagger查看api详情
项目结构如下:
intranet-dns-backend/
├── 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
1.准备工作: clone仓库, 安装redis和mysql, 安装named服务并配置TSIG key.
git clone git@github.com:tswcbyy1107/intranet-dns.git
2.启动后端: 修改config.ini配置, 填入自己的mysql和redis地址密码.
cd intranet-dns-backend
vim config/config.ini
go run cmd/main.go
3.启动前端: 配置了多个环境变量
cd intranet-dns-web
npm i
npm run dev

Leave a Reply