ipset 使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ipset 使用相关的知识,希望对你有一定的参考价值。
参考技术A 原文地址 : http://ipset.netfilter.org/ipset 资料: https://www.linuxjournal.com/content/advanced-firewall-configurations-ipset
ip set 是linux内核的一个内部框架, 可由ipset工具管理,ip set 可以分为以下几种类型:ip地址, 网路地址(网段),tcp/udp 端口号, mac地址, 网卡名称。或者是上述类型的组合,并保证快速的匹配。
ipset 适用于以下几种场景:
(1)一次性存储大量的ip或者端口,用以iptables匹配
(2)在不影响性能的前提下,动态更新iptables规则(针对ip或者端口)
(3)期望使用ipset的告诉匹配,或者在一条iptables规则中表达复杂的 ip/端口规则
(1)bitmap : ip
存储在内存中,利用bitmap数据结构存储, 可以存储 65535个ip地址(B类网络)
(2)bitmap: ip,mac
存储在内存中, 8 bytes 表示一个ip,mac
(3) bitmap: port
同(1), 只是存储的是端口号
(4)hash:ip
使用hash存储ip地址。元素冲突的话,将以数组的形式放在最后
(5)hash:net
使用hash存储网络,与 hash:ip 使用同样的技术避免元素冲突
(6)hash:ip,port
与hash:ip 类似,但是可以存储IP与 协议-端口的组合,支持 tcp sctp udp udplite 加上端口号, 以及icmp icmpv6及其它无端口号的协议。
(7)hash:ip,port,ip
用hash存放 ip,port,ip的组合
(8)hash:ip,port,net
用hash 存放 ip,port, net 的组合
(9)hash:net,port
(10)hash:net,iface
用hash存放 网络 网卡
(11)list:set
用数组存放其它set, 即不同set的有序组合
linux 内核版本 >=3.11
source of ipset http://ipset.netfilter.org/ipset-7.6.tar.bz2
git://git.netfilter.org/ipset.git
ipset
n, create SETNAME TYPENAME [ CREATE-OPTIONS ]
新建集合
add SETNAME ADD-ENTRY [ ADD-OPTIONS ]
向指定集合中新增元素
del SETNAME DEL-ENTRY [ DEL-OPTIONS ]
删除指定集合中的元素
test SETNAME TEST-ENTRY [ TEST-OPTIONS ]
判断元素是否在指定集合,0 存在, 非0 不存在
译者注: 不同集合类型,test 参数会不一致
x, destroy [ SETNAME ]
删除一个或所有集合(参数中未制定集合), 如果集合已经被引用,则无法删除
list [ SETNAME ] [ OPTIONS ]
列出集合条目
save [ SETNAME ]
保存集合指定集合或所有(至指定参数), -file 参数可以保存到制定文件
restore
将ipset集合从 指定文件中恢复存, 通过 -file 参数。需要注意到是, 现有 到集合和元素不会被覆盖, list、 help、 vertsion以及 交互模式下不支持该命令
flush [ SETNAME ]
清空指定集合到所有条目,或所有集合到条目(未指定集合参数)
e, rename SETNAME-FROM SETNAME-TO
重命名集合, SETNAME-TO 必须不存在
w, swap SETNAME-FROM SETNAME-TO
交换集合, 两个集合必须存在, 并且类型兼容
help [ TYPENAME ]
打印帮助信息
version
打印版本号
进入交互模式, 从标准输出读入命令,quit 退出,
其它选项
-!, -exist
忽略错误输出
-o, -output plain | save | xml
list命令制定输出格式
-q, -quiet
不输出相关信息, 但是当ipset无法继续运行时,仍然会退出
-r, -resolve
list 命令输出集合条目时, 解析主机名, dns查询可能导致速度缓慢
-s, -sorted
对输出排序
-n, -name
list命令,只输出集合名称
-t, -terse
List 命令只输出集合名称和头部,忽略条目
-f, -file filename
list save restore 命令,用于指定文件名称
ip, net, mac, port, iface 这类参数用 “,” 逗号隔开, 但是主机名包含段短横线“-”时, 必须放在方括号“[]” 中, 并且,ipset 会去解析主机名,如果解析出多个ip, 只使用第一个.
bitmap, list类型,使用固定长度存储空间。 hash 类型是用hash存放元素, 为了避免hash冲突, 会现在链到长度,如果上到到达限制,在使用iset添加条目时,将hash大小加倍。当集合中到条目被应用到iptables时, hash大小是固定到, 集合也不能重复,新到条目也不能加载到集合中。
常见 create add 命令选项
timeout
未完待续。。。。。
Linux使用iptables设置黑白名单使用ipset工具
1,下面我先说下iptables的基本配置规则,然后再说ipset
以下使用C7 x86_64为实验环境
CentOS7默认的防火墙不是iptables,而是firewalle.
如果你没有安装iptables的话,你可以使用以下命令进行安装
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
上面的意思是先屏蔽掉原有的firewall防火墙,下面我们就开始安装iptables,至于为什么要安装IPtables我就不讲了
yum install iptables iptables-services -y
设置规则
#查看iptables现有规则
iptables -L -n
#先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
#清空所有默认规则
iptables -F
#清空所有自定义规则
iptables -X
#所有计数器归0
iptables -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#其他入站一律丢弃
iptables -P INPUT DROP
#所有出站一律绿灯
iptables -P OUTPUT ACCEPT
#所有转发一律丢弃
iptables -P FORWARD DROP
其他规则设定
#如果要添加内网ip信任(接受其所有TCP请求)
iptables -A INPUT -p tcp -s 45.96.174.68 -j ACCEPT
#过滤所有非以上规则的请求
iptables -P INPUT DROP
#要封停一个IP,使用下面这条命令:
iptables -I INPUT -s ... -j DROP
#要解封一个IP,使用下面这条命令:
iptables -D INPUT -s ... -j DROP
#保存上述规则
service iptables save
开启iptables服务
#注册iptables服务
#相当于以前的chkconfig iptables on
systemctl enable iptables.service
#开启服务
systemctl start iptables.service
#查看状态
systemctl status iptables.service
2,现在我们介绍ipset
ipset是iptables的扩展,它允许你创建 匹配整个地址集合的规则。而不像普通的iptables链只能单IP匹配, ip集合存储在带索引的数据结构中,这种结构即时集合比较大也可以进行高效的查找,除了一些常用的情况,比如阻止一些危险主机访问本机,从而减少系统资源占用或网络拥塞,IPsets也具备一些新防火墙设计方法,并简化了配置.官网:http://ipset.netfilter.org/
ipset的安装
首先先安装依赖
yum provides ‘*/applydeltarpm‘
yum install deltarpm -y
yum install ipset -y
创建一个ipset
ipset create xxx hash:net (也可以是hash:ip ,这指的是单个ip,xxx是ipset名称)
ipset默认可以存储65536个元素,使用maxelem指定数量
ipset create blacklist hash:net maxelem 1000000 #黑名单
ipset create whitelist hash:net maxelem 1000000 #白名单
查看已创建的ipset
ipset list
在创建的黑名单中添加一个ip
ipset add blacklist 192.168.4.175
删除黑名单ip
ipset del blacklist 192.168.4.175
创建防火墙规则,与此同时,allset这个IP集里的ip都无法访问80端口(如:CC×××可用)
iptables -I INPUT -m set --match-set blacklist src -p tcp -j DROP
iptables -I INPUT -m set --match-set whitelist src -p tcp -j DROP
iptables -I INPUT -m set --match-set setname src -p tcp --destination-port 80 -j DROP
service iptables save
将ipset规则保存到文件
ipset save blacklist -f blacklist.txt
ipset save whitelist -f whitelist.txt
删除ipset
ipset destroy blacklist
ipset destroy whitelist
导入ipset规则
ipset restore -f blacklist.txt
ipset restore -f whitelist.txt
备注:ipset的一个优势是集合可以动态的修改,即使ipset的iptables规则目前已经启动,新加的入ipset的ip也生效
3,应用场景
例:某服务器被CC×××,经过抓包或者一序列手段发现有一批IP是源×××ip,因此我们需要封掉这些IP,如果用iptables一条一条加就麻烦些了。
#对TIME_WAIT的外部ip以及此对ip出现的次数经行求重排序。
netstat -ptan | grep TIME_WAIT | awk ‘{print $5}‘ | awk -F: ‘{print $1}‘ |sort |uniq -c | sort -n -r
#tcpdump 抓取100个包,访问本机80的ip进行求重排序 只显示前20个,数量多的ip可能为×××源IP,我们需要封掉它
tcpdump -tnn dst port 80 -c 100 | awk -F"." ‘{print $1"."$2"."$3"."$4}‘ | sort | uniq -c | sort -n -r |head -20
#新建一个setname.txt文件,以如下格式加入这些ip (有多少个ip就多少行)
vim setname.txt
add setname xxx.xxx.xxx.xxx
#导入setname.txt文件到ipset集
ipset restore -f setname.txt
#查看是否导入成功 (成功的话会发现一个新ipset名为 sername,且Members里就是那些×××IP)
ipset list
#建立一条iptables规则,拦截这些×××ip访问服务器80,也可以直接禁止这些ip的所有访问
iptables -I INPUT -m set --match-set setname src -p tcp --destination-port 80 -j DROP
以上是关于ipset 使用的主要内容,如果未能解决你的问题,请参考以下文章