Ip sets是一个批量操作iptables的工具,通过集合规则来管理iptables,如果有大量iptables规则的刷新将是很难维护的,通过ipsets可以有效避免这些问题
Ipsets Install
1 | // centos |
Create Ipset Sets
ipset create SETNAME TYPENAME(method:datatype[,datatype[,datatype]])
- SETNAME是创建的ipset的名称
- TYPENAME是ipset的类型
- method指定ipset中的entry存放的方式(bitmap, hash, list)
- datatype约定了每个entry的格式(ip, net, mac, port, iface)
1 | sudo ipset create ipwhitelist hash:ip |
1 | Supported set types: |
Create Options
1. TTL生命周期 (所有集合适用)
设置为0,表示永久生效;可以通过 -exist来进行修改
1 | sudo ipset create ipwhitelist_timeout hash:ip timeout 5000 |
2. Comment 备注(所有集合适用)
内核和ipset本身完全忽略这个字符串,纯粹是为了注释
1 | sudo ipset create ipwhitelist_comment hash:ip comment |
3. Hashsize初始哈希大小 、Maxelem集合存储最大数量
hashsize定义了集合的初始哈希大小,默认值为1024。哈希大小必须是2的幂,内核会自动舍入两个哈希大小的非幂到第一个正确的值
maxelem定义了可以存储在集合中的元素的最大数量,默认值为65536
1 | sudo ipset create ipwhitelist_size hash:ip hashsize 2408 maxelem 500 |
Set Types
1. Method存储方式
bitmap和list: 使用固定大小的存储
hash: 使用hash表来存储元素。但为了避免Hash表键冲突,在ipset会在hash表key用完后,若又有新增条目,则ipset将自动对hash表扩大
这里需要注意的是,一旦使用 hash:ip和hash:ip,port 方式 进行ipset配置,而ip又非常多的话,可能会出现下面的情况.(最后是使用hash:net替换hash:ip解决的)
2. Datatype数据类型
支持的类型有:ip, net, mac, port, iface
- hash:ip
1 | 1. 使用哈希存储ip主机地址(默认)或网络地址。零值IP地址不能存储在散列中 |
- hash:net
1 | 1. 使用集合存储不同大小的IP网络地址。前缀大小为零的网络地址不能存储在这种类型的集合中 |
- hash:ip,port
1 | 1. 使用hash存储IP地址和端口号对。端口号与协议(默认TCP)一起,不能使用零协议号 |
- hash:ip,port,net
1 | 1. 使用hash存储IP地址、端口号和IP网络地址三元组。端口号与协议(默认TCP)一起,不能使用零协议号。前缀大小为零的网络地址也不能存储 |
Add Rules To Sets
ipset add SETNAME ENTRY
- ENTRY 要符合创建ipset的类型
1 | sudo ipset add ipwhitelist 10.1.8.140 |
添加时指定协议
- ip,protocal:port
1 | sudo ipset add ipwhitelist01 10.1.8.141,udp:5340 |
末尾加-exist表示已经存在就忽略,不然会报已经存在的错误
Check Ipset Entry
ipset test SETNAME ENTRY
1 | sudo ipset test ipwhitelist 10.1.8.140 |
Del、Flush、Destroy Sets
ipset del SETNAME ENTRY
ipset flush SETNAME
ipset destroy SETNAME
1 | // 删除某一条记录 |
末尾加-exist表示不存在就忽略,不然会报不存在的错误
Import and Export ipsets
sudo ipset save SETNAME -f FILE_PATH
sudo ipset restore -f FILE_PATH
1 | // 备份到文件 |
Use of ipset and iptables
1 | 在iptables中使用ipset,只要加上-m set --match-set即可 |
1.目的ip使用ipset(ipset集合为bbb)
1 | iptables -I INPUT -s 192.168.100.36 -m set --match-set bbb dst -j DROP |
2.源ip使用ipset(ipset集合为aaa)
1 | iptables -I INPUT -m set --match-set aaa src -d 192.168.100.36 -j DROP |
3.源和目的都使用ipset(源ip集合为aaa,目的ip集合为bbb)
1 | iptables -I INPUT -m set --match-set aaa src -m set --match-set bbb dst -j DROP |
4.设定白名单(源ip集合为ipwhitelist)
1 | iptables -A INPUT -p tcp -m set --match-set ipwhitelist src -j ACCEPT |
5.为ipset list开启特定端口
1 | iptables -A INPUT -p tcp -m multiport --destination-port 21,22 -m set --match-set ipwhitelist src -j ACCEPT |
6.在hash ip:port情况下,指定源、目标的权限
1 | iptables -I INPUT -p tcp -m set --match-set ipwhitelist src,dst -j REJECT |
转载请注明出处:https://github.com/imperio-wxm