核心思路是“进程行为管控+网络出口限制”,需通过SELinux/AppArmor实施强制访问控制,结合iptables/nftables按UID/cgroup细粒度拦截,并辅以auditctl、eBPF等实时监控异常联网行为。

核心思路是“进程行为管控+网络出口限制”,不能只靠防火墙封端口,得从源头控制谁可以联网、连哪里、用什么协议。
明确哪些进程该有网络权限
先梳理业务必需的联网进程,比如 nginx、redis-server、systemd-resolved;其他如 cron、rsyslog、udev 等默认不应主动外连。可通过以下方式识别异常外联:
- 用
ss -tunlp或lsof -i -P -n查看当前所有监听和主动连接的进程 - 用
auditctl -a always,exit -F arch=b64 -S connect -k net_connect审计所有 connect 系统调用,配合 ausearch 分析非预期进程 - 检查 systemd 服务单元文件,确认
RestrictAddressFamilies=AF_INET AF_INET6或CapabilityBoundingSet=~CAP_NET_BIND_SERVICE是否被误删
用强制访问控制(MAC)锁定进程网络能力
SELinux 或 AppArmor 是关键防线,它们能阻止即使 root 权限的进程发起未授权连接。
- SELinux:确保处于 enforcing 模式(
getenforce返回 Enforcing),对自定义服务启用network_client或bind_port类型域,禁用net_admin权限 - AppArmor:为关键服务(如 python3、node)编写 profile,显式声明
network inet tcp或deny network inet udp,用aa-logprof辅助生成最小策略 - 避免全局放行:
abstractions/base默认含网络能力,需手动剔除或覆盖
结合防火墙做出口级细粒度拦截
iptables/nftables 可基于进程 UID/GID 或 cgroup 作出口过滤,比单纯按端口更精准。
- 按用户限制:添加规则拒绝某 UID 的 outbound 流量(仅允许白名单用户)
iptables -A OUTPUT -m owner --uid-owner 1001 -j REJECT - 按 cgroup 限制(推荐用于容器/服务隔离):
创建 cgroup v2 目录/sys/fs/cgroup/net-restricted,将非必要服务加入,再用 nftables 匹配@cgroup丢弃其 OUTPUT 流量 - 阻断非常用协议:默认 DROP 所有
OUTPUT中非 TCP/UDP/ICMP 的流量(如 raw socket、GRE、ESP),防止隐蔽隧道
运行时监控与自动响应
策略不是一次配置就完事,要持续感知异常联网行为并快速干预。
- 部署 eBPF 工具(如 tracee 或 bpftrace)实时捕获新进程的 connect() 调用,输出到日志或告警系统
- 用 systemd 的
ExecStartPre=/usr/bin/systemctl is-system-running类机制,在服务启动前校验其网络策略是否加载 - 集成 fail2ban 针对 audit 日志中的高频 connect 尝试,自动封禁对应 PID 所属用户或临时拉黑其 cgroup
- 每日定时扫描:
find /proc/[0-9]*/fd -lname "socket:*" 2>/dev/null | xargs -r -n1 readlink | grep -v "00000000:"快速发现未绑定监听但已建立连接的可疑进程

















