zerotrust.supply

零信任接入 · 出网默认拒绝

没有命中规则的连接,不会离开这台 Mac。

agent 同时核对 Team ID、Signing ID、cdhash、域名和端口。规则如果写了完整路径,整条路径也必须一致,而且不能只有路径没有 cdhash。接入点只在单包通过之后,拨 console 里登记的上游。

// 一个 agent · 签名和哈希 · 规则在 console · 上游地址不进单包

zerotrust — egress / demo
01
Browser
AB12CD34EF · ledger.internal:5432
ALLOWED
02
同名程序,cdhash 不同
文件名一样,哈希不是规则里的那一枚
DENIED
03
只写了路径
没有 cdhash 的规则不会加载
NOT LOADED
04
未登记域名
签名对,目标不在规则里
DENIED

缺口

名字挡不住出网。网段也不是授权。

按进程名放行

用文件名做豁免名单时,把自己的程序改成那个名字就能直连。云枢 2.5.12.16 的出网控制就是这样被绕过的。这里不读进程名,也不读 PID。

验完单包按源地址开门

fwknop 验包成功后给来源地址一条临时放行。NAT 后面很多人共用这个地址,上游会直接露出来。我们的单包只签发许可,不给上游加防火墙规则。

整网 VPN

进了网段就能扫旁边的机器。这里没有虚拟网卡。接入点只拨 console 里已经写明的那一个上游。

三步

规则在 console。拒绝在 Mac。拨号在接入点。

01

写入规则

console 跑在 Cloudflare Workers 上,规则进 D1。每次写入都会把快照发到 R2 的 snapshots/current.json。

02

本机默认拒绝

系统扩展只从 audit token 取出 Team ID、Signing ID、cdhash 和完整路径,交给本机的 Go 进程。300 毫秒没有答复就拒绝,不直连。

03

单包之后才拨上游

UDP 单包用 AES-256-GCM。标签不对就丢,不回包。通过之后的 TLS 还要证明持有这把临时私钥。接入点忽略会话里夹带的地址。

对照

相邻的做法各盖住一层。

能力按进程名按源地址开洞整网 VPNzerotrust.supply
Team ID、Signing ID、cdhash–––有
完整路径必须连同 cdhash–––有
单包失败不回包–有–有
不按源地址放行上游–––有
只拨已登记的上游–––有
执行白名单–––还没做。要单独向 Apple 申请 Endpoint Security

系统扩展还没有装到 Mac 上。端口是不是对扫描不可见,还没有在 Linux 上测过,所以这里不这么说。UDP 应用和 QUIC 第一期不转发。

console

demo 里有 18 条规则、4 个服务、3 台设备。

用 demo 账号登录就能看到。没有规则时,出网会被拒绝。

打开 console