ipset 學習總結


用途:當機器受到網絡攻擊時,使用 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

  Command-Options:

    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
     

         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

 


免責聲明!

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



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