0x01 ipset
可以使用iptables
对访问地址进行一定的限制,但是当受限地址数量过多时,维护管理起来就不太方便,而且数量过多的iptables
条目也会影响设备的性能。此时就可以使用ipset
工具来解决此种问题。
ipset
理解起来比较容易,理解为地址组就好,具有相同作用的地址段存放在一个集合里面,当使用策略时,策略会对集合里面的所有地址段都生效。提高了策略的部署效率和减少了维护管理的工作量。
这里以centos7
为例,要是没有ipset
工具的话通过yum
安装就可以yum -y install ipset
,安装好了后,先创建一个空的set
ipset create testip hash:net #这里的testip是ipset的名字
除了hash
外ipset
还可以用bitmap
或者list
方式存储地址,可以按需求来进行设置
如果是等同大小的段可以使用bitmap
,不同大小段一般使用hash
较多,至于list
只是用一个列表来进行存放信息。
可以使用list
来进行查看ipset
情况
root@debian-pve:~# ipset list testip Name: testipType: hash:netRevision: 7Header: family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xe08d3b99#这里的hashsize当存储满时会自动翻倍增长,下一次就是2048,再下次就是4096#maxelem可以改大一些,代表着最大存储的条目。Size in memory: 456References: 0Number of entries: 0Members:
在创建完ipset
后,可以通过add
、del
、test
等指令进行操作
root@debian-pve:~# ipset add testip 10.1.1.0/24
还可以进行测试地址段是否已经加入到ipset
中
最后需要注意的是ipset
和iptables
一样,需要单独保存,配置重启后会丢失。
ipset save testip > testip.ipset #保存文件ipset restore < testip.ipset #恢复文件
0x02 iptables结合ipset禁止国外IP进行访问
先下载国内IP
地址的网段量,可以在/
进行查找所需要的数据,接着将这些数据加入到ipset
中,这里使用脚本简单处理下
[root@localhost ~]# cat ipset_cn.sh wget /ipblocks/data/countries/cn.zoneipset create cnip hash:net maxelem 1000000for i in `cat cn.zone`doipset add cnip $idone#可以看到此时大概有8000+条的IP段[root@localhost ~]# ipset list cnip |wc -l8647
接着根据业务情况,配置合理的iptables
条目,这里是禁止所有地址访问,只允许国内IP
访问来实现效果。
iptables -I INPUT -m set --match-set cnip src -p tcp --dport 80 -j ACCEPT