通过 Antivirus app for Files,可以让 Nextcloud 自动扫描新上传文件。该应用集成开源 ClamAV 引擎,检测木马、病毒、蠕虫等恶意软件,支持 Windows、Linux、Mac 文件、压缩包、可执行文件、图片、Flash、PDF 等多种格式。Freshclam 守护进程定期更新病毒特征库。
ClamAV 支持 Linux、其他 Unix 类系统和 Windows,但与 Nextcloud 的组合只在 Linux 上测试过,因此本文针对 Linux。先安装 ClamAV,再安装并配置 Nextcloud 防病毒应用。
安装 ClamAV
不同发行版的安装配置方式不同。
Debian、Ubuntu、Linux Mint
apt-get install clamav clamav-daemon
安装器会自动创建默认配置并启动 clamd 与 freshclam,无需其他必要步骤,但建议阅读文档并检查 /etc/clamav/。调试期间可在 clamd.conf 和 freshclam.conf 开启详细日志。
RHEL 7 与 CentOS 7
先安装 EPEL,再安装 ClamAV:
yum install epel-release
yum install clamav clamav-scanner clamav-scanner-systemd clamav-server
clamav-server-systemd clamav-update
安装生成 /etc/freshclam.conf 与 /etc/clamd.d/scan.conf,运行前必须编辑两者。文件内有详细注释,也可查阅 man clamd.conf 与 man freshclam.conf。核对用户和组时,查看 /etc/passwd 与 /etc/group。
先配置 freshclam。它负责更新病毒库,应频繁运行。安装后手动下载首批特征:
freshclam
EPEL 包没有 freshclam init 文件,可以用 cron 定期检查。以下在每小时第 47 分钟运行:
# m h dom mon dow command
47 * * * * /usr/bin/freshclam --quiet
尽量避开 10 的倍数分钟,那些时刻更新服务器负载最高。
再编辑 scan.conf,完成后启用并启动:
systemctl enable clamd@scan.service
systemctl start clamd@scan.service
在运行符合预期之前,保持 scan.conf 与 freshclam.conf 的详细日志。
Docker 与 Docker Compose
可以使用 ClamAV 官方镜像,或自行构建。以下基于 Cisco Talos ClamAV。
把容器 socket 作为卷挂载到主机,就不必向外暴露端口。Docker 命令:
docker run --name clamav -d -v /var/run/clamav/:/var/run/clamav/ -v /var/docker/clamav/virus_db/:/var/lib/clamav/ clamav/clamav:stable_base
Compose 配置:
version: "3.6"
services:
clamav:
image: "clamav/clamav:stable_base"
container_name: "clamav"
volumes:
# Socket
- /var/run/clamav/:/var/run/clamav/
# Virus DB
- /var/docker/clamav/virus_db/:/var/lib/clamav/
restart: unless-stopped
启用文件防病毒应用
将 files_antivirus 放入 Nextcloud 服务器的 apps 目录,然后在应用页面启用。

在 Nextcloud 配置 ClamAV
先进入管理页面,将日志级别改为 Everything:

找到 Antivirus Configuration 面板:

ClamAV 支持三种模式:
- Daemon (Socket):与 Nextcloud 同服务器,clamd 后台运行。空闲时负载很低,大量上传时 CPU 占用会升高。
- Daemon:ClamAV 在另一服务器运行,适合上传量大的 Nextcloud。
- Executable:与 Nextcloud 同机,每次上传启动再停止 clamscan。该方式较慢,按需使用不总可靠,优先选守护进程模式。
Daemon (Socket)
Nextcloud 应自动检测 socket 并填入 Socket 字段,对应 clamd.conf 的 LocalSocket。可用 netstat 核对:
netstat -a|grep clam
unix 2 [ ACC ] STREAM LISTENING 15857 /var/run/clamav/clamd.ctl

Stream Length 是每次读取字节数,默认 26214400,即 25 MiB。不得超过 PHP 的 memory_limit;若 memory_limit 为 -1,则不应超过物理内存。
“扫描发现感染文件时的动作”可选择只记录告警而不删除,或立即删除感染文件。
Daemon
填写远程 ClamAV 服务器主机名或 IP,以及端口。

Executable
填写交互式扫描命令 clamscan 的路径,Nextcloud 通常会自动找到。

运行符合预期后,可以将所有日志级别调低。
确认扫描有效
防病毒厂商使用标准测试病毒字符串,测试很方便。文件见 EICAR 测试文件。
上传会触发错误:Virus Win.Test.EICAR_HDB-1 is detected in the file. Upload cannot be completed.,表示检测到测试病毒,无法完成上传。
加密文件检测限制
默认情况下,ClamAV 对密码保护压缩包和加密文件仍可能返回 OK。这是已知行为,会绕过应用的“阻止无法扫描文件”选项。
可在 clamd.conf 配置额外告警:
AlertEncryptedArchive:使用启发式特征,对加密 zip、7zip、rar 告警。AlertEncryptedDoc:对加密 PDF 等文档告警。AlertEncrypted:同时对加密归档与文档告警。
可靠检测与阻止加密文件的方法,应参考可用防病毒后端的文档。
管理后台扫描器
后台扫描通常无需手动干预,但可以查看或执行相关任务。
工作方式
每次运行按优先级分三轮处理,最多扫描配置的批次大小:
- 未扫描文件:包括应用安装前就存在的文件。随着任务反复运行,最终都会扫描。
- 已修改文件:修改时间晚于上次扫描时间的文件。
- 过期扫描文件:距上次扫描超过 28 天的文件,以考虑病毒库更新。天数由
av_rescan_days配置。
默认最多每 15 分钟运行一次,实际频率还受 Nextcloud 的 cron、webcron 或 ajax 后台任务频率限制。修改最小间隔秒数:
sudo -E -u www-data php occ config:app:set files_antivirus av_scan_interval --value="900"
修改重新扫描天数:
sudo -E -u www-data php occ config:app:set files_antivirus av_rescan_days --value="28"
外部存储参与前两轮,即首次扫描和修改后重扫。周期性的第三轮仅适用于 files/ 下的主存储,不包含外部存储。
查看扫描队列
sudo -E -u www-data php occ files_antivirus:status [-v]
手动触发后台扫描
sudo -E -u www-data php occ files_antivirus:background-scan [-v] [-m MAX]
扫描单个文件
sudo -E -u www-data php occ files_antivirus:scan <path>
标记已扫描或未扫描
sudo -E -u www-data php occ files_antivirus:mark <path> <scanned|unscanned>
标记为已扫描的文件,之后四周不会再扫描。
配置 ICAP
Nextcloud 也支持基于 ICAP 协议的防病毒集成。设置如下图,进一步文档仍在编写中。

禁用后台扫描
如果只希望上传时扫描,可通过 occ 关闭后台扫描:
sudo -E -u www-data php occ config:app:set files_antivirus av_background_scan --value="off"
注意:将 av_rescan_days 设为 0 不会关闭周期重扫。小于 1 的值会被静默替换为默认 28 天,因此仍按正常计划运行。必须用上面的 av_background_scan 才能完全停止后台扫描。
原文:Antivirus scanner。作者/维护方:Nextcloud 文档维护者。本文为中文翻译,代码及命令保留原文。











暂无评论内容