ZeroTierOne的MPL-2.0合规避坑解析
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
周五傍晚,你把改了三十行的 LinuxEthernetTap.cpp 提交进公司私有仓库,想着等内部评审完再公开。周一早上邮件到了:这个文件来自 ZeroTierOne,采用 MPL-2.0 许可,修改过的文件在分发时就必须以同一许可公开源码。这篇文章只解决一个问题——你碰了这个仓库的代码之后,哪些文件必须开源,哪些可以留在私有仓库。
文件级copyleft:只追到文件,不追到整个项目
MPL-2.0 最关键的设计决策是"文件级"触发。看 LICENSE-MPL.txt 的 §1.10,"Modifications" 的定义是按文件算的:被改动的文件,以及包含其代码的新文件,才属于"被覆盖的源码"。这和 GPL(项目级 copyleft,组合后整体都算衍生作品、必须整体开源)、MIT(宽松型,分发时只要求保留声明)放在一条轴上对比,MPL 恰好卡在中间:你改了一页,就只公开这一页,剩下的书可以锁进抽屉。
这个仓库的目录结构就是照着这条边界画的。根目录 LICENSE.txt 把全仓切成三块:node/、osdep/、service/ 下的核心代码走 MPL 许可;nonfree/ 是 source-available(源码可查、商用要买授权)许可;ext/ 保留第三方库的原始许可。你把 ZeroTierOne 的 agent(负责加入虚拟网络的客户端守护进程)集成进自己的产品时,没碰过的文件维持原样,只有你改过的文件进入义务范围。
四个最容易踩坑的条款逐条翻译
改过就得开源的那批文件
LICENSE-MPL.txt §3.1 只说了一件事:分发被覆盖源码(包括你的修改)必须沿用 MPL 许可,并告知接收方如何获取许可文本。仓库里 node/Node.cpp 这类文件头部都写着 MPL 声明,那就是"被覆盖"的标记。你一旦修改 osdep/LinuxEthernetTap.cpp(Linux 下的 TAP 虚拟网卡实现),这个文件就成为你的义务载体。
// 错误:改了 LinuxEthernetTap.cpp 却只交付二进制 // → 违反 §3.1,必须以同一许可发布源码 // 正确:保留原 MPL 头声明,并在其下补一行修改说明 /* Modified by Acme 2025-06: buffer pool reuse */ // 同时把这个文件的源码放进分发包如果你改了代码、留在私有仓库、只给客户发二进制——产品出货那一刻就构成违约,许可会按 §5.1 自动终止。
专利授权没写到的那一半
§2.1 给了你专利许可,但 §2.3(b) 划出例外:它只覆盖每位贡献者自己的贡献部分,不覆盖"该代码与其他软件组合"的情形,也不覆盖你自己修改造成的侵权。node/ 下的 ECC.cpp、AES.cpp(椭圆曲线与对称加密实现)属于被覆盖部分。如果你以为"用了 MPL 就全链路专利免疫",把一个自研加密模块硬塞进 agent 里,组合产生的专利风险由你承担,ZeroTier 不替你背书。
商标和名字不随代码给你
§2.3 最后一段写得很直白:本许可不授予贡献者商标、服务标志或 logo 的任何权利。如果你把原版图标原样放进产品、还取名"ZeroTier One 企业版",等来的会是商标混淆层面的函件。代码权利随许可白给,品牌权利要单独谈,这两条线必须分开。
同一个仓库里的三种许可
⚠️ 这是本仓库风险最高的一条。根 LICENSE.txt 写明 nonfree/ 受 nonfree/LICENSE.md 约束:个人、教学、30 天以内评估免费,但"Commercial Use"(含任何营利实体的使用)必须另签商业协议。嵌入式网络控制器 nonfree/controller/EmbeddedNetworkController.cpp 就在这个区。如果你用 ZT_NONFREE=1(这个开关就写在 debian/rules 里)构建出"完整版"再作为商业服务转售,会直接撞上 nonfree 许可的付费条款,而 agent 的免费部分不受影响——分区处理,别一锅端。
内部部署、SaaS、二次售卖的合规动作表
| 你的用法 | 要做的 | 不能做的 | 参考文件 |
|---|---|---|---|
| 内部部署,不分发 | 保留头声明与许可文本,记录改过的文件 | 不删 MPL 头、不对外流出二进制 | debian/rules |
| 交付客户 / SaaS | 修改文件提供完整源码及获取方式(§3.2) | 不裸发二进制、不无授权混入 nonfree 组件 | pkg/snap/snapcraft.yaml |
| 二次开发售卖 | 修改文件继续按 MPL 开源,你的新文件可闭源 | 不把 nonfree/ 代码混进开源部分 | nonfree/LICENSE.md |
commit 前的一次自查
全文最有用的判断只有一句:MPL-2.0 只追"你改过的文件",而本仓库真正的商业红线在 nonfree/ 里。下次 commit 前跑一遍git diff --name-only,把每个改动文件对着 node/ 和 osdep/ 核一遍,改过的文件在头部补一行修改说明。后续如果看到根 LICENSE.txt 或 nonfree 许可文本有版本更新,回来重新核对一次分区——许可边界是按发布版本走的,值得每次发版前验证一遍。
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考