PDNS+FOSSBILLING平台折腾

34次阅读
没有评论

最近这几个月,我一直在用 FOSSBilling + PowerDNS 搭一个自己的 DNS / 证书平台,顺便当成 VPS 吧的基础设施实验场。中间改了不少东西,踩了不少坑,也修了一些典型的“薅羊毛”问题。

简单记一下现在这个项目到底长成了什么样。

───

  1. 域名注册规则:别再随便乱搞了

一开始的域名系统几乎不设防,只要前端能填,后台就能收。结果很快暴露几个问题:

  • 有人注册一堆奇怪长字符串当域名,纯属玩票;
  • 有人拿看上去正常、其实根本不会真正托管的域名来“蹭资源”。

所以我做了几件事:

  • 限制域名字符长度
    太短的、太长的都不允许,避免 a、超级长一整句句子.com 这种博眼球型域名。
  • 保留部分域名 / 前缀
    平台自用的域名、关键字域名直接加入保留列表,用户看不到,也注册不了。
  • 更严格的格式校验
    只接受正常的字母、数字、连字符组合,避免各种诡异符号。

简单粗暴,但直接让“乱注册”和“玩梗域名”的空间小了很多。

───

  1. 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 来的、有没有报错。

───

  1. DNSSEC & DS:不仅能开,还能看得懂

DNSSEC 和 DS 记录也做了一轮梳理:

  • 对托管在我这的纯 DNS 域名:
    • 可以一键开启 / 关闭 DNSSEC;
    • 前端会展示当前的 DS 记录,一键复制粘贴到注册商后台;
    • 还会做一次“上游 DS 健康检查”,告诉你父域有没有 DS、DS 是否匹配、最近一次检查时间。
  • 对使用第三方 DNS 的域名:
    • 也支持在域名订单的 DNSSEC TAB 里单独管理 DS;
    • 用的还是同一套 Servicedns/Servicedomain 的 DS 解析逻辑。

总之,不再是“我开了 DNSSEC 但到底配成啥样我自己也不知道”的状态。

───

  1. 证书系统:从 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 → 私钥

复制的时候几乎不用思考:点哪个按钮,就往对方同名输入框里贴什么。

───

  1. NS 强制 + 自动清理:防“挂名不托管”

有一类典型的“薅羊毛”行为是:

  • 在平台开了一个 DNS 服务;
  • 但 NS 根本没切过来,或者只是做了形式上的 NS 记录;
  • 实际解析还跑在别处,真正的流量和责任不在这边。

为了这个问题,我做了几件事:

  1. NS + SOA 双重判定
    不仅看 NS 记录是不是我们的,还看 SOA 是不是真正权威已经迁过来。
  2. 48 + 48 小时自动清理模型
    • 新开的 DNS 服务前 48 小时不扫,给迁移留时间;
    • 之后如果检测到 NS/SOA 不对:
    • 第一天记下首次异常时间;
    • 48 小时内只是观察;
    • 满 48 小时发一封警告邮件;
    • 再过 48 小时还不修,就自动删除这个 DNS 服务,并发一封“已移除”通知。

只要中间任何时候把 NS 和 SOA 配正确,这个计时器就会自动清空,不会被误删。

───

  1. 薅羊毛相关的坑:简单记几类

上线之后,现实用户的创造力总是超出预期。比较典型的几类“薅羊毛”/误用场景:

6.1 DNS 不迁 NS,只想蹭功能

有人在平台开 DNS 服务,但 NS 根本没切过来,只是想蹭:

  • DDNS
  • 证书
  • 或者单纯想要一个“在我这有个订单”的感觉

NS + SOA 强制 + 自动清理机制上线后,这一类基本被挡掉了。

6.2 证书被当成“无限刷的免费资源”

有人反复点“申请证书”,完全不管冷却、也不管证书还有多久过期。

解决方式就是:

  • 冷却逻辑:尊重 CA 的 Retry-After,默认 1 天冷却;
  • 时间窗口:距离过期大于 30 天的,不再新建请求;
  • 前端用中文描述原因,告诉你“不是坏了,是我故意不让你再刷”。

6.3 一个优惠码下单一堆域名

还有一个比较典型的坑:优惠码的设计太宽松。

  • 一开始的优惠券是按「订单」打折,没有限制“一个优惠码最多配多少个域名”;
  • 结果就是:
    • 有人用一张优惠码直接下单一串域名;
    • 单个域名看起来没啥,叠在一起就变成一波“批发注册”。

调整之后做了几件事:

  • 对某些敏感优惠码:
    • 限制使用次数(比如每个账户只允许用一次);
    • 或者只允许搭配特定商品(而不是任何 DNS/域名都能用)。
  • 对域名侧的限制(长度、保留词)叠加起来,整体可玩空间被压缩不少。

换句话说:优惠还是有,但是把“顺手养一座免费域名/证书农场”这件事卡住了。

正文完
 0
评论(没有评论)