OpenClaw 出口流量管控 - AI Agent 的新安全市场
AI Agent 正在从工具演化为执行主体,而安全模型却仍停留在权限与资源层面。真正的风险不在资源访问,而在“意图生成与路径漂移”。本文通过 cgroup + TProxy + TLS SNI 的出口流控实验,分享一种可能的安全增强路径。未来的安全市场,或将围绕“Intent Security”重构,AI Agent 的普及,也许正是下一个安全产业周期的起点。 在 《AI 焦虑:从 OpenClaw 到黑客帝国 Agent Smith》 中,我们探讨了 AI Agent 能力的演进,以及由此带来的技术焦虑。 但焦虑只是表象。真正值得思考的问题是: 如果答案是否定的,那么一个新的安全市场几乎是必然出现的。 可以预见,类似 OpenClaw 这样的个人 AI Agent 软件,在不远的将来,会像 1990~2000 年代的 PC 软件一样快速普及。它可能运行在 PC、本地服务器,甚至移动设备之上。 而历史反复证明: 这已经不再是 Apple Siri、Google Assistant 或米家小爱同学那种“语音助手”。 这是具备执行能力、组合能力、甚至自我规划能力的系统。 能力越强,攻击面越大。 1990 年代,PC 软件进入爆发期。 我大约在 1995 年开始接触 PC。那是一个“功能优先”的时代。人们到处下载程序、交换软盘、安装未知来源的软件。直到病毒爆发。 历史规律非常清晰: AI Agent,正处在“执行能力放大”的起点。 传统安全体系建立在一个默认前提之上: 而 AI Agent 时代,结构发生了反转: 安全对象从: 转变为: 这不是概念上的修辞,而是安全边界的本质变化。 当 Agent 可以: 问题不再是“它是否有权限”,而是: 开发者已经意识到 Agent 需要被限制,因此 sandbox / container 成为常见设计。本地运行时隔离当然是必要手段之一,但问题远未结束。 系统层面: 用户权限层面: 但这些机制控制的是“资源访问”, 而不是“目标漂移”。 举例: 这个高层语义目标,可以拆解为无数种低层执行路径。 传统 RBAC 无法判断: 这意味着: 而这一切的不同,源于 Agent 的一个特点: 如果 PC 时代的安全产品保护的是 “文件系统”, 那么 AI Agent 时代的安全产品,保护的将是 “意图系统”。 这将是安全范式的一次迁移。 “The pessimist sees difficulty in every opportunity. —— Winston Churchill 每一次技术跃迁,都伴随安全市场的重构。 PC 带来了防病毒产业。 AI Agent,会带来什么? 下面是一个 PoC 级别的实验。 核心目标: 技术路径: 本例以 TLS/HTTPS 层出口流量控制为例,演示基于域名的策略路由与拦截。 我尝试部署一个 egress 控制网关,支持策略化选择 TLS/HTTPS 层流量的互联网出口。 我们知道,每个 Linux service 都运行在独立的 cgroup v2 层级中。 而每个 cgroup v2 可以设置自己的 tcp outbound TProxy 规则。 通过 nftables + policy routing + TProxy,可以实现: 这种方式的优势在于: 通过支持 TLS SNI 感知能力的 Proxy(如具备 sniffing 能力的开源 proxy),可以实现: 如果未来策略配置由一个“治理 Agent”动态维护, 这本质上,是“Agent 之间的博弈系统”。引
当 AI Agent 开始替人类执行真实世界的操作时,现有安全体系是否已经准备好?
每一次能力跃迁,都会伴随风险跃迁。
历史不会重复,但或会押韵
1996 年,中国 KV100 杀毒软件发布;
1998 年 CIH 让人第一次意识到 BIOS 都可以被破坏;
2000 年 ILOVEYOU 让病毒进入互联网传播阶段;
2003 年 SQL Slammer 证明网络可以在几分钟内被席卷;
2017 年 WannaCry 让勒索软件成为全球事件。每一次执行能力的放大,都会带来攻击能力的指数级放大。
风险
AI Agent 改变了安全的基本假设
人类发起操作,程序按照预定义逻辑执行。
人类描述目标
Agent 生成执行路径
系统完成具体操作意图(Intent)
它是否理解正确?
是否被 Prompt 注入误导?
是否在目标漂移中越界执行?Sandbox 不是终点
聊天作为主界面后, Agent 以什么身份授权操作?是操作的人类用户的全部权限?
Agent 有近乎人类的定制能力。以前的权限 RBAC 控制粒度,已经不能很好地识别和控制 high level 级别的实际意图。
用接地气的说法是,有太多方法可以 workaround 实现权限逃脱的目标了。
当我们类比 Agent 是个忠诚的秘书,那么,这个秘书怎么筛选来自互联网的信息?“帮我优化服务器性能”
我们缺少的是“执行路径可控层”,而不是更多权限规则。
Agent 的执行链是动态生成的。动态系统,必须配套动态安全层。
风险即机会
The optimist sees opportunity in every difficulty.”
互联网带来了防火墙与 IDS。
移动互联网带来了移动安全与应用市场审计。网络流控 PoC
让 AI Agent 的出口流量可标记、可分流、可审计。
+----------------------------------+
| +------------------+ | +-------------+
| | | | | |
| | OpenClaw | | TProxy | |
| | | +-------->| Proxy |
| ++-----------------+ | | |
| | | | |
| | +-------------------------+ | ++----+-------+
| +-+ child processes: | | | |
| | | | | |
| | bash commands: curl/...| | | |
| | browser: Chrome/... | | | |
| | | | | |
| +-------------------------+ | | |
| | | |
| Linux service cgroupv2 | | |
+----------------------------------+ | |
| |
v |
+-----------+ |
| Internet 1| |
+-----------+ |
|
+-----------+ |
| Internet 2|<-+
+-----------+ TProxy 流量
➜ $ systemctl --user status openclaw-gateway.service
● openclaw-gateway.service - OpenClaw Gateway (v2026.2.22-2)
Loaded: loaded (/home/mark/.config/systemd/user/openclaw-gateway.service; enabled; preset: enabled)
Drop-In: /home/mark/.config/systemd/user/openclaw-gateway.service.d
└─override.conf
Active: active (running) since Tue 2026-02-24 16:06:19 HKT; 8s ago
Main PID: 87270 (openclaw-gatewa)
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/openclaw-gateway.service
└─87270 openclaw-gateway#!/bin/bash
# Configuration
PROXY_PORT=12345
SERVICE_PATH="user.slice/user-1000.slice/user@1000.service/app.slice/openclaw-gateway.service"
MARK_ID=1
TABLE_ID=100
set -x
# set -e
echo "=== Setting up TPROXY for openclaw-gateway.service ==="
# 1. Create routing table for marked packets
echo "Configuring policy routing..."
ip rule del fwmark $MARK_ID table $TABLE_ID 2>/dev/null || true
ip -6 rule del fwmark $MARK_ID table $TABLE_ID 2>/dev/null || true
ip rule add fwmark $MARK_ID table $TABLE_ID
ip route add local 0.0.0.0/0 dev lo table $TABLE_ID
ip -6 rule add fwmark $MARK_ID table $TABLE_ID
ip -6 route add local ::/0 dev lo table $TABLE_ID
# 2. Delete existing table (outside heredoc)
echo "Configuring nftables..."
nft delete table inet tproxy_openclaw 2>/dev/null || true
# 3. Apply nftables ruleset
nft -f - <<EOF
table inet tproxy_openclaw {
# RFC1918 Private IPv4 Networks
set bypass_v4 {
type ipv4_addr
flags interval
elements = {
10.0.0.0/8,
172.16.0.0/12,
192.168.0.0/16,
127.0.0.0/8,
169.254.0.0/16,
224.0.0.0/4, # Multicast
240.0.0.0/4 # Reserved
}
}
# Private and Special IPv6 Addresses
set bypass_v6 {
type ipv6_addr
flags interval
elements = {
::1/128, # Loopback
fe80::/10, # Link-local
fc00::/7, # Unique local (ULA)
ff00::/8 # Multicast
}
}
chain output_mark {
type route hook output priority mangle; policy accept;
# Bypass local/private destinations
ip daddr @bypass_v4 return
ip6 daddr @bypass_v6 return
# Mark traffic from openclaw-gateway service
socket cgroupv2 level 5 "$SERVICE_PATH" meta l4proto tcp meta mark set $MARK_ID
}
chain prerouting_tproxy {
type filter hook prerouting priority mangle; policy accept;
# Handle already-established transparent connections
socket transparent 1 meta mark set $MARK_ID accept
# Redirect marked TCP traffic to TPROXY
meta l4proto tcp meta mark $MARK_ID \
tproxy ip to 127.0.0.1:$PROXY_PORT \
meta mark set $MARK_ID accept
meta l4proto tcp meta mark $MARK_ID \
tproxy ip6 to [::1]:$PROXY_PORT \
meta mark set $MARK_ID accept
}
}
EOF
echo "=== Setup complete! ==="
echo ""
echo "Verify with:"
echo " sudo nft list table inet tproxy_openclaw"
echo " sudo ip rule show"
echo " sudo ip route show table $TABLE_ID"流量路由
那么就形成了一个闭环:inbounds:
- port: 12345
protocol: dokodemo-door
settings:
network: tcp,udp
sniffing:
enabled: true
destOverride:
- http
- tls
streamSettings:
sockopt:
tproxy: tproxy # TPROXY inbound
outbounds:
- protocol: vm***
settings:
...
tag: internet_1
- protocol: vm***
settings:
...
tag: internet_2
- protocol: blackhole
settings: {}
tag: block
- protocol: freedom
tag: direct
settings: {}
routing:
domainStrategy: AsIs
rules:
- type: field
domain:
- domain:internet1.com
outboundTag: internet_1
- type: field
domain:
- domain:internet2.com
outboundTag: internet_2
- type: field
domain:
- domain:blocked_domain.com
outboundTag: blackhole
- type: field
ip:
- 192.168.0.0/16
- fc00::/7
- fe80::/10
outboundTag: direct
- type: field
ip:
- geoip:private
- geoip:XX
outboundTag: direct