基于青龙面板事件,对 VPS 进行自检记录

2026 年 2 月 27 日附近,有大量消息来源表示青龙面板出现 0 day 漏洞,借此机会我来加强一下对服务器的防护

周二 3月 03 2026
7567 字 · 48 分钟

一、前因

2026 年 2 月 27 日附近,有大量消息来源12345表示青龙面板出现 0 day 漏洞,我 VPS 虽然没有用青龙面板,但是平日里的防护也是比较弱,借此机会加强一下对服务器的防护

:青龙面板已于 2026 年 3 月 1 日 的 v2.20.2 版中已修复该 0 day 漏洞

Terminal window
青龙 v2.20.2 (❗️重要❗️)
更新说明:
1. 修复 path init 接口安全漏洞(重要)
更新方法:
-> 面板更新 系统设置 -> 其他设置 -> 检查更新
-> 容器内更新 执行 ql update
-> 宿主机更新 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR <容器名>
-> debian 版本同步更新
版本镜像:
正式版: whyour/qinglong:latest
Python3.10 正式版: whyour/qinglong:python3.10
debian 版: whyour/qinglong:debian
Python3.10 debian 版: whyour/qinglong:debian-python3.10
npm 版本: npm i -g @whyour/qinglong
叹寄与路遥,夜雪初积。

漏洞摘要

青龙面板 v2.20.1 及以下版本存在多个安全漏洞,这些漏洞组合利用可导致 未授权远程代码执行(Unauthenticated RCE)

核心问题是 JWT 签名密钥使用了硬编码的默认值 'whyour-secret',该值在开源代码中公开可见。攻击者无需任何凭据即可伪造有效的 JWT Token,调用后端 API 向 config.sh 注入恶意 Shell 脚本。由于 config.sh 在每次定时任务执行前被 source 加载,恶意代码得以持久化执行。

实际攻击中,恶意载荷从外部服务器下载加密货币挖矿程序(.fullgc),在后台运行并消耗大量系统资源(CPU 占用率达 85%-100%)。

二、开始排查

主要步骤还是从 SSH ---> 系统性能 ---> 自启动 开始排查

1. SSH

SSH 的话,因为根据 【自用】VPS 到手后必做的几件事 部署的(自己的教程就是好用) 的话,默认 SSH 端口是非默认+ SSH 密钥登陆 + root 用户不可直接登录 + fail2ban 是部署了的

所以我们这次只需要查看一下:

  1. SSH 登录历史
  2. SSH 认证日志
  3. fail2ban 是否有有效工作

即可

我们一个一个来

1.1 SSH 登录历史
Terminal window
# 查看最近成功登录的 50 条登录历史
last -a | head -n 50
# 查看最近失败登录的 50 条登录历史
sudo lastb -a | head -n 50

如果此时出现 找不到 lastlastb 命令的情况下,可以尝试安装 wtmpdb

Terminal window
sudo apt update
sudo apt install -y wtmpdb

然后再去测试就会发现有命令 last

lastb 命令就只能用日志检索来代替

Terminal window
sudo journalctl -u ssh -u sshd --no-pager \
| grep -E "Failed password|Invalid user" \
| awk '{for(i=1;i<=NF;i++) if($i=="from") {print $(i+1); break}}' \
| sort | uniq -c | sort -nr | head

这个是统计失败来源 IP

  • 成功登录

    Terminal window
    $ last -a | head -n 50
    moka pts/0 Mon Mar 2 20:30 still logged in 223.***.***.***
    moka pts/1 Mon Mar 2 16:33 - 16:40 (00:07) :pts/0:S.0
    moka pts/0 Mon Mar 2 16:16 - 18:49 (02:32) 223.***.***.***
    moka pts/0 Sun Mar 1 19:01 - 19:14 (00:12) 223.***.***.***
    moka pts/0 Fri Feb 27 12:26 - 13:26 (00:59) 112.***.***.***
    moka pts/0 Fri Feb 27 08:02 - 08:03 (00:00) 112.***.***.***
    root pts/0 Thu Feb 26 12:28 - 15:34 (03:05) 112.***.***.***
    moka pts/0 Thu Feb 26 11:42 - 11:51 (00:08) 112.***.***.***
    moka pts/0 Tue Feb 24 13:59 - 15:53 (01:53) 112.***.***.***
    moka pts/1 Mon Feb 23 11:11 - 11:18 (00:06) :pts/0:S.0
    moka pts/0 Mon Feb 23 11:11 - 12:10 (00:59) 112.***.***.***
    moka pts/0 Mon Feb 23 10:07 - 10:11 (00:04) 112.***.***.***
    reboot system boot Mon Feb 23 09:53 still running 6.8.0-100-generic
    moka pts/0 Fri Feb 20 09:53 - 12:36 (02:42) 112.***.***.***
    moka pts/0 Fri Feb 20 09:06 - 09:07 (00:00) 112.***.***.***
    moka pts/0 Wed Feb 18 18:04 - 18:05 (00:00) 112.***.***.***
    moka pts/0 Wed Feb 18 11:41 - 11:41 (00:00) 45.***.***.***
    moka pts/5 Mon Feb 16 12:49 - 12:50 (00:01) 112.***.***.***
    moka pts/4 Mon Feb 16 12:48 - 12:50 (00:01) 112.***.***.***
    moka pts/3 Mon Feb 16 11:46 - 12:50 (01:04) 112.***.***.***
    moka pts/0 Mon Feb 16 11:45 - 12:50 (01:04) 112.***.***.***
    moka pts/0 Mon Feb 16 08:24 - 10:57 (02:33) 112.***.***.***
    moka pts/7 Sun Feb 15 17:12 - 18:16 (01:03) 112.***.***.***
    moka pts/6 Sun Feb 15 17:06 - 19:50 (02:44) 112.***.***.***
    moka pts/6 Sun Feb 15 17:01 - 17:06 (00:04) 112.***.***.***
    moka pts/5 Sun Feb 15 16:56 - 19:40 (02:44) 112.***.***.***
    moka pts/4 Sun Feb 15 16:56 - 19:40 (02:44) 112.***.***.***
    moka pts/3 Sun Feb 15 15:22 - 19:34 (04:12) 112.***.***.***
    moka pts/2 Sun Feb 15 14:40 - 19:34 (04:53) 112.***.***.***
    moka pts/0 Sun Feb 15 14:40 - 19:34 (04:54) 112.***.***.***
    moka pts/2 Sun Feb 15 14:24 - 14:40 (00:15) 112.***.***.***
    moka pts/0 Sun Feb 15 14:03 - 14:40 (00:36) 112.***.***.***
    moka pts/1 Sun Feb 15 09:53 - 09:56 (00:03) :pts/0:S.0
    moka pts/0 Sun Feb 15 09:47 - 09:56 (00:09) 112.***.***.***
    moka pts/2 Sat Feb 14 16:27 - 20:13 (03:45) 112.***.***.***
    moka pts/0 Sat Feb 14 12:56 - 20:13 (07:16) 112.***.***.***
    moka pts/0 Sat Feb 14 10:24 - 10:26 (00:02) 112.***.***.***
    moka pts/0 Sat Feb 14 10:23 - 10:23 (00:00) 112.***.***.***
    moka pts/0 Fri Feb 13 07:05 - 07:13 (00:07) 112.***.***.***
    moka pts/1 Thu Feb 12 06:20 - 06:21 (00:01) :pts/0:S.0
    moka pts/0 Thu Feb 12 06:20 - 06:21 (00:01) 112.***.***.***
    reboot system boot Thu Feb 12 06:12 still running 6.8.0-100-generic
    moka pts/2 Mon Feb 9 20:35 - 20:36 (00:01) :pts/0:S.0
    moka pts/2 Mon Feb 9 20:27 - 20:27 (00:00) :pts/0:S.0
    moka pts/0 Mon Feb 9 20:27 - 20:38 (00:10) 112.***.***.***
    moka pts/2 Mon Feb 9 10:35 - 10:36 (00:01) :pts/0:S.0
    moka pts/2 Mon Feb 9 10:29 - 10:29 (00:00) :pts/0:S.0
    moka pts/1 Mon Feb 9 10:29 - 10:29 (00:00) :pts/0:S.0
    moka pts/2 Mon Feb 9 10:29 - 10:29 (00:00) :pts/0:S.0
    moka pts/0 Mon Feb 9 10:28 - 13:59 (03:30) 112.***.***.***

    这上面出现的 223.***.***.***, 112.***.***.***45.***.***.*** 都是我自己的 IP 地址,而 :pts/0:S.0 则是伪终端,根据时间判断,应该是当时的复制终端,所以无事发生

  • 失败登录

    Terminal window
    $ $ sudo lastb -a | head -n 50
    vyr_odoo ssh:notty Mon Mar 2 20:29 - 20:29 (00:00) 195.24.237.3
    hive ssh:notty Mon Mar 2 19:46 - 19:46 (00:00) 195.24.237.3
    mysql ssh:notty Mon Mar 2 19:31 - 19:31 (00:00) 195.24.237.3
    dudu ssh:notty Mon Mar 2 18:17 - 18:17 (00:00) 195.24.237.3
    admin ssh:notty Mon Mar 2 16:05 - 16:05 (00:00) 195.24.237.3
    student ssh:notty Mon Mar 2 14:36 - 14:36 (00:00) 195.24.237.3
    openeule ssh:notty Mon Mar 2 14:22 - 14:22 (00:00) 195.24.237.3
    oracle ssh:notty Mon Mar 2 14:07 - 14:07 (00:00) 195.24.237.3
    test ssh:notty Mon Mar 2 13:22 - 13:22 (00:00) 195.24.237.3
    alarm ssh:notty Mon Mar 2 12:53 - 12:53 (00:00) 195.24.237.3
    ubuntu ssh:notty Mon Mar 2 12:38 - 12:38 (00:00) 195.24.237.3
    teamhd ssh:notty Mon Mar 2 11:59 - 11:59 (00:00) 195.24.237.3
    teacher ssh:notty Mon Mar 2 08:20 - 08:20 (00:00) 195.24.237.3
    gas ssh:notty Mon Mar 2 05:44 - 05:44 (00:00) 195.24.237.3
    test ssh:notty Mon Mar 2 03:51 - 03:51 (00:00) 195.24.237.3
    ztl ssh:notty Sun Mar 1 09:44 - 09:44 (00:00) 195.24.237.3
    odin ssh:notty Sun Mar 1 03:44 - 03:44 (00:00) 195.24.237.3
    www ssh:notty Sun Mar 1 02:41 - 02:41 (00:00) 195.24.237.3

    可以看到此时 195.24.237.3 这个 IP 在来回尝试登录我的 VPS,而我之前 fail2ban 设置的频率是 300s 内尝试次数超过 5 次就封禁,虽然这个次数没到,但是我们可以手动封禁,这个后面再说,我们先把这个 IP 记录一下

1.2 SSH 认证日志
Terminal window
# 查看最近登录
sudo grep -E "sshd|Accepted|Failed|Invalid|authentication failure" /var/log/auth.log | tail -n 200
# 快速统计成功登录来自哪些 IP
sudo grep -E "sshd.*Accepted" /var/log/auth.log \
| awk '{for(i=1;i<=NF;i++) if($i=="from") {print $(i+1); break}}' \
| sort | uniq -c | sort -nr | head
  • 最近登录

    Terminal window
    $ sudo grep -E "sshd|Accepted|Failed|Invalid|authentication failure" /var/log/auth.log | tail -n 200
    2026-03-01T00:05:49.909592+08:00 HK4C sshd[1517009]: Connection closed by authenticating user root 195.24.237.3 port 11760 [preauth]
    2026-03-01T00:21:23.132016+08:00 HK4C sshd[1519362]: Connection closed by authenticating user root 195.24.237.3 port 29688 [preauth]
    2026-03-01T02:41:40.538107+08:00 HK4C sshd[1540451]: Invalid user www from 195.24.237.3 port 17264
    2026-03-01T02:41:40.807143+08:00 HK4C sshd[1540451]: Connection closed by invalid user www 195.24.237.3 port 17264 [preauth]
    2026-03-01T03:44:10.774123+08:00 HK4C sshd[1549789]: Invalid user odin from 195.24.237.3 port 23892
    2026-03-01T03:44:11.592459+08:00 HK4C sshd[1549789]: Connection closed by invalid user odin 195.24.237.3 port 23892 [preauth]
    2026-03-01T07:06:47.388569+08:00 HK4C sshd[1580388]: Connection closed by authenticating user root 195.24.237.3 port 32092 [preauth]
    2026-03-01T08:29:33.702026+08:00 HK4C sshd[1592811]: Connection closed by authenticating user root 195.24.237.3 port 5772 [preauth]
    2026-03-01T09:44:13.181322+08:00 HK4C sshd[1604035]: Invalid user ztl from 195.24.237.3 port 57542
    2026-03-01T09:44:14.627876+08:00 HK4C sshd[1604035]: Connection closed by invalid user ztl 195.24.237.3 port 57542 [preauth]
    2026-03-01T09:58:52.352421+08:00 HK4C sshd[1606239]: Connection closed by authenticating user root 195.24.237.3 port 62492 [preauth]
    2026-03-01T11:13:09.141928+08:00 HK4C sshd[1617389]: Connection closed by authenticating user root 195.24.237.3 port 39912 [preauth]
    2026-03-01T11:27:46.384227+08:00 HK4C sshd[1619604]: Connection closed by authenticating user root 195.24.237.3 port 39300 [preauth]
    2026-03-01T11:45:32.439144+08:00 HK4C sshd[1622280]: Connection closed by 162.216.150.126 port 51805
    2026-03-01T12:41:42.805076+08:00 HK4C sshd[1630681]: Connection closed by authenticating user root 195.24.237.3 port 43872 [preauth]
    2026-03-01T19:00:01.603015+08:00 HK4C sshd[1688151]: Connection closed by authenticating user root 198.***.***.*** port 45952 [preauth]
    2026-03-01T19:00:56.501398+08:00 HK4C sshd[1688278]: Accepted publickey for moka from 223.***.***.*** port 2701 ssh2: ED25519 SHA256:5w**********z/ps**********Wck
    2026-03-01T19:00:56.507930+08:00 HK4C sshd[1688278]: pam_unix(sshd:session): session opened for user moka(uid=1000) by moka(uid=0)
    2026-03-01T19:03:35.431977+08:00 HK4C sshd[1689207]: Accepted publickey for root from 198.***.***.*** port 44292 ssh2: ED25519 SHA256:M5/HoOCZWxWFfya3qORWGjYRIYQ1Ju++D1HhVsBZjhc
    2026-03-01T19:03:35.433798+08:00 HK4C sshd[1689207]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)
    2026-03-01T19:03:36.587454+08:00 HK4C sshd[1689207]: Received disconnect from 198.***.***.*** port 44292:11: disconnected by user
    2026-03-01T19:03:36.587766+08:00 HK4C sshd[1689207]: Disconnected from user root 198.***.***.*** port 44292
    2026-03-01T19:03:36.587864+08:00 HK4C sshd[1689207]: pam_unix(sshd:session): session closed for user root
    2026-03-01T19:14:28.522767+08:00 HK4C sshd[1688382]: Received disconnect from 223.***.***.*** port 2701:11:
    2026-03-01T19:14:28.524773+08:00 HK4C sshd[1688382]: Disconnected from user moka 223.***.***.*** port 2701
    2026-03-01T19:14:28.525185+08:00 HK4C sshd[1688278]: pam_unix(sshd:session): session closed for user moka
    2026-03-01T22:28:22.456857+08:00 HK4C sshd[1720019]: Connection closed by 162.216.150.43 port 50134
    2026-03-02T00:33:53.802458+08:00 HK4C sshd[1738823]: Connection closed by 206.168.34.211 port 45430 [preauth]
    2026-03-02T03:51:50.156282+08:00 HK4C sshd[1769227]: Invalid user test from 195.24.237.3 port 57740
    2026-03-02T03:51:50.754064+08:00 HK4C sshd[1769227]: Connection closed by invalid user test 195.24.237.3 port 57740 [preauth]
    2026-03-02T05:44:51.195391+08:00 HK4C sshd[1786167]: Invalid user gas from 195.24.237.3 port 37598
    2026-03-02T05:44:51.562464+08:00 HK4C sshd[1786167]: Connection closed by invalid user gas 195.24.237.3 port 37598 [preauth]
    2026-03-02T07:02:45.141816+08:00 HK4C sshd[1797977]: Connection closed by authenticating user root 195.24.237.3 port 32906 [preauth]
    2026-03-02T08:20:36.620457+08:00 HK4C sshd[1809753]: Invalid user teacher from 195.24.237.3 port 36824
    2026-03-02T08:20:36.952218+08:00 HK4C sshd[1809753]: Connection closed by invalid user teacher 195.24.237.3 port 36824 [preauth]
    2026-03-02T08:36:03.842457+08:00 HK4C sshd[1812057]: Connection closed by authenticating user root 195.24.237.3 port 36808 [preauth]
    2026-03-02T08:51:23.089987+08:00 HK4C sshd[1814410]: Connection closed by authenticating user root 195.24.237.3 port 60484 [preauth]
    2026-03-02T10:08:47.452441+08:00 HK4C sshd[1825998]: Connection closed by 35.203.211.62 port 51723
    2026-03-02T10:41:31.749172+08:00 HK4C sshd[1830938]: Connection closed by authenticating user nobody 195.24.237.3 port 60016 [preauth]
    2026-03-02T11:59:18.170138+08:00 HK4C sshd[1842611]: Invalid user teamhd from 195.24.237.3 port 34556
    2026-03-02T11:59:19.405415+08:00 HK4C sshd[1842611]: Connection closed by invalid user teamhd 195.24.237.3 port 34556 [preauth]
    2026-03-02T12:23:09.728405+08:00 HK4C sshd[1846196]: Connection closed by authenticating user root 195.24.237.3 port 44956 [preauth]
    2026-03-02T12:38:11.988193+08:00 HK4C sshd[1848447]: Invalid user ubuntu from 195.24.237.3 port 53364
    2026-03-02T12:38:13.263538+08:00 HK4C sshd[1848447]: Connection closed by invalid user ubuntu 195.24.237.3 port 53364 [preauth]
    2026-03-02T12:53:10.336572+08:00 HK4C sshd[1850666]: Invalid user alarm from 195.24.237.3 port 55316
    2026-03-02T12:53:11.658916+08:00 HK4C sshd[1850666]: Connection closed by invalid user alarm 195.24.237.3 port 55316 [preauth]
    2026-03-02T13:08:04.632588+08:00 HK4C sshd[1852920]: Connection closed by authenticating user root 195.24.237.3 port 34590 [preauth]
    2026-03-02T13:22:54.745066+08:00 HK4C sshd[1855167]: Invalid user test from 195.24.237.3 port 38652
    2026-03-02T13:22:56.015314+08:00 HK4C sshd[1855167]: Connection closed by invalid user test 195.24.237.3 port 38652 [preauth]
    2026-03-02T13:37:43.535381+08:00 HK4C sshd[1857336]: Connection closed by authenticating user root 195.24.237.3 port 48422 [preauth]
    2026-03-02T13:52:35.213450+08:00 HK4C sshd[1859598]: Connection closed by authenticating user root 195.24.237.3 port 52204 [preauth]
    2026-03-02T14:07:21.586690+08:00 HK4C sshd[1861807]: Invalid user oracle from 195.24.237.3 port 60746
    2026-03-02T14:07:23.280541+08:00 HK4C sshd[1861807]: Connection closed by invalid user oracle 195.24.237.3 port 60746 [preauth]
    2026-03-02T14:22:09.330402+08:00 HK4C sshd[1864070]: Invalid user openeuler from 195.24.237.3 port 45606
    2026-03-02T14:22:10.643950+08:00 HK4C sshd[1864070]: Connection closed by invalid user openeuler 195.24.237.3 port 45606 [preauth]
    2026-03-02T14:36:50.573879+08:00 HK4C sshd[1866257]: Invalid user student from 195.24.237.3 port 42684
    2026-03-02T14:36:51.967831+08:00 HK4C sshd[1866257]: Connection closed by invalid user student 195.24.237.3 port 42684 [preauth]
    2026-03-02T15:50:58.562564+08:00 HK4C sshd[1877392]: Connection closed by authenticating user root 195.24.237.3 port 51514 [preauth]
    2026-03-02T16:05:36.409063+08:00 HK4C sshd[1879575]: Invalid user admin from 195.24.237.3 port 37078
    2026-03-02T16:05:37.913296+08:00 HK4C sshd[1879575]: Connection closed by invalid user admin 195.24.237.3 port 37078 [preauth]
    2026-03-02T16:16:31.875608+08:00 HK4C sshd[1881239]: Accepted publickey for moka from 223.***.***.*** port 2564 ssh2: ED25519 SHA256:5w**********z/ps**********Wck
    2026-03-02T16:16:31.878600+08:00 HK4C sshd[1881239]: pam_unix(sshd:session): session opened for user moka(uid=1000) by moka(uid=0)
    2026-03-02T16:20:16.423716+08:00 HK4C sshd[1882203]: Connection closed by authenticating user root 195.24.237.3 port 45258 [preauth]
    2026-03-02T16:34:53.258926+08:00 HK4C sshd[1884387]: Connection closed by authenticating user root 195.24.237.3 port 38348 [preauth]
    2026-03-02T16:46:58.867674+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/grep -E 'sshd|Accepted|Failed|Invalid|authentication failure' /var/log/auth.log
    2026-03-02T16:49:33.084634+08:00 HK4C sshd[1886636]: Connection closed by authenticating user root 195.24.237.3 port 56224 [preauth]
    2026-03-02T16:51:12.279174+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/fail2ban-client status sshd
    2026-03-02T16:51:41.824433+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/fail2ban-client set sshd banip 195.24.237.3
    2026-03-02T16:51:48.820889+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/fail2ban-client status sshd
    2026-03-02T17:04:09.417037+08:00 HK4C sshd[1888914]: Connection closed by authenticating user root 195.24.237.3 port 55476 [preauth]
    2026-03-02T18:17:49.993373+08:00 HK4C sshd[1899904]: Invalid user dudu from 195.24.237.3 port 40222
    2026-03-02T18:17:51.631989+08:00 HK4C sshd[1899904]: Connection closed by invalid user dudu 195.24.237.3 port 40222 [preauth]
    2026-03-02T18:49:24.780768+08:00 HK4C sshd[1881319]: Received disconnect from 223.***.***.*** port 2564:11:
    2026-03-02T18:49:24.782493+08:00 HK4C sshd[1881319]: Disconnected from user moka 223.***.***.*** port 2564
    2026-03-02T18:49:24.782928+08:00 HK4C sshd[1881239]: pam_unix(sshd:session): session closed for user moka
    2026-03-02T19:31:44.778402+08:00 HK4C sshd[1911262]: Invalid user mysql from 195.24.237.3 port 40628
    2026-03-02T19:31:46.049998+08:00 HK4C sshd[1911262]: Connection closed by invalid user mysql 195.24.237.3 port 40628 [preauth]
    2026-03-02T19:46:19.158435+08:00 HK4C sshd[1913437]: Invalid user hive from 195.24.237.3 port 44756
    2026-03-02T19:46:20.541793+08:00 HK4C sshd[1913437]: Connection closed by invalid user hive 195.24.237.3 port 44756 [preauth]
    2026-03-02T20:00:49.917286+08:00 HK4C sshd[1915635]: Connection closed by authenticating user root 195.24.237.3 port 44962 [preauth]
    2026-03-02T20:15:18.039603+08:00 HK4C sshd[1917833]: Connection closed by authenticating user root 195.24.237.3 port 52990 [preauth]
    2026-03-02T20:29:47.520061+08:00 HK4C sshd[1919999]: Invalid user vyr_odoo from 195.24.237.3 port 56356
    2026-03-02T20:29:49.246996+08:00 HK4C sshd[1919999]: Connection closed by invalid user vyr_odoo 195.24.237.3 port 56356 [preauth]
    2026-03-02T20:30:07.449599+08:00 HK4C sshd[1920063]: Accepted publickey for moka from 223.***.***.*** port 2865 ssh2: ED25519 SHA256:5w**********z/ps**********Wck
    2026-03-02T20:30:07.452744+08:00 HK4C sshd[1920063]: pam_unix(sshd:session): session opened for user moka(uid=1000) by moka(uid=0)
    2026-03-02T20:44:20.094270+08:00 HK4C sshd[1922673]: Connection closed by authenticating user root 195.24.237.3 port 38112 [preauth]
    2026-03-02T20:49:01.214433+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/grep -E 'sshd|Accepted|Failed|Invalid|authentication failure' /var/log/auth.log
    2026-03-02T20:50:27.359177+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/grep Accepted /var/log/auth.log
    2026-03-02T20:51:19.528610+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/grep -E sshd.*Accepted /var/log/auth.log
    2026-03-02T20:58:50.124246+08:00 HK4C sshd[1924891]: Connection closed by authenticating user root 195.24.237.3 port 45930 [preauth]
    2026-03-02T21:02:53.469058+08:00 HK4C sudo: moka : TTY=pts/0 ; PWD=/home/moka ; USER=root ; COMMAND=/usr/bin/grep -E 'sshd|Accepted|Failed|Invalid|authentication failure' /var/log/auth.log

    可以发现还是上面的那些内容

  • 最近成功登录是来自哪些 IP

    Terminal window
    $ sudo grep -E "sshd.*Accepted" /var/log/auth.log \
    | awk '{for(i=1;i<=NF;i++) if($i=="from") {print $(i+1); break}}' \
    | sort | uniq -c | sort -nr | head
    3 223.***.***.***
    1 198.**.***.***

    前面的数字是次数,后面的是 IP,可以发现仍然是我们的 IP

在检测 fail2ban 之前,有一个小插曲,有一台机器在进行刚才 SSH 登录历史的时候发现有一个不是我的 IP

Terminal window
# last -a | head -n 50 | grep 134.75.145.90
root pts/2 Thu Feb 26 04:24 - 04:24 (00:00) 134.75.145.90

就是这个 IP: 134.75.145.90,而在进行 SSH 认证日志 测试的时候并未发现有这个 IP,这个是正常现象,因为这条记录可能在已轮转的日志里

last 读的是 /var/log/wtmp(登录历史数据库),保存周期通常更久; 而 /var/log/auth.log 会被 logrotate 轮转成 auth.log.1auth.log.2.gz ……你只查了当前 auth.log,所以可能漏掉 2 月 26 日那条

所以此时需要我们全盘搜索:

Terminal window
# sudo zgrep -hE "sshd.*Accepted" /var/log/auth.log* | grep "134.75.145.90"
Feb 26 04:24:01 vultr sshd[8546]: Accepted publickey for root from 134.75.145.90 port 52516 ssh2: ED25519 SHA256:6tOC2PKravofjFPcnzkuMjg++cxG3s07N98aIt3L7UY
Feb 26 04:29:48 vultr sshd[8641]: Accepted publickey for root from 134.75.145.90 port 58004 ssh2: ED25519 SHA256:6tOC2PKravofjFPcnzkuMjg++cxG3s07N98aIt3L7UY
Feb 26 04:30:53 vultr sshd[8721]: Accepted publickey for root from 134.75.145.90 port 51888 ssh2: ED25519 SHA256:6tOC2PKravofjFPcnzkuMjg++cxG3s07N98aIt3L7UY

从日志里可以看出,134.75.145.90 这个 IP 在 2 月 26 日 04:24、04:29、04:30 使用 SSH 公钥的方式,以 root 身份登录了这台 VPS

因为是公钥泄露,所以我们需要找到是哪个公钥出现了泄露

Terminal window
# sudo ssh-keygen -lf /root/.ssh/authorized_keys | grep '6tOC2PKravofjFPcnzkuMjg++cxG3s07N98aIt3L7UY'
256 SHA256:6tOC2PKravofjFPcnzkuMjg++cxG3s07N98aIt3L7UY root@JP1G (ED25519)

经检查发现,是 JP1G 这台机器的公钥进行泄露,那么先要立刻从服务器上移除这把泄露 key,并且替换这个密钥

Terminal window
# 在 JP1G
ssh-keygen -t ed25519
cat ~/.ssh/id_ed25519.pub
# 在其他机器
vim ~/.ssh/authorized_keys
# 粘贴在 JP1G 上获得的公钥
1.3 fail2ban 是否有有效工作

如果是根据我 【自用】VPS 到手后必做的几件事 教程来的话,那么 jail 应该就是默认的 sshd

Terminal window
# 查看 fail2ban 状态
sudo fail2ban-client status
# 具体到某个 jail
sudo fail2ban-client status sshd
# ban 掉 IP 1.2.3.4
sudo fail2ban-client set sshd banip 1.2.3.4
# 再次查看 jail 状态
sudo fail2ban-client status sshd

正如上面所言,现在有 195.24.237.3124.237.79.34 来回扫机器,还有莫名的 134.75.145.90 来登录我的 VPS,那么这几个 IP 都是我们要着重封禁的

Terminal window
sudo fail2ban-client set sshd banip 195.24.237.3
sudo fail2ban-client set sshd banip 124.237.79.34
sudo fail2ban-client set sshd banip 134.75.145.90

第二天早上发现 195.24.237.3 仍在尝试登录,真得控制你了.jpg

Terminal window
$ sudo lastb -a | head -n 50
dbus ssh:notty Tue Mar 3 07:52 - 07:52 (00:00) 195.24.237.3
root1 ssh:notty Tue Mar 3 07:37 - 07:37 (00:00) 195.24.237.3
elastics ssh:notty Tue Mar 3 05:59 - 05:59 (00:00) 195.24.237.3
ubuntu ssh:notty Tue Mar 3 05:27 - 05:27 (00:00) 195.24.237.3
admin ssh:notty Tue Mar 3 00:46 - 00:46 (00:00) 195.24.237.3
admin ssh:notty Mon Mar 2 23:13 - 23:13 (00:00) 195.24.237.3
dixi ssh:notty Mon Mar 2 22:57 - 22:57 (00:00) 195.24.237.3

此时昨晚的 ban list 已过期(因为之前设置的是 bantime = 600 是 600s 也就是 10 分钟),此时我们需要永久封禁,可以创建一个名为 recidive 的 jail

/etc/fail2ban/jail.local 加上

Terminal window
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
# 在一天内
findtime = 1d
# 最多尝试 5 次
maxretry = 5
# 就被永久封禁
bantime = -1

然后重启 fail2ban 并查看状态

Terminal window
sudo systemctl restart fail2ban
sudo fail2ban-client status recidive
Terminal window
$ sudo fail2ban-client status recidive
Status for the jail: recidive
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=fail2ban.service PRIORITY=5
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

此时我们可以添加永久封禁的 IP

Terminal window
sudo fail2ban-client set recidive banip 195.24.237.3
# 查看永久封禁的状态
sudo fail2ban-client status recidive
Terminal window
$ sudo fail2ban-client status recidive
Status for the jail: recidive
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=fail2ban.service PRIORITY=5
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 195.24.237.3

可以看到,此时有一个 195.24.237.3 的 IP 被永久封禁

至此,SSH 排查结束

2. 系统性能

大致流程是:使用实时监控工具来看看谁在抢占资源 ---> 排查 CPU 负载 ---> 排查 磁盘 I/O ---> 排查网络连接是否有异常

2.1 快速全局概览:实时监控工具

首先,我们需要一个直观的界面来看看谁在抢占资源,比如 htop 或者 btop

观察重点:看 CPU 柱状图。如果某个进程持续占用 90%-100% 的 CPU,且进程名随机(如 ajk382)或伪装成系统进程(如 syslogd 但路径不对),就要警惕了

htop 使用技巧:按 P 按 CPU 排序,按 M 按内存排序

Terminal window
htop

2.1.3.12.1.3.2

大致看了一眼,应该没有什么问题

2.2 CPU 负载
Terminal window
uptime

这里主要看 Load Average:分别代表 1、5、15 分钟的平均负载。如果数值远超过你的 CPU 核心数(例如 4 核机器负载到了 10 以上),说明系统正处于高压状态

Terminal window
$ uptime
09:26:46 up 7 days, 23:33, 4 users, load average: 0.57, 0.52, 0.37
2.3 磁盘 I/O
Terminal window
iostat -x 1 5

有时候矿机不费 CPU 费硬盘,或者木马在疯狂写日志

这里主要看 %util:如果某个磁盘利用率接近 100%,说明 I/O 达到瓶颈。

这里因为太长就不放了

2.4 网络是否异常
Terminal window
sudo netstat -antp

这里看 IP 是否为境外 IP,端口是否为 3333, 4444, 5555, 8888 等,或者看有没有你不熟悉的端口号

或者也可以使用 iftop 查看是否有占用大带宽的非法程序

Terminal window
sudo apt update
sudo apt install iftop

安装之后

Terminal window
sudo iftop -i eth0 -P # 看看是哪个端口在吃掉你的总带宽

2.2.4.1

可以看到,这张截图上没有很大带宽的流量,最大的带宽是当前的 SSH 终端。 但是有许多大量的、来自 *.netpontal.net.br 的连接,从地址可以看出这是一个巴西的 ISP,每个连接的流量极小(只有 208b 或 125b)。这正是 SYN Flood(半连接攻击) 的典型表现:攻击者不发送实际数据,只发送微小的握手请求包来占满你的系统资源

此时我们可以采取以下操作:

  1. 屏蔽巴西网段

    Terminal window
    sudo iptables -I INPUT -s 131.100.0.0/16 -j DROP
  2. 开启抗攻击内核参数

    Terminal window
    sudo sysctl -w net.ipv4.tcp_syncookies=1

3. 自启动

3.1 环境变量

首先检查是否有异常的环境变量

Terminal window
# 检查当前环境变量是否有可疑路径(如 /tmp 或隐藏目录)
env
# 检查关键配置文件是否有异常的 export 指令
cat ~/.bashrc ~/.profile /etc/profile /etc/bash.bashrc | grep "export"
# 如果发现可疑项,直接用 vim 编辑对应文件删除该行
3.2 定时任务和自启脚本
Terminal window
# 查看并清理用户的定时任务
crontab -l
crontab -r # 如果确认全是恶意任务,可直接清空
# 检查系统级定时任务目录
ls -la /etc/cron.*
ls -la /var/spool/cron/crontabs
# 查看所有正在运行的可疑服务
systemctl list-units --type=service --state=running
# 停止并禁用可疑服务(以 anubis 为例)
systemctl stop anubis
systemctl disable anubis
# 删除服务定义文件
rm -f /etc/systemd/system/anubis.service
systemctl daemon-reload
3.3 检查陌生用户

检查是否被创建了具有 Root 权限的新账户

Terminal window
# 检查 UID 为 0(管理员权限)的所有用户
awk -F: '$3==0 {print $1}' /etc/passwd
# 检查具有登录权限(非 nologin)的用户
grep -E "sh$|bash$" /etc/passwd
# 如果发现陌生用户(如 hacker123),立即删除其密码或删除用户
userdel -r 陌生用户名
3.4 检查隐藏进程
Terminal window
# 查找不在 ps 列表中但在 /proc 里的进程 (需要安装 unhide)
sudo apt install unhide -y
sudo unhide quick reverse
# 检查有没有诡异的临时文件系统挂载
mount | grep "tmpfs"
3.5 检查 LD 相关内容(动态库劫持)

这是非常隐蔽的手段,通过劫持系统库让所有命令都失效

Terminal window
# 检查最重要的预加载文件(正常情况下该文件应为空或不存在)
cat /etc/ld.so.preload
# 检查环境变量中的预加载
echo $LD_PRELOAD
# 如果文件中有内容且你不认识,立即清空它: > /etc/ld.so.preload
3.6 检查内核有没有被修改

裸金属服务器如果被植入内核模块,普通的 ps 就彻底废了

Terminal window
# 列出已加载的内核模块,寻找名字随机或可疑的模块
lsmod
# 查看内核日志,寻找有关 "module tainted" 或异常的输出
dmesg | grep -iE "tainted|module|hidden"
# 验证内核签名(取决于发行版)
uname -a
3.7 使用专业工具检测 Rootkits 进行检查

首先安装

Terminal window
sudo apt update
sudo apt install rkhunter chkrootkit -y

然后运行 chkrootkit

Terminal window
sudo chkrootkit | grep INFECTED

之后运行 rkhunter

Terminal window
sudo rkhunter --update
sudo rkhunter --check --sk # --sk 表示自动确认,无需手动回车
Terminal window
$ sudo rkhunter --check --sk
[ Rootkit Hunter version 1.4.6 ]
Checking system commands...
Performing 'strings' command checks
Checking 'strings' command [ OK ]
Performing 'shared libraries' checks
Checking for preloading variables [ None found ]
Checking for preloaded libraries [ None found ]
Checking LD_LIBRARY_PATH variable [ Not found ]
Performing file properties checks
Checking for prerequisites [ OK ]
/usr/local/sbin/sshd [ OK ]
/usr/local/bin/ssh [ OK ]
/usr/sbin/adduser [ OK ]
/usr/sbin/chroot [ OK ]
/usr/sbin/cron [ OK ]
/usr/sbin/depmod [ OK ]
/usr/sbin/fsck [ OK ]
/usr/sbin/groupadd [ OK ]
/usr/sbin/groupdel [ OK ]
/usr/sbin/groupmod [ OK ]
/usr/sbin/grpck [ OK ]
/usr/sbin/ifconfig [ OK ]
/usr/sbin/ifdown [ OK ]
/usr/sbin/ifup [ OK ]
/usr/sbin/init [ OK ]
/usr/sbin/insmod [ OK ]
/usr/sbin/ip [ OK ]
/usr/sbin/lsmod [ OK ]
/usr/sbin/modinfo [ OK ]
/usr/sbin/modprobe [ OK ]
/usr/sbin/nologin [ OK ]
/usr/sbin/pwck [ OK ]
/usr/sbin/rmmod [ OK ]
/usr/sbin/route [ OK ]
/usr/sbin/rsyslogd [ OK ]
/usr/sbin/runlevel [ OK ]
/usr/sbin/sshd [ OK ]
/usr/sbin/sulogin [ OK ]
/usr/sbin/sysctl [ OK ]
/usr/sbin/useradd [ OK ]
/usr/sbin/userdel [ OK ]
/usr/sbin/usermod [ OK ]
/usr/sbin/vipw [ OK ]
/usr/sbin/unhide [ OK ]
/usr/sbin/unhide-linux [ OK ]
/usr/sbin/unhide-posix [ OK ]
/usr/sbin/unhide-tcp [ OK ]
/usr/bin/awk [ OK ]
/usr/bin/basename [ OK ]
/usr/bin/bash [ OK ]
/usr/bin/cat [ OK ]
/usr/bin/chattr [ OK ]
/usr/bin/chmod [ OK ]
/usr/bin/chown [ OK ]
/usr/bin/cp [ OK ]
/usr/bin/curl [ OK ]
/usr/bin/cut [ OK ]
/usr/bin/date [ OK ]
/usr/bin/df [ OK ]
/usr/bin/diff [ OK ]
/usr/bin/dirname [ OK ]
/usr/bin/dmesg [ OK ]
/usr/bin/dpkg [ OK ]
/usr/bin/dpkg-query [ OK ]
/usr/bin/du [ OK ]
/usr/bin/echo [ OK ]
/usr/bin/egrep [ Warning ]
/usr/bin/env [ OK ]
/usr/bin/fgrep [ Warning ]
/usr/bin/file [ OK ]
/usr/bin/find [ OK ]
/usr/bin/fuser [ OK ]
/usr/bin/grep [ OK ]
/usr/bin/groups [ OK ]
/usr/bin/head [ OK ]
/usr/bin/id [ OK ]
/usr/bin/ip [ OK ]
/usr/bin/ipcs [ OK ]
/usr/bin/kill [ OK ]
/usr/bin/killall [ OK ]
/usr/bin/last [ OK ]
/usr/bin/lastlog [ OK ]
/usr/bin/ldd [ OK ]
/usr/bin/less [ OK ]
/usr/bin/logger [ OK ]
/usr/bin/login [ OK ]
/usr/bin/ls [ OK ]
/usr/bin/lsattr [ OK ]
/usr/bin/lsmod [ OK ]
/usr/bin/lsof [ OK ]
/usr/bin/mail [ OK ]
/usr/bin/md5sum [ OK ]
/usr/bin/mktemp [ OK ]
/usr/bin/more [ OK ]
/usr/bin/mount [ OK ]
/usr/bin/mv [ OK ]
/usr/bin/netstat [ OK ]
/usr/bin/newgrp [ OK ]
/usr/bin/passwd [ OK ]
/usr/bin/perl [ OK ]
/usr/bin/pgrep [ OK ]
/usr/bin/ping [ OK ]
/usr/bin/pkill [ OK ]
/usr/bin/ps [ OK ]
/usr/bin/pstree [ OK ]
/usr/bin/pwd [ OK ]
/usr/bin/readlink [ OK ]
/usr/bin/rkhunter [ OK ]
/usr/bin/runcon [ OK ]
/usr/bin/sed [ OK ]
/usr/bin/sh [ OK ]
/usr/bin/sha1sum [ OK ]
/usr/bin/sha224sum [ OK ]
/usr/bin/sha256sum [ OK ]
/usr/bin/sha384sum [ OK ]
/usr/bin/sha512sum [ OK ]
/usr/bin/size [ OK ]
/usr/bin/sort [ OK ]
/usr/bin/ssh [ OK ]
/usr/bin/stat [ OK ]
/usr/bin/strace [ OK ]
/usr/bin/strings [ OK ]
/usr/bin/su [ OK ]
/usr/bin/sudo [ OK ]
/usr/bin/tail [ OK ]
/usr/bin/telnet [ OK ]
/usr/bin/test [ OK ]
/usr/bin/top [ OK ]
/usr/bin/touch [ OK ]
/usr/bin/tr [ OK ]
/usr/bin/uname [ OK ]
/usr/bin/uniq [ OK ]
/usr/bin/users [ OK ]
/usr/bin/vmstat [ OK ]
/usr/bin/w [ OK ]
/usr/bin/watch [ OK ]
/usr/bin/wc [ OK ]
/usr/bin/wget [ OK ]
/usr/bin/whatis [ OK ]
/usr/bin/whereis [ OK ]
/usr/bin/which [ Warning ]
/usr/bin/who [ OK ]
/usr/bin/whoami [ OK ]
/usr/bin/numfmt [ OK ]
/usr/bin/kmod [ OK ]
/usr/bin/systemd [ OK ]
/usr/bin/systemctl [ OK ]
/usr/bin/mawk [ OK ]
/usr/bin/mail.mailutils [ OK ]
/usr/bin/dash [ OK ]
/usr/bin/x86_64-linux-gnu-size [ OK ]
/usr/bin/x86_64-linux-gnu-strings [ OK ]
/usr/bin/telnet.netkit [ OK ]
/usr/bin/w.procps [ OK ]
/usr/lib/systemd/systemd [ OK ]
Checking for rootkits...
Performing check of known rootkit files and directories
55808 Trojan - Variant A [ Not found ]
ADM Worm [ Not found ]
AjaKit Rootkit [ Not found ]
Adore Rootkit [ Not found ]
aPa Kit [ Not found ]
Apache Worm [ Not found ]
Ambient (ark) Rootkit [ Not found ]
Balaur Rootkit [ Not found ]
BeastKit Rootkit [ Not found ]
beX2 Rootkit [ Not found ]
BOBKit Rootkit [ Not found ]
cb Rootkit [ Not found ]
CiNIK Worm (Slapper.B variant) [ Not found ]
Danny-Boy's Abuse Kit [ Not found ]
Devil RootKit [ Not found ]
Diamorphine LKM [ Not found ]
Dica-Kit Rootkit [ Not found ]
Dreams Rootkit [ Not found ]
Duarawkz Rootkit [ Not found ]
Ebury backdoor [ Not found ]
Enye LKM [ Not found ]
Flea Linux Rootkit [ Not found ]
Fu Rootkit [ Not found ]
Fuck`it Rootkit [ Not found ]
GasKit Rootkit [ Not found ]
Heroin LKM [ Not found ]
HjC Kit [ Not found ]
ignoKit Rootkit [ Not found ]
IntoXonia-NG Rootkit [ Not found ]
Irix Rootkit [ Not found ]
Jynx Rootkit [ Not found ]
Jynx2 Rootkit [ Not found ]
KBeast Rootkit [ Not found ]
Kitko Rootkit [ Not found ]
Knark Rootkit [ Not found ]
ld-linuxv.so Rootkit [ Not found ]
Li0n Worm [ Not found ]
Lockit / LJK2 Rootkit [ Not found ]
Mokes backdoor [ Not found ]
Mood-NT Rootkit [ Not found ]
MRK Rootkit [ Not found ]
Ni0 Rootkit [ Not found ]
Ohhara Rootkit [ Not found ]
Optic Kit (Tux) Worm [ Not found ]
Oz Rootkit [ Not found ]
Phalanx Rootkit [ Not found ]
Phalanx2 Rootkit [ Not found ]
Phalanx2 Rootkit (extended tests) [ Not found ]
Portacelo Rootkit [ Not found ]
R3dstorm Toolkit [ Not found ]
RH-Sharpe's Rootkit [ Not found ]
RSHA's Rootkit [ Not found ]
Scalper Worm [ Not found ]
Sebek LKM [ Not found ]
Shutdown Rootkit [ Not found ]
SHV4 Rootkit [ Not found ]
SHV5 Rootkit [ Not found ]
Sin Rootkit [ Not found ]
Slapper Worm [ Not found ]
Sneakin Rootkit [ Not found ]
'Spanish' Rootkit [ Not found ]
Suckit Rootkit [ Not found ]
Superkit Rootkit [ Not found ]
TBD (Telnet BackDoor) [ Not found ]
TeLeKiT Rootkit [ Not found ]
T0rn Rootkit [ Not found ]
trNkit Rootkit [ Not found ]
Trojanit Kit [ Not found ]
Tuxtendo Rootkit [ Not found ]
URK Rootkit [ Not found ]
Vampire Rootkit [ Not found ]
VcKit Rootkit [ Not found ]
Volc Rootkit [ Not found ]
Xzibit Rootkit [ Not found ]
zaRwT.KiT Rootkit [ Not found ]
ZK Rootkit [ Not found ]
Performing additional rootkit checks
Suckit Rootkit additional checks [ OK ]
Checking for possible rootkit files and directories [ None found ]
Checking for possible rootkit strings [ None found ]
Performing malware checks
Checking running processes for suspicious files [ None found ]
Checking for login backdoors [ None found ]
Checking for sniffer log files [ None found ]
Checking for suspicious directories [ None found ]
Checking for suspicious (large) shared memory segments [ None found ]
Checking for Apache backdoor [ Not found ]
Performing Linux specific checks
Checking loaded kernel modules [ OK ]
Checking kernel module names [ OK ]
Checking the network...
Performing checks on the network ports
Checking for backdoor ports [ None found ]
Performing checks on the network interfaces
Checking for promiscuous interfaces [ None found ]
Checking the local host...
Performing system boot checks
Checking for local host name [ Found ]
Checking for system startup files [ Found ]
Checking system startup files for malware [ None found ]
Performing group and account checks
Checking for passwd file [ Found ]
Checking for root equivalent (UID 0) accounts [ None found ]
Checking for passwordless accounts [ None found ]
Checking for passwd file changes [ None found ]
Checking for group file changes [ None found ]
Checking root account shell history files [ OK ]
Performing system configuration file checks
Checking for an SSH configuration file [ Found ]
Checking if SSH root access is allowed [ Warning ]
Checking if SSH protocol v1 is allowed [ Not set ]
Checking for other suspicious configuration settings [ None found ]
Checking for a running system logging daemon [ Found ]
Checking for a system logging configuration file [ Found ]
Checking if syslog remote logging is allowed [ Not allowed ]
Performing filesystem checks
Checking /dev for suspicious file types [ None found ]
Checking for hidden files and directories [ None found ]
System checks summary
=====================
File properties checks...
Files checked: 145
Suspect files: 3
Rootkit checks...
Rootkits checked : 499
Possible rootkits: 0
Applications checks...
All checks skipped
The system checks took: 47 seconds
All results have been written to the log file: /var/log/rkhunter.log
One or more warnings have been found while checking the system.
Please check the log file (/var/log/rkhunter.log)

三、防护措施

防火墙

安装最新最热防火墙管理工具 nftables

Terminal window
sudo apt update
sudo apt install nftables -y

因为新版 Debian/Ubuntu 系统已经就是用着“套皮” nftables 来管理防火墙,所以即使你安装的是新的软件,但是之前的防火墙配置也还在这上面

我们可以通过下面的命令来查看之前的表

Terminal window
sudo nft list ruleset
Terminal window
$ # sudo nft list ruleset
table ip filter {
chain INPUT {
type filter hook input priority 0; policy accept;
ip saddr 131.100.0.0/16 counter packets 1749 bytes 90936 drop
meta l4proto tcp counter packets 167212 bytes 122373248 jump f2b-sshd
}
chain FORWARD {
type filter hook forward priority 0; policy drop;
counter packets 6149938 bytes 3213518507 jump DOCKER-USER
counter packets 6149938 bytes 3213518507 jump DOCKER-ISOLATION-STAGE-1
oifname "docker0" ct state related,established counter packets 3149324 bytes 1617411443 accept
oifname "docker0" counter packets 44958 bytes 2615072 jump DOCKER
iifname "docker0" oifname != "docker0" counter packets 2955656 bytes 1593491992 accept
iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
}
chain DOCKER {
iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.2 tcp dport 9000 counter packets 41060 bytes 2399884 accept
iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.3 tcp dport 1935 counter packets 3898 bytes 215188 accept
}
chain DOCKER-ISOLATION-STAGE-1 {
iifname "docker0" oifname != "docker0" counter packets 2955656 bytes 1593491992 jump DOCKER-ISOLATION-STAGE-2
counter packets 6149938 bytes 3213518507 return
}
chain DOCKER-ISOLATION-STAGE-2 {
oifname "docker0" counter packets 0 bytes 0 drop
counter packets 2955656 bytes 1593491992 return
}
chain DOCKER-USER {
counter packets 6149938 bytes 3213518507 return
}
chain f2b-sshd {
ip saddr 124.237.79.34 counter packets 0 bytes 0 reject
ip saddr 195.24.237.3 counter packets 16 bytes 960 reject
counter packets 167196 bytes 122372288 return
}
}
table ip nat {
chain PREROUTING {
type nat hook prerouting priority -100; policy accept;
fib daddr type local counter packets 23720414 bytes 1281011871 jump DOCKER
}
chain INPUT {
type nat hook input priority 100; policy accept;
}
chain POSTROUTING {
type nat hook postrouting priority 100; policy accept;
oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 20051 bytes 1224503 masquerade
meta l4proto tcp ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 9000 counter packets 0 bytes 0 masquerade
meta l4proto tcp ip saddr 172.17.0.3 ip daddr 172.17.0.3 tcp dport 1935 counter packets 0 bytes 0 masquerade
}
chain OUTPUT {
type nat hook output priority -100; policy accept;
ip daddr != 127.0.0.0/8 fib daddr type local counter packets 22 bytes 1315 jump DOCKER
}
chain DOCKER {
iifname "docker0" counter packets 0 bytes 0 return
iifname != "docker0" meta l4proto tcp tcp dport 9000 counter packets 41060 bytes 2399884 dnat to 172.17.0.2:9000
iifname != "docker0" meta l4proto tcp tcp dport 1935 counter packets 3898 bytes 215188 dnat to 172.17.0.3:1935
}
}

可以看到它自带一个 filter 表,并且我们刚刚通过 fail2ban 封掉的 IP 也在这个上面

我们现在只对外开放 22 (SSH) 和 80, 443 的 HTTP(S) 服务的端口号,尽可能减小通过弱端口的攻击

Terminal window
# 1. 允许已建立的连接(确保你的机器人发请求能收到回包)
sudo nft add rule ip filter INPUT ct state established,related accept
# 2. 允许本地回环(系统内部通信必须)
sudo nft add rule ip filter INPUT iifname "lo" accept
# 3. 明确放行你的核心端口
sudo nft add rule ip filter INPUT tcp dport 22 accept # 这里的 22 修改成你的 SSH 端口号
sudo nft add rule ip filter INPUT tcp dport { 80, 443 } accept
# 4. 修改默认策略为 DROP (丢弃所有未被允许的入站流量)
# 注意:这一步执行后,除了 22, 80, 443,其他所有端口在外部都将无法访问
sudo nft "chain ip filter INPUT { policy drop ; }"

基本可以防护的部分也就只有防火墙来阻挡未知 IP 来访问端口了,再者就是定期做检查

四、总结

自己的网络安全自己负责,不要因为自己的安全意识淡薄去给别人造成麻烦。 网络攻击是逐年在增加的,且手段越来越丰富,有了 AI 的加持会让很多原来不会攻击的人也参与到攻击。 所以,不要对任何服务的暴露与脚本使用报侥幸心理。

  1. 不用的服务尽量关闭。
  2. 不要给普通用户设置 sudo 免密。
  3. 做好权限隔离,给对外的服务。

Footnotes

  1. https://linux.do/t/topic/1664395

  2. https://linux.do/t/topic/1665010

  3. https://linux.do/t/topic/1672897

  4. https://linux.do/t/topic/1673480

  5. https://linux.do/t/topic/1671682


Thanks for reading!

基于青龙面板事件,对 VPS 进行自检记录

周二 3月 03 2026
7567 字 · 48 分钟

评论