最近这几个月,我一直在用 FOSSBilling + PowerDNS 搭一个自己的 DNS / 证书平台,顺便当成 VPS 吧的基础设施实验场。中间改了不少东西,踩了不少坑,也修了一些典型的“薅羊毛”问题。
简单记一下现在这个项目到底长成了什么样。
───
- 域名注册规则:别再随便乱搞了
一开始的域名系统几乎不设防,只要前端能填,后台就能收。结果很快暴露几个问题:
- 有人注册一堆奇怪长字符串当域名,纯属玩票;
- 有人拿看上去正常、其实根本不会真正托管的域名来“蹭资源”。
所以我做了几件事:
- 限制域名字符长度
太短的、太长的都不允许,避免 a、超级长一整句句子.com 这种博眼球型域名。 - 保留部分域名 / 前缀
平台自用的域名、关键字域名直接加入保留列表,用户看不到,也注册不了。 - 更严格的格式校验
只接受正常的字母、数字、连字符组合,避免各种诡异符号。
简单粗暴,但直接让“乱注册”和“玩梗域名”的空间小了很多。
───
- DDNS:一台机器搞定多条解析
DDNS 这块我做了一个“一键脚本 + 后台日志”的组合。
现在的能力大概是:
- 客户端只需在目标服务器上跑一行:
curl -fsSL “https://vps8.zz.cd/servicedns/ddns/install.sh” | bash - 安装时可以在 Host 前缀 里一次性填多个子域:
imap,pop,mail - 脚本会自动:
• 在本机写一个配置文件;
• 定时拉起更新脚本;
• 每次把 imap.example.com、pop.example.com、mail.example.com 这几条 A/AAAA 记录一起更新。
管理端和客户端都有日志页面,能看到每次 DDNS 请求更新了哪条记录、从哪个 IP 来的、有没有报错。
───
- DNSSEC & DS:不仅能开,还能看得懂
DNSSEC 和 DS 记录也做了一轮梳理:
- 对托管在我这的纯 DNS 域名:
• 可以一键开启 / 关闭 DNSSEC;
• 前端会展示当前的 DS 记录,一键复制粘贴到注册商后台;
• 还会做一次“上游 DS 健康检查”,告诉你父域有没有 DS、DS 是否匹配、最近一次检查时间。 - 对使用第三方 DNS 的域名:
• 也支持在域名订单的 DNSSEC TAB 里单独管理 DS;
• 用的还是同一套 Servicedns/Servicedomain 的 DS 解析逻辑。
总之,不再是“我开了 DNSSEC 但到底配成啥样我自己也不知道”的状态。
───
- 证书系统:从 DNS-01 到“贴到别人家面板”
这块变化最大,也是我自己最常用的。
4.1 一键申请 ACME 证书
对于托管在我这的 DNS 订单,现在可以:
- 在 DNS 管理页直接点「申请证书」,后台通过 acme.sh 走 DNS-01 自动签发;
- 支持:
• 二级域名(www.example.com、imap.example.com 等);
• @ 根域名(example.com 本身)。
为了避免“刷证书”:
- 如果当前证书离过期还有很久(> 30 天),前端会直接提示“已有有效证书,暂不需要重新申请”,不会重复排队;
- ACME worker 按队列慢慢跑,遇到 CA 的 Retry-After 会自动进入冷却,避免把 CA 当压测工具。
4.2 状态透明:队列 + 冷却提示
客户端看到的是一张简单的卡片:
- 顶部有状态徽章:
• Queued:排队中;
• Running:正在签;
• Last success:最近一次成功;
• Last failure:最近一次失败。 - 证书快要过期时,会有“证书即将到期(X 天)”的黄色提示。
管理员则有一张全局队列表:
- 可以按域名 / 客户 / 状态筛选;
- 可以清理成功/失败记录;
- 看到每条失败的具体错误信息。
4.3 专门为“贴到别人家面板”设计的查看界面
现实里经常发生的场景是:我在自己平台签证书,然后要“贴”到别人家的托管面板里。大部分面板都是这样三格:
- SSL 证书
- SSL 私钥
- SSL CA证书 / 中间证书
所以我特地把客户端证书查看做成了 3 个按钮 + 3 个框的布局:
- 按钮:
• SSL 证书
• SSL CA证书
• SSL 私钥 - 点击后,只显示相应那一个文本框:
• CRT → 用于 SSL 证书
• CA → 从 fullchain 里自动扣出来中间证书链,只用于 SSL CA证书
• KEY → 私钥
复制的时候几乎不用思考:点哪个按钮,就往对方同名输入框里贴什么。
───
- NS 强制 + 自动清理:防“挂名不托管”
有一类典型的“薅羊毛”行为是:
- 在平台开了一个 DNS 服务;
- 但 NS 根本没切过来,或者只是做了形式上的 NS 记录;
- 实际解析还跑在别处,真正的流量和责任不在这边。
为了这个问题,我做了几件事:
- NS + SOA 双重判定
不仅看 NS 记录是不是我们的,还看 SOA 是不是真正权威已经迁过来。 - 48 + 48 小时自动清理模型
• 新开的 DNS 服务前 48 小时不扫,给迁移留时间;
• 之后如果检测到 NS/SOA 不对:
• 第一天记下首次异常时间;
• 48 小时内只是观察;
• 满 48 小时发一封警告邮件;
• 再过 48 小时还不修,就自动删除这个 DNS 服务,并发一封“已移除”通知。
只要中间任何时候把 NS 和 SOA 配正确,这个计时器就会自动清空,不会被误删。
───
- 薅羊毛相关的坑:简单记几类
上线之后,现实用户的创造力总是超出预期。比较典型的几类“薅羊毛”/误用场景:
6.1 DNS 不迁 NS,只想蹭功能
有人在平台开 DNS 服务,但 NS 根本没切过来,只是想蹭:
- DDNS
- 证书
- 或者单纯想要一个“在我这有个订单”的感觉
NS + SOA 强制 + 自动清理机制上线后,这一类基本被挡掉了。
6.2 证书被当成“无限刷的免费资源”
有人反复点“申请证书”,完全不管冷却、也不管证书还有多久过期。
解决方式就是:
- 冷却逻辑:尊重 CA 的 Retry-After,默认 1 天冷却;
- 时间窗口:距离过期大于 30 天的,不再新建请求;
- 前端用中文描述原因,告诉你“不是坏了,是我故意不让你再刷”。
6.3 一个优惠码下单一堆域名
还有一个比较典型的坑:优惠码的设计太宽松。
- 一开始的优惠券是按「订单」打折,没有限制“一个优惠码最多配多少个域名”;
- 结果就是:
• 有人用一张优惠码直接下单一串域名;
• 单个域名看起来没啥,叠在一起就变成一波“批发注册”。
调整之后做了几件事:
- 对某些敏感优惠码:
• 限制使用次数(比如每个账户只允许用一次);
• 或者只允许搭配特定商品(而不是任何 DNS/域名都能用)。 - 对域名侧的限制(长度、保留词)叠加起来,整体可玩空间被压缩不少。
换句话说:优惠还是有,但是把“顺手养一座免费域名/证书农场”这件事卡住了。