在《信息安全技术工业控制系统专用防火墙技术要求》中对工业防火墙的带宽管理功能提出如下的要求“部署域间的工控防火墙应具备带宽保障功能,使得在带宽出现拥堵时,能够保障重要终端的网络通信”。
本文对我司工业防火墙实现“带宽管理”功能的关键技术进行了描述和分析。
方案1-流量限速
>>>> 描述
流量限速是流量QoS的基本功能,该方案的思路是对进入防火墙的流量进行分类,区分出优先级高和优先级低的流量,当网络出现拥堵时,为了保障高优先级(本文是重要终端)的流量,对低优先级的流量进行限速。
按照不同的需求对流量进行分类的方法有很多种,比如按照应用层协议(Modbus,OPC,S7等)进行分类,按照IP报文不同的TOS/DSCP标记进行分类,按照不同的MAC地址进行分类等,《技术要求》中提到的“保障重要终端的网络通信”,这里是按照不同的IP地址段进行分类。
>>>> CAR(committed access rate)算法
对于流量限速,IETF建议采用srTCM(A Single Rate Three Color Marker,RFC2697)算法或trTCM(A Two Rate
Three Color Marker,RFC2698)算法对流量进行测评,这里简单介绍一种单桶双色算法,如下图:
构造一个令牌桶,开始令牌桶是空的,让需要限速的报文进入令牌桶,每进入一个报文,投入报文长度的令牌(Token),同时令牌桶以CIR(Committed Information Rate)的速率不停的漏掉令牌,直到令牌桶为空为止。
根据报文进入令牌桶时桶中的令牌数对报文着色,如果投入该报文的令牌后,桶中的令牌数没有溢出(超过桶高),将报文着绿色,更新桶中的令牌数,如果投入该报文的令牌后,桶中的令牌数溢出,将该报文着红色,桶中的令牌数不更新,对于红色的报文丢弃,CIR就是绿色报文通过的带宽。
如果限速的报文带宽小于CIR,流出桶的令牌比进入桶的令牌速率要大,桶中的令牌数长期在0附近波动,限速的报文基本不会被丢弃,除非一波突发的流量超过了桶高(Bucket Height),桶高决定了CAR算法支持的突发能力CBS(Committed Burst Size)。
>>>> 实现
利用限制低优先级流量的带宽保障高优先级的流量,需要知道拥堵时低优先级流量的带宽,将低优先级的流量限制在其带宽以下,多余出来的带宽来保障高优先级的流量,但是当非拥堵时,如果低优先级的流量超过了其限制带宽,其仍旧是会被限制的。低优先级的流量可以有多种,可以限制到不同的带宽。
另外,由于CAR算法不需要缓存报文,绿色的报文都实时转发,因而对报文转发的时延影响很小。
方案2-区分优先级的限速
>>>> 描述
利用方案1实现保障高优先级的流量存在误杀的情况,即在非拥堵的时候低优先级的流量也可能会被限制;同时,低优先级流量的带宽可能波动比较大,难以找到一个准确的限制带宽。
本方案改进了CAR算法,将高优先级和低优先级的流量一起考虑,只有当它们的流量之和超过一定的带宽(拥堵)时,才会限制低优先级的流量。
>>>> 多层桶高的CAR算法
本算法在CAR算法的基础上,将高优先级的流量和低优先级的流量设置成不同的桶高,高优先级流量的桶高比低优先级的桶高要大,如图: 高优先级报文P1的桶高为BH1,低优先级报文P2的桶高为BH2,BH1>BH2,两种报文共用一个令牌桶。当P2进入令牌桶时,投入该报文的令牌后,如果桶中的令牌数超过BH2,报文着红色,反之着绿色。同理,当P1进入令牌桶时,投入该报文的令牌后,如果桶中的令牌数超过BH1,报文着红色,反之着绿色。
当P1和P2的带宽之和小于CIR时,进入令牌桶的令牌数小于流出的令牌数,桶中的令牌数长期在0附近波动,报文不会被丢弃,除非一波突发的流量超过了BH2,才会有少量的P2报文着红色,BH2决定了支持P2突发流量的能力。
当P1和P2的带宽之和大于CIR,但是P1的带宽小于CIR时,桶中的令牌数长期在BH2上下波动,当令牌数大于BH2时,P2报文着红色,当令牌数小于BH2时,P2报文着绿色。由于令牌数达不到BH1,所以P1报文基本不会着红色,除非有一波P1的突发报文大于BH1-BH2,才会有少量的P1报文着红色,BH1-BH2决定了支持P1突发流量的能力。
当P1的带宽超过CIR时,桶中的令牌数长期在BH1上下波动,所有的P2报文都着红色,P1报文的带宽限制在CIR。
>>>> 实现
多层桶高的CAR算法在限制流量带宽的同时通过不同的桶高区分出来两种或者多种流量的优先级。将CIR设置为拥堵的带宽阈值,当拥堵的时候,优先丢弃低优先级的报文,当不拥堵的时候,低优先级的报文就不会被丢弃。
相较于方案1,该方案所有的报文共用一个CAR桶,实现较复杂,进入CAR桶的报文数多,性能也不如方案1。同时支持的桶高层数不宜过多,最好不要超过3层。
方案3-拥塞控制
>>>> 描述为了解决方案1中对低优先级流量的误杀情况,还有一种拥塞控制的方法。该方法的思路是增加一个策略判决链,通过策略判决链决定低优先级流量的限速是否生效;也就是拥堵的时候限制低优先级的流量,不拥堵的时候将低优先级流量的限制取消。
>>>> 策略判决链
策略判决链是将所有判断系统拥塞的条件和对应的策略作为拥塞节点放在一个链表中,拥塞节点可以是一个或者多个,对应的限制低优先级流量的策略也可以是一个或者多个。定期的遍历拥塞节点判决拥塞的条件是否成立,如果拥塞的条件成立,立即启动对应的策略来限制低优先级的流量,如果连续三次判决拥塞的条件不成立(低于拥塞带宽80%以下),取消对应的策略不限制低优先级流量的带宽。如图:
>>>> 实现
该方案也是在方案1的基础上实现低优先级流量的动态控制。相较于方案2其适用性更广,进入CAR桶处理的流量更少,但是会额外增加策略判决链的处理,使得实现的复杂性相较于方案2更复杂,对系统性能的影响更大。
方案4-优先队列(Priority Queuing)
>>>> 描述
该方案区别于上面的方案的地方是增加了报文的缓存,其思路是将高优先级和低优先级的流量作为一个总体考虑,在限制总带宽的同时,将不同优先级的报文缓存在不同的队列中,然后从最高优先级的队列中开始转发报文,直到高优先级队列中没有报文后,才开始转发次优先级的报文,然后才是低优先级的报文。每个队列都有长度限制,如果缓存报文超过了队列的长度,进行队尾丢弃报文。
由于该方案进行了报文缓存,实现起来复杂,并且会增大报文的时延,但是其能够对流量有一定的整形(traffic shaping)效果。
>>>> 方案
该方案对系统的影响较大,实现很复杂,本文暂不考虑其实现。
>>>> 实现
略。
方案比较及建议