本文最下方转载自 https://blog.csdn.net/gymaisyl/article/details/101695697

ipset是通过IP集合的方式管理itables,

#创建一个名为myipset的集合,timeout 0允许新增IP带时间参数,最大存储IP数量是1000000
ipset create -exist myipset hash:net family inet hashsize 1024 maxelem 1000000 timeout 0
#添加一个关于ipset myipset的 iptables规则,
iptables -I INPUT -m set --match-set myipset src -j DROP
#添加IP 1.2.3.4到myset中,并且timeout是3600秒
ipset -exist add myipset 1.2.3.4 timeout 3600

官方文档地址

https://ipset.netfilter.org/ipset.man.html

ipset的一个优势是集合可以动态的修改,👍👍👍👍👍

ipset --help
ipset v7.1
Usage: ipset [options] COMMAND
Commands:
create SETNAME TYPENAME [type-specific-options]
        Create a new set
add SETNAME ENTRY
        Add entry to the named set
del SETNAME ENTRY
        Delete entry from the named set
test SETNAME ENTRY
        Test entry in the named set
destroy [SETNAME]
        Destroy a named set or all sets
list [SETNAME]
        List the entries of a named set or all sets
save [SETNAME]
        Save the named set or all sets to stdout
restore 
        Restore a saved state
flush [SETNAME]
        Flush a named set or all sets
rename FROM-SETNAME TO-SETNAME
        Rename two sets
swap FROM-SETNAME TO-SETNAME
        Swap the contect of two existing sets
help [TYPENAME]
        Print help, and settype specific help
version 
        Print version information
        Quit interactive mode
Options:
-o plain|save|xml
       Specify output mode for listing sets.
       Default value for "list" command is mode "plain"
       and for "save" command is mode "save".
        Print elements sorted (if supported by the set type).
        Suppress any notice or warning message.
        Try to resolve IP addresses in the output (slow!)
        Ignore errors when creating or adding sets or
        elements that do exist or when deleting elements
        that don't exist.
        When listing, just list setnames from the kernel.
        When listing, list setnames and set headers
        from kernel only.
        Read from the given file instead of standard
        input (restore) or write to given file instead
        of standard output (list/save).

ipset的安装

yum install ipset -y

ipset的配置

1. 命名(创建)一个新的ipset集合

# ipset create myset hash:net
# ipset -N myset nethash
推荐下面的方式
ipset create myset hash:net timeout 259200 
#timeout 259200是集合内新增的IP有三天的寿命

2.把希望屏蔽的IP地址添加到集合中

# ipset add myset 14.144.0.0/12
# ipset add myset 27.8.0.0/13
# ipset add myset 58.16.0.0/15
或者添加一个timeout时间
ipset add test 192.168.0.1 timeout 3600
或者修改现存的ip timeout时间
ipset -exist add test 192.168.0.1 timeout 259200

3. 把新建的ipset集合丢到iptables里

# iptables -I INPUT -m set --match-set myset src -j DROP

上面的iptables命令用到了

  • input链的知识
  • -m 加模块的知识
  • -m set --match-set myset(myset是你的ipset的名称)
  • iptables的其他规则,如何src -j DROP
  • 参考本博客的iptables教程 https://www.cnblogs.com/faberbeta/p/iptables001.html
  • 4.其他知识

    ipset默认可以存储65536个元素,使用maxelem指定数量

    ipset create blacklist hash:net maxelem 1000000    #黑名单
    ipset create whitelist hash:net maxelem 1000000    #白名单

    查看已创建的ipset

    ipset list

    加一个IP到你的集合中

    ipset add myset 1.2.3.4

    移除一个你的集合中的IP

    ipset del myset 1.2.3.4

    ipset持久化

    创建的 ipset 存在于内存中,重启后将会消失。要使ipset持久化,需要把他保存到一个文件中

    # ipset save > /etc/ipset.conf
    # ipset save myset -f /etc/ipset_myset.txt

    导入 ipset规则

    ipset restore -f /etc/ipset_myset.txt

    删除名为“myset”的集合。

    # ipset destroy myset

    删除所有集合。

    # ipset destroy

    method指定ipset中的entry存放的方式,随后的datatype约定了每个entry的格式。
    可以使用的method:(后面会详细解释)
    bitmap, hash, list
    可以使用的datatype:(后面会详细解释)
    ip, net, mac, port, iface

    将ip/port/ip-ip等添加到ipset集合中:ipset add SETNAME ENTRY
    向集合中添加条目时需要注意,创建的集合属于哪种类型,在添加时的数据就要符合对应的类型,如下所示

    查询条目: list / test

    1. 查询对应集合中的具体ip条目内容: ipset list [SETNAME]
    2. 检查目标ip是否在ipset集合中:ipset test SETNAME ENTRY

    删除条目: del / flush

    1. 删除集合中的某ip条目:ipset del SETNAME ENTRY
    2. 删除ipset某集合的所有ip条目:flush 【SETNAME】
    3. 清空ipset中所有集合的ip条目(删条目,不删集合):ipset flush
    4. 删除ipset中的某个集合或者所有集合:ipset destroy [SETNAME]

    创建和添加选项(CREATE&ADD-OPTIONS):

    1. timeout 超时时间/生效时间 (所有集合适用)

    timeout设置超时时间,如果设置为0,表示永久生效,超时时间可以通过 -exist来进行修改

    2. counters, packets, bytes (所有集合适用)

    如果指定了该选项,则使用每个元素支持的包和字节计数器创建集合。当元素(重新)添加到集合中时,除非包和字节选项显式指定包和字节计数器值,否则包和字节计数器将初始化为零。

    3. comment 备注(所有集合适用)

    在ipset上启用此扩展可以使用任意字符串注释ipset条目。内核和ipset本身完全忽略这个字符串,纯粹是为了提供一种方便的方法来记录条目存在的原因。注释不能包含任何引号,通常的转义字符()没有任何意义。

    4. skbinfo, skbmark, skbprio, skbqueue (所有集合适用)

    这个扩展允许您存储每个条目的metainfo(防火墙标记、tc类和硬件队列),并使用SET netfilter target和——map- SET选项将其映射到包。skbmark选项格式:MARK或MARK/MASK,其中MARK和MASK为32位十六进制数字,前缀为0x。如果只指定标记,则使用掩码0xffffffff。skbprio选项有tc类格式:MAJOR:MINOR,其中MAJOR和MINOR号是十六进制,没有0x前缀。skbqueue选项只是一个小数。

    ps:这里不是很懂,就没有做案例了,有了解的大神,希望可以指导一下。

    5. hashsize 集合的初始哈希大小(hsah集合适用)

    它定义了集合的初始哈希大小,默认值为1024。哈希大小必须是2的幂,内核会自动舍入两个哈希大小的非幂到第一个正确的值。

    6. maxelem 集合存储最大数量(hsah集合适用)

    它定义了可以存储在集合中的元素的最大数量,默认值为65536

    7. family { inet | inet6 } IPv4/IPv6 (适用hash集合(hash:mac除外))

    这个参数对于除hash:mac之外的所有hash类型集的create命令都是有效的。它定义了要存储在集合中的IP地址的协议族

    8. nomatch (hash:net适用 ):

    可以存储网络数据类型的哈希集类型(即hash: net )在添加条目时支持可选的nomatch选项。当匹配集合中的元素时,将跳过标记为nomatch的条目,就好像这些条目没有添加到集合中一样,这使得在异常情况下构建集合成为可能。参见下面的hash类型hash:net中的示例。当ipset测试元素时,会考虑nomatch标志。如果想要测试集合中使用nomatch标记的元素是否存在,那么也必须指定该标志。
    也就是说,这个通常与hash:net搭配使用,用来跳过 hash:net指定的ip netmask address.

    9. forceadd 集合满时,随机删除(所有集合适用)

    当使用此选项创建的集合已满时,集合的下一个添加项可能成功并从集合中删除随机项。

    SET TYPES 集合类型:

    method存储方式:
    存储方式有 bitmap, hash, list
    bitmap和list : 使用固定大小的存储.
    hash : 使用hash表来存储元素。但为了避免Hash表键冲突,在ipset会在hash表key用完后,若又有新增条目,则ipset将自动对hash表扩大,假如当前哈希表大小为100条,则它将扩展为200条。当在iptables/ip6tables中使用了ipset hash类型的集合,则该集合将不能再新增条目。

    hash的自增
    前面说过:bitmap link 的储存方式的集合大小是固定,hash类型的储存大小是可变的
    下面回顾一下hash的两个参数

  • hashsize :指定了创建集合时初始大小
  • maxelem :指定了集合最大存储记录的数量
  • 如果集合中最大存储数量不能满足配置的ip数量,则会出现下面的问题:
    这也再次证明,其实在hash:ip和hash:ip,port中,即使配置的时候是以ip段的方式配置的,但是存储的时候还是按照单个ip进行保存的。
    这里需要注意的是,一旦使用 hash:ip和hash:ip,port 方式 进行ipset配置,而ip又非常多的话,可能会出现下面的情况.(最后是使用hash:net替换hash:ip解决的)

    datatype数据类型:
    支持的类型有: ip, net, mac, port, iface ,即除了ip外,还可以是网络段,端口号(支持指定 TCP/UDP 协议),mac 地址,网络接口名称,或者多种。在创建的时候,指定是什么类型,在添加的时候,数据就要按照对应的格式来,不然就会报错

    Supported set types 支持的集合类型:

    1. hash:ip

    使用哈希存储ip主机地址(默认)或网络地址。零值IP地址不能存储在散列中。
    CREATE-OPTIONS(创建可用选项) := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ netmask cidr ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
    ADD-ENTRY(添加参数 := ipaddr
    ADD-OPTIONS(添加可用选项):= [ timeout value ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
    DEL-ENTRY(删除参数) := ipaddr
    TEST-ENTRY(测试参数) := ipaddr
    关于netmask :当指定可选的netmask参数时,网络地址将存储在集合中,而不是IP主机地址。cidr前缀值必须在IPv4的1-32和IPv6的1-128之间。如果网络地址是用netmas屏蔽的,则IP地址将在集合中 在这里插入图片描述

    2. hash:net

    使用集合存储不同大小的IP网络地址。前缀大小为零的网络地址不能存储在这种类型的集合中。
    CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
    ADD-ENTRY := netaddr
    ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
    DEL-ENTRY := netaddr
    TEST-ENTRY := netaddr
    where netaddr := ip[/cidr]

    在添加/删除/测试条目时,如果没有指定cidr前缀参数,则假定主机前缀值。当添加/删除条目时,内核将添加/删除确切的元素,并且不检查重叠元素。当测试条目时,如果测试了主机地址,那么内核将尝试匹配添加到集的网络中的主机地址,并相应地报告结果。netfilter匹配从集合的角度寻找匹配总是从最小的尺寸用于网段(最具体的前缀)最大的一个(至少特定前缀)添加到集合。当添加/删除IP地址设置netfilter设定的目标,它将被添加/删除最特定的前缀,可以发现在一组,或由主机前缀值如果设置为空。查找时间随着添加到集合中的不同前缀值的数量线性增长。

    3. hash:ip,port

    使用hash存储IP地址和端口号对。端口号与协议(默认TCP)一起,不能使用零协议号
    CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
    ADD-ENTRY := ipaddr,[proto:]port
    ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
    DEL-ENTRY := ipaddr,[proto:]port
    TEST-ENTRY := ipaddr,[proto:]port
    如果创建集合是指定的存储内容包含 ip, 例如 hash:ip 或 hash:ip,port ,在添加记录时,可以填 IP 段,但是仍然是以单独一个个 IP 的方式来存储的

    4. hash:ip,port,net

    使用hash存储IP地址、端口号和IP网络地址三元组。端口号与协议(默认TCP)一起,不能使用零协议号。前缀大小为零的网络地址也不能存储。
    CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
    ADD-ENTRY := ipaddr,[proto:]port,netaddr
    ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
    DEL-ENTRY := ipaddr,[proto:]port,netaddr
    TEST-ENTRY := ipaddr,[proto:]port,netaddr
    where netaddr := ip[/cidr]

    上面仅做4个常用的进行介绍,还有很多其他的类型可供使用
    ipset官网直达
    还有下面几个未做介绍(有空再更)

    bitmap:ip
    bitmap:ip,mac
    bitmap:port
    hash:mac
    hash:ip,mac
    hash:net,net
    hash:net,port
    hash:ip,port,ip
    hash:ip,mark
    hash:net,port,net
    hash:net,iface
    list:set

    ipset和iptables:
    在iptables中使用ipset,只要加上 -m set --match-set 即可。(这里只做简单的介绍)

  • 目的ip使用ipset(ipset集合为bbb)
  • 源ip使用ipset(ipset集合为aaa)
  • iptables -I INPUT -m set --match-set aaa src -d 192.168.100.36  -j DROP
  • 源和目的都使用ipset(源ip集合为aaa,目的ip集合为bbb)
  • iptables -I INPUT -m set --match-set aaa src -m set --match-set bbb dst  -j DROP