1.52.0
- 【新增·「端口与协议不符」类目】判"矛盾"而不是"可疑"：某个端口上出现了绝不属于它的东西。
  判据数据来自引擎内置的 **IANA 端口注册表**（714 条：0-1023 全部公认端口 + 一组有实际流量的
  注册端口，由 IANA 的 CSV 生成而非手抄），分组出"这个端口不可能承载什么"。
  例：SMTP 的 25 端口上跑Web明文流量 —— 这正是你举的例子。它比"非标端口"强在：非标端口只是
  事实（可能完全正常），而矛盾是两个独立事实互相打架，误报率因此有界。
- 【宽松/严格两档】判据分两级，面板上可切换：
  · 宽松（默认）：只用"绝无可能"一级 —— 邮件端口跑Web、共享/远程管理端口跑Web、数据库端口跑Web、
    这些端口上出现SSH。敢拦，因为它要求两个事实矛盾。
  · 严格：加上"很反常"一级 —— 协议在该端口没有TLS形态（445上出现TLS）、端口承诺加密却出现明文
    （443上跑明文HTTP）。这一级是线索不是判决，默认关闭。
  刻意排除的误报（有测试钉住）：邮件端口的TLS（STARTTLS是正常的邮件提交方式）、3389的TLS
  （RDP的现代默认）、21的TLS（显式FTPS）、1433的TLS（SQL Server加密）、389的TLS（StartTLS）。
  这些一旦标出来，每个正常在这种端口上工作的人都会上板子，而一次误伤就足以让操作员不再看板子。
- 【新增·高危端口名单】25/135/139/444/445/5800/5900（运营商与云厂商默认封堵，来源：阿里云ECS
  常见端口说明）。这是**信息**不是判决：端口高危不代表流量可疑，它代表**服务**放在这里很反常 ——
  而这正是隧道会躲的地方。
- 【新增·端口表接口】/api/v1/ports/reference 返回判据用到的端口、它们的IANA名字、以及每个端口
  上不容许什么（含中文说明与命中的两级）。判据要可解释：只给一个开关的拦截功能，操作员在第一次
  误伤之后就会永久关掉它。
- 【记录·一条被权威表纠正的记忆】IANA 现在把 465 注册为 urd，不是多数资料仍在写的 smtps。
  端口表以注册表为准，并有测试钉住这一点，免得日后有人"修回"成记忆里的名字。

1.51.0
- 【新增·「Cloudflare CDN」作为一种类型】上一版把CF豁免写成了规则里的 cloudflare_cdn(...) 调用；
  按你的意见改成**一个类型**：协议库里多一条「Cloudflare CDN」，判据是"目的地属于CF地址段 **且**
  端口是CF公开端口"。非标端口类目的豁免因此变成引用它：portstd != nil && cloudflarecdn == nil
  —— 豁免所豁免的东西从此在协议库里有名字、看得见、改得动，而不是表达式里的一段条件。
  这个类型默认关，而且面板上写明：**拦它几乎总是错的**（CF上是一大块正常网站）。它的意义是
  ①让豁免有名字 ②操作员能基于它写自己的规则。
- 【保留·cloudflare_cdn 内置函数】表达式里仍可用 cloudflare_cdn(ip, 端口)，供自定义规则直接判。
  它与类型读的是引擎里同一份 cloudflare 清单，不存在两份数据。
- 【记录·面板为什么不用它命名流量】这个类型**不参与**流量记录的命名（analyzerOf 里没有它）：
  CF 上是全世界一大块普通 HTTPS，用它命名会把实时看板刷满"Cloudflare CDN"，而操作员要看的是
  "这条是不是隧道"。要判断某条流量是不是CF CDN，看协议库与规则即可。


（本包内只保留最近的版本记录，完整历史见项目仓库的 changelog。
原因：插件市场的安装器把整条记录作为一个命令行参数交给 sqlite3，而系统对
单个参数有硬上限（131072 字节）——包内文本过大会导致注册失败。）
