apparmor 可通过 deny network 规则禁止程序联网,但需确保内核模块启用(cat /sys/module/apparmor/parameters/enabled 返回 y)、profile 文件名与可执行路径严格匹配(如 /usr/bin/telnet.netkit 对应 usr.bin.telnet.netkit)、规则置于 {} 内且 profile 处于 enforce 模式(sudo aa-enforce 设置),否则无效。

AppArmor 可以有效禁止程序访问网络,但配置不当容易失效——关键在于规则写法、模式启用和 profile 加载三者必须同时正确。
确认 AppArmor 已启用并运行
先验证基础环境是否就绪:
- 检查内核模块是否启用:
cat /sys/module/apparmor/parameters/enabled,返回 Y 表示已加载 - 查看服务状态:
systemctl is-active apparmor,应为 active - 确认 profile 已加载:
aa-status | grep -E "(profiles|enforce)",需看到目标程序处于 enforce 模式
编写正确的网络限制规则
核心是使用 deny network,但它必须放在 profile 主体中、且不能被更宽泛的规则覆盖。常见错误包括:
- 规则位置错误:必须写在 profile 大括号
{ }内部,不能在#include块里 - 缺少必要权限:即使禁止网络,仍需保留
capability net_admin,或其他基础能力(视程序而定),否则进程可能启动失败 - 路径命名不匹配:profile 文件名必须与可执行文件路径严格对应,
/usr/bin/telnet.netkit对应文件名应为usr.bin.telnet.netkit(斜杠替换成点)
正确示例:
# /etc/apparmor.d/usr.bin.telnet.netkit
#include <tunables><p>/usr/bin/telnet.netkit {</p>
<h1>include <abstractions></abstractions>
</h1>
<p>deny network,
}</p></tunables>确保 profile 处于 enforce 模式
AppArmor 默认可能运行在 complain 模式(只记录不拦截),导致 deny network 看似无效:
- 临时切换全部 profile 到 enforce:
sudo aa-enforce /etc/apparmor.d/* - 单独强制某个 profile:
sudo aa-enforce /etc/apparmor.d/usr.bin.telnet.netkit - 验证:
aa-status | grep telnet应显示 (enforce),而非 (complain)
测试与排错要点
配置生效后,用实际命令验证,而非仅看连接是否“成功”:
- 运行
telnet.netkit 127.0.0.1 22后,立即查日志:dmesg | tail -10 | grep -i apparmor,若看到 operation="connect" 和 denied,说明规则已触发 - 若连接仍通,检查进程是否真受控:
ps auxZ | grep telnet,输出中应含 profile 路径,且无 unconfined - 注意:loopback(127.0.0.1)连接有时会绕过部分网络限制,建议同步测试外网地址(如
8.8.8.8)或禁用 IPv6 后重试











