自留地
切勿乱来!

Linux iptables 扩展 ipset 使用教程

iptables介绍

Iptables是在linux内核里配置防火墙规则的用户空间工具,它实际上是netfilter框架的一部分.可能因为iptables是netfilter框架里最常见的部分,所以这个框架通常被称为iptables,iptables是linux从2.4版本引入的防火墙解决方案.

ipset介绍

Ipset是iptables的扩展,它允许你创建 匹配整个地址sets(地址集合) 的规则。而不像普通的iptables链是线性的存储和过滤,ip集合存储在带索引的数据结构中,这种结构即时集合比较大也可以进行高效的查找.
除了一些常用的情况,比如阻止一些危险主机访问本机,从而减少系统资源占用或网络拥塞,IPsets也具备一些新防火墙设计方法,并简化了配置.
官网:http://ipset.netfilter.org/

前期需要知道的

关于 iptables,要知道这两点。

iptables 包含几个表,每个表由链组成。
默认的是 filter 表,最常用的也是 filter 表,另一个比较常用的是 nat 表。一般封 IP 就是在 filter 表的 INPUT 链添加规则。
在进行规则匹配时,是从规则列表中从头到尾一条一条进行匹配。
这像是在链表中搜索指定节点费力。ipset 提供了把这个 O(n) 的操作变成 O(1) 的方法:就是把要处理的 IP 放进一个集合,对这个集合设置一条 iptables 规则。像 iptable 一样,IP sets 是 Linux 内核中的东西,ipset 这个命令是对它进行操作的一个工具。

使用方法

ipset 安装

yum install ipset -y

ipset创建set

ipset create  banip hash:net

这里是创建一个名为 banip 的合集,以 hash 方式存储,存储内容是 IP/段 地址

储存类型可以有多种方式,后续有介绍

然后在这个合集里面添加需要封禁的 IP 或者 IP 段

ipset add banip 4.5.6.7    //单个 IP 地址

ipset add banip 4.5.6.0/24 //IP段

然后,这里需要注意一点,你现在添加的 IP 合集 banip 当服务器重启后,会消失,合集是临时的,所以需要执行以下命令进行持久化保存:

service ipset save

执行之后,保存在了/etc/sysconfig/ipset 下次重启自动调用,以后要加的时候IP直接加在 /etc/sysconfig/ipset 文件内就行

然后到这里ipset 安装,创建合集,添加 IP 和保存已经结束,并且已经运行中,接下来还有最后一步,在 iptables 里添加一个规则来调用这个合集

-I INPUT -m set –match-set banip src -p tcp –destination-port 80 -j DROP

-m set –match-set banip src 主要是这段,调用了 banip,封禁的是80端口,只要在 banip 合集里的 IP 全部无法访问80端口

service iptables restart 重启 iptables

至此,全部配置就已经完成,添加到 banip 合集 里的 IP 无法访问80端口,并且后续添加 IP 的时候不需要重启iptables,立即生效

更多的 ipset 用法

存储类型

前面例子中的 banip 这个集合是以 hash net方式存储 IP 和 IP 段 地址,也就是以 网络段 为 hash 的键。除了 IP 地址,还可以是IP段,端口号(支持指定 TCP/UDP 协议),mac 地址,网络接口名称,或者上述各种类型的组合。

比如指定 hash:ip,port就是 IP 地址和端口号共同作为 hash 的键。查看 ipset 的帮助文档可以看到它支持的所有类型。

下面以两个例子说明。

ipset create  banip hash:ip
ipset add banip 6.7.8.9
ipset test banip 1.2.3.2

执行 ipset test banip 1.2.3.2 就会得到结果 1.2.3.2 is NOT in set banip.

注意,如果在 hash:ip 里添加 IP 段,会被拆分为这个 IP 段里所有的独立 IP 进行储存,如果是 IP 和 IP 段混合储存,建议使用 hash:net

hash:ip,port

ipset create banip hash:ip,port
ipset add banip 3.4.5.6,80
ipset add banip 5.6.7.8,udp:53
ipset add banip 1.2.3.4,80-86
第二条命令添加的是 IP 地址为 3.4.5.6,端口号是 80 的项。没有注明协议,默认就是 TCP,下面一条命令则是指明了是 UDP 的 53 端口。最后一条命令指明了一个 IP 地址和一个端口号范围,这也是合法的命令。

自动过期,解封

ipset 支持 timeout 参数,这就意味着,如果一个集合是作为黑名单使用,通过 timeout 参数,就可以到期自动从黑名单里删除内容。

ipset create banip hash:ip timeout 300
ipset add banip 1.2.3.4
ipset add banip 6.6.6.6 timeout 60
上面第一条命令创建了名为 banip 的集合,后面多加了 timeout 参数,值为 300,往集合里添加条目的默认 timeout 时间就是 300。第三条命令在向集合添加 IP 时指定了一个不同于默认值的 timeout 值 60,那么这一条就会在 60 秒后自动删除。

隔几秒执行一次 ipset list banip 可以看到这个集合里条目的 timeout 一直在随着时间变化,标志着它们在多少秒之后会被删除。

如果要重新为某个条目指定 timeout 参数,要使用 -exit 这一选项。

ipset -exist add banip 1.2.3.4 timeout 100
这样 1.2.3.4 这一条数据的 timeout 值就变成了 100,如果这里设置 300,那么它的 timeout,也就是存活时间又重新变成 300。

如果在创建集合是没有指定 timeout,那么之后添加条目也就不支持 timeout 参数,执行 add 会收到报错。想要默认条目不会过期(自动删除),又需要添加某些条目时加上 timeout 参数,可以在创建集合时指定 timeout 为 0。

合集支持更大条目!

hashsize, maxelem 这两个参数分别指定了创建集合时初始的 hash 大小,和最大存储的条目数量。

ipset create banip hash:ip hashsize 4096 maxelem 1000000
ipset add banip 3.4.5.6
这样创建了名为 banip 的集合,初始 hash 大小是 4096,如果满了,这个 hash 会自动扩容为之前的两倍。最大能存储的数量是 100000 个。

如果没有指定,hashsize 的默认值是 1024,maxelem 的默认值是 65536。

另外几条常用命令

ipset del banip x.x.x.x                     # 从 banip 集合中删除内容
ipset list banip                              # 查看 banip 集合内容
ipset list                                       # 查看所有集合的内容
ipset flush banip                            # 清空 banip 集合
ipset flush                                     # 清空所有集合
ipset destroy banip                        # 销毁 banip 集合
ipset destroy                                 # 销毁所有集合
ipset save banip >1.txt                    # 输出 banip 集合内容到1.txt
ipset save >1.txt                             # 输出所有集合内容到1.txt
ipset restore  <1.txt                         # 根据1.txt内容恢复集合内容
service ipset save                           #执行 add,del 这类添删操作后都需要保存
service ipset restart                       #重启ipset

打赏

未经允许不得转载:周涛的个人博客 » Linux iptables 扩展 ipset 使用教程

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

关注互联网发展前沿,关注PHPCMS技术演进,钻研PHPCMS技术开发

模块开发联系我们