一、简介:为什么工业 RT-Linux 必须“自带防火墙”?

  • 工业 4.0 场景下,机械臂、AGV、边缘 AI 盒子全部直连云端,实时操作系统 ≠ 安全操作系统

  • 一次“勒索软件”事件即可让整条产线停机 24 h,损失 > 百万。

  • 传统 iptables 规则冗长、性能抖动大;nftables 内核原生、延迟低,搭配 SELinux 强制访问控制(MAC),可实现“毫秒级实时 + 最小权限”双重保障。

掌握本文技能 = 让 RT-Linux 既跑得快,又扛得住


二、核心概念:5 个关键词速览

关键词 一句话 本文作用
RT-Linux 打 PREEMPT_RT 补丁的 Linux,中断延迟 < 50 μs 基础平台
nftables 内核 4.x 引入的下一代包过滤框架,语法简洁,延迟低 网络第一道门
SELinux 强制访问控制(MAC),“默认拒绝”任何访问 系统第二道门
最小权限 只开放业务必需的端口/文件权限,其余全堵 安全基线
延迟测试 cyclictest / hping3 量化防火墙对实时性的影响 验收指标

三、环境准备:10 分钟搭好实验沙箱

1. 硬件

  • x86_64 多核主板,≥2 核 4 GB 内存

  • 网卡:Intel I210/I211(驱动成熟,实时友好)

2. 软件

组件 版本 安装命令
RT 内核 5.15.71-rt53 见“一键脚本”
nftables 1.0.6+ 内核 ≥5.10 自带
SELinux 3.2+ apt install selinux-basics
测试工具 cyclictest, hping3, nmap 同上下载

3. 一键装 RT 内核(可复制)

#!/bin/bash
# install_rt.sh
VER=5.15.71
RT=patch-5.15.71-rt53.patch.xz
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v$VER/linux-image-${VER}-rt53_${VER}-rt53_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v$VER/linux-headers-${VER}-rt53_${VER}-rt53_amd64.deb
sudo dpkg -i linux*.deb
sudo update-grub
sudo reboot

重启选“RT 内核”进入,uname -r 出现 5.15.71-rt53 即可。


四、应用场景(300 字):边缘 AI 质检工位

某汽车零部件厂,在产线末端部署 RT-Linux 边缘盒:

  • 2 × GigE 相机触发周期 4 ms,AI 推理耗时 2.5 ms,剩余 1.5 ms 需完成网络上报与 PLC 握手;

  • 同时通过 5G 上云,存在被扫描/入侵风险;

  • 要求:网络延迟增加 < 100 μs,安全策略需阻挡除 22/443/502 之外全部端口,AI 模型文件只读不可改。

采用本文方案:

  1. nftables 默认丢弃,仅放行 SSH(22)、WebSocket(443)、Modbus-TCP(502);

  2. SELinux 给 AI 推理服务定制域 ai_t,仅允许读取 /opt/model/、绑定 502 端口;

  3. 上线后 cyclictest 测得最大延迟 38 μs,较未开防火墙仅增加 7 μs,满足实时需求。


五、实际案例与步骤:从零到“能抗扫描”

实验目录统一:~/security-lab,所有脚本放此处。

mkdir -p ~/security-lab && cd ~/security-lab

5.1 启用 nftables 并设置最小规则

# 1. 启用服务
sudo systemctl enable --now nftables

# 2. 清空旧规则
sudo nft flush ruleset

# 3. 写入最小规则(保存为 minimal.nft)
cat <<EOF | sudo tee minimal.nft
#!/usr/sbin/nft -f

table inet filter {
  chain input {
    type filter hook input priority 0;
    # 允许本地回环
    iif lo accept
    # 已建立连接
    ct state established,related accept
    # 放行 SSH + HTTPS + Modbus-TCP
    tcp dport {22, 443, 502} accept
    # 其余默认丢弃
    drop
  }
  chain forward { type filter hook forward priority 0; drop }
  chain output { type filter hook output priority 0; accept }
}
EOF

sudo nft -f minimal.nft

验证:另机 nmap -p 1-65535 <target> 只显示 22/443/502 开放,其余 filtered。


5.2 延迟对比:开/关防火墙各跑一次

# 关防火墙基准
sudo systemctl stop nftables
cyclictest -p99 -i100 -d60s -n > base.log &
# 60 s 后 Ctrl+C,看 Max
grep "Max" base.log

# 开防火墙
sudo systemctl start nftables
cyclictest -p99 -i100 -d60s -n > nft.log &
grep "Max" nft.log

典型结果(I210 网卡):

  • 关:Max 31 μs

  • 开:Max 38 μs
    差值 7 μs,在工业节点可接受。


5.3 启用 SELinux 并进入强制模式

# 1. 安装
sudo apt install selinux-basics selinux-policy-default auditd

# 2. 激活(需重启)
sudo selinux-activate
sudo reboot

重启后:

getenforce   # 应输出 Enforcing

5.4 为 AI 推理服务定制最小域

场景:可执行文件 /opt/ai/infer,模型只读 /opt/model/,监听 502。

# 1. 建立自定义模块目录
mkdir -p ~/security-lab/selinux
cd ~/security-lab/selinux

# 2. 编写策略 ai_infer.te
cat <<'TE' > ai_infer.te
policy_module(ai_infer, 1.0.0)

require {
  type port_t;
  type file_type;
  class tcp_socket name_bind;
  class file { read write };
  class dir search;
}

type ai_t;
type ai_exec_t;
domain_type(ai_t)
domain_entry_file(ai_t, ai_exec_t)

# 允许绑定 502
allow ai_t port_t:tcp_socket name_bind;

# 允许读模型目录
type ai_model_t;
files_type(ai_model_t)
allow ai_t ai_model_t:file read;
allow ai_t ai_model_t:dir search;
TE

# 3. 编译模块
make -f /usr/share/selinux/devel/Makefile
# 生成 ai_infer.pp
sudo semodule -i ai_infer.pp

5.5 打标签 & 测试

# 给文件打标签
sudo chcon -t ai_exec_t /opt/ai/infer
sudo chcon -R -t ai_model_t /opt/model/

# 运行服务
sudo -u ai-user /opt/ai/infer &
# 尝试写模型(应拒绝)
echo "corrupt" > /opt/model/resnet50.onnx
# 查看 AVC 拒绝日志
sudo ausearch -m avc -ts recent

预期:写操作被拒绝,audit 日志出现 denied { write } → 证明 MAC 生效。


5.6 一键检查脚本(可复制)

#!/bin/bash
# check-security.sh
echo "========== Firewall =========="
sudo nft list ruleset | grep -E "dport|drop"
echo "========== SELinux ==========="
getenforce
echo "========== Open Ports ========="
ss -tlnp
echo "========== AVC Recent ========="
sudo ausearch -m avc -ts recent | tail -5

跑完即可截图放报告。


六、常见问题与解答(FAQ)

问题 现象 解决
nftables 启动失败 Error: Could not process rule: No such file or directory 内核未开启 CONFIG_NF_TABLES → RT 内核打开即可
cyclictest 延迟暴增 > 200 μs 规则太多或日志级别 7 精简规则,关闭 trace;使用 limit 限速而非 log
SELinux 阻止 SSH 登录 无法远程 保留 sshd_t 域,切勿给 ssh_port_t 误删
容器内无法使用 nft 权限不足 docker run --cap-add=NET_ADMIN --cap-add=NET_RAW
5G 模块掉线 防火墙未放行 QMI 端口 增加 udp dport {700, 710} 规则

七、实践建议与最佳实践

  1. 规则从“默认拒绝”开始,逐步放行——比“全开放再封堵”更安全。

  2. 实时优先

    • 避免在 input 链大量使用 log(printk 会抢占)。

    • counter 做流量统计,再定时 nft list counters 批量读取。

  3. SELinux 策略最小化

    • 一个服务一个域,禁止 domain 自动转换。

    • audit2allow 仅添加必要允许,拒绝“一键 permissive”。

  4. 持续监控

    • Prometheus + node_exporter 采集 nft_counterselinux_avc_denied_total

    • Grafana 告警:AVC 拒绝突增 → 可能攻击或策略过严。

  5. 灾备回退

    • 保留串口或 IPMI 带外管理,防火墙策略误锁时可绕路。

    • 重大升级前 nft list ruleset > backup.nft,一键回滚。


八、总结:一张脑图带走全部要点

RT-Linux 安全加固
├─ nftables:默认丢弃,放行 22/443/502,延迟 < 50 μs
├─ SELinux:自定义域 ai_t,仅读模型,绑定 502
├─ 观测:cyclictest 量化延迟,AVC 日志审权限
└─ 监控:Prometheus 采集规则命中 & 拒绝计数

实时性与安全性并非零和——只要遵循“最小权限 + 量化验证”,你就能让工业节点既抗得住扫描,又跟得上节拍

立刻把本文 minimal.nftai_infer.te 复制到你的产线盒子,跑一遍 check-security.sh,下一波漏洞扫描,让攻击者只能看到“ filtered ”!祝你实时不掉线,安全不翻车。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐