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 使用的主要内容,如果未能解决你的问题,请参考以下文章

Linux下使用 ipset 封大量IP及ipset参数说明

iptables之ipset使用介绍

重启后使用 ipset 的规则

iptables一次性封多个ip,使用ipset 工具

ipset的学习与使用

Linux使用iptables设置黑白名单使用ipset工具