一、 核心思路:规范化与模块化

为了方便将来“一键搬家”,我们将所有运维脚本统一存放在 /root/scripts/monitor 目录下。

目录结构预览

/root/scripts/monitor/
├── admin_bot.py          # Telegram 机器人主程序 (Python)
├── ban_ip.sh             # IP 处决脚本 (Shell)
├── rss_watchdog.sh       # 实时高频攻击监控 (Shell)
├── server_monitor_env.sh # 环境配置文件 (存储 Token/ID)
├── blacklist.conf        # Nginx 核心黑名单 (由脚本自动维护)
└── logs/                 # 存放机器人运行日志

二、 Nginx 层:接入“小黑屋”机制

不要直接在 nginx.conf 里乱写 deny。我们采用 include 方式,让主配置保持干净。

1. 准备黑名单本子

touch /usr/local/nginx/conf/vhost/blacklist.conf

2. 修改站点配置 (rss.conf)

server { listen 443 ... } 块中加入:

# 引入黑名单文件
include /usr/local/nginx/conf/vhost/blacklist.conf;

# 如果使用 Cloudflare,务必配置真实 IP 获取
real_ip_header CF-Connecting-IP;
set_real_ip_from 103.21.244.0/22; # (此处省略其他 CF IP 段)

三、 脚本实现:保安的“枪”与“眼”

1. 配置文件 (server_monitor_env.sh)

将敏感信息提取出来,方便管理:

export BOT_TOKEN="你的_TG_BOT_TOKEN"
export MY_CHAT_ID="你的_CHAT_ID"

2. 智能处决脚本 (ban_ip.sh)

这个脚本支持“自动抓取最恶劣 IP”或“手动封禁指定 IP”,且绝不重复写入:

#!/bin/bash
source /root/scripts/monitor/server_monitor_env.sh
CONF_FILE="/usr/local/nginx/conf/vhost/blacklist.conf"

# 支持参数输入
IP=${1:-$(tail -n 1000 /data/wwwlogs/rss.access.log | grep " 403 " | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 1 | awk '{print $2}')}

if [ -z "$IP" ]; then echo "NODATA"; exit; fi

if grep -q "$IP" $CONF_FILE; then
    echo "EXISTS|$IP"
else
    echo "deny $IP;" >> $CONF_FILE
    /usr/local/nginx/sbin/nginx -t > /dev/null 2>&1 && service nginx restart > /dev/null 2>&1
    echo "SUCCESS|$IP"
fi

四、 Telegram 交互:可视化指挥中心

使用 pyTelegramBotAPI 编写的 admin_bot.py。核心功能:

  • /scan:统计今日拦截数,并列出 Top 5 攻击者,附带一键封禁按钮。
  • /list:查看当前黑名单“战果”。
  • /status:全中文显示 Docker 容器健康状态。
    提示: 完整 Python 代码建议在 WordPress 中使用“代码块”插件展示。重点在于使用了 InlineKeyboardMarkup 实现按钮交互。

五、 Vaultwarden 备份通知:最后的拼图

使用 ttionya/vaultwarden-backup 镜像,在 docker-compose.yml 中配置环境变量实现精美通知:

environment:
  - PING_URL_WHEN_SUCCESS=https://api.telegram.org/bot你的TOKEN/sendMessage
  - PING_URL_WHEN_SUCCESS_CURL_OPTIONS=-d chat_id=你的ID -d text="📦 *Vaultwarden 备份报告*%0A━━━━━━━━━━━━━━━%0A✅ *状态:* 成功%0A⏰ *完成时间:* %{content}" -d parse_mode=Markdown

(注:%{content} 是项目自带的占位符,会自动替换为上传结果。)

六、 自动化:让系统自己跑起来

最后,通过 crontab -e 设置两个定时任务:

  1. 每分钟监控* * * * * /bin/bash /root/scripts/monitor/rss_watchdog.sh
  2. 机器人自启:建议将 nohup python3 ... & 加入开机启动项。

结语

这套体系建立后,你只需在 Telegram 里动动手指,就能完成 90% 的日常运维工作。将来换服务器时,只需:

  1. 打包 monitor 文件夹。
  2. rss.conf 里写上 include
  3. 重启机器人。
    保安系统,瞬间复活!