Python在特定时间删除iptables规则

时间:2017-10-12 09:09:19

标签: python daemon iptables

我编写了一个基于Python的守护程序,可以根据某些参数阻止恶意IP。现在,我想在1小时后自动解锁(删除规则)IP,但我不确定如何在我的代码中使用timer / scheduler模块。

我知道替代方法可以是:

  1. 的fail2ban
  2. ipset timeout
  3. iptables -m - 最近--seconds开关
  4. cron job
  5. 但我有局限性,不能使用上述替代方法。

    我的主要代码在WHILE(1)循环中运行,因此它的阻塞IP。 如何在我的python代码中创建一个并行模块/函数来执行IPTABLES -D命令来删除IP?每个IP都有自己的特定时间来解除阻塞。

    e.g。

    1. IP1 ---在01:00:00阻止---应在02:00:00解锁
    2. IP2 ---在01:10:00阻止---应在02:10:00解锁
    3. IP3 ---在01:10:10阻止---应该在02:10:10小时取消阻止
    4. 更新

      while True:
          if (ip_found == -1 and port_found == -1):
              os.system("iptables -A INPUT -s "+str(s_addr)+" -j DROP")
              print(str(s_addr) + " was a malcious IP and it is blocked")
          else:
              print("Not a malcious IP")
      

1 个答案:

答案 0 :(得分:0)

逻辑上,您可以尝试以下步骤:

  1. 将阻塞的IP保留在队列中;按时间顺序
  2. 每秒检查一次队列
  3. 取消阻止相关项目并将其出列
  4.   

    您可以安排在要删除或取消阻止队列中的第一个项目时运行出队过程。

    如果您想在同一模块中使用队列和出列逻辑,您可以尝试类似:

    while(1):
        queue(List of IPs)
        dequeue()
        sleep(1000) # sleep for 1 second
    

    更新

    根据您和我的理解提供的代码,我建议实施以下内容:

    import os
    from datetime import datetime, timedelta
    from time import sleep
    from sys import stdout
    
    #These values will be populated by the existing logic
    ip_found = -1
    port_found = -1
    
    #This is some IP address to be blocked
    s_addr = ""
    
    #Sorted List of IP addresses
    ip_list = []
    
    while True:
        #Create temporary list
        tmp_list = ip_list[:]
        if (ip_found == -1 and port_found == -1):
            tmp_list.append({'ip_address': s_addr, 'blocked_at': datetime.now()})
            ip_list = sorted(tmp_list, key=lambda x: x['blocked_at'])
            os.system("iptables -A INPUT -s "+str(s_addr)+" -j DROP")
            print(str(s_addr) + " was a malcious IP and it is blocked")
        else:
            print("Not a malcious IP")
    
        unblock_time = datetime.now()
        #Keep unblocking all IPs which have been blocked for 1 hour or more
        while (ip_list[0]["blocked_at"] + timedelta(hours = 1) < unblock_time):
            print(ip_list[0]["blocked_at"])
            unblock_ip = ip_list.pop(0)
    
            #Implement command to unblock IP
            os.system("-------- command to unblock IP --------")
            print("Unblocked IP " + unblock_ip['ip_address'])
    
        #if needed output may be flushed to stdout    
        stdout.flush()
        #sleep for 1 second
        sleep(1)
    
      
        
    • 您需要编写取消阻止IP地址的命令
    •   
    • 请以此为出发点,而不是复制粘贴解决方案!
    •