V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
phx1
V2EX  ›  服务器

宝塔面板批量封 IP - 自动获取恶意情报并更新

  •  
  •   phx1 · 36 天前 · 1090 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用宝塔面板经常遇到恶意 IP 攻击,需要手动封禁,非常麻烦。

    想要实现的功能

    • 简单可以通过宝塔面板配置
    • 自动自动封禁最新的恶意 IP
    • **白嫖**:使用更多的恶意 IP 情报库

    准备工作

    在开始之前,请确保已经:

    1. 安装了宝塔面板
    2. 获取长亭恶意 IP 库的订阅链接(点此注册获取恶意 IP 库链接

    宝塔面板具体步骤

    想要用 bt cli 实现,没有发现入口,先用 python 脚本实现。

    1. 创建自动化脚本

    首先,我们需要创建一个 Python 脚本来实现自动化封禁。登录宝塔面板后,在 /www/server/panel/plugin/ 目录下创建 ip_intel.py 文件:

    #!/usr/bin/python3
    import requests
    import subprocess
    import logging
    from datetime import datetime
    
    # 配置日志
    logging.basicConfig(
        filename='/www/server/panel/logs/ip_intel.log',
        level=logging.INFO,
        format='%(asctime)s - %(message)s'
    )
    
    # 长亭 IP 恶意情报库订阅地址
    API_URL = "https://ip-0.rivers.chaitin.cn/api/share/ip_group/xxxxxxxxxxxxxxxxxxxxxxxx?format=cidr"
    
    def get_malicious_ips():
        """获取恶意 IP 列表"""
        try:
            response = requests.get(API_URL)
            ip_list = response.content.decode('utf-8').split('\n')
            return [ip.strip() for ip in ip_list if ip.strip()]
        except Exception as e:
            logging.error(f"获取恶意 IP 列表失败: {str(e)}")
            return []
    
    def update_iptables_rules():
        """更新 iptables 规则"""
        try:
            # 创建新的 chain (如果不存在)
            subprocess.run("iptables -N CHAITIN_BLOCK 2>/dev/null || true", shell=True)
    
            # 清空现有规则
            subprocess.run("iptables -F CHAITIN_BLOCK", shell=True)
    
            # 确保 chain 被引用(如果还没有)
            subprocess.run("iptables -C INPUT -j CHAITIN_BLOCK 2>/dev/null || iptables -I INPUT -j CHAITIN_BLOCK", shell=True)
    
            # 获取恶意 IP 列表并添加规则
            ips = get_malicious_ips()
            for ip in ips:
                cmd = f"iptables -A CHAITIN_BLOCK -s {ip} -j DROP"
                subprocess.run(cmd, shell=True)
                logging.info(f"已添加封禁规则: {ip}")
    
            logging.info(f"规则更新完成,共添加 {len(ips)} 条规则")
    
        except Exception as e:
            logging.error(f"更新防火墙规则失败: {str(e)}")
    
    if __name__ == "__main__":
        update_iptables_rules()
    

    2. 配置定时任务

    在宝塔面板中添加定时任务,实现自动更新:

    1. 进入 [计划任务] 页面
    2. 点击 [添加计划任务]
    3. 填写配置信息:
      • 任务名称:更新长亭 IP 威胁情报
      • 执行周期:每天
      • 脚本内容:python3 /www/server/panel/plugin/ip_intel.py

    3. 查看防护效果

    完成配置后,您可以通过以下方式查看防护效果:

    1. 查看 /www/server/panel/logs/ip_intel.log 日志文件
    2. 通过网站访问日志观察恶意请求是否减少

    4. 注意事项

    • 提前配置好白名单 IP ,避免误封。
    10 条回复    2024-11-13 14:34:18 +08:00
    ncmonster
        1
    ncmonster  
       36 天前
    宝塔明明可以直接在界面上封 IP ,何必搞这么复杂
    phx1
        2
    phx1  
    OP
       36 天前
    @ncmonster 那你肯定没有用过,界面填 1000 个恶意 IP 封禁太卡了。而且我想是每天自动获取最新的 IP 自动封禁🐶
    JKOR
        3
    JKOR  
       36 天前
    加个双向 tls 验证更安全
    phx1
        5
    phx1  
    OP
       36 天前
    @aminobody tql 我要给我的服务器集成一下,哪些 set 是推荐集成的?
    wu67
        6
    wu67  
       36 天前 via Android
    不要只用 iptable ,考虑组合 ipset 使用。
    而且自动获取看起来很美好,实际上有个很大的问题,上游的 ip 数据不一定可靠,到时候就会喜提服务器高负载宕机,别问我怎么知道的...
    aeron
        7
    aeron  
       36 天前
    我是服务器上开几个钓鱼端口,除了一些白名单的之外,其他的哪个 IP 访问封哪个,
    phx1
        8
    phx1  
    OP
       35 天前
    @wu67 有道理。当时是考虑 ipset 还需要用户自己装,所以就没搞,我自己用的是 ipset 版本
    phx1
        9
    phx1  
    OP
       35 天前
    @aeron 这个好。开端口 -> 检测连接 IP -> 自动封禁这套连招有自动化的脚本实现么?
    aeron
        10
    aeron  
       35 天前   ❤️ 1
    @phx1 #9 开端口这步没有这个没有,自己用 gpt 写一下就好了。我是根据自己的情况自己改的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3136 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 12:57 · PVG 20:57 · LAX 04:57 · JFK 07:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.