很多人有个误解:Linux 不会中毒。事实是,Linux 服务器同样会被植入恶意程序——挖矿木马、WebShell、后门、勒索软件、以及专门针对服务器组件的蠕虫。而且 Linux 服务器承担的往往不是"个人电脑"的角色,它是 Web 服务、文件共享、邮件网关的载体。一台被感染的服务器,不只是它自己出事,还可能成为攻击其他机器的跳板、给用户分发病毒的源头。
ClamAV 是 Linux 上最常用的开源反病毒引擎,由 Cisco 维护(现归属 Cisco Talos)。它的定位是文件扫描而非实时防护,特别适合几类场景:文件服务器/网盘的入库扫描、邮件网关的附件过滤、Web 上传目录的定期排查、以及服务器应急时"扫一遍看有没有已知恶意文件"。它自带命令行扫描器 clamscan、常驻守护进程 clamd、以及配合 Mail 的 clamav-milter。
这篇文章讲清楚:ClamAV 的原理和它适合/不适合做什么、如何在不同发行版上安装、如何更新病毒库(这是新手最容易卡住的地方)、如何在服务器上做全盘和定向扫描、如何用 clamd + onaccess 做准实时防护,以及怎么把它接进日常运维。文中命令以 root 或 sudo 执行。
一、先理解 ClamAV 的能力边界
用任何安全工具之前,搞清楚它能做什么、不能做什么,比会敲命令更重要。ClamAV 的核心是特征码匹配:它把已知恶意文件的特征(签名)维护成一个病毒库,扫描时拿文件内容去比对。这意味着两件事。
第一,它只能查出"已知"的恶意文件。全新出现的、没有特征入库的样本,ClamAV 查不出来。这不是 ClamAV 的问题,所有基于特征的杀毒引擎都一样。所以扫描前务必先更新病毒库,否则可能用的是几天甚至几周前的特征。
第二,它是文件扫描,不是行为防护。ClamAV 主要看"这个文件是不是已知恶意文件",而不太关注"某个进程在做什么可疑行为"。所以它防不住纯内存运行的挖矿程序、防不住不需要落地文件的攻击。真正全面的防护要靠多层:主机入侵检测(HIDS)、文件完整性监控(AIDE)、auditd、以及 Web 层防护配合。
基于这个定位,ClamAV 最适合的用法是定期扫描 + 入库扫描,而不是指望它做实时拦截。下面这张表把 ClamAV 的几个组件和适用场景列清楚:
| 组件 | 命令/服务 | 特点 | 适用场景 |
|---|---|---|---|
| 命令行扫描器 | clamscan | 单次扫描,慢,逐文件加载库 | 应急排查、小目录 |
| 守护进程 | clamd | 常驻内存,扫描快 | 大批量/定期扫描 |
| 客户端 | clamdscan | 调用 clamd 扫描 | 配合 clamd 使用 |
| 实时监控 | clamonacc | 基于 fanotify 的准实时 | 上传目录、共享目录 |
| 邮件过滤 | clamav-milter | 配合 MTA | 邮件网关 |
| 病毒库更新 | freshclam | 定时更新特征库 | 必需,定时运行 |
需要提醒的是内存占用:clamd 常驻内存通常需要 1GB 以上(加载完整病毒库,经验值,随库大小增长),小内存(如 512MB)的机器上跑 clamd 会很吃力,这时候更适合用 clamscan 按需扫描。另外 clamscan 是单线程逐文件扫描,全盘扫描几百万文件可能要几个小时,要做好心理预期。
二、安装:不同发行版的做法
ClamAV 在各发行版的官方源里基本都有,直接装最省事。
# RHEL/CentOS/Rocky 系(需要 EPEL 源)
dnf install -y epel-release
dnf install -y clamav clamav-update clamd
# 老系统用 yum
# yum install -y epel-release && yum install -y clamav clamav-update clamd
# Debian/Ubuntu 系
apt update
apt install -y clamav clamav-daemon
安装后先看版本和目录结构:
clamscan --version
# 配置文件
# /etc/clamav/ (Debian/Ubuntu)
# /etc/clamd.d/clamd.conf 及 /etc/freshclam.conf (RHEL 系)
# 病毒库目录通常为 /var/lib/clamav/
ls -la /var/lib/clamav/
这里有个新手必踩的坑:刚装完是没有病毒库的,直接扫描会报 "Can't open file or directory" 或提示需要先更新。必须先跑 freshclam 下载特征库,而特征库有一两百 MB(经验值,随版本增长),下载需要时间。如果服务器在国内且网络受限,可能需要配置镜像源来加速 freshclam——下文会讲。
三、更新病毒库:freshclam 配置与国内镜像
freshclam 负责从官方源下载 main.cvd、daily.cvd、bytecode.cvd 等特征文件。更新失败是 ClamAV 使用中的头号问题,原因通常是网络、权限或镜像。
# 手动更新一次(-v 显示详细过程)
freshclam -v
# 如果报权限错误(普通用户无法写病毒库目录),先确认目录属主
ls -ld /var/lib/clamav/
# Debian 系通常是 clamav:clamav,RHEL 系可能是 clamav 或 root
国内服务器更新慢或失败时,可以换用国内镜像。在 /etc/freshclam.conf(RHEL)或 /etc/clamav/freshclam.conf(Debian)里配置:
# 指定数据库镜像(示例:使用公开镜像,具体地址以你实际可用的为准)
DatabaseMirror db.local.clamav.net
# 或者一次配置多个,freshclam 会自动轮询
DatabaseMirror database.clamav.net
# 每天检查更新次数
Checks 12
配置自动更新很关键——特征库每天都在变,不更新等于白装。各发行版通常已经配好了定时任务:
# RHEL 系:检查是否有 cron 或 timer
ls /etc/cron.d/ | grep clam
systemctl list-timers | grep clam
# Debian 系:freshclam 由 systemd 服务驱动
systemctl status clamav-freshclam
# 手动触发一次更新服务
systemctl restart clamav-freshclam # Debian 系
RHEL 系的 clamav-update 包会提供 clamav-freshclam 服务,可以启用:
systemctl enable --now clamav-freshclam
如果 freshclam 与 clamd 的病毒库文件权限冲突(常见于手动跑 freshclam 之后 clamd 读不到),注意保持病毒库属主一致,或者以运行 clamd 的用户身份执行 freshclam。RHEL 系通常在 /etc/sysconfig/freshclam 里设置了 FRESHCLAM_DELAY 等参数。
四、扫描:从定向排查到全盘检查
扫描分几个层次,按需选择。扫描前务必先 freshclam 更新库,这是前提。
# 1. 扫单个文件
clamscan /path/to/suspicious.file
# 2. 扫一个目录(如 Web 上传目录),-r 递归,-i 只显示被感染的文件
clamscan -r -i /var/www/html/wp-content/uploads
# 3. 扫目录,输出日志到文件,便于事后查看
clamscan -r -i -l /var/log/clamscan_$(date +%F).log /var/www/html
# 4. 全盘扫描(-i 只输出感染项,--exclude-dir 排除虚拟文件系统)
clamscan -r -i \
--exclude-dir="^/proc" \
--exclude-dir="^/sys" \
--exclude-dir="^/dev" \
--exclude-dir="^/run" \
/ 2>/dev/null
# 5. 扫描压缩包内的文件(-a 强制扫描所有文件,含归档格式)
clamscan -r -i --archive=yes /var/www/uploads
全盘扫描耗时较长(经验值:几十万到上百万文件可能需要一至数小时),建议放到业务低峰期,并注意它会大量占 IO,可能影响线上服务。更务实的做法是定向扫描高风险目录:上传目录、临时目录、用户家目录、Web 根目录、以及 /tmp、/var/tmp、/dev/shm。攻击者植入的恶意文件基本都落在这几处。
# 推荐的高风险目录扫描组合(经验清单)
clamscan -r -i /tmp /var/tmp /dev/shm
clamscan -r -i /var/www
clamscan -r -i /home
如果服务器已经装了 clamd(守护进程),用 clamdscan 扫描会快很多,因为它不需要每次重新加载病毒库:
# 启用并启动 clamd
systemctl enable --now clamd # RHEL 系服务名可能是 clamd@scan
systemctl enable --now clamav-daemon # Debian 系
# 用 clamdscan 扫描(速度比 clamscan 快一个数量级)
clamdscan -r -i /var/www
clamd 相比 clamscan 的优势就在"库常驻内存",反复扫描时性能差异明显。代价是常年占用约 1GB 内存,小机器要权衡。
五、准实时防护与自动化集成
clamscan 是"手动扫",要让它更主动,可以用 clamonacc 做基于 fanotify 的准实时监控,或者把扫描接入自动化流程。
clamonacc 的配置在 /etc/clamav/clamd.conf(Debian)或 /etc/clamd.d/scan.conf(RHEL)里:
# 开启按访问扫描
OnAccessIncludePath /var/www/html/wp-content/uploads
OnAccessExcludeUname clamav
OnAccessPrevention yes
# 卸载(Debian 用 clamav;RHEL 视配置,常为 clamav 或 clamonacc 专用)
启动 on-access 服务:
systemctl enable --now clamav-clamonacc # Debian 系
# RHEL 系对应的服务名以实际安装为准
需要注意:on-access 模式依赖内核 fanotify,某些内核或容器环境下不可用;而且 OnAccessPrevention yes 依赖内核支持阻断,配置不当可能影响性能甚至卡住文件访问。建议先在测试环境验证再上生产。
更常见也更稳妥的做法是把 ClamAV 接入运维流程:
- 入站自动扫:用户往网盘/共享目录上传文件后,用 hook 触发
clamdscan,命中则隔离并告警。 - 定期全盘扫:用 cron 或 systemd timer 每周低峰期跑一次定向扫描,把结果写入日志并做趋势对比。
- 告警联动:扫描命令返回码有意义——
0表示无感染,1表示发现感染,2表示出错。脚本里据此触发不同动作。
# 一个定期扫描脚本示例,配合 cron 使用
#!/bin/bash
LOG=/var/log/clamav/scan_$(date +%F).log
/usr/bin/clamdscan -r -i --log="$LOG" /var/www /home /tmp
RC=$?
if [ "$RC" -eq 1 ]; then
# 发现感染,触发告警(替换为你的告警方式)
mail -s "ClamAV 发现恶意文件 $(hostname)" admin@example.com < "$LOG"
# 注意:不要直接自动删除!先隔离,人工确认后再处置
fi
这里要特别强调一个安全纪律:不要写脚本自动 --remove 删除检出文件。反病毒引擎有误报,自动删除可能删掉正常业务文件(比如某些打包过的二进制、脚本模板)。稳妥流程是"检出 → 隔离/移动 → 人工确认 → 处置"。ClamAV 支持把检出文件移动到隔离区(--move),而不是直接删。
mkdir -p /var/quarantine
# 把检出文件移动到隔离目录(保留现场,不直接删)
clamscan -r -i --move=/var/quarantine /var/www/uploads
常见问题
Q:ClamAV 和商业杀毒软件比,够用吗?
对服务器场景,ClamAV 的特征库覆盖主流恶意软件,完全够用。它的短板是缺少行为防护和一些高级检测,但这本来就是"服务器 HIDS"该干的活。合理的组合是 ClamAV 做文件特征扫描 + AIDE 做完整性校验 + auditd 做行为审计。
Q:为什么扫描速度这么慢,能不能加快?
两个方向:一是改用 clamd + clamdscan(库常驻内存,明显更快);二是缩小扫描范围,只扫高风险目录,别动不动全盘。--exclude-dir 排除 /proc、/sys、/dev、/run 也能省很多时间。全盘扫描本来就慢,这是特征匹配的固有开销。
Q:freshclam 一直失败怎么办?
先看错误信息。如果是 "Connection failed",检查网络和 DNS,或换国内镜像;如果是权限错误,确认病毒库目录属主和运行用户一致;如果是 "The ClamAV database is out of date / update failed",可能需要先手动下载库文件放到 /var/lib/clamav/。国内服务器网络受限时,配置可用镜像通常是关键。
Q:扫描发现有文件被感染,是不是直接删掉就好?
先别删。查看被感染文件的路径和时间,判断它是"真正的恶意文件"还是"误报",并回溯它是怎么进来的(往往意味着系统已经被入侵)。把它移动到隔离区留证,然后结合日志排查入侵入口。直接删掉会破坏现场。
Q:ClamAV 能防挖矿吗?
能防"落地成文件的挖矿程序"(比如检出常见的挖矿木马样本),但防不住纯内存执行、或者特征未入库的新型挖矿程序。防挖矿更依赖 CPU 异常的监控、进程审计和及时的系统补丁。
总结
- ClamAV 是基于特征码的文件扫描引擎,查已知恶意文件、适合定期扫描和入库扫描;不要指望它做实时行为防护,要和其他手段配合。
- 安装后必须先 freshclam 更新病毒库再扫描,国内服务器注意配置可用镜像;一定把自动更新(cron/timer)配好。
- 扫描优先用"定向高风险目录"(上传目录、
/tmp、/dev/shm、Web 根目录、家目录),全盘扫描放低峰期并排除虚拟文件系统;装了 clamd 后用clamdscan提速。 - 不要写脚本自动删除检出文件,要用
--move隔离留证 + 人工确认,因为存在误报。 - 排查已感染文件时要回溯入侵入口,结合日志和文件时间线,而不是只处理"物证"。
- 小内存机器慎用常驻 clamd(约 1GB 内存,经验值);对性能敏感的服务器优先按需扫描 + 自动化集成,而不是实时防护。
企业QQ咨询




