本文将介绍如何在 Debian 12 系统上部署 Nginx 访问监控脚本,当检测到敏感路径被访问时,通过 Telegram Bot 发送通知。

效果图

1737267386261.webp

功能特点

  • 实时监控指定网站的敏感路径访问
  • 支持 IP 白名单
  • 支持访问阈值控制(可开启/关闭)
  • 通过 Telegram Bot 发送实时通知
  • 通知内容包含:服务器名称、IP、时间、访问路径和 UA 信息
  • 支持服务异常告警

一、准备工作

1. 创建 Telegram Bot

  1. 在 Telegram 中搜索 @BotFather
  2. 发送 /newbot 命令
  3. 按提示设置 bot 名称
  4. 保存获取到的 Bot Token

2. 获取 Chat ID

  1. 向你创建的 Bot 发送一条消息
  2. 访问 https://api.telegram.org/bot<YourBOTToken>/getUpdates
  3. 在返回的 JSON 中找到 chat_id

二、环境部署

1. 安装依赖

# 更新系统
apt update
apt upgrade -y

# 安装必要软件包
apt install -y python3 python3-pip python3-venv git

2. 创建项目结构

# 创建项目目录
mkdir -p /root/ecouu/nginx_notify_tg
cd /root/ecouu/nginx_notify_tg

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 安装依赖
pip install requests

3. 创建监控脚本

# 创建脚本文件
nano /root/ecouu/nginx_notify_tg/nginx_notify_tg.py

4. 配置脚本

修改以下配置项:

# Nginx 日志路径(确认实际路径)
NGINX_LOG = "/var/log/nginx/access.log"

# Telegram 配置
TELEGRAM_BOT_TOKEN = "YOUR_BOT_TOKEN"  # 替换为你的 Bot Token
TELEGRAM_CHAT_ID = "YOUR_CHAT_ID"      # 替换为你的 Chat ID
SERVER_NAME = "YOUR_SERVER_NAME"       # 设置服务器名称

# 监控的网站和路径
MONITOR_SITES = {
    "example.com": ["/dashboard/login", "/admin"],# 修改为你要监控的网站和路径
    # 添加更多网站和路径
}

# IP 白名单(可选)
IP_WHITELIST = {
    "1.1.1.1": "安全IP",
    "2.2.2.2": "开发者IP",
}

# 阈值设置
MONITOR_SETTINGS = {
    'threshold_enabled': False,  # True: 启用阈值, False: 每次访问都通知
    'burst_threshold': 5,        # 访问次数阈值
    'burst_window': 60,         # 检测窗口(秒)
}

5. 设置权限

chmod +x /root/ecouu/nginx_notify_tg/nginx_notify_tg.py

三、创建系统服务

1. 创建服务文件

nano /etc/systemd/system/nginx_notify_tg.service

2. 添加服务配置

[Unit]
Description=Nginx Access Monitor
After=network.target nginx.service

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root/ecouu/nginx_notify_tg
Environment=PATH=/root/ecouu/nginx_notify_tg/venv/bin:$PATH
ExecStart=/root/ecouu/nginx_notify_tg/venv/bin/python /root/ecouu/nginx_notify_tg/nginx_notify_tg.py
Restart=always
StandardOutput=append:/var/log/nginx_notify_tg.log
StandardError=append:/var/log/nginx_notify_tg.log

[Install]
WantedBy=multi-user.target

四、配置日志轮转(可选)

1. 创建日志轮转配置

nano /etc/logrotate.d/nginx_notify_tg

2. 添加配置内容

/var/log/nginx_notify_tg.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
}

五、启动服务

# 重载 systemd
systemctl daemon-reload

# 启动服务
systemctl start nginx_notify_tg

# 设置开机自启
systemctl enable nginx_notify_tg

# 查看服务状态
systemctl status nginx_notify_tg

六、通知效果展示

  1. 正常访问通知(阈值关闭时):

    服务器: YOUR_SERVER_NAME-️⚠️ 检测到敏感路径访问
    
    IP: xxx.xxx.xxx.xxx
    时间: 19/Jan/2025:11:31:18 +0800
    访问页面: example.com/dashboard/login
    UA: Mozilla/5.0 ...
  2. 频繁访问警告(阈值开启时):

    服务器: YOUR_SERVER_NAME-⚠️ 检测到频繁访问
    
    IP: xxx.xxx.xxx.xxx
    警告: 60秒内访问超过5次
    时间: 19/Jan/2025:11:31:18 +0800
    访问页面: example.com/dashboard/login
    UA: Mozilla/5.0 ...

七、常用维护命令

# 查看服务状态
systemctl status nginx_notify_tg

# 重启服务
systemctl restart nginx_notify_tg

# 停止服务
systemctl stop nginx_notify_tg

# 查看日志
tail -f /var/log/nginx_notify_tg.log
# 或
journalctl -u nginx_notify_tg -f

# 检查运行状态
ps aux | grep nginx_notify_tg.py

八、故障排查

  1. 服务无法启动:
  2. 检查 Python 虚拟环境
  3. 检查文件权限
  4. 查看服务日志
  5. 无法发送通知:
  6. 验证 Bot Token 和 Chat ID
  7. 检查网络连接
  8. 测试 Telegram API

测试 Telegram Bot:

curl -X POST \
  https://api.telegram.org/bot<YourBOTToken>/sendMessage \
  -H 'Content-Type: application/json' \
  -d '{
    "chat_id": "<YourChatID>",
    "text": "测试消息",
    "parse_mode": "HTML"
}'

九、注意事项

  1. 确保 Nginx 日志路径配置正确
  2. Bot Token 和 Chat ID 不要泄露
  3. 合理配置监控路径和 IP 白名单
  4. 根据实际情况调整访问阈值
  5. 定期检查监控日志
  6. 确保服务器能访问 Telegram API

十、卸载

systemctl stop nginx_notify_tg && systemctl disable nginx_notify_tg && rm /etc/systemd/system/nginx_notify_tg.service && systemctl daemon-reload && rm /etc/logrotate.d/nginx_notify_tg && rm -rf /root/ecouu/nginx_notify_tg && rm /var/log/nginx_notify_tg.log*
最后修改:2025 年 01 月 19 日
如果觉得我的文章对你有用,请随意赞赏