ipset詳解 使用ipset提高iptables的控制效率


本文最下方轉載自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 
        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".
-s 
        Print elements sorted (if supported by the set type).
-q 
        Suppress any notice or warning message.
-r 
        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.
-n 
        When listing, just list setnames from the kernel.

-t 
        When listing, list setnames and set headers
        from kernel only.
-f 
        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命令用到了

 

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

 

 
        

ipset詳解

ipset創建:create

創建一個新的ipset集合:ipset create SETNAME TYPENAME

在這里插入圖片描述

  1. SETNAME是創建的ipset的名稱,TYPENAME是ipset的類型:
    TYPENAME := method:datatype[,datatype[,datatype]]

  2. method指定ipset中的entry存放的方式,隨后的datatype約定了每個entry的格式。
    可以使用的method:(后面會詳細解釋)
    bitmap, hash, list
    可以使用的datatype:(后面會詳細解釋)
    ip, net, mac, port, iface
    例如:
    在這里插入圖片描述

添加條目:add

將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的兩個參數

  1. hashsize:指定了創建集合時初始大小
  2. maxelem:指定了集合最大存儲記錄的數量

在這里插入圖片描述
默認hashsize大小是1024,如果滿了 hash 會自動擴容為之前的兩倍,最大能存儲的數量是 65536 個.
這時我們可以進行默認值大小的設置和最大值的設置:
在這里插入圖片描述
如果集合中最大存儲數量不能滿足配置的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即可。(這里只做簡單的介紹)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM