一、简介:为什么工业 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 模型文件只读不可改。
采用本文方案:
nftables 默认丢弃,仅放行 SSH(22)、WebSocket(443)、Modbus-TCP(502);
SELinux 给 AI 推理服务定制域
ai_t,仅允许读取/opt/model/、绑定 502 端口;上线后 cyclictest 测得最大延迟 38 μs,较未开防火墙仅增加 7 μs,满足实时需求。
五、实际案例与步骤:从零到“能抗扫描”
实验目录统一:~/security-lab,所有脚本放此处。
mkdir -p ~/security-lab && cd ~/security-lab5.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 # 应输出 Enforcing5.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.pp5.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}规则 |
七、实践建议与最佳实践
规则从“默认拒绝”开始,逐步放行——比“全开放再封堵”更安全。
实时优先:
避免在
input链大量使用log(printk 会抢占)。用
counter做流量统计,再定时nft list counters批量读取。
SELinux 策略最小化:
一个服务一个域,禁止
domain自动转换。用
audit2allow仅添加必要允许,拒绝“一键 permissive”。
持续监控:
Prometheus + node_exporter 采集
nft_counter、selinux_avc_denied_total。Grafana 告警:AVC 拒绝突增 → 可能攻击或策略过严。
灾备回退:
保留串口或 IPMI 带外管理,防火墙策略误锁时可绕路。
重大升级前
nft list ruleset > backup.nft,一键回滚。
八、总结:一张脑图带走全部要点
RT-Linux 安全加固 ├─ nftables:默认丢弃,放行 22/443/502,延迟 < 50 μs ├─ SELinux:自定义域 ai_t,仅读模型,绑定 502 ├─ 观测:cyclictest 量化延迟,AVC 日志审权限 └─ 监控:Prometheus 采集规则命中 & 拒绝计数实时性与安全性并非零和——只要遵循“最小权限 + 量化验证”,你就能让工业节点既抗得住扫描,又跟得上节拍。
立刻把本文minimal.nft和ai_infer.te复制到你的产线盒子,跑一遍check-security.sh,下一波漏洞扫描,让攻击者只能看到“ filtered ”!祝你实时不掉线,安全不翻车。