AppArmor 默认禁止所有网络行为,必须显式声明network规则才能放行;规则格式为network [family] [type] [, protocol],需严格匹配程序实际调用的socket参数,如network inet raw,用于traceroute,且不支持通配符。

AppArmor 可以精确控制进程是否能创建特定类型、协议或地址族的 socket,但默认策略通常不包含网络规则——没写即禁止。要限制网络行为,必须显式声明 network 规则,且需匹配程序实际调用的 socket() 参数。
确认 AppArmor 正在拦截网络行为
别假设它在起作用。先验证:
- 运行 sudo aa-status | grep -E "(nginx|mysqld|traceroute)",确认目标进程 profile 已加载且处于 enforce 模式
- 查拒绝日志:sudo dmesg | grep -i "apparmor.*socket\|operation=\"socket_create\"",典型报错如 operation="socket_create" family="inet" sock_type="raw" protocol=1
- 若用 traceroute -T 失败,或服务启动时提示 Permission denied 且涉及
socket、bind、connect,大概率是 AppArmor 拦截
编写 network 规则的正确写法
network 规则格式为:network [family] [type] [, protocol]。必须与程序实际调用一致,否则无效。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- network inet stream, —— 允许 IPv4 TCP(如 Nginx 建立客户端连接)
- network inet6 dgram, —— 允许 IPv6 UDP(如 DNS 查询)
- network netlink raw, —— 允许 netlink 原始套接字(如某些监控工具),不加则禁止
-
network inet raw, —— 允许 IPv4 原始套接字(
traceroute -T、ping所需),这是最常被拦的项 - 不支持通配符,不能写
network *或network inet;family 和 type 必须成对出现
常见服务的网络权限示例
不同服务所需 socket 类型差异大,照搬易出错:
-
Nginx:通常只需 network inet stream,(反向代理建连)+ network inet dgram,(UDP 日志转发),禁用
raw更安全 - MariaDB:若只监听本地,加 network inet stream, 即可;若启用远程访问,才需明确允许该端口绑定,AppArmor 不管端口号,只管 socket 类型
-
traceroute / ping:必须含 network inet raw,(ICMP/TCP 探测);SuSE 默认策略常禁用此项,导致
Permission denied - 自定义后台程序:用 strace -e trace=socket,bind,connect your-program 查清它调用了哪些 socket 参数,再按需放行
加载与验证网络限制是否生效
改完配置不会自动应用,且错误规则会导致服务无法启动:
- 语法检查并重载:sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
- 重启服务使新策略生效:sudo systemctl restart nginx
- 验证 profile 状态:sudo aa-status --verbose | grep nginx,确认无 parse error 且 mode 为 enforce
- 复现原操作(如 curl、traceroute),再查 dmesg 确认不再出现 socket 相关 denied 记录

















