面向 MikroTik RouterOS 的 CGNAT
CGNAT 通过在多个私网客户端之间切分每个公网地址的源端口空间,把它们映射到少量公网地址上。Mikro Manager 依据你真正关心的参数构建这一布局,并把它打算写入的每一条规则都摆给你看。
布局是怎么回事
私网空间被切成与公网前缀等大的连续块。每个块在自己的源端口区间内 1:1 netmap 到整个前缀,于是多个块以端口相隔共享每个公网地址。分发是两级跳转——从 srcnat 进入按 /24 划分的链,再进入按块划分的链——因此无论有多少块,规则匹配都很快。
声明式,且幂等
每条规则都带有一段结构化注释,编码了整个池。连接时应用读取实时规则,从这些注释中重建出池,再把你想要的与现有的做比对。事实来源是路由器,而不是你 Mac 上的某个文件——没有我们有效注释的规则,绝不会被触碰。
确定性查询,无需流日志
因为 netmap 是算术而非租约表,一个公网地址加源端口能精确解析到唯一一个私网客户端,反向亦然,事先无需任何记录。这正是滥用举报真正需要的答案。
add chain=srcnat action=jump jump-target=cgnat-10.64add chain=cgnat-10.64-b3 action=netmap \ to-addresses=200.2.3.0/27 to-ports=3072-4095 \ comment="mikro:v1;pool=cgnat;blk=3;cpi=256"- 2 创建
- 67 更新
- 66 删除
在写入任何内容之前,由你来审阅计划。
一个地址池的一生
一年后依然改得动的地址池
大多数 CGNAT 部署只写一次,此后余生都靠人工一条条改规则。在这里,地址池始终是可以打开、修改、再次应用的东西——因为设计本身就存放在路由器上。
先设计
起个名字,填上私网起始地址和公网前缀,再选定每个客户端分到多少端口。区块数、端口区间和规则条数会随着输入一起算出来。此时路由器上还什么都没有——标记写着「草稿」。
读一遍计划
它打算写入的每一条规则,一条不省:一个 /27 分成 32 份就是 133 条。只有「应用」会写入,而且会逐条汇报进度。
它成为一个池,而不是一堆规则
应用之后它变为「运行中」,并说明自己在路由器上拥有哪些规则。设计就写在规则注释里,所以每次连接时,应用都会从路由器把地址池重新拼出来。
一年后再改
把每个地址的客户端数量减半,打开 Fasttrack,然后复核:新增 2 条、修改 67 条、删除 66 条。写入的只有差异。
回复滥用举报
给出公网地址和源端口,就能用算术推出背后的客户端——属于哪个池、哪个区块、哪段端口——不需要保留任何流日志。
常见问题
- 这是 CGNAT 计算器,还是会直接配置路由器?
- 两者都是。输入时它会算出区块、每个客户端分到的端口数和规则条数——这是计算器的部分——然后通过 REST API 写入 netmap 规则;你若想自己粘贴,它也能给你脚本。
- 路由器上已经有 CGNAT 规则,还能用吗?
- 可以。应用只管理带有它自己结构化注释的规则;你手写的内容会被读取,但绝不会被修改或删除。
- 一个公网地址可以由多少客户端共享?
- 1 到 1024 之间任意 2 的幂。这个数值决定源端口窗口如何切分,因此每个地址上的客户端越多,各自的端口区间就越窄。
- 它能把 RouterOS 的 CGNAT 配置生成为脚本吗?
- 可以。任何地址池都能导出为 .rsc 文件,内容就是应用本会发送的那些带标记的命令,可用于 /import、变更工单,或只能通过控制台访问的路由器。
- 如果我想自己来应用这些规则呢?
- 把池导出为 RouterOS 脚本,粘贴到终端里即可。生成的命令与应用本会发送的完全相同。
- 它会记录哪个客户端用了哪个端口吗?
- 不会,也不需要。映射是由池的参数算出来的,因此即便从未开启任何日志,也能回溯查询。
获取 Mikro Manager
通过 Mac App Store 分发——沙盒运行、已签名,并自动更新。
即将登陆 Mac App Store。需要 macOS 14 或更高版本,以及一台已启用 REST API 的 RouterOS v7 设备。