我发布了一个零依赖Python库,允许你在runtime管理网络输出流量。它可以轻松集成到Django中。

什么它的作用

tethered限制了你的Python进程在runtime可以连接的主机。它在sys.addaudithook处截取socket操作,遵循一个白名单才能在机器上发送包。零依赖,避免基础设施更新。

import tethered
tethered.activate(allow=["*.stripe.com:443", "db.internal:5432"])
  • 主机名通配符
  • CIDR范围
  • IPv4/IPv6
  • 端口过滤器
  • Works with requests, httpx, aiohttp, Django, Flask, FastAPI - 在Python socket上运行的任何库
  • 只记录模式下的模式锁定
  • 模式无法关闭
  • on_blocked回调
  • 线程安全
  • 异步安全
  • Python 3.10–3.14

安装:uv add tethered

GitHub:[https://github.com/shcherbak-ai/tethered]

许可:** MIT **

Django集成

settings.py,wsgi.pymanage.py中调用activate(allow=[…])来激活tethered,防止你的应用开始之前。任何连接到白名单之外的主机都会引发 EgressBlocked(是一个RuntimeError,而不是OSError),因此不会被 HTTP库或重试逻辑无声地吞没。中间件应该捕捉并处理它。

目标受众

  • 关心供应链攻击的团队 - 偶尔引入的依赖不能打电话回家
  • LLM代理(大脑模型)开发者 - 约束他们只接收批准的API
  • 想要测试从生产端点隔离的任何人
  • 声明网络接口可以声明依赖项的后端工程师

比较

  • 防火墙/出向代理/服务网格:需要基础设施团队,管理员权限,运营在网络层面。tethered在进程内部,需要一个功能调用。
  • 出向代理服务(Squid, Smokescreen):有效,无论是在中央部署还是作为侧车部署,添加了运维复杂性,延迟和另一个维护的服务。tethered在进程内部,没有部署开销。
  • seccomp/OS sandbox:硬隔离,但OS特定,配置复杂。tethered可补充 - 为防御在深度提供两者。

tethered填补了无控制和一次基础设施更新之间的差距。