ipset

IPSET

本项目提供与Linux IPSET技术兼容的服务器隔离策略自动部署和更新方案

快速开始

本项目为Golang开发的插件

原理

  IPTables是Linux服务器上进行网络隔离的核心技术,内核在处理网络请求时会对IPTables中的策略进行逐条解析,因此当策略较多时效率较低;而是用IPSet技术可以将策略中的五元组(协议,源地址,源端口,目的地址,目的端口)合并到有限的集合中,可以大大减少IPTables策略条目从而提高效率。测试结果显示IPSet方式效率将比IPTables提高100倍。
  使用到的IPTables参数如下:

-A  INPUT|OUTPUT     指定IPTables链,对应网络数据流相对于当前网卡的方向是流入或流出
-p  tcp|udp|icmp     指定网络数据流使用的协议
-m  state|set        指定加载的模块:set对应IPSet模块,具体的介绍在后面;state模块用于限定连接状态,配置此项可以避免对每个ACCEPT的策略同时加入INPUT链和OUTPUT链
-j  ACCEPT|REJECT    指定对网络数据流放行或拒绝

  目前网络隔离使用默认拒绝+白名单的方式配置,在配置IPSet表时,根据其方向、协议、是否放行及五元组类型可以分为24个list:set类型的集合,每个list:set集合可以容纳65536个其他类型集合(目前为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策略设计

  使用到的IPSet类型

  • hash:ip 用于单独指定(si=源地址)或(di=目标地址),这两种在本方案中都会使用
  • hash:ip,port 用于指定(sisp=源地址-源端口)、(disp=目的地址-源端口)、(sidp=源地址-目的端口)、(didp=目的地址-目的端口),后两种在本方案中会使用
  • bitmap:port 用于单独指定端口(sp=源端口)或(dp=目的端口),后一种在本方案中会使用
  • list:set 用于容纳前述三种集合类型,且不能包含本身

  目前存在的hash:ip hash:ip,port容量设置为1048576,bitmap:port容量设置为65536,外层list:set容量设置为65536,这样任意一个list:set集合可以容纳1048576*65536=600亿 个元素,整体结构如下:

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使用注意事项

1.hash类型集合在iptables命令执行时大小确定,后期如果对该集合增加较多元素会发生哈希冲突,影响策略匹配。因此建立集合时需要设定一个较大容量
2.ipset的集合在执行iptables后进行更新操作时,会在这段时间执行默认操作(reject)
3.list:set不能包含list:set类型,只能包含其他类型

IPTables策略设计

  按如下形式固定IPTables策略,可避免IPTables本身策略的备份与恢复操作(IPTables进行restore操作时会全量还原重置,而IPSet进行restore操作时是增量进行的):

*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

  现在来考虑IPSet指定的五元组的问题

  • INPUT连接:考虑socket的accept函数,源端即远程主机,目的端即本机。这里只考虑新链接(NEW)
    • 源地址 即远程主机地址,可以作为策略限制因子
    • 源端口 即远程主机端口,一般为随机端口,不可作为策略限制因子
    • 目的地址 即本机地址,由于是固定的,无需作为策略限制因子
    • 目的端口 即本机端口,可以作为策略限制因子
  • OUTPUT连接:考虑socket的connect函数,源端即本机,目的端即远程主机。这里只考虑新链接(NEW)
    • 源地址 即本机地址,由于是固定的,无需作为策略限制因子
    • 源端口 即本机端口,一般为随机端口,不可作为策略限制因子
    • 目的地址 即远程主机地址,可以作为策略限制因子
    • 目的端口 即远程主机端口,可以作为策略限制因子

  综上,对于INPUT连接,可以指定源地址(si)、目的端口(dp)、源地址+目的端口(sidp);而对于OUTPUT连接,可以指定目的地址(di)、目的端口(dp)、目的地址+目的端口(didp)

IPSet方案相比IPTables方案的优点

  • IPSet基于IPTables方案,是对IPTables技术的优化,将线性策略查找优化为集合元素查找,提高了通信速度
  • IPSet方案在进行下发更新时,只需要对IPSet策略进行更新,无需对IPTables策略进行更新,由于在这种情况下IPTables条目极少,且无需还原操作,因此在更新的时间段对网络策略的影响较小,不会出现因为IPTables重置而导致短时间策略失效问题
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容