外观
防火墙规则
做完这一篇,你清楚 OMV 内置防火墙的边界,并且能在不锁死自己的前提下加规则,例如只让管理电脑访问 SSH 和 Web 界面。
先问:你需要它吗
OMV 的防火墙是 iptables 外面的一层简单界面:只管 filter 表的 INPUT(进入 NAS 的流量)和 OUTPUT(NAS 发出的流量)两条链。没有区域,没有预设规则,也没有默认拒绝:没有被规则匹配到的流量一律放行。
家里的 NAS 躲在路由器后面、没有端口映射时,通常不需要它。常见用途是:只让管理电脑访问管理入口;限制别的网段或 VLAN 访问 NAS;小团队服务器上多加一层。
| 防火墙 | 负责 |
|---|---|
| 路由器或网关 | 互联网到内网、不同网段之间的流量。不要把 NAS 的管理端口映射到公网,见远程访问 |
| OMV 防火墙 | 到达 NAS 本机的流量和 NAS 发出的流量,包括同网段内的访问控制 |
| 都管不到 | Docker 发布的容器端口 |
Docker 官方文档(ufw 一节)写明:发布端口的流量在到达 INPUT 和 OUTPUT 链之前就被转走,防火墙配置实际上被绕过。OMV 的规则只写 INPUT 和 OUTPUT,所以同样管不到容器发布的端口。限制容器端口要在容器一侧或反向代理处做,见反向代理与 HTTPS;以 Docker 官方文档为准。
防火墙规则可能把你自己锁在门外
- 影响范围:规则对 NAS 本机的所有连接生效,Web 界面、SSH、SMB 都受影响。新建规则表单的默认值是:方向 INPUT、动作 REJECT、协议 TCP,来源和端口留空,这等于拒绝所有进来的 TCP 连接。不改默认值就保存并应用,Web 界面和 SSH 会一起被挡掉。
- 前置条件:有本机控制台;知道管理电脑的 IP,并且它不会变(做 DHCP 预留或用静态地址);点 应用 之前,先设好下面的「自动恢复」。
- 回退:在控制台以 root 执行
systemctl stop openmediavault-firewall.service,它会清空 INPUT 和 OUTPUT 链并把策略设回放行;再到 Web 界面修正规则。omv-firstaid没有防火墙相关的菜单项。
规则页
网络 → 防火墙 → 规则(Network → Firewall → Rules)。页面上有 IPv4 和 IPv6 两个标签页,规则各自独立。列表的列是:方向、动作、来源、端口、目标、端口、协议、扩展选项、标签。
工具栏按钮:保存(磁盘图标,平时是灰的)、添加、编辑、上移、下移、删除。
- 添加 和 编辑 的表单点 保存 后直接写入配置,新规则追加在列表末尾。
- 上移、下移、删除 只改页面上的列表,要点工具栏上的 保存 图标才写入配置,界面提示「已更新的防火墙规则」。
- 不论哪种改动,最后都要点黄色提示条上的 应用 才会生效。
规则表单:
| 字段 | 默认值 | 说明 |
|---|---|---|
| 系列(Family) | 所在标签页 | 只读,IPv4 或 IPv6 |
| 方向(Direction) | INPUT | INPUT 是进入 NAS 的流量,OUTPUT 是 NAS 发出的 |
| 动作(Action) | REJECT | ACCEPT 放行;REJECT 拒绝并回复错误,对方立刻看到「连接被拒绝」;DROP 悄悄丢弃,对方会等到超时;LOG 记日志并继续匹配后面的规则;没有(Nothing)表示不带动作,只匹配 |
| 来源(Source) | 空 | 单个 IP、网段(如 192.168.1.0/24)或 IP 范围(如 192.168.1.10-192.168.1.20)。前面加 ! 表示「非」 |
| 源端口 | 空 | 单个端口、端口范围或取反,例如 21、!443、1024-65535 |
| 目标、目标端口 | 空 | 写法同上。NAS 本机服务的端口要填在目标端口 |
| 协议 | TCP | TCP、UDP、ICMP、ICMPv6、全部,以及非 TCP、非 UDP、非 ICMP、非 ICMPv6。填了端口就不能选「全部」 |
| 扩展选项 | 空 | 原样附加在生成的 iptables 命令末尾,见下文 |
| 标签 | 空 | 备注 |
顺序决定结果:规则从上到下逐条匹配,第一条匹配并且动作是 ACCEPT、REJECT 或 DROP 的规则说了算,后面的不再看。LOG 不终止匹配。所以放行规则要放在拒绝规则前面。
它是怎么生效的
应用时,Salt 的 iptables 状态生成脚本 /etc/iptables/openmediavault-firewall.sh 和 systemd 单元 openmediavault-firewall.service(一次性服务,开机自启),然后重启这个服务:
- 先执行 stop:清空 INPUT 和 OUTPUT 两条链(IPv4 和 IPv6 都清),并把它们的策略设为放行。
- 再执行 start:该族有规则时,再清空一次,然后按列表顺序用
iptables -A逐条追加。
「扩展选项」会接在每条命令的最后。写错了,脚本会在那一条中止:前面的规则已经生效,后面的没有。
这个脚本会清空整条 INPUT 和 OUTPUT 链,别的工具放进这两条链的规则(例如 Fail2ban 的封禁规则)也会被一起清掉。这是按源码做的推断,没有实机验证:应用防火墙变更后,检查那些工具的规则还在不在,必要时重启它们的服务,见 Fail2ban。
点应用之前,先设好自动恢复
在 root 会话(本机控制台或 SSH)里设一个 5 分钟后自动生效的保险:
sh
# 在 OMV 的 shell 里执行(root)
systemd-run --on-active=5min --unit=omv-fw-safety systemctl stop openmediavault-firewall.servicesystemd-run 创建的是一次性的定时器单元,不依赖当前会话,SSH 断了也照样执行。5 分钟后防火墙服务被停掉,规则清空。时间从你执行命令的这一刻开始算,所以要在准备点 应用 之前再执行,不要提前很久。规则测试没问题,就取消它:
sh
# 在 OMV 的 shell 里执行(root)
systemctl stop omv-fw-safety.timerOMV 官方文档的做法,是建一个每 5 分钟清空 INPUT 和 OUTPUT 的计划任务,测完再删。忘了删它,你的规则会一直被清掉,所以这里推荐一次性的定时器。这个办法是本文按 systemd 的行为设计的,没有在 OMV 8 上实测,第一次用请在控制台旁试一遍。
示例:只让管理电脑访问 SSH 和 Web 界面
假设管理电脑是 192.168.1.10,SSH 端口 22(可在 服务 → SSH(Services → SSH)里改),Web 界面端口 80(可在 系统 → 工作台(System → Workbench)里改;启用 HTTPS 的还有 443)。这组规则只管住管理入口,不影响 SMB 等别的服务:
| 顺序 | 方向 | 动作 | 来源 | 目标端口 | 协议 |
|---|---|---|---|---|---|
| 1 | INPUT | ACCEPT | 127.0.0.1 | 留空 | 全部 |
| 2 | INPUT | ACCEPT | 192.168.1.10 | 22 | TCP |
| 3 | INPUT | ACCEPT | 192.168.1.10 | 80 | TCP |
| 4 | INPUT | REJECT | 留空 | 22 | TCP |
| 5 | INPUT | REJECT | 留空 | 80 | TCP |
第 1 行不能省。 OMV 的 Monit 会定时用 127.0.0.1 访问 Web 界面端口做存活检查,连不上就重启 nginx(见源码里的 Monit nginx 检查)。没有这条放行规则,第 5 行会把 Monit 也挡在外面,nginx 会被反复重启。
端口一栏一次只能写一个端口或一个范围,所以每个端口一条规则;用了 HTTPS 的,再各加一对 443 的规则。
- 在 IPv4 标签页点 添加,按表中第 1 行填写,标签写个备注,点 保存。
- 依次添加另外四条。新规则总是追加在末尾,按表里的顺序添加就不用调整。
- 检查列表顺序对不对;不对就 上移 或 下移,再点工具栏的 保存 图标。
- 在控制台设好上一节的自动恢复。
- 点黄色提示条上的 应用,确认框里点 是。
- 马上测试,见下面的「检查结果」。没问题再取消自动恢复。
另外几件事
- LOG 规则:想知道哪些包被拒绝,在 REJECT 前面加一条条件相同、动作为 LOG 的规则。官方文档说日志在 dmesg 或 syslog 里(
诊断 → 系统日志(Diagnostics → System Logs)里可以看)。记录很多,调试完就删。 - IPv6:有单独的标签页。IPv6 没启用就不用管,启用了要在 IPv6 标签页里再写一遍,否则从 IPv6 来的流量不受限制。
- 别做「默认拒绝」:把所有没放行的都拒绝,意味着要先放行回环接口和已建立的连接,否则 NAS 自己发起的连接(DNS、更新)的回包也会被拒绝。这些要靠 扩展选项 写 iptables 匹配,例如
-i lo和-m conntrack --ctstate ESTABLISHED,RELATED,这是 iptables 的通用写法,没有在 OMV 上实测。新手不建议这样做,整体收紧放到路由器或交换机上更稳妥。
检查结果
在管理电脑上,SSH 和 Web 界面应该都还能用:
sh# 在管理电脑(macOS 或 Linux)上执行 nc -vz <NAS 的 IP> 22 nc -vz <NAS 的 IP> 80Windows 的 PowerShell 用
Test-NetConnection <NAS 的 IP> -Port 22。换一台不在放行名单里的电脑,同样的测试应该失败:REJECT 立刻返回「连接被拒绝」,DROP 要等到超时。
在 OMV 的 shell(root)里确认规则已加载:
sh# 在 OMV 的 shell 里执行,只读 systemctl status openmediavault-firewall.service # 应为 active (exited) iptables -L INPUT -n -v --line-numbers # 规则按顺序列出,带命中计数 iptables-save # 完整规则,求助时贴这个,别贴界面截图过几分钟再看一眼
systemctl status nginx,确认 nginx 没有被 Monit 反复重启。确认自动恢复已经取消:
systemctl list-timers里没有omv-fw-safety。重启 NAS 一次,规则应仍然存在(服务开机自启)。
常见问题
保存了规则但没有生效。 没点黄色提示条上的 应用。
删除或调整顺序之后,刷新页面又变回去了。 这些操作只改页面上的列表,要点工具栏的 保存 图标。
加了拒绝规则,别的东西也连不上了。 拒绝规则的范围太宽,或者排在放行规则前面。回到规则页检查顺序,必要时 上移。
Web 界面时好时坏,nginx 老是重启。 多半是拒绝规则把 127.0.0.1 也挡了,Monit 的检查连不上。补上第 1 行那样的回环放行规则,并放在拒绝规则前面。
应用时报错,或防火墙服务启动失败。 用 systemctl status openmediavault-firewall.service 和 journalctl -u openmediavault-firewall.service 看原因,多半是 扩展选项 写错了。
规则对容器端口无效。 见前面:Docker 发布的端口不经过 INPUT 链。
Fail2ban 的封禁规则不见了。 防火墙应用时会清空整条 INPUT 链,重启 Fail2ban 服务可以让它重新放置规则。
把自己锁在外面了。 在本机控制台以 root 执行 systemctl stop openmediavault-firewall.service,再到 Web 界面修正规则。