简介:
ipset是iptables的扩展,允许你创建匹配整个地址sets(地址集合)的规则。而不像普通的iptables链是线性的存储和过滤,ip集合存储在带索引的数据结构中,这种集合比较大也可以进行高效的查找。在许多的linux发布中ipset是一个简单的安装包,可以通过linux发行版提供的yum进行安装。
格式:ipset-6.11版本
显示已有列表: ipset list
创建列表 : ipset create 表名 hash:net或者hash:ip hashsize 表大小 maxelem 最大条目数
其中hashsize 为表大小默认为1024 maxelem为表项数默认为65535
删除已有表 : ipset destroy 表名
删表中项 : ipset del 表名 项
向表添加网段: ipset add 表名 IP/掩码位
测试是否在表中 iptest test 表名 项
表要关联到防火墙,例如做nat匹配
iptables -t nat -A POSTROUTING -m set --set 表名 src -m set --set 目的表名 dst -j SNAT --to NAT后地址
这条就是同时匹配源地址和目的地址的NAT转换(记得要开启sysctl的ip转发)
举例:
下面的ipset/iptables命令:
ipset create myset hash:ip
ipset add myset 1.1.1.1
ipset add myset 2.2.2.2
iptables -A INPUT -m set --set myset src -j DROP
上面的命令创建了两个地址(1.1.1.1 and 2.2.2.2)的集合(myset表类型是haship,还可以是hashnet) 然后iptables命令通过-m set --set myset src这个选项使用这个集合,这个匹配规则的意思是“匹配源地址包含在集合myset中的数据包”。src表示源地址,dst表示目标地址。如果同时使用src和dst表示既要匹配源地址又要匹配目的地址。
ipset还有另一个应用。假设有一个本地LAN (10.0.0.0/24)需要连接到internet,除此之外还有三个本地网络(10.30.30.0/24, 10.40.40.0/24, 192.168.4.0/23 和 172.22.0.0/22),执行下面的命令: ipset create routed_nets hash:net
ipset add routed_nets 10.30.30.0/24
ipset add routed_nets 10.40.40.0/24
ipset add routed_nets 192.168.4.0/23
ipset add routed_nets 172.22.0.0/22
iptables -t nat -A POSTROUTING \
-s 10.0.0.0/24 \
-m set ! --set routed_nets dst \
-j MASQUERADE
如你所见,ipset 简单的实现了精确匹配。该规则伪装所有来自(10.0.0.0/24)的数据包,而不处理其他在routed_nets集合中的网络的包。由于该配置完全基于网络地址,所以你完全不用担心其他特殊的网络连接(比如VPN),也不用担心物理接口和网络拓扑。
参考文章:http://sw5720.blog.51cto.com/8812314/1623378