middelink/mikrotik-dns

GitHub: middelink/mikrotik-dns

将标准 RFC1035 区域文件中的 DNS 记录与 DHCP 静态租约自动同步到 Mikrotik 路由器的命令行工具。

Stars: 4 | Forks: 5

# mikrotik-dns [![GoDoc](https://godoc.org/github.com/middelink/mikrotik-dns?status.svg)](https://godoc.org/github.com/middelink/mikrotik-dns) [![License](https://img.shields.io/github/license/middelink/mikrotik-dns.svg)](https://github.com/middelink/mikrotik-dns/blob/master/LICENSE) [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/4ac0296ea7153716.svg)](https://github.com/middelink/mikrotik-dns/actions?query=workflow%3Atest) [![Go Report Card](https://goreportcard.com/badge/github.com/middelink/mikrotik-dns)](https://goreportcard.com/report/github.com/middelink/mikrotik-dns) ## 太长不看 * mikrotik-dns 读取给定的 RFC1034 格式的 nameserver zone 文件,并使用发现的信息更新 Mikrotik 内部的 DNS 和/或 DHCP 服务器。 * 它处理 Mikrotik DNS 支持的所有资源记录。(A, AAAA, CNAME, MX, NS, SRV 和 TXT) * 当 A RR 中添加了 `dhcp:` 时,该工具能够在 Mikrotik 上的一个或多个 dhcp 服务器中维护静态租约。 * 当 RR 中添加了 `forward:` 时,该工具会将其转换为 Mikrotik DNS 侧的 FWD 条目。 * 当 RR 中添加了 'ignore' 时,该工具将不会复制该记录,但如果该记录在 Mikrotik 侧存在则会将其移除。 ## 我为什么要写这个? 由于我自己维护域名的 DNSSEC 密钥的根深蒂固的需求,我运行了一个所谓的盲 nameserver(通过通知将更改推送到一组公开已知的 nameserver)。然而,由于运行 nameserver 的服务器最近进行了一次升级,我们家暂时失去了正常工作的 DNS。这令人无法接受。这让我想到如何将给定的 nameserver 记录同步到 Mikrotik,这将允许我在需要时将其用作紧急 DNS。然而,尽管它作为转发 DNS 运行良好,但我的本地 zone 却没有条目…… 在实现此工具的过程中,我认为将静态 DHCP 租约也作为单一事实来源会很好,让该工具 a) 弄清楚租约将分配给哪个 dhcp 服务器实例,以及 b) 将 DNS 名称作为注释填充进去。 ## 命令行标志 ``` Usage: ./mikrotik-dns [OPTION]... ZONE... When --use_dns is given, this tool copies compatible RRs from the given zones into the Mikrotiks static DNS table. This can for example be used in emergency modes where the local nameserver is down, but the organisation still requires an internal DNS in the mean time. Unknown entries from the static DNS table will be removed! When --use_dhcp is given, all A records from the given zones which have a comment matching 'dhcp:' will update the Mikrotiks DHCP table. Unknown entries from the DHCP table will be removed! -address api://user:pass@host url like address of the MT to connect to api://user:pass@host. use `apis` for encrypted connections. -dry_run run the program but do not make any changes on the Mikrotik -dnsfilter string comma separated list of dns prefixes to filter -use_dhcp maintain dhcp table based upon '; dhcp:' mac comments on the A records -use_dns maintain static dns table from zone -verbose be more verbose -version output version information and exit ``` ## 示例用法 给定一个示例 zone 文件,包含: ``` example.com SOA ns.example.com postmaster.example.com 2020092602 28800 7200 2419200 1200 IN NS virthost.polyware.nl. IN TXT "v=spf1 a:smtp.example.com ?all" IN SPF "v=spf1 a:smtp.example.com ?all" CAA 0 issue "letsencrypt.org" localhost IN A 127.0.0.1 @ IN A 192.168.10.10 ; dhcp:01:23:45:67:89:ab IN AAAA 2a02:ff:ff:ffff:ffff:ff:ffff:ffff IN MX 50 smtp *.d IN A 192.168.10.12; forward:192.168.10.10 $GENERATE 128-254 dhcp${-127,3} A 192.168.10.$ ``` 使用 `mikrotik-dns --use_dns --use_dhcp --dnsfilter="dhcp" --address apis://:@ /var/named/` 命令运行该工具 将会把 example.com 的 NS、TXT、A 和 AAAA 记录添加到 mikrotik 的静态 DNS 缓存中,同时移除其他任何记录。 然后,如果它能找到为此范围配置的 dhcp 服务器,它将添加租约,同时移除其他任何记录。 ## 安装 我假设您有使用 Go 的经验。 ### 构建二进制文件 * 确保您已安装 `make`、`git` 和 `go`。 * 克隆源码 `git clone https://github.com/middelink/mikrotik-dns`。 * 执行 `make` 以创建 mikrotik-fwban 二进制文件。 * 将二进制文件复制到 /usr/local/bin。 ### Mikrotik 更改 * 在您的 mikrotik 上创建一个组 (`apis`)(系统 > 用户;组)并至少赋予其 `read`、`write` 和 `api` 策略。 * 在您的 mikrotik 上创建一个用户(系统 > 用户;用户)并使其属于您刚刚创建的组。 ## 许可证 [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fmiddelink%2Fmikrotik-dns.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fmiddelink%2Fmikrotik-dns?ref=badge_large)
标签:AAAA记录, A记录, CNAME, DHCP, DNS, DNSSEC, DNS记录, DNS转发, EVTX分析, Go语言, IT运维, MikroTik, RFC1034, RFC1035, Socks5代理, 区域文件, 开源, 日志审计, 程序破解, 网络同步, 网络配置, 自动化运维, 路由器, 静态租约