1. 先想清楚一件事:你的 Ubuntu 到底有没有被“感染”
1.1 别一上来就装杀毒软件,先冷静三分钟
很多人遇到“怀疑 Ubuntu 中木马”的第一反应是:赶紧装个杀毒软件全盘扫一遍。这个方向没错,但顺序错了。服务器也好、桌面机也好,如果真有恶意程序在跑,你直接装软件、更新病毒库、再全盘扫描,这中间的一两个小时里,恶意程序一直在正常工作。它可能会继续偷数据、继续扫描内网、继续挖矿,甚至在你装杀毒软件的过程中抢先一步把你的敏感文件打包传走。
所以文章标题里提到的“排除系统已经感染木马或病毒”,这不是一句废话,它其实是整个操作的核心思路:先做轻量级人工排查,确认有没有明显的异常迹象,再上杀毒工具做深度扫描。ClamAV 确实是 Ubuntu 上最主流的开源杀毒方案,但它不是防火墙也不是行为检测工具,它本质上是基于特征库的扫描器。你要先搞清楚自己在防什么、查什么,才能用好它。
1.2 Linux 上说的“被感染”到底指什么
Linux 不是不会感染恶意软件,而是感染的方式、场景和 Windows 不太一样。常见情况大概有这几类:
- 你从第三方仓库下载了被投毒的 .deb 包或压缩包,里面藏着脚本或二进制后门。
- 系统暴露在公网,某个服务(比如 Redis、Nginx、SSH)存在未授权访问或已知漏洞,被入侵后植入了挖矿程序或 Rootkit。
- 你的机器不是最终受害者,而是“跳板”。它可能是个文件服务器或邮件网关,中转传播 Windows 恶意软件。
- 针对 Linux 的木马确实相对少,但挖矿木马、僵尸网络客户端、勒索软件这些都真实存在。
ClamAV 能扫描前三种场景中的大部分已知样本,但它对第四种(Rootkit 行为、内核模块级别的后门)基本无能为力。你可以在 Ubuntu 上用 ClamAV 做病毒木马扫描,但别指望它是万能药。
1.3 上工具之前,先做一次三分钟手工排查
安装 ClamAV 之前,我建议你先在终端里用几句命令看看系统当前的状态。这三分钟花得很值,因为信息能帮你判断问题有多严重,也能在后续扫描出现海量告警时快速定位真正可疑的两三个文件。
先用 top 或 htop 看 CPU 占用。如果是服务器,正常情况下一台闲置机器的 CPU 应该在个位数徘徊。如果你看到某个进程占了 100% 甚至更多,而且进程名看起来很不正常,这就是第一个危险信号。很多挖矿木马为了让进程看起来像系统服务,会把自己改名成 java、kworker、dbus-daemon 之类的名字,注意区分:真正的 kworker 是内核工作线程,用 ps 看它的 PPID 和路径能判断真伪。
再用 ss 或 netstat 检查网络连接。重点看有没有大量非 80/443 端口的外连,尤其是连接目标 IP 不像正常云服务商的连接。有个小技巧:用ss -tunap把状态为 ESTABLISHED 的连接列出来,留意进程名和连接数量。正常服务器不会同时和几十个陌生 IP 保持连接。
然后检查计划任务:crontab -l看当前用户的,sudo ls /etc/cron.d/、/etc/cron.hourly/看系统级的。攻击者通常会加一条定时任务,每隔几分钟从远端拉取一个脚本执行。很多清理案例里,用户把病毒文件删了,但忘了删 crontab,结果过十分钟又复活了。
最后看一眼登录记录:last和lastb,特别留意有没有陌生 IP 的 SSH 登录。如果发现有可疑来源的 Successful Login,后面做清理时你还要改密码、检查 authorized_keys。
这几步查完,你对系统的状态就有谱了。如果发现明显的异常进程或连接,接下来装 ClamAV、跑扫描、做隔离清理,就是一条完整的应对链。
2. 装 ClamAV 的正确姿势:先把软件源和依赖搞清楚
2.1 安装前的一步准备:更新软件源
安装命令本身很简单,但很多人忽略了一个前置动作:先更新一下软件源。Ubuntu 的官方源和镜像站同步有一定延迟,你直接apt install clamav可能装到一个版本较旧的包。杀毒软件的病毒库和程序版本都有时效性,装旧版本等于给自己挖坑。
执行sudo apt update,让它把软件包列表刷新一下。这一步还会顺手检查源里有没有损坏的条目,如果输出里出现很多类似404 Not Found的提示,那你装的可能是个非官方源或已停止维护的版本,比如某些老教程里让你添加的第三方 PPA。对于安全工具,我强烈建议只用 Ubuntu 官方源或你所在机构维护的镜像源。ClamAV 在官方源里一直都有,实在没必要为了“新版”去折腾 PPA。
2.2 安装命令和它到底装了些什么
命令行两条:
sudo apt update sudo apt install clamav clamav-daemon有的教程只写clamav,装完发现只有命令和病毒库更新工具,没有后台守护进程。这里我建议加上clamav-daemon,原因后面讲扫描效率时会细说。
装完后你用下面几条命令验证一下:
clamscan --version freshclam --version systemctl status clamav-daemon第一条会输出 ClamAV 版本号和病毒库签名日期,第二条确认 freshclam 工具正常,第三条看守护进程有没有跑起来。一个关键点:clamav-daemon在安装完成后会自动启动,但病毒库可能还没下载,因为 freshclam 的首次下载是异步的。你可能会在系统日志里看到 clamav-freshclam 相关的报错,这是正常的,等它把病毒库拉下来就好了。
2.3 装完先别急,看一下病毒库版本
ClamAV 的特点在于:程序本身只是骨架,真正干活的是病毒库。你安装时病毒库一个都没有,需要 freshclam 去下载。Ubuntu 的镜像里通常带了一个初始病毒库的压缩包,freshclam 会做增量更新,第一次运行可能要下载几十 MB 到上百 MB 的数据,具体取决于当前库的规模。
检查病毒库版本的命令是:
sudo freshclam --version输出里会有类似FreshClam version和Last checked的信息。如果你看到病毒库日期是好多天以前的,说明更新流程有问题,需要排查网络、代理或 DNS 配置。这一步很关键,拿一个过期好几天的病毒库去扫描系统,等于拿着去年的通缉令抓今年的逃犯,查不出东西也算正常结果,但你没法说服自己系统是干净的。
这里有一个实操经验:Ubuntu 桌面版默认配置了clamav-freshclam服务,它会每小时自动检查一次更新。服务器上如果你关了它的定时器,就要自己写 cron 任务定期跑 freshclam,不然病毒库会慢慢过期。后面我会给一个具体的 cron 配置参考。
3. 第一次全盘扫描之前,先搞懂 ClamAV 的两种工作模式
3.1 clamscan 与 clamdscan 有什么区别
装完 ClamAV,你会发现至少有两条扫描命令可用:clamscan和clamdscan。第一次用的人很容易困惑,这两者的区别其实很关键。
clamscan是独立的命令行扫描工具,每次运行都会自己加载病毒库,扫描结束后释放资源。优点是简单、可靠、不需要额外配置;缺点是每次打开病毒库都有一段延迟,如果扫描大目录会非常慢,而且吃内存。
clamdscan是把扫描请求发给后台守护进程clamd,由后者完成扫描并返回结果。前提是clamd已经在运行,而clamav-daemon这个包的作用就是提供这个服务。优点在于守护进程常驻内存、病毒库已经加载好,多次扫描不用反复初始化,所以速度快、效率高;缺点是需要先保证服务正常运行,而且clamd的配置对内存要求更高一些。
我的建议:日常临时扫描用clamscan,因为简单直接、不用排查服务状态;如果你的服务器需要定期扫描大量文件(比如每周全盘扫一次),那就用clamdscan,配合定时任务效率提升明显。
有个容易踩的坑:clamdscan的权限模型和clamscan不一样。clamd 通常以clamav用户运行,如果你用clamdscan扫描/root目录或者某些权限受限的文件,可能会报权限不足的错误。这种情况下要么手动给 clamav 用户加读权限(不建议),要么临时用clamscan来扫这些目录。
3.2 更新病毒库:freshclam 的配置项你必须知道
先跑一次手动更新,确认机制正常:
sudo freshclam正常情况下你会看到类似 “Downloading daily.cvd” 之类的进度,然后提示病毒库已是最新版本。如果你的网络环境比较特殊,需要走代理,可以在/etc/clamav/freshclam.conf里加配置,但先说明白,配置文件里像UpdateLogFile、DatabaseDirectory这种参数默认已经设置好了,一般不需要动。
我需要特别提醒的是DatabaseMirror配置项。默认情况下 freshclam 会从一组官方镜像下载病毒库,国内网络的访问速度时快时慢,如果你发现更新经常超时,可以考虑把DatabaseMirror改成比较稳定的镜像地址。但注意,改之前确认一下镜像来源是否可靠。杀毒软件的病毒库本身就是安全敏感的东西,你从不可信渠道拿病毒库,等于把安全后门拱手让人,这违背了整个事情的初衷。
对多数 Ubuntu 用户来说,官方镜像偶尔慢一点,但最终能更新成功,也就够用了。与其折腾镜像,不如检查一下你机器上的clamav-freshclam服务是否正常运行:
systemctl status clamav-freshclam sudo journalctl -u clamav-freshclam --no-pager -n 30日志里能看到每次自动更新的时间戳和结果。如果你发现服务处于 active 状态但日志里全是警告,多半是病毒库没写到默认目录,或者目录权限不对。检查一下/var/lib/clamav是否存在、属主是否为clamav:clamav,不对就修正:
sudo ls -ld /var/lib/clamav sudo chown -R clamav:clamav /var/lib/clamav3.3 第一次全盘扫描:别指望一条命令跑到底
现在病毒库就绪、程序确认正常,可以开始第一次扫描。先给一个最基础的命令:
sudo clamscan -r / --exclude-dir=/proc --exclude-dir=/sys --exclude-dir=/dev --exclude-dir=/run --exclude-dir=/snap解释一下这里为什么手动排除几个目录。/proc、/sys、/dev是内核虚拟文件系统和设备文件,扫描它们不仅毫无意义,还可能因为特殊的文件类型导致 ClamAV 卡住或报大量奇怪的错误。/run是运行时的临时目录,进程的 pid 文件和一些 socket 文件都在里面,扫它对发现恶意软件没有任何帮助。/snap目录可以视情况排除,snap 镜像里的文件是只读挂载的,被篡改的可能性几乎为零,扫描它会增加大量无效 IO,拖慢整体速度。
一个更现实的方案是,第一次别全盘扫,先扫最容易藏毒的目录:
sudo clamscan -r /home /tmp /var/tmp /var/www /etc这几个目录覆盖了用户文件、临时文件、Web 站点配置和系统配置文件,是恶意软件最常出现的位置。全盘扫描可以放在这一步之后,等确认核心目录干净了再执行。
扫描开始后你可能会看到大量输出。别慌,ClamAV 默认情况下每个文件都会输出一条记录,扫描一个几万文件的家目录,终端会刷刷刷滚很久。建议加上参数:
sudo clamscan -r --bell --verbose /home--bell是发现病毒时响铃,这样你可以在跑扫描的同时做其他事,听到蜂鸣声再回来看。--verbose会显示扫描的进度和文件信息,但对海量文件会浪费 IO,如果你只想安静地扫描,可以在命令末尾用--quiet,只在发现问题时输出。
实际扫描完成后,输出会有一份汇总统计:扫描了多少文件、发现了多少病毒。看到 “Infected files: 0” 也别高兴太早,因为 ClamAV 查的是特征库已知样本,对新型变种和没有签名文件的能力有限。
4. 面对已经怀疑感染的场景:重点检查这五个地方
4.1 可疑进程和异常 CPU 占用
很多人问这个问题:ClamAV 扫描出来的都是已知病毒文件,如果木马是新型变种,扫描不出来怎么办?所以 ClamAV 扫描不等于排查的全部。如果你的系统已经表现出异常(CPU 飙高、网络流量奇怪、莫名出现新用户),先解决异常现象,扫描是辅助确认的手段。
挖矿木马是最典型的症状。它在运行时会把 CPU 占满,即使你的机器闲置,top里也能看到它。检查时用:
top -c ps aux --sort=-%cpu | head -20发现可疑进程后,用ls -l /proc/PID/exe看这个进程对应的可执行文件路径。如果路径指向/tmp、/var/tmp、/dev/shm这类非标准目录,几乎可以直接判定为恶意。/dev/shm尤其可疑,攻击者喜欢在这里放文件因为它默认是内存文件系统,重启就消失,传统文件扫描很容易漏掉。
处理这种进程的标准操作是:先记录进程 PID 和父进程 PID,再用kill -9终止,随即清理对应的文件,最后翻一下 cron 和 systemd 服务的配置,把它的持久化机制断掉。只杀进程不删文件,等于没处理。
4.2 网络连接和监听端口
挖矿木马除了吃 CPU,一般还要和远端的矿池建立连接。如果它只占用 CPU 而没有外连,你还能看到算力提升,但网络连接检查依然值得做。用:
ss -tnp看 ESTABLISHED 状态的连接。正常服务器外连通常是:HTTP/HTTPS 用的 80、443,SSH 用的 22,NTP 时间同步用的 123,DNS 查询用的 53。如果你看到大量连接到 8443、4444、6666、3333 这类端口,或者连接目标是陌生的境外 IP,就要提高警惕。
对照检查每个外部连接对应的本地进程,再用ps和lsof深挖。比如:
sudo lsof -i -P -n这个命令列出所有网络连接和监听端口,可以判断哪些端口是系统服务正常开放的,哪些是可疑进程开放的。如果你的机器是服务器并且有防火墙,正常只应该对外开放少量端口(比如 22、80、443),其他端口要么不监听,要么只监听内网或本机,发现异常监听端口基本可以确定系统被入侵过。
4.3 定时任务和启动项里藏着的“复活机制”
我前面已经提了一次 cron,这里再展开讲。恶意软件要在重启后继续存活,常见的持久化手段有三种:cron、systemd service、自启动脚本。Ring 上有些攻击脚本会在被清理后 10 分钟内重新下载自身,原因就是清理时漏了 cron。
检查完上面几个地方,再用下面几条命令确保没有漏网之鱼:
crontab -l sudo crontab -l sudo ls -la /etc/cron.d/ sudo ls -la /etc/cron.daily/ sudo systemctl list-unit-files --state=enabled重点关注/lib/systemd/system和/etc/systemd/system下面有没有最近新增的 service 或 timer 文件。用ls -lt按时间排序,新出现的文件一目了然。
4.4 敏感目录里的特殊文件
攻击者拿到一个服务器的权限后,通常不会把恶意程序放在/usr/bin这种容易被发现的地方(但也不会绝对排除,木马伪装成系统命令的情况很常见)。相对隐蔽的位置包括:
/tmp和/var/tmp:经常放下载脚本和临时二进制。/dev/shm:内存文件系统,重启清空,适合放短生命周期工具。/var/spool/cron/crontabs:系统用户 crontab 的存储位置。/root/.ssh和/home/用户/.ssh:检查有没有被塞入新的公钥。/etc/ld.so.preload:这个文件如果存在非注释内容,可能是用于 hook 系统库调用的 Rootkit。
用 ClamAV 扫描时,/dev/shm默认会被跳过吗?实际上,如果从/开始扫描,/dev/shm会被算在/dev里面,而/dev通常不会被完整扫描。所以手动扫一遍:
sudo clamscan -r /dev/shm /run /tmp /var/tmp注意/dev/shm在内存里,扫描速度通常很快。
4.5 SSH 后门和登录凭证排查
最后检查一个非常容易被忽略的点:SSH 后门。攻击者可能往authorized_keys文件里追加了一个公钥,这样你改完密码、杀完木马都没用,对方依然能用密钥直接登录。
sudo cat /root/.ssh/authorized_keys sudo cat /home/*/.ssh/authorized_keys sudo last -20 sudo lastb -20如果 authorized_keys 里有一条你不认识的公钥,立刻删除并确认文件属主和权限归位。lastb显示失败登录记录,如果一直有人爆破,说明系统暴露在公网上,还应该考虑修改 SSH 端口、禁用密码登录、启用 fail2ban 等加固措施。
5. 清理阶段:别见一个删一个,先隔离再处置
5.1 为什么要先隔离而不是直接删
ClamAV 扫描完成后如果发现了病毒文件,很多人第一反应是加--remove参数直接删除。我劝你稳一手。原因在于杀毒软件经常误报,尤其是针对某些破解工具、注册机、特殊编译的脚本,ClamAV 可能会因为特征匹配而报警,但实际上那些文件只是“长得像”病毒,并非真的恶意。
更稳妥的做法是把可疑文件移动到一个隔离目录,比如:
sudo mkdir -p /var/quarantine sudo mv /path/to/suspicious_file /var/quarantine/之后再根据文件类型和来源人工判断:
- 如果是你从某个安全网站下载的正常软件,ClamAV 报毒,很可能是误报,可以上传到在线多引擎扫描平台再确认一下。
- 如果是
/tmp下面来历不明的二进制文件,同时你前面已经发现 CPU 异常,那基本可以确定是恶意文件,直接删除或保留样本都行,但绝不能再放回去执行。 - 如果是系统文件,比如
/usr/bin下面的命令,杀毒软件报毒要先看哈希值和官方包做对比,用dpkg -V验证文件完整性。
ClamAV 的隔离动作不包含在包本身,可以用上面这个 mv 方式实现。如果你选择直接在扫描时删除,务必先备份一份到隔离目录再删。
5.2 真正的清理流程分三步走
第一步,终止相关进程。找到恶意进程后:
sudo kill -9 PID1 PID2第二步,清理持久化配置。检查并删除可疑的 cron 条目、service 文件、启动脚本,顺手把/etc/ld.so.preload清空或删除。
第三步,处理受影响的用户账户和配置。包括但不限于:修改 root 密码和所有用户的密码、删除未知 SSH 公钥、检查是否多出了未知的用户(sudo cat /etc/passwd里 uid 为 0 的除了 root 还有其他用户就非常可疑)、清理~/.bashrc里被追加的恶意导出或别名。
这三步做完,再用 ClamAV 做一次全盘扫描确认清理结果,这次如果病毒数归零,基本可以放心了。
5.3 清理完成后别急着恢复业务
清理只是第一步,系统完整性的恢复才是后续重点。感染过一次的系统,不敢保证没有被放行其他后门,所以合规的做法是:评估系统是否值得保留,还是干脆重装。
判断标准大致如下:
- 感染的只是
/tmp下的一个挖矿脚本,没有发现 root 权限被拿、没有发现额外 SSH 公钥,可以清理后继续使用。 - 发现 Rootkit 痕迹、内核模块被替换、
/etc/passwd出现 uid=0 的未知用户,或者重要数据存在被加密或外传的迹象,这种情况下继续在原有系统上打补丁的意义不大,重装才是稳妥选择。
重装系统虽然麻烦,但比起和一个不确定干净的系统长期相处,这点代价值得。
6. 常见问题与实战避坑:至少有一半人会在这些点上摔跤
6.1 freshclam 更新失败
这是 ClamAV 最头疼的问题。症状:freshclam反复提示连接超时,或者报权限错误、目录不可写。
排查顺序:
sudo systemctl status clamav-freshclam sudo ls -ld /var/lib/clamav sudo tail -50 /var/log/clamav/freshclam.log权限错误的处理方式我前面说过:确认目录属主是clamav,如果是 root 就 chown 一下。连接超时的问题,优先检查防火墙是不是挡了外面的 TCP 443 出站连接,其次考虑镜像速度。
如果 freshclam 服务一直失败,可以先杀干净重启一把:
sudo systemctl stop clamav-freshclam sudo freshclam sudo systemctl start clamav-freshclam手动跑成功后,服务会自动更新最后的检查时间,从日志里看如果下次定时更新正常,这个问题就解决了。
6.2 扫描时内存和 CPU 被吃满
ClamAV 全盘扫描时加载病毒库需要数百 MB 内存,扫描大量文件时 CPU 也会持续较高负载。在配置较低的 VPS 上,这可能导致系统卡顿甚至 OOM。
解决办法:
- 扫描前把可执行的 IO 优先级调低:
sudo ionice -c3 clamscan -r /tmp - 避开业务高峰期执行扫描。
- 如果你用
clamd扫描,可以调整/etc/clamav/clamd.conf里的MaxThreads和MaxConnectionQueueLength参数,限制并发线程数量。 - 部分 VPS 上 ClamAV 扫描会导致内存耗尽,可以给 clamd 的 systemd 服务加入
MemoryMax限制,防止它把系统撑垮。 - 扫描时排除明显不会感染的目录,如前面提到的
/proc、/sys、/dev、/run,能大幅减少无效 IO 和 CPU 消耗。
6.3 看到报警先别删,确认误报再看处理方案
ClamAV 的误报率不算低,尤其是针对某些自行编译的程序、加壳的二进制、PHP 混淆代码。误报的常见场景是 Web 目录里的加密 PHP 文件被当成 webshell,但其实有些是正常的加密授权文件。
处理方式:
clamscan --remove=false /path/to/file先在隔离目录留一份,然后用其他引擎交叉验证。确认误报后有两种选择:把文件加入白名单目录,或者在clamd.conf中配置ExcludePath,将特定路径排除在后续扫描范围之外。
加入白名单的命令行参数是:
clamscan --exclude=/path/to/file -r /target6.4 三个新手容易犯的错
第一个错误:只杀进程不清理持久化配置。结果就是“僵尸复活”,几天后同样的木马又出现。
第二个错误:用旧病毒库扫描就以为系统干净。病毒库的时效性决定了你扫描结果的可靠程度。
第三个错误:把 ClamAV 当实时防御来用。ClamAV 默认没有实时文件监控(除非配置 OnAccessScan 或使用第三方的整合方案),它更适合做定期扫描、邮件网关扫描、文件服务器扫描。指望它像 Windows 桌面杀毒软件那样实时拦阻,会错失很多攻击信号。
6.5 给定期维护加一个安全基线
病毒库更新时间久不难维护,但容易忘。你可以用 cron 做两层保障:一层是系统自带的clamav-freshclam服务,每小时检查一次;另一层是自己加一个每周的例行扫描任务,比如每周日凌晨三点跑一次全盘扫描,把结果输出到日志文件:
0 3 * * 0 sudo clamscan -r / --exclude-dir=/proc --exclude-dir=/sys --exclude-dir=/dev --exclude-dir=/run --exclude-dir=/snap --log=/var/log/clamav/weekly-scan.log这样只需要定期看一下日志就行。健康运行的服务器,日志里 “Infected files: 0” 是常态,哪天真出现了非零值,说明你的定期检查起作用了。
最后把我自己实践中最大的体会分享给你:ClamAV 是排查和兜底的好帮手,但它替代不了基本的安全意识。一个系统是否干净,更多取决于入口的控制,比如 SSH 是否开了密钥登录、业务服务是否限制了访问来源、普通用户是否有不必要的 sudo 权限、软件包是否都从官方源安装。把这些基础的防线做扎实,ClamAV 更多时候只是一个让人安心的“定期体检工具”。如果你这次是在“怀疑已经感染”的背景下点开这篇文章,那么建议你按上面排查流程认真过一遍,该清理就清理,该重装就重装,别再陪异常进程过日子。