zoukankan      html  css  js  c++  java
  • 服务器添加一个简单的黑名单

    简单的实现黑名单,例子用的是Golang言语,其他语言也不影响,主要需要理解的是shell脚本,其他语言只要能调用shell就行了.

    1.打开终端,确定linux的服务器是否能执行iptables跟ipset,若显示"-bash: iptables: command not found"或者"-bash: ipset: command not found",请输入下面两句,没这个问题就跳过.

    apt-get install iptables
    apt-get install ipset

    2.创建ipset集合

    输入  ipset create myset hash:ip  timeout 300  maxelem 1000000

    上面的命令创建了的集合(myset表类型是haship,还可以是hashnet) ,这个匹配规则的意思是“匹配源地址包含在集合myset中的数据包”。src表示源地址,dst表示目标地址。如果同时使用src和dst表示既要匹配源地址又要匹配目的地址。

    myset : 集合名

    timeout 300 : 表示加入myset集合的ip存在300秒之后自动被删除,用来设置在黑名单的时间,去除代表永久

    maxelem 1000000 : ipset默认可以存储65536个元素,使用maxelem指定数量为1000000

    3.把ipset加入iptable

    输入 iptables -A INPUT -m set --match-set myset src -j DROP    

    上面的命令将myset集合添加进iptables,就是说myset里面的ip地址都会被禁止.

    4.运行Golang运行shell语句,2.2.2.2是ip地址,可以写成变量,字符串随你喜欢怎么改

    cmd := exec.Command("ipset add myset 2.2.2.2")    

    out, err := cmd.CombinedOutput()    

    if err != nil {      

      fmt.Println(err)    

    }   

    fmt.Println(string(out))

     

    需要用到的包是"os/exec"

    ipset add myset 2.2.2.2 代表将ip添加进myset集合完成上面,服务器就会禁用2.2.2.2的ip地址300秒.

    --------------------------------------------------------------

    (拓展)若需要执行多行shell语句,就直接写到脚本文件,然后用go调用脚本文件exec.sh

    
    
    	cmd := exec.Command("/bin/sh", "./exec.sh")
    	bytes, err := cmd.Output()
    	if err != nil {
    		fmt.Println("cmd.Output: ", err)
    		return
    	}
    	fmt.Println(string(bytes))
    

    脚本exec.sh

    #!/bin/bash
    
    ipset add myset 2.2.2.2
    

    查看iptables

    iptables -nv -L

    删除iptables中的ipset

    iptables -D INPUT -m set --match-set myset src -j DROP

    5.如果上面还不能满足你的需求,这里有详细的链接供参考

    iptables详解

    http://blog.chinaunix.net/uid-26495963-id-3279216.html

    golang中os/exec包的用法

    http://blog.csdn.net/chenbaoke/article/details/42556949

    ipset批量iptables

    利用ipset禁用大量IP

    http://www.cnblogs.com/CasonChan/p/5319364.html

    ipset和iptables配合来自动封闭有问题的IP

    http://joeyang.blog.51cto.com/9092193/1878862

    6.今天遇到一些问题的总结,一开始用了两个方法无法实现需求,也请高手给一些建议. 

    1>仅用iptables来添加和删除IP,只能操作单个IP,并且无法写超时,所以我用了下面的语句:

    iptables -A INPUT -s 2.2.2.2 -j DROP

    sleep 300  

    iptables -D INPUT -s 2.2.2.2 -j DROP 

    sleep用来阻塞,但是占用很多资源,当太多IP需要屏蔽,服务器将被卡死.  

    2>为了设置自动解封IP,用到了linux的定时任务

    但是后来发现,大量的IP不停需要屏蔽,写入定时任务中的crontab会越来越大,系统文件也会越来越乱. 

    想了解定时任务可以看下下面的链接:

    脚本添加定时任务linux

    http://blog.csdn.net/javaweiming/article/details/8722525  

    linux下添加定时任务

    http://blog.csdn.net/hi_kevin/article/details/8983746

    7.今天初略了解一下,有什么错误希望能指出,感谢提供资料的所有人

      
     
     
















  • 相关阅读:
    二维数组和指向指针的指针
    多路复用构建高性能服务器
    disque概要
    漫谈云计算与SOA (1)
    zeromq
    自定义内存分配
    基于行的操作
    反应器类型的操作
    多个流,简短的读和写
    缓存
  • 原文地址:https://www.cnblogs.com/zhongxuan/p/7475173.html
Copyright © 2011-2022 走看看