openai/softnet
GitHub: openai/softnet
Softnet 是专为 Tart 虚拟化工具设计的用户空间网络包过滤器,提供虚拟机网络隔离以防止 ARP 欺骗,并优化 DHCP 租约策略以缓解大规模临时虚拟机创建时的地址耗尽问题。
Stars: 62 | Forks: 26
# Softnet
Softnet 是一款专为 [Tart](https://github.com/cirruslabs/tart) 设计的软件网络工具,它提供了更好的网络隔离,并缓解了生产系统上的 DHCP 短缺问题。
它本质上是一个用户空间的包过滤器,用于限制虚拟机网络并防止一系列安全问题,例如 ARP 欺骗。默认情况下,虚拟机只能:
* 从自身的 MAC 地址发送流量
* 从 DHCP 分配给它的 IP 地址发送流量
* 向全局可路由的 IPv4 地址发送流量
* 向 vmnet 桥接的网关 IP 发送流量(通常是 "bridge100" 接口)
* 接收任何传入流量
此外,Softnet 会调整 macOS 内置的 DHCP 服务器,将其租约时间从默认的 86,400 秒(一天)减少到 600 秒(10 分钟)。当您使用 Tart 在一天内克隆并运行大量临时虚拟机时,这一点尤为重要。
请查看[此博客文章](https://cirrus-ci.org/blog/2022/07/07/isolating-network-between-tarts-macos-virtual-machines/)了解背景故事。
## 工作模型
Softnet 解决了两个问题:
1. 虚拟机网络隔离
* [`VZNATNetworkDeviceAttachment`](https://developer.apple.com/documentation/virtualization/vznatnetworkdeviceattachment)(Tart 中的默认网络方式)默认启用了 [vmnet 的桥接隔离](https://developer.apple.com/documentation/vmnet/vmnet_enable_isolation_key)并阻止了跨虚拟机的流量,然而,任何虚拟机仍然可以通过使用能够发起 [ARP 欺骗攻击](https://en.wikipedia.org/wiki/ARP_spoofing)的工具(例如 [arpspoof](https://www.monkey.org/~dugsong/dsniff/)、[arpoison](http://www.arpoison.net/) 等)来伪造主机的 ARP 表,并捕获其他虚拟机的流量
2. DHCP 耗尽
* macOS 内置的 DHCP 服务器默认分配租约时间为 86400 秒的 `/24` 子网,每天只允许生成大约 253 台虚拟机(或大约每 6 分钟生成 1 台虚拟机)而不会导致拒绝服务,这对于像 Cirrus CI 这样的 CI 服务来说非常局限
并且假设:
1. Tart 为其虚拟机分配唯一的 MAC 地址
2. macOS 内置的 DHCP 服务器在租约到期之前,不会重新使用其地址池中的 IP 地址
...否则,两台虚拟机有可能从 macOS 内置的 DHCP 服务器接收到相同的 IP 地址(即使有 Softnet 的数据包过滤存在),从而绕过 Softnet 提供的保护。
## 安装
为了正常运行,Softnet 二进制文件需要满足两个条件:
* 在该二进制文件上设置 [SUID 位](https://en.wikipedia.org/wiki/Setuid#SUID),或配置[免密码 sudo](https://serverfault.com/questions/160581/how-to-setup-passwordless-sudo-on-linux),这将有效地赋予该二进制文件 `root` 权限
* 这些权限是创建 [`vmnet.framework`](https://developer.apple.com/documentation/vmnet) 接口并执行与 DHCP 相关的系统调整所必需的
* 一旦所有初始化工作完成,这些权限将自动降级为调用用户的权限(或由 `--user` 和 `--group` 命令行参数所代表的权限)
* 该二进制文件必须在 `PATH` 中可用
* 以便 Tart 能够找到它
## 运行
如果在调用 `tart run` 时提供了 `--net-softnet` 标志,Softnet 将由 Tart 自动启动并管理。
标签:DHCP, Tart, 数据包过滤, 用户态网络, 网络隔离, 虚拟化, 通知系统