ipset淺議

利用 ipset 封禁大量 IP

使用 iptables 封 IP铺韧,是一種比較簡單的應對網(wǎng)絡攻擊的方式,也算是比較常見哈打。有時候可能會封禁成千上萬個 IP,如果添加成千上萬條規(guī)則前酿,在一臺注重性能的服務器或者本身性能就很差的設備上罢维,這就是個問題了。ipset 就是為了避免這個問題而生的肺孵。

關于 iptables,要知道這兩點吓肋。

  • iptables 包含幾個表瑰艘,每個表由鏈組成。默認的是 filter 表紫新,最常用的也是 filter 表,另一個比較常用的是 nat 表囤耳。一般封 IP 就是在 filter 表的 INPUT 鏈添加規(guī)則偶芍。
  • 在進行規(guī)則匹配時,是從規(guī)則列表中從頭到尾一條一條進行匹配椎麦。

這像是在鏈表中搜索指定節(jié)點費力萄窜。ipset 提供了把這個 O(n) 的操作變成 O(1) 的方法:就是把要處理的 IP 放進一個集合,對這個集合設置一條 iptables 規(guī)則。像 iptable 一樣凤类,IP sets 是 Linux 內(nèi)核中的東西,ipset 這個命令是對它進行操作的一個工具佃延。

簡單的流程

可以用這幾條命令概括使用 ipset 和 iptables 進行 IP 封禁的流程

ipset create vader hash:ip  
iptables -I INPUT -m set --match-set vader src -j DROP  
ipset add vader 4.5.6.7  
ipset add vader 1.2.3.4  
ipset add vader ...  
ipset list vader # 查看 vader 集合的內(nèi)容  

下面分別對各條命令進行描述。

創(chuàng)建一個集合

ipset create vader hash:ip  

這條命令創(chuàng)建了名為 vader 的集合履肃,以 hash 方式存儲,存儲內(nèi)容是 IP 地址封锉。

添加 iptables 規(guī)則

iptables -I INPUT -m set --match-set vader src -j DROP  

如果源地址(src)屬于 vader 這個集合成福,就進行 DROP 操作荆残。這條命令中,vader 是作為黑名單的内斯,如果要把某個集合作為白名單,添加一個 ‘!’ 符號就可以潭苞。

iptables -I INPUT -m set ! --match-set yoda src -j DROP
到現(xiàn)在雖然創(chuàng)建了集合萄传,添加了過濾規(guī)則蜜猾,但是現(xiàn)在集合還是空的,需要往集合里加內(nèi)容蹭睡。

找出“壞” IP
找出要封禁的 IP,這是封禁過程中重要的步驟脊串,不過不是這里的重點琼锋。簡要說明一下兩種方法思路祟昭。

netstat -ntu | tail -n +3 | awk '{print $5}' | sort | uniq -c | sort -nr
直接通過 netstat 的信息,把與本地相關的各種狀態(tài)的 IP 都計數(shù)篡悟,排序列出來匾寝。

或者從 nginx 或者其他 web server 的日志里找請求數(shù)太多的 IP

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
后半部分艳悔,排序女仰,去重,再按次數(shù)進行逆向排序的操作码倦,跟上面命令是一樣的锭碳。

找出“壞” IP,往之前創(chuàng)建的集合里添加就可以了擒抛。

ipset add vader 4.5.6.7
有多少“壞” IP,就添加多少 IP歹撒,因為針對這些封禁的 IP 只需要一條 iptables 規(guī)則诊胞,而這些 IP 是以 hash 方式存儲,所以封禁大量的 IP 也不會影響性能撵孤,這也是 ipset 存在的最大目的邪码。

ipset 更多的用法
存儲類型
前面例子中的 vader 這個集合是以 hash 方式存儲 IP 地址,也就是以 IP 地址為 hash 的鍵奴潘。除了 IP 地址影钉,還可以是網(wǎng)絡段,端口號(支持指定 TCP/UDP 協(xié)議)雀扶,mac 地址肆汹,網(wǎng)絡接口名稱昂勉,或者上述各種類型的組合。

比如指定 hash:ip,port就是 IP 地址和端口號共同作為 hash 的鍵岗照。查看 ipset 的幫助文檔可以看到它支持的所有類型攒至。

下面以兩個例子說明。

hash:net
ipset create r2d2 hash:net
ipset add r2d2 1.2.3.0/24
ipset add r2d2 1.2.3.0/30 nomatch
ipset add r2d2 6.7.8.9
ipset test r2d2 1.2.3.2
hash:net 指定了可以往 r2d2 這個集合里添加 IP 段或 IP 地址库菲。

第三條命令里的 nomatch 的作用簡單來說是把 1.2.3.0/30 從 1.2.3.0/24 這一范圍相對更大的段里“剝離”了出來志膀,也就是說執(zhí)行完 ipset add r2d2 1.2.3.0/24 只后1.2.3.0/24 這一段 IP 是屬于 r2d2 集合的,執(zhí)行了 ipset add r2d2 1.2.3.0/30 nomatch 之后烫止,1.2.3.0/24 里 1.2.3.0/30 這部分馆蠕,就不屬于 r2d2 集合了惊奇。執(zhí)行 ipset test r2d2 1.2.3.2 就會得到結果 1.2.3.2 is NOT in set r2d2.

hash:ip,port
ipset create c-3po hash:ip,port
ipset add c-3po 3.4.5.6,80
ipset add c-3po 5.6.7.8,udp:53
ipset add c-3po 1.2.3.4,80-86
第二條命令添加的是 IP 地址為 3.4.5.6,端口號是 80 的項吨铸。沒有注明協(xié)議诞吱,默認就是 TCP,下面一條命令則是指明了是 UDP 的 53 端口房维。最后一條命令指明了一個 IP 地址和一個端口號范圍咙俩,這也是合法的命令。

自動過期阿趁,解封
ipset 支持 timeout 參數(shù),這就意味著皂股,如果一個集合是作為黑名單使用,通過 timeout 參數(shù)呜呐,就可以到期自動從黑名單里刪除內(nèi)容蘑辑。

ipset create obiwan hash:ip timeout 300
ipset add obiwan 1.2.3.4
ipset add obiwan 6.6.6.6 timeout 60
上面第一條命令創(chuàng)建了名為 obiwan 的集合坠宴,后面多加了 timeout 參數(shù),值為 300啄踊,往集合里添加條目的默認 timeout 時間就是 300颠通。第三條命令在向集合添加 IP 時指定了一個不同于默認值的 timeout 值 60,那么這一條就會在 60 秒后自動刪除谨垃。

隔幾秒執(zhí)行一次 ipset list obiwan 可以看到這個集合里條目的 timeout 一直在隨著時間變化硼控,標志著它們在多少秒之后會被刪除牢撼。

如果要重新為某個條目指定 timeout 參數(shù),要使用 -exit 這一選項熏版。

ipset -exist add obiwan 1.2.3.4 timeout 100
這樣 1.2.3.4 這一條數(shù)據(jù)的 timeout 值就變成了 100纷责,如果這里設置 300,那么它的 timeout撼短,也就是存活時間又重新變成 300再膳。

如果在創(chuàng)建集合是沒有指定 timeout,那么之后添加條目也就不支持 timeout 參數(shù)曲横,執(zhí)行 add 會收到報錯喂柒。想要默認條目不會過期(自動刪除),又需要添加某些條目時加上 timeout 參數(shù),可以在創(chuàng)建集合時指定 timeout 為 0灾杰。

ipset create luke hash:ip
ipset add luke 5.5.5.5 timeout 100

得到報錯信息 kernel error received: Unknown error -1

更大蚊丐!
hashsize, maxelem 這兩個參數(shù)分別指定了創(chuàng)建集合時初始的 hash 大小,和最大存儲的條目數(shù)量吭露。

ipset create yoda hash:ip,port hashsize 4096 maxelem 1000000
ipset add yoda 3.4.5.6,3306
這樣創(chuàng)建了名為 yoda 的集合吠撮,初始 hash 大小是 4096,如果滿了讲竿,這個 hash 會自動擴容為之前的兩倍弄屡。最大能存儲的數(shù)量是 100000 個迈嘹。

如果沒有指定,hashsize 的默認值是 1024神僵,maxelem 的默認值是 65536保礼。

另外幾條常用命令
ipset del yoda x.x.x.x # 從 yoda 集合中刪除內(nèi)容
ipset list yoda # 查看 yoda 集合內(nèi)容
ipset list # 查看所有集合的內(nèi)容
ipset flush yoda # 清空 yoda 集合
ipset flush # 清空所有集合
ipset destroy yoda # 銷毀 yoda 集合
ipset destroy # 銷毀所有集合
ipset save yoda # 輸出 yoda 集合內(nèi)容到標準輸出
ipset save # 輸出所有集合內(nèi)容到標準輸出
ipset restore # 根據(jù)輸入內(nèi)容恢復集合內(nèi)容
還有……
如果創(chuàng)建集合是指定的存儲內(nèi)容包含 ip, 例如 hash:ip 或 hash:ip,port 胁赢,在添加條目時,可以填 IP 段吹害,但是仍然是以單獨一個個 IP 的方式來存。
上面所有的例子都是用 hash 的方式進行存儲纵穿,實際上 ipset 還可以以 bitmap 或者 link 方式存儲淆院,用這兩種方式創(chuàng)建的集合大小,是固定的拷淘。
通過 man upset 和 ipset —help 可以查到更多的內(nèi)容,包括各種選項,支持的類型等等松忍。

參考

利用 ipset 封禁大量 IP

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敞掘,一起剝皮案震驚了整個濱河市更扁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膛薛,老刑警劉巖哄啄,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锌半,死亡現(xiàn)場離奇詭異殉摔,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門惜索,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人角塑,你說我怎么就攤上這事。” “怎么了侥猩?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兵怯。 經(jīng)常有香客問我掸犬,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任柔滔,我火速辦了婚禮形真,結果婚禮上嘶朱,老公的妹妹穿的比我還像新娘偿衰。我一直安慰自己宝当,他們只是感情好跌穗,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布佩微。 她就那樣靜靜地躺著扒俯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪留潦。 梳的紋絲不亂的頭發(fā)上站削,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音蛛勉,去河邊找鬼侣诵。 笑死训柴,一個胖子當著我的面吹牛仗嗦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菊霜!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壤追,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡撵割,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年故硅,在試婚紗的時候發(fā)現(xiàn)自己被綠了往踢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峻呕。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖热押,靈堂內(nèi)的尸體忽然破棺而出牙寞,到底是詐尸還是另有隱情碎税,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布吗购,位于F島的核電站,受9級特大地震影響刀森,放射性物質(zhì)發(fā)生泄漏踱启。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埠偿。 院中可真熱鬧透罢,春花似錦、人聲如沸胚想。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浊服。三九已至统屈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牙躺,已是汗流浹背愁憔。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孽拷,地道東北人吨掌。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像脓恕,于是被迫代替她去往敵國和親膜宋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348