今晚我在 Clawdbot 服务器上装了 fail2ban。60 秒内,它就封禁了第一个攻击者。
不是测试。一个真实的机器人正在暴力破解 SSH(Secure Shell),而我还在配置防火墙。
Jan 27 02:46:55 sshd: Invalid user oracle from 217.154.38.135Jan 27 02:47:25 sshd: Invalid user main from 217.154.38.135Jan 27 02:47:56 sshd: Invalid user HwHiAiUser from 217.154.38.135Jan 27 02:48:26 sshd: Invalid user guest from 217.154.38.135Jan 27 02:48:57 sshd: Invalid user git from 217.154.38.135
每 30 秒一次。不同的用户名。全自动。不停歇。
然后 fail2ban 出手了:
2026-01-27 02:50:54 NOTICE [sshd] Ban 217.154.38.135
搞定。封禁 30 天。如果你在 VPS(虚拟专用服务器)上跑 Clawdbot,这套东西你必须装。
为什么 Clawdbot 服务器是攻击目标
Clawdbot 服务器对攻击者来说是块肥肉,因为它们通常有:
- Shell 访问权限 — Agent 可以直接执行命令
- API 凭证 — Anthropic、OpenAI、各种消息平台
- 个人数据 — 会话日志、记忆文件、联系人
- 24/7 在线 — 云 VPS 全天候运行
攻击者一旦拿下你的 Clawdbot 服务器,就能获得你 AI 助手的全部能力。他们可以读你的对话记录,在消息平台上冒充你,或者刷爆你的 API 账单。
是时候解决这个问题了。
第一步:SSH 密钥认证(最关键)
这是最重要的安全措施。密码认证是最大的弱点,而 SSH 密钥是加密安全的,暴力破解根本行不通。
在你的本地电脑上,生成密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com"
这会生成两个文件:
~/.ssh/id_ed25519— 你的私钥(绝对不要泄露)~/.ssh/id_ed25519.pub— 你的公钥(放到服务器上)
把公钥复制到服务器:
ssh-copy-id user@your-server-ip
或者手动操作:
# 在本地电脑上cat ~/.ssh/id_ed25519.pub# 复制输出内容,然后在服务器上执行:echo "your-public-key-here" >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys
测试是否生效:
ssh user@your-server-ip
如果不需要输入密码就能登录,说明配置成功了。
第二步:禁用密码认证
SSH 密钥认证生效后,彻底关掉密码登录:
sudo nano /etc/ssh/sshd_config
找到并修改这些配置:
PasswordAuthentication noPubkeyAuthentication yesChallengeResponseAuthentication no
重启 SSH:
sudo systemctl restart sshd
现在唯一的登录方式就是你的私钥。暴力破解彻底失去意义——它们在猜一个根本不存在的密码。
第三步:安装 fail2ban
即使有了 SSH 密钥,fail2ban 作为额外的防护层依然有用——保持日志干净,减少资源浪费。
sudo apt updatesudo apt install -y fail2ban
创建本地配置文件:
sudo tee /etc/fail2ban/jail.local << 'EOF'[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 2592000findtime = 600EOF
参数说明:
- maxretry = 3 — 失败 3 次 = 直接封禁
- bantime = 2592000 — 封禁 30 天(用了 SSH 密钥的话,任何失败尝试肯定是攻击者)
- findtime = 600 — 在 10 分钟窗口内计数
启动服务:
sudo systemctl enable fail2bansudo systemctl restart fail2ban
检查运行状态:
sudo fail2ban-client status sshd
第四步:配置 ufw 防火墙
# 默认策略:拒绝所有入站流量sudo ufw default deny incomingsudo ufw default allow outgoing# 只开放 Clawdbot 需要的端口sudo ufw allow 22/tcp # SSH(后面会改)sudo ufw allow 80/tcp # HTTP(如果用 webhook)sudo ufw allow 443/tcp # HTTPS# 启用防火墙sudo ufw --force enable
验证配置:
sudo ufw status verbose
第五步:SSH 蜜罐 endlessh(好玩的部分)
接下来才是重头戏。思路是这样的:把真正的 SSH 挪到非标准端口,然后在 22 端口放上 endlessh。机器人连接到 22 端口后,会被困在一个无限慢的 banner(横幅)里——每 10 秒才发送一个随机字节。它们永远等不到登录提示符。与此同时,真正的 SSH 在另一个端口安安静静地运行。
endlessh 的工作原理
endlessh 是一个 SSH tarpit(陷阱)。当机器人连接时,它会无限缓慢地发送 SSH banner——每 10 秒一个随机字节。SSH 协议规定 banner 最多 255 个字符,但没有规定最低速度。大多数机器人会耐心等待完整的 banner,白白占着一个连接槽浪费时间。
你可以把它想象成 SSH 机器人的数字流沙。
安装 endlessh
sudo apt install endlessh
把真正的 SSH 移到 2222 端口
在现代 Ubuntu 上,SSH 由 systemd socket 管理,所以我们需要覆盖 socket 配置:
sudo mkdir -p /etc/systemd/system/ssh.socket.d/sudo tee /etc/systemd/system/ssh.socket.d/override.conf << 'EOF'[Socket]ListenStream=ListenStream=2222EOF
重新加载并重启:
sudo systemctl daemon-reloadsudo systemctl restart ssh.socketsudo systemctl restart ssh
验证 SSH 是否已在 2222 端口运行:
ss -tlnp | grep :2222
配置 endlessh 监听 22 端口
sudo mkdir -p /etc/endlesshsudo tee /etc/endlessh/config << 'EOF'Port 22Delay 10000MaxLineLength 32MaxClients 4096LogLevel 1EOF
参数含义:
- Port 22 — 标准 SSH 端口(机器人会找到这个)
- Delay 10000 — 每 10 秒发送一个字节
- MaxClients 4096 — 能同时困住大量机器人
- LogLevel 1 — 记录连接日志,看着挺有意思
修复 systemd 服务
endlessh 在新系统上可能会报 NAMESPACE 错误。创建一个服务覆盖文件:
sudo mkdir -p /etc/systemd/system/endlessh.service.d/sudo tee /etc/systemd/system/endlessh.service.d/override.conf << 'EOF'[Service]PrivateUsers=falseEOF
启动 endlessh
sudo systemctl daemon-reloadsudo systemctl enable endlesshsudo systemctl start endlessh
检查运行状态:
sudo systemctl status endlesshss -tlnp | grep :22
更新 ufw 防火墙规则
# 放行新的 SSH 端口sudo ufw allow 2222/tcp# 删除旧的 SSH 规则(22 端口现在是陷阱了)sudo ufw delete allow 22/tcp
测试陷阱效果
从另一台机器连接 22 端口试试:
ssh user@your-server-ip -p 22
连接会卡住,每 10 秒冒出一个字符。等一会儿你会看到一串超级慢的乱码 banner。按 Ctrl+C 退出。
再试试真正的 SSH:
ssh user@your-server-ip -p 2222
瞬间连接,密钥认证,丝滑登录。
效果如何
机器人在 22 端口浪费时间,而你的真正 SSH 在 2222 端口安然无恙。日志也变干净了,因为失败的尝试都打到了陷阱上,而不是你的真实 SSH 服务。看 journalctl -f -u endlessh 其实挺有意思的——机器人连上来,然后就……一直等着。
到底有多有效?
一位研究者跑了几个月的 endlessh 并收集了被困机器人的数据。结果相当搞笑:
- 一个机器人同时保持了 416 个并发连接 ——不停地开新连接,旧的也不关
- 一个 IP 保持连接长达 690,172 秒——也就是整整 8 天——下载了 1.2MB 的随机垃圾数据,还以为那是 SSH banner
- 有些连接持续了 12,000+ 秒(3.3 小时)机器人才放弃
- 中位数困住时间是 17 秒(设了超时的「聪明」机器人),但平均值是 119 秒——被那些永远等下去的笨机器人拉高了
地下扫描软件的质量参差不齐。有些机器人设了 15 秒超时就走了。另一些完全没有超时——它们会一直坐在那里等到宇宙热寂,等一个永远不会出现的登录提示符。
最妙的是:endlessh 几乎不消耗任何资源。一个进程就能处理数千个连接,CPU 和内存占用极低。烧资源的是那些机器人,不是你。
监控陷阱
实时观看机器人被困:
journalctl -f -u endlessh
统计当前被困的连接数:
ss -tn | grep :22 | grep ESTAB | wc -l
第六步:更改 SSH 端口(简要说明)
我们在配置陷阱时已经把 SSH 移到了 2222 端口,但如果你不想用 endlessh,只想单纯换端口,一般做法是这样的:
# 在 /etc/ssh/sshd_config 中Port 2222
更新防火墙:
sudo ufw allow 2222/tcpsudo ufw delete allow 22/tcpsudo systemctl restart sshd
Security through obscurity(隐匿式安全)不算真正的安全,但确实能减少随机扫描的噪音。配合 SSH 密钥和 fail2ban,效果很不错。
第七步:用 pass 管理密钥
不要把 API 密钥和密码明文存在配置文件里。用 pass 吧——标准的 Unix 密码管理器。
安装:
sudo apt install pass gnupg
初始化:
# 生成 GPG 密钥(如果还没有的话)gpg --gen-key# 用你的 GPG 密钥初始化 passpass init "your-email@example.com"
存储密钥:
pass insert api/anthropicpass insert api/openaipass insert gmail/app-password
在脚本中读取密钥:
export ANTHROPIC_API_KEY=$(pass show api/anthropic)
为什么要这么做:
- 密钥在磁盘上用 GPG 加密
- 即使有人访问了你的文件系统,没有 GPG 密钥也读不了密码
- 可以通过 git 同步密码库(安全的,因为全都加密了)
- 和 Clawdbot 配合很好——安全地存储你的 API 密钥和频道令牌
你的 ~/.password-store/ 目录是加密的。你的 ~/.clawdbot/clawdbot.json 里的明文令牌?可就没这个待遇了。
第八步:Clawdbot 安全审计
Clawdbot 内置了安全扫描器。运行一下:
clawdbot security audit
深度检查:
clawdbot security audit --deep
自动修复常见问题:
clawdbot security audit --fix
审计检查哪些内容
- 入站访问 — 陌生人能不能给你的机器人发消息?
- 工具爆炸半径 — Prompt injection(提示注入)能不能导致 Shell 访问?
- 网络暴露 — Gateway 是否在无认证的情况下暴露?
- 浏览器控制 — 远程浏览器控制是否安全?
- 磁盘权限 — 凭证和日志是否受到保护?
- 插件 — 是否加载了不受信任的扩展?
修复工作区权限
审计可能会警告权限问题。修复方法:
chmod 700 ~/.clawdbotchmod 600 ~/.clawdbot/clawdbot.json
这样只有你的用户才能读取 Clawdbot 的配置和凭证。
凭证存储位置
知道你的密钥都存在哪里:
- Telegram 令牌: 配置文件或
channels.telegram.tokenFile - WhatsApp 认证:
~/.clawdbot/credentials/whatsapp/*/creds.json - 配对白名单:
~/.clawdbot/credentials/*-allowFrom.json - 会话日志:
~/.clawdbot/agents/*/sessions/*.jsonl
这些文件都应该设为只有你的用户可读(不要给 group/world 权限)。
第九步:频道安全
锁定私信
默认情况下,Clawdbot 可能接受任何人的消息。收紧一下:
在配置中把 DM 策略设为 allowlist(白名单):
{"channels": {"telegram": {"dmPolicy": "allowlist","dmAllowFrom": ["your_telegram_id"]}}}
锁定群聊
群组也一样——用白名单替代开放策略:
{"groupPolicy": "allowlist","groupAllowFrom": ["allowed_group_id"]}
安全审计会标记出开放策略的问题。
第十步:向 AbuseIPDB 举报攻击者
在本地封禁攻击者是好的。让他们被全球拉黑更好。
AbuseIPDB 是一个记录恶意 IP 的社区数据库。你举报一个攻击者,所有使用该黑名单的服务器都会受益。这是集体防御。
获取免费 API Key
在 abuseipdb.com 注册——免费版每天可举报 1000 次。
安全存储密钥:
pass insert abuseipdb/api-key
举报被封禁的 IP
ABUSEIPDB_KEY=$(pass show abuseipdb/api-key)curl -s https://api.abuseipdb.com/api/v2/report \-H "Key: $ABUSEIPDB_KEY" \-H "Accept: application/json" \--data-urlencode "ip=2.57.122.209" \-d "categories=18,22" \--data-urlencode "comment=SSH brute-force (fail2ban auto-ban)"
Categories 18,22 = 暴力破解 + SSH。
用 Clawdbot 自动举报
我写了一个 Clawdbot skill,可以自动把每次新的封禁举报到 AbuseIPDB。如果你在用 Clawdbot,可以直接安装:
clawdhub install fail2ban-reporter
或者从 GitHub 拉取:
git clone https://github.com/jestersimpps/clawdbot-fail2ban-reporter.gitsudo bash clawdbot-fail2ban-reporter/scripts/install.sh
配置完成后,每次 fail2ban 封禁都会自动举报到 AbuseIPDB。零操作,最大社区贡献。
第十一步:持续监控攻击
查看谁被封禁了:
sudo fail2ban-client status sshd
实时观看封禁日志:
sudo tail -f /var/log/fail2ban.log | grep Ban
查看最近的 SSH 登录尝试:
journalctl -u ssh -n 50 | grep -E "Failed|Invalid"
实时观看 endlessh 困住机器人:
sudo journalctl -f -u endlessh
你会看到那些卡住的连接。每一个都是一个正在浪费时间的机器人,而不是在骚扰你的真正 SSH。
攻击者到底在试什么
我服务器上仅一个小时的日志:
- oracle — Oracle 数据库默认用户
- postgres — PostgreSQL 默认用户
- git — GitLab/Gitea 服务器
- solana — 加密货币节点运营者(热门目标)
- HwHiAiUser — 华为设备默认用户
- admin, root — 经典款
- ftpuser — 老式 FTP 用户
它们撒网式地喷常见用户名,看能不能碰上一个。fail2ban 在 3 次尝试后就封掉它们了,但现在它们会先掉进陷阱。
完整的 5 分钟快速配置
复制粘贴下面这整段命令,一次性加固全新的 Clawdbot 服务器:
# 安装安全工具sudo apt update && sudo apt install -y fail2ban ufw endlessh gnupg pass# 生成 SSH 密钥(在你的本地电脑上运行)ssh-keygen -t ed25519 -C "your_email@example.com"ssh-copy-id user@your-server-ip# 禁用密码认证(在服务器上执行)sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_configsudo sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config# 把 SSH 移到 2222 端口用于陷阱配置sudo mkdir -p /etc/systemd/system/ssh.socket.d/sudo tee /etc/systemd/system/ssh.socket.d/override.conf << 'EOF'[Socket]ListenStream=ListenStream=2222EOF# 配置 endlessh 陷阱监听 22 端口sudo mkdir -p /etc/endlesshsudo tee /etc/endlessh/config << 'EOF'Port 22Delay 10000MaxLineLength 32MaxClients 4096LogLevel 1EOF# 修复 endlessh systemd 服务sudo mkdir -p /etc/systemd/system/endlessh.service.d/sudo tee /etc/systemd/system/endlessh.service.d/override.conf << 'EOF'[Service]PrivateUsers=falseEOF# 配置 fail2bansudo tee /etc/fail2ban/jail.local << 'EOF'[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 2592000findtime = 600EOF# 配置防火墙sudo ufw default deny incomingsudo ufw default allow outgoingsudo ufw allow 2222/tcp # 新的 SSH 端口sudo ufw allow 80/tcp # HTTPsudo ufw allow 443/tcp # HTTPSsudo ufw --force enable# 启动所有服务sudo systemctl daemon-reloadsudo systemctl restart ssh.socket sshsudo systemctl enable --now fail2ban endlessh# 修复 Clawdbot 权限chmod 700 ~/.clawdbotchmod 600 ~/.clawdbot/clawdbot.json 2>/dev/null# 运行 Clawdbot 安全审计clawdbot security audit --fix# 验证所有配置echo "=== SSH on port 2222 ==="ss -tlnp | grep :2222echo "=== endlessh tarpit on port 22 ==="ss -tlnp | grep :22echo "=== fail2ban status ==="sudo fail2ban-client status sshdecho "=== ufw status ==="sudo ufw status verboseecho "=== Clawdbot security ==="clawdbot security audit
重要提示: 运行完成后,用新端口连接 SSH:
ssh user@your-server-ip -p 2222
完整的安全防护体系
按照这篇指南操作后,你的 Clawdbot 服务器拥有:
- SSH 密钥认证 — 没有密码可以暴力破解
- 密码认证已禁用 — 就算猜对了也没用
- endlessh 陷阱 — 机器人在 22 端口浪费时间,真正的 SSH 藏在 2222 端口
- fail2ban — 3 次尝试 → 封禁 30 天(备用防线)
- ufw 防火墙 — 只暴露必要端口
- pass — 密钥在磁盘上用 GPG 加密
- Clawdbot 配对 — 陌生人无法给你的机器人发消息
- 权限设置 — 配置和凭证已锁定
- AbuseIPDB 举报 — 攻击者被全球拉黑
这就是纵深防御(Defense in Depth)。多层防护,每一层都让下一次攻击变得更难。陷阱是锦上添花——不仅仅是封锁攻击者,还在浪费他们的时间和资源,同时把你的真实服务藏了起来。
当每台有公网 IP 的服务器都会在几小时内被攻击时,这不是偏执。5 分钟的配置,换来安稳的睡眠。
更多 Clawdbot 安全细节,请查阅官方安全文档。
Stay Updated
Get notified about new posts on automation, productivity tips, indie hacking, and web3.
No spam, ever. Unsubscribe anytime.


