
AgentENV沙箱网络内幕网络命名空间、veth与出站代理的实现全解析【免费下载链接】AgentENVAgentENV (AENV) is a distributed platform for running agent environments at scale.项目地址: https://gitcode.com/gh_mirrors/age/AgentENVAgentENVAENV是一个用于大规模运行 AI Agent 环境的分布式平台其沙箱网络由Linux 网络命名空间、veth 虚拟网卡对与命名空间本地出站代理Egress Proxy三层机制构成每个 Firecracker 微虚拟机独享一个网络命名空间通过 veth 对接入宿主机并由透明的出站代理实现域名级出口管控。本文将用通俗语言带你完整看懂这套沙箱网络的数据面实现。一图看懂沙箱网络拓扑 ️每个运行中的沙箱都拥有独立的网络命名空间Firecracker 虚拟机通过 TAP 设备连入命名空间命名空间再通过 veth 对连到宿主机。官方架构文档给出了完整的拓扑示意拓扑图与包路径细节可参考官方内部架构文档docs/src/internals/networking.md地址规划三组地址各司其职沙箱网络的所有地址都由 src/sandbox/network/address_plan.rs 中的NetworkAddressPlan根据**槽位索引slot**推导分配配置来自 config/default.toml 的[network.internal]段落地址默认网段作用host_interaction_ip10.11.0.0/16每槽位 /31宿主机访问 VM 的交互地址也是出口流量的统一身份veth_host_ip/veth_vm_ip10.12.0.0/16每槽位 /31veth 对两端宿主机侧veth-{slot}与命名空间侧vpeervm_ip/tap_ip固定169.254.0.21/169.254.0.22VM 与 TAP 之间的固定链路端点一个精妙的设计是internal_egress_denied_cidrs()会把全部三个内部地址池整体拒绝见 address_plan.rs#L71-L80。也就是说即使用户策略放行一切沙箱也永远摸不到其他沙箱的命名空间、veth 链路或 VM 链路——多租户之间天然隔离。veth 配对沙箱如何接入宿主机 命名空间是 Linux 内核隔离网络栈的标准手段。Slot::create_network()在专用线程中完成整套初始化因为网络命名空间归属是线程相关的流程非常清晰在运行时netns目录下创建并 bind-mount 持久化的命名空间文件unshare(CLONE_NEWNET)进入全新网络命名空间并创建 veth 对把宿主机端点移回基线宿主机命名空间命名为veth-{slot}配置lo、vpeer、tap0、地址、链路状态与命名空间默认路由开启命名空间 IPv4 转发写入命名空间 NAT/过滤规则配置宿主机 veth 地址与指向该槽位交互 IP 的主机路由。其中 veth 对就像一根网线vpeer一头插在沙箱命名空间里veth-{slot}一头插在宿主机上。命名空间内再加一条经veth_host_ip的默认路由VM 的流量就自然被引向宿主机。相关实现集中在 src/sandbox/network/slot.rs全局槽位位图、预热池与宿主机 iptables 则由 src/sandbox/network/manager.rs 中的NetworkManager统一管理。包怎么走的出口流量的完整旅程一次沙箱访问外网的流量要经历命名空间内 SNAT → 宿主机 MASQUERADE两段变换出站包从eth0→tap0→ 命名空间PREROUTING可能先被重定向到代理→FORWARD过滤链 →POSTROUTINGSNAT 成槽位的host_interaction_ip宿主机随后对该源地址段做MASQUERADE发往互联网回程流量被ESTABLISHED,RELATED规则先行放行保证策略热更新期间既有连接不断流。宿主机侧只装一套进程级防火墙规则INPUT 拒绝来自沙箱的新连接、FORWARD 放行、POSTROUTING 伪装规则定义见 docs/src/internals/networking.md 的 Host Firewall 一节。出站代理 EgressProxy域名级管控的关键 纯 IP/CIDR 规则管不住只允许访问*.example.com这类域名策略AgentENV 的答案是命名空间本地透明出站代理实现在 src/sandbox/network/egress_proxy.rs透明当策略需要域名管控时命名空间 NAT 链把 TCP 80/443 端口 REDIRECT 到0.0.0.0:15000。代理用SO_ORIGINAL_DST取回被改写的真实目标地址VM 内的应用完全无感知每命名空间独立监听注册表是进程全局的但每个启用代理的命名空间有自己的监听 socket 与 accept 线程因此固定端口 15000 不会冲突深度识别代理最多缓冲 64 KiB 握手前导字节解析 HTTPHost头或 TLS ClientHello 的 SNI跨 TLS record 边界累积解析信任解析域名解析交给常驻宿主机命名空间的 DNS workersrc/sandbox/network/resolver.rs每个候选 IPv4 地址都要先通过策略检查才被选用失败即关闭fail-closed存在域名白名单时空主机名或无法识别的主机名不允许回退到默认放行策略。代理不终结 TLS、不改写 HTTP 内容拿到判定后直接把缓冲的前导字节写给上游双向中继并处理半关闭——对流式长连接非常友好每个代理最多 256 条连接但不设空闲超时。iptables 规则链三层防线与用户策略每个命名空间里由 src/sandbox/network/iptables_util.rs 管理三条链静态链顺序是先放行平台流量再谈用户规则AGENTENV-EGRESS静态入口先放行ESTABLISHED,RELATED放行到客户机 DNS 的 53 端口拒绝全部内部地址池与always_denied_cidrs最后跳转用户链AGENTENV-USER-EGRESS可整体替换按allowOut→denyOut→ 基础策略Deny时拒绝0.0.0.0/0的顺序渲染AGENTENV-EGRESS-PROXY可替换 NAT 链承载代理 REDIRECT 规则。策略语义与匹配顺序节点级拒绝 → allowOut → denyOut → 基础策略在 src/sandbox/network/policy.rs 中归一化用户可见的行为契约见 docs/src/concepts/sandboxes/networking.md。节点级永远拒绝的默认清单包括10.0.0.0/8、127.0.0.0/8、169.254.0.0/16等私网段沙箱策略无法覆盖config/default.toml#L147-L157。策略热更新如何做到无感切换 运行中的沙箱可以直接替换出口策略入口是 slot.rs#L459 的set_egress_policy()核心是原子性新策略先存入代理的pending映射需要代理中介时确保命名空间监听器存在用一次iptables-restore批量提交 filter 与 NAT 链替换新策略在批次成功后才激活若从无代理状态开启代理则先激活策略再装 REDIRECT避免新连接在旧策略默认放行下溜进代理更新失败则丢弃 pending、保留旧策略。每条连接在 accept 时刻持有当时策略的副本因此更新主要影响新连接不会主动掐断既有中继。预热池与生命周期NetworkManager::allocate_any()会优先从预热池取现成的Slot沙箱停止后槽位可以回流复用——命名空间与基线网络保留user_egress_rules_present标记下次租户是否需要重写用户链避免上一个沙箱的规则残留。进程退出时管理器依次停止池维护、排空热槽位、关闭全部代理监听、移除宿主机全局规则与命名空间状态另有atexit钩子与Drop路径兜底异常退出。源码导读从哪读起想深入沙箱网络实现建议按以下顺序阅读模块路径关注点网络管理总入口src/sandbox/network/manager.rs槽位位图、预热池、宿主机 iptables、关闭流程命名空间与 vethsrc/sandbox/network/slot.rscreate_network()六步初始化、策略应用地址规划src/sandbox/network/address_plan.rs槽位地址推导、内部拒绝网段出口代理src/sandbox/network/egress_proxy.rs监听、SNI/Host 解析、中继、策略替换规则渲染src/sandbox/network/iptables_util.rs三条管理链与 iptables-restore 批次策略语义src/sandbox/network/policy.rsallow/deny 归一化、绝对拒绝判定宿主机 DNS workersrc/sandbox/network/resolver.rs进程级可信域名解析官方文档方面面向用户的配置契约在 docs/src/concepts/sandboxes/networking.md面向实现者的架构说明在 docs/src/internals/networking.md两者搭配阅读最高效。总结AgentENV 的沙箱网络用三块经典积木搭出了既隔离又灵活的出口管控体系网络命名空间给每个沙箱一个独立网络房间TAP 接 VM、veth 接宿主机地址规划 全池拒绝让多租户间互不可达且无法被用户策略覆盖透明出站代理 iptables 三层链把域名白名单这类细粒度策略做到 fail-closed还支持运行时无感热更新。理解这套实现不仅能帮你正确配置沙箱网络策略也为在其他平台Firecracker、Cloud Hypervisor、gVisor上设计安全出口管控提供了很好的参照。【免费下载链接】AgentENVAgentENV (AENV) is a distributed platform for running agent environments at scale.项目地址: https://gitcode.com/gh_mirrors/age/AgentENV创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考