用途:當機器受到網絡攻擊時,使用 iptables 封 IP,有時候可能會封禁成千上萬個 IP,若是添加成千上萬條規則,
在一臺注重性能的服務器或者自己性能就不好的設備上就不在適用了。ipset 就是爲了不這個問題而生的。
ipset的參數:
ipset [-exist | -output { plain | save | xml } | -quiet | -resolve | -sorted | -name | -terse | -file filename ] Command [ Command-Options ]
-o,-output plain|save|xml
#爲清單集指定輸出模式。「list」命令的默認值是「plain」模式,「save」命令的默認值是「save」模式。
-f,-file #restore時,指定從文件中恢復,list/save時,保存數據到文件.
-s,-sorted #打印排序的元素(若是集合類型支持)。
-!,-exist #建立或添加已存在的set,或 刪除不存在的set時,不報錯
-q,-quiet #靜默模式
-r,-resolve #反向解析IP地址.
-n,-name #僅列出內核中的setname。
-t,-terse #僅從內核中列出setnames和set header。
ipset的可用 Command 選項:
create SETNAME TYPENAME [Command-Options]
add SETNAME ENTRY [Command-Options] #在指定集合中添加條目(Entry),僅在建立時,
指定了Command-Options才能使用相應的參數.
del SETNAME ENTRY
flush [SETNAME] #清空指定集合或所有集合中全部條目
destroy [SETNAME] #刪除一個指定的集合,或刪除全部集合
test SETNAME ENTRY #測試一個條目是否包含在該集合
list [SETNAME] #顯示一個指定的集合,或列出全部集合
save [SETNAME] #保存一個指定的集合,或保存全部集合
restore #恢復已保存的狀態
rename FROM-SETNAME TO-SETNAME #重命名集合名
swap FROM-SETNAME TO-SETNAME #交換兩個集合的內容服務器
TYPENAME: 是集合類型,它包括存儲數據的 存儲方法 和存儲在集合中的 數據類型
格式:
TYPENAME := method:datatype[,datatype[,datatype]]
當前方法列表爲 bitmap, hash, 和list,可能的數據類型爲ip、net、mac、port和iface。
bitmap和list: 使用固定大小的存儲.
hash: 使用hash表來存儲元素。但爲了不Hash表鍵衝突,在ipset會在hash表key用完後,
若又有新增條目,則ipset將自動對hash表擴大,假如當前哈希表大小爲100條,則它將
擴展爲200條。當在iptables/ip6tables中使用了ipset hash類型的集合,則該集合將
不能再新增條目。
集合的dimension(維度)等於其類型名稱中的數據類型的數量。
如:
ipset create test hash:ip,port,net
ipset add test 1.1.1.1,80,1.1.1.0/24 #這就是所謂的集合維度,有幾個類型,就必須有幾個與其對應的類型值.
另注:
#若使用非ip,net,port等數字或編號類,而使用域名或服務名等時,必須使用中括號括起來.
若提供了域名,ipset內部經過DNS解析爲多個IP時,ipset將使用第一個IP.
ipset add foo [test-hostname],[ftp-data]
TYPENAME使用注意事項:
hash:port
port的格式有三種:
1.直接寫端口號.
2.udp:端口號, 默認是tcp
3.端口範圍,如:8000-9000
hash:mac
mac: 只能是源MAC. 由於iptables沒法獲取互聯網上的目標MAC.
集合存儲方式有三類:
bitmap: 是將條目存儲到內存中一段連續的空間中.
hash: 使用hash表來存儲集合條目
list: 是存儲集合的集合
CentOS7上可用的集合類型名:
注: 這些類型名都是固定格式,每種類型名支持的Command-Options不一樣,具體可看man手冊.
hash:net
hash:ip
hash:ip,port
hash:net,port
hash:net,iface
hash:ip,port,net
hash:ip,port,ip
bitmap:ip
bitmap:port
bitmap:ip,mac
list:set網絡
hash自增參數:
hashsize:指定了建立集合時初始大小
maxelem:指定了集合最大存儲記錄的數量
例:
ipset create test1 hash:ip,port hashsize 4096 maxelem 1000000
family [inet |int6] : 指定集合是ipv4 或ipv6的集合.
nomatch:
若使用hash:net, 指定了一個網段爲192.168.0.0/24,但我不想讓此集合包含0~4這一段,
即:192.168.0.0~192.168.0.4,怎麼辦? 這就可使用nomatch參數.
注: nomatch參數是在追加條目時,使用的參數。
ipset create test hash:net
ipset add test 192.168.0.0/24
ipset add test 192.168.0.0/30 nomatch
注: 這句就表示192.168.0.0/30此網段中第一段子網將從test集合中移除.
timeout:
集合中的條目超時後自動刪除,需在建立集合時指定此參數,不然後期沒法給集合中的條目追加超時參數.
timeout 0:表示永不超時,但在添加條目時,可手動指定其超時值,若不指定則默認爲永不超時.
如:
ipset create test2 hash:net timeout 1000
注: 這就建立了一個test2的集合,其內部每一個條目均在1000秒後,自動刪除.
ipset add test2 192.168.1.0/24 timeout 100
注: 這表示不使用默認值,手動指定其超時值.【必須在集合建立時,指定了超時參數纔可用】
counters:
計數器選項,可用於統計條目匹配的數據包和字節數,也可在新增或從新添加時指定這些初始計數值.
注: 此參數須要在建立時指定後,集合內的條目才能支持計數器.
comment:
註釋選項,需在建立集合時指定,集合內的條目才能使用comment來添加註釋.
例:
ipset create test4 hash:net comment
ipset add test4 1.1.1.0/24 comment "This is a test."
ipset add test4 1.1.2.0/24 comment "This comment is \"bad\""
ipset add test4 1.1.3.0/24 comment "This is file:\\\\Bad\\"
注: 以上是對雙引號和「\」的轉義,但不建議使用,這可能致使save和restore時出錯。
skbinfo:
此擴展選項支持在每一個條目中存儲metainfo(firewall mark, tc class和hardware queue),
並使用SET netfilter target 的 --map-set選項將其映射到數據包中。
skbmark:其值爲MARK[/MASK]其中MARK和MASK是帶有0x前綴的32位十六進制數,
若僅指定了MARK 則掩碼默認爲:0xffffffff
tcp
skbprio: 此選項具備tc class格式:MAJOR:MINOR,它們都是無0x前綴的十六進制數.
skbqueue: 此選項是一個整數。
例:
ipset create test5 hash:ip skbinfo
ipset add test5 skbmark 0x1111/0xff00ffff skbprio 1:10 skbqueue 10
forceadd: 當hash集合滿時,追加依然能成功,但它會隨機從集合中刪除一個條記錄.
簡單例子:
#建立集合指定初始hash大小是4096,若是滿了,這個hash會自動擴容爲以前的兩倍。
最大能存儲的數量是100000個
ipset create black_list hash:net,port hashsize 4096 maxelem 1000000
ipset add black_list 3.4.5.6,80 #指定端口80,可是沒指定協議,默認是TCP
ipset add black_list 5.6.7.8,udp:53 #
ipset add black_list 1.2.3.4,80-86 #指定一個端口範圍
ipset add black_list 123.123.123.0/24
ipset add black_list 123.123.123.0/30 nomatch
#黑名單用法(拒絕規則集裏的地址)
iptables -I INPUT -m set --match-set black_list src -j DROP
#白名單用法(不拒絕規則集裏的地址)
iptables -I INPUT -m set --match-set black_list src -j ACCEPT性能