跳转到内容

防火墙规则 ​

做完这一篇,你清楚 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)INPUTINPUT 是进入 NAS 的流量,OUTPUT 是 NAS 发出的
动作(Action)REJECTACCEPT 放行;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 本机服务的端口要填在目标端口
协议TCPTCP、UDP、ICMP、ICMPv6、全部,以及非 TCP、非 UDP、非 ICMP、非 ICMPv6。填了端口就不能选「全部」
扩展选项空原样附加在生成的 iptables 命令末尾,见下文
标签空备注

顺序决定结果:规则从上到下逐条匹配,第一条匹配并且动作是 ACCEPT、REJECT 或 DROP 的规则说了算,后面的不再看。LOG 不终止匹配。所以放行规则要放在拒绝规则前面。

它是怎么生效的 ​

应用时,Salt 的 iptables 状态生成脚本 /etc/iptables/openmediavault-firewall.sh 和 systemd 单元 openmediavault-firewall.service(一次性服务,开机自启),然后重启这个服务:

  1. 先执行 stop:清空 INPUT 和 OUTPUT 两条链(IPv4 和 IPv6 都清),并把它们的策略设为放行。
  2. 再执行 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.service

systemd-run 创建的是一次性的定时器单元,不依赖当前会话,SSH 断了也照样执行。5 分钟后防火墙服务被停掉,规则清空。时间从你执行命令的这一刻开始算,所以要在准备点 应用 之前再执行,不要提前很久。规则测试没问题,就取消它:

sh
# 在 OMV 的 shell 里执行(root)
systemctl stop omv-fw-safety.timer

OMV 官方文档的做法,是建一个每 5 分钟清空 INPUT 和 OUTPUT 的计划任务,测完再删。忘了删它,你的规则会一直被清掉,所以这里推荐一次性的定时器。这个办法是本文按 systemd 的行为设计的,没有在 OMV 8 上实测,第一次用请在控制台旁试一遍。

示例:只让管理电脑访问 SSH 和 Web 界面 ​

假设管理电脑是 192.168.1.10,SSH 端口 22(可在 服务 → SSH(Services → SSH)里改),Web 界面端口 80(可在 系统 → 工作台(System → Workbench)里改;启用 HTTPS 的还有 443)。这组规则只管住管理入口,不影响 SMB 等别的服务:

顺序方向动作来源目标端口协议
1INPUTACCEPT127.0.0.1留空全部
2INPUTACCEPT192.168.1.1022TCP
3INPUTACCEPT192.168.1.1080TCP
4INPUTREJECT留空22TCP
5INPUTREJECT留空80TCP

第 1 行不能省。 OMV 的 Monit 会定时用 127.0.0.1 访问 Web 界面端口做存活检查,连不上就重启 nginx(见源码里的 Monit nginx 检查)。没有这条放行规则,第 5 行会把 Monit 也挡在外面,nginx 会被反复重启。

端口一栏一次只能写一个端口或一个范围,所以每个端口一条规则;用了 HTTPS 的,再各加一对 443 的规则。

  1. 在 IPv4 标签页点 添加,按表中第 1 行填写,标签写个备注,点 保存。
  2. 依次添加另外四条。新规则总是追加在末尾,按表里的顺序添加就不用调整。
  3. 检查列表顺序对不对;不对就 上移 或 下移,再点工具栏的 保存 图标。
  4. 在控制台设好上一节的自动恢复。
  5. 点黄色提示条上的 应用,确认框里点 是。
  6. 马上测试,见下面的「检查结果」。没问题再取消自动恢复。

另外几件事 ​

  • LOG 规则:想知道哪些包被拒绝,在 REJECT 前面加一条条件相同、动作为 LOG 的规则。官方文档说日志在 dmesg 或 syslog 里(诊断 → 系统日志(Diagnostics → System Logs)里可以看)。记录很多,调试完就删。
  • IPv6:有单独的标签页。IPv6 没启用就不用管,启用了要在 IPv6 标签页里再写一遍,否则从 IPv6 来的流量不受限制。
  • 别做「默认拒绝」:把所有没放行的都拒绝,意味着要先放行回环接口和已建立的连接,否则 NAS 自己发起的连接(DNS、更新)的回包也会被拒绝。这些要靠 扩展选项 写 iptables 匹配,例如 -i lo 和 -m conntrack --ctstate ESTABLISHED,RELATED,这是 iptables 的通用写法,没有在 OMV 上实测。新手不建议这样做,整体收紧放到路由器或交换机上更稳妥。

检查结果 ​

  1. 在管理电脑上,SSH 和 Web 界面应该都还能用:

    sh
    # 在管理电脑(macOS 或 Linux)上执行
    nc -vz <NAS 的 IP> 22
    nc -vz <NAS 的 IP> 80

    Windows 的 PowerShell 用 Test-NetConnection <NAS 的 IP> -Port 22。

  2. 换一台不在放行名单里的电脑,同样的测试应该失败:REJECT 立刻返回「连接被拒绝」,DROP 要等到超时。

  3. 在 OMV 的 shell(root)里确认规则已加载:

    sh
    # 在 OMV 的 shell 里执行,只读
    systemctl status openmediavault-firewall.service   # 应为 active (exited)
    iptables -L INPUT -n -v --line-numbers             # 规则按顺序列出,带命中计数
    iptables-save                                      # 完整规则,求助时贴这个,别贴界面截图
  4. 过几分钟再看一眼 systemctl status nginx,确认 nginx 没有被 Monit 反复重启。

  5. 确认自动恢复已经取消:systemctl list-timers 里没有 omv-fw-safety。

  6. 重启 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 界面修正规则。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。