IPSet設(shè)計(jì)

原帖發(fā)布于2018年11月

原理

??IPTables是Linux服務(wù)器上進(jìn)行網(wǎng)絡(luò)隔離的核心技術(shù)幸斥,內(nèi)核在處理網(wǎng)絡(luò)請(qǐng)求時(shí)會(huì)對(duì)IPTables中的策略進(jìn)行逐條解析,因此當(dāng)策略較多時(shí)效率較低俊庇;而是用IPSet技術(shù)可以將策略中的五元組(協(xié)議狮暑,源地址,源端口,目的地址辉饱,目的端口)合并到有限的集合中搬男,可以大大減少IPTables策略條目從而提高效率。測(cè)試結(jié)果顯示IPSet方式效率將比IPTables提高100倍彭沼。
??使用到的IPTables參數(shù)如下:

  • -A INPUT|OUTPUT 指定IPTables鏈缔逛,對(duì)應(yīng)網(wǎng)絡(luò)數(shù)據(jù)流相對(duì)于當(dāng)前網(wǎng)卡的方向是流入或流出
  • -p tcp|udp|icmp 指定網(wǎng)絡(luò)數(shù)據(jù)流使用的協(xié)議
  • -m state|set 指定加載的模塊:set對(duì)應(yīng)IPSet模塊,具體的介紹在后面姓惑;state模塊用于限定連接狀態(tài)褐奴,配置此項(xiàng)可以避免對(duì)每個(gè)ACCEPT的策略同時(shí)加入INPUT鏈和OUTPUT鏈
  • -j ACCEPT|REJECT 指定對(duì)網(wǎng)絡(luò)數(shù)據(jù)流放行或拒絕

??目前網(wǎng)絡(luò)隔離使用默認(rèn)拒絕+白名單的方式配置,在配置IPSet表時(shí)于毙,根據(jù)其方向敦冬、協(xié)議、是否放行及五元組類型可以分為24個(gè)list:set類型的集合望众,每個(gè)list:set集合可以容納65536個(gè)其他類型集合(目前為hash:ip hash:ip,port)匪补,從而容納海量策略:

in_tcp_acc_si    out_tcp_acc_di 
in_tcp_rej_si    out_tcp_rej_di 
in_udp_acc_si    out_udp_acc_di 
in_udp_rej_si    out_udp_rej_di 
in_tcp_acc_dp    out_tcp_acc_dp 
in_tcp_rej_dp    out_tcp_rej_dp 
in_udp_acc_dp    out_udp_acc_dp
in_udp_rej_dp    out_udp_rej_dp 
in_tcp_acc_sidp  out_tcp_acc_didp
in_tcp_rej_sidp  out_tcp_rej_didp
in_udp_acc_sidp  out_udp_acc_didp
in_udp_rej_sidp  out_udp_rej_didp

IPSet策略設(shè)計(jì)

使用到的IPSet類型

  • hash:ip 用于單獨(dú)指定(si=源地址)或(di=目標(biāo)地址)伞辛,這兩種在本方案中都會(huì)使用
  • hash:ip,port 用于指定(sisp=源地址-源端口)烂翰、(disp=目的地址-源端口)、(sidp=源地址-目的端口)蚤氏、(didp=目的地址-目的端口)甘耿,后兩種在本方案中會(huì)使用
  • bitmap:port 用于單獨(dú)指定端口(sp=源端口)或(dp=目的端口),后一種在本方案中會(huì)使用
  • list:set 用于容納前述三種集合類型竿滨,且不能包含本身

??目前存在的hash:ip hash:ip,port容量設(shè)置為1048576佳恬,bitmap:port容量設(shè)置為65536捏境,外層list:set容量設(shè)置為65536,這樣任意一個(gè)list:set集合可以容納1048576*65536=600億 個(gè)元素毁葱,整體結(jié)構(gòu)如下:

IPTables
    in_tcp_acc_si        
        set1
        set2
        ....
        setn
    in_tcp_rej_si        
        set1
        set2
        ....
        setn
    in_udp_acc_si      
    in_udp_rej_si
    in_tcp_acc_dp    
    in_tcp_rej_dp        
    in_udp_acc_dp        
    in_udp_rej_dp        
    in_tcp_acc_sidp    
    in_tcp_rej_sidp    
    in_udp_acc_sidp    
    in_udp_rej_sidp    
    out_tcp_acc_di  
    out_tcp_rej_di  
    out_udp_acc_di  
    out_udp_rej_di  
    out_tcp_acc_dp  
    out_tcp_rej_dp  
    out_udp_acc_dp
    out_udp_rej_dp  
    out_tcp_acc_didp
    out_tcp_rej_didp
    out_udp_acc_didp
    out_udp_rej_didp

IPSet使用注意事項(xiàng)

  • hash類型集合在iptables命令執(zhí)行時(shí)大小確定垫言,后期如果對(duì)該集合增加較多元素會(huì)發(fā)生哈希沖突,影響策略匹配倾剿。因此建立集合時(shí)需要設(shè)定一個(gè)較大容量
  • ipset的集合在執(zhí)行iptables后進(jìn)行更新操作時(shí)筷频,會(huì)在這段時(shí)間執(zhí)行默認(rèn)操作(reject)
  • list:set不能包含list:set類型,只能包含其他類型

IPTables策略設(shè)計(jì)

??按如下形式固定IPTables策略前痘,可避免IPTables本身策略的備份與恢復(fù)操作(IPTables進(jìn)行restore操作時(shí)會(huì)全量還原重置凛捏,而IPSet進(jìn)行restore操作時(shí)是增量進(jìn)行的):

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT    
-A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set in_tcp_acc_si src         
-A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set in_tcp_acc_dp dst         
-A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set in_tcp_acc_sidp src,dst   
-A INPUT -p tcp -m state --state NEW,ESTABLISHED -j REJECT -m set --set in_tcp_rej_si src         
-A INPUT -p tcp -m state --state NEW,ESTABLISHED -j REJECT -m set --set in_tcp_rej_dp dst         
-A INPUT -p tcp -m state --state NEW,ESTABLISHED -j REJECT -m set --set in_tcp_rej_sidp src,dst   
-A INPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set in_udp_acc_si src         
-A INPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set in_udp_acc_dp dst         
-A INPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set in_udp_acc_sidp src,dst   
-A INPUT -p udp -m state --state NEW,ESTABLISHED -j REJECT -m set --set in_udp_rej_si src         
-A INPUT -p udp -m state --state NEW,ESTABLISHED -j REJECT -m set --set in_udp_rej_dp dst         
-A INPUT -p udp -m state --state NEW,ESTABLISHED -j REJECT -m set --set in_udp_rej_sidp src,dst   
-A INPUT -m state --state NEW -j REJECT
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -p icmp -j ACCEPT 
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set out_tcp_acc_di src       
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set out_tcp_acc_dp dst       
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set out_tcp_acc_didp src,dst 
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j REJECT -m set --set out_tcp_rej_di src       
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j REJECT -m set --set out_tcp_rej_dp dst       
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j REJECT -m set --set out_tcp_rej_didp src,dst 
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set out_udp_acc_di src       
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set out_udp_acc_dp dst       
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT -m set --set out_udp_acc_didp src,dst 
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j REJECT -m set --set out_udp_rej_di src       
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j REJECT -m set --set out_udp_rej_dp dst       
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j REJECT -m set --set out_udp_rej_didp src,dst 
-A OUTPUT -j LOG --log-prefix "iptables:"
-A OUTPUT -m state --state NEW -j REJECT 
COMMIT

??現(xiàn)在來考慮IPSet指定的五元組的問題

INPUT連接:考慮socket的accept函數(shù),源端即遠(yuǎn)程主機(jī)芹缔,目的端即本機(jī)坯癣。這里只考慮新鏈接(NEW)

  • 源地址 即遠(yuǎn)程主機(jī)地址,可以作為策略限制因子

  • 源端口 即遠(yuǎn)程主機(jī)端口最欠,一般為隨機(jī)端口示罗,不可作為策略限制因子

  • 目的地址 即本機(jī)地址,由于是固定的窒所,無需作為策略限制因子

  • 目的端口 即本機(jī)端口鹉勒,可以作為策略限制因子

OUTPUT連接:考慮socket的connect函數(shù),源端即本機(jī)吵取,目的端即遠(yuǎn)程主機(jī)禽额。這里只考慮新鏈接(NEW)

  • 源地址 即本機(jī)地址,由于是固定的皮官,無需作為策略限制因子

  • 源端口 即本機(jī)端口脯倒,一般為隨機(jī)端口,不可作為策略限制因子

  • 目的地址 即遠(yuǎn)程主機(jī)地址捺氢,可以作為策略限制因子

  • 目的端口 即遠(yuǎn)程主機(jī)端口藻丢,可以作為策略限制因子

??綜上,對(duì)于INPUT連接摄乒,可以指定源地址(si)悠反、目的端口(dp)、源地址+目的端口(sidp)馍佑;而對(duì)于OUTPUT連接斋否,可以指定目的地址(di)、目的端口(dp)拭荤、目的地址+目的端口(didp)

IPSet方案相比IPTables方案的優(yōu)點(diǎn)

  • IPSet基于IPTables方案茵臭,是對(duì)IPTables技術(shù)的優(yōu)化,將線性策略查找優(yōu)化為集合元素查找舅世,提高了通信速度
  • IPSet方案在進(jìn)行下發(fā)更新時(shí)旦委,只需要對(duì)IPSet策略進(jìn)行更新奇徒,無需對(duì)IPTables策略進(jìn)行更新,由于在這種情況下IPTables條目極少缨硝,且無需還原操作摩钙,因此在更新的時(shí)間段對(duì)網(wǎng)絡(luò)策略的影響較小,不會(huì)出現(xiàn)因?yàn)镮PTables重置而導(dǎo)致短時(shí)間策略失效問題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末查辩,一起剝皮案震驚了整個(gè)濱河市腺律,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宜肉,老刑警劉巖匀钧,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谬返,居然都是意外死亡之斯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門遣铝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佑刷,“玉大人,你說我怎么就攤上這事酿炸√毙酰” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵填硕,是天一觀的道長(zhǎng)麦萤。 經(jīng)常有香客問我,道長(zhǎng)扁眯,這世上最難降的妖魔是什么壮莹? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮姻檀,結(jié)果婚禮上命满,老公的妹妹穿的比我還像新娘。我一直安慰自己绣版,他們只是感情好胶台,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杂抽,像睡著了一般诈唬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上默怨,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天讯榕,我揣著相機(jī)與錄音骤素,去河邊找鬼匙睹。 笑死愚屁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痕檬。 我是一名探鬼主播霎槐,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼梦谜!你這毒婦竟也來了丘跌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤唁桩,失蹤者是張志新(化名)和其女友劉穎闭树,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荒澡,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡报辱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了单山。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍现。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖米奸,靈堂內(nèi)的尸體忽然破棺而出昼接,到底是詐尸還是另有隱情,我是刑警寧澤悴晰,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布慢睡,位于F島的核電站,受9級(jí)特大地震影響铡溪,放射性物質(zhì)發(fā)生泄漏一睁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一佃却、第九天 我趴在偏房一處隱蔽的房頂上張望者吁。 院中可真熱鬧,春花似錦饲帅、人聲如沸复凳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽育八。三九已至,卻和暖如春赦邻,著一層夾襖步出監(jiān)牢的瞬間髓棋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留按声,地道東北人膳犹。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像签则,于是被迫代替她去往敵國(guó)和親须床。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345