提高ROS小包转发速率
小包转发速率是路由器的一个性能指标,一般在DNS、ICMP、网络游戏、聊天程序等应用中用到。最近看了几位大侠的妙文思考了很多问题,感觉有个问题要注意,就是队列可容纳数据包的长度。比如
default queue type的长度是50个包,我觉得对于小包来说大了,小包应该是优先并尽快发出去,不宜放在大的队列里排队,对于大包,比如VOD或HTTP,等一下没关系,不会掉线。所以可以用长度为10的队列,或尽量小的。太多种组合我也没有一一去试,我现在用的就是长度为10的队列. 你可以单独设置小包为 小队列环境= default-small类
pfifo 按包个数控制 先进先出
bfifo 按字节数控制 先进先出
sfq 随机公平队列
SFQ(Stochastic Fairness Queueing,随机公平队列)是公平队列算法家族中的一个简单实现.它的精确性不如其它的方法,但是它在实现高度公平的同时,需要的计算量却很少.SFQ的关键词是"会话"(或称作
"流") ,主要针对一个TCP会话或者UDP流.流量被分成相当多数量的FIFO队列中,每个队列对应一个会话.数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会.这种方式非常公平,保证了每一个会话都不会没其它会话所淹没.SFQ之所以被称为"随机",是因为它并不是真的为每一个会话创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去.因为使用了散列,所以可能多个会话分配在同一个队列里,从而需要共享发包的机会,也就是共享带宽.为了不让这种效应太明显,SFQ会频繁地改变散列算法,以便把这种效应控制在几秒钟之内.有很重要的一点需要声明:只有当你的出口网卡确实已经挤满了的时候,SFQ才会起作用!否则在你的Linux机器中根本就不会有队列,SFQ也就不会起作用.稍后我们会描述如何把SFQ与其它的队列规定结合在一起,以保证两种情况下都比较好的结果.特别地,在你使用DSL modem或者cable modem的以太网卡上设置SFQ而不进行任何进一步地流量整形是无谋的!
[ 本帖最后由 sak2000 于 2006-8-22 22:37 编辑 ] 15.2. 防护SYN洪水攻击
根据Alexey的iproute文档和许多非正式的netfilter方法而设计。如果你使用这个脚本,请认真调整其中的数值以适应你的网络。 如果你需要保护整个网络,就不要考虑这个脚本了,它最适合于单机使用。 乎你需要很新版本的iproute2工具才能利用2.4.0的内核工作。
#! /bin/sh -x
# sample script on using the ingress capabilities
# this script shows how one can rate limit incoming SYNs
# Useful for TCP-SYN attack protection. You can use
# IPchains to have more powerful additions to the SYN (eg
# in addition the subnet)
#path to various utilities;
#change to reflect yours.
TC=/sbin/tc
IP=/sbin/ip
IPTABLES=/sbin/iptables
INDEV=eth2
# tag all incoming SYN packets through $INDEV as mark value 1
############################################################
$iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
-j MARK --set-mark 1
########################################################
# install the ingress qdisc on the ingress interface
########################################################
$TC qdisc add dev $INDEV handle ffff: ingress
######################################################### SYN packets are 40 bytes (320 bits) so three SYNs equals
# 960 bits (approximately 1kbit); so we rate limit below
# the incoming SYNs to 3/sec (not very useful really; but
#serves to show the point - JHS
########################################################
$TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \
police rate 1kbit burst 40 mtu 9k drop flowid :1
########################################################
echo "---- qdisc parameters Ingress----------"
$TC qdisc ls dev $INDEV
echo "---- Class parameters Ingress----------"
$TC class ls dev $INDEV
echo "---- filter parameters Ingress ----------"
$TC filter ls dev $INDEV parent ffff:
#deleting the ingress qdisc
#$TC qdisc del $INDEV ingress
15.3. 为防止DDoS而对ICMP限速
最近一段,分布式拒绝服务攻击成了Internet上最让人讨厌的东西。通过对你的网络正确地设置过滤和限速可以避免成为攻击的目标和跳板。 你应该过滤你的网络,禁止非本地IP源地址的数据包离开网络,这可以阻止其它人向Internet上发送垃圾包。 限速就象以前所展示的那样。如果忘了,就是这张图:
---<E3、T3之类>--- --- [办公室+ISP]
eth1 eth0
我们先进行预备设置:
# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
# tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
10Mbit allot 1514 prio 5 maxburst 20 avpkt 1000
如果你有一个100Mbps的网卡,调整这些数据。现在你需要决定允许多大的ICMP流量。你可以用tcpdump测量段时间,把结果写入一个文件,看一看有多少ICMP数据包流经网络。别忘了适当延长监测时间! 如果没有条件进行测量,不妨就选择带宽的5%。设置我们的类:
# tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \
100Kbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 250 \
bounded
限速为100Kbps。然后我们设置过滤器把ICMP数据包送给这个类:
# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip
protocol 1 0xFF flowid 10:100 原帖由 sak2000 于 2006-8-22 22:36 发表
你可以单独设置小包为 小队列环境= default-small类
pfifo 按包个数控制 先进先出
bfifo 按字节数控制 先进先出
sfq 随机公平队列
SFQ(Stochastic Fairness Queueing,随机公平队列)是公平队列算法家?...
实际上我正是用的default-small类型,我这里是双光纤环境,所以适合测试这些队列,现在我就是混用PCQ,default和defaultsmall队列,分别用于总体限速,大中型包,小包 看来想更深入ROS,最好要通透IPTABLE和IPROUTER的原理,上次看了IPTABLE的文档还是有些益处的 我在搞防范SYN攻击的脚本
TC命令相当于ROS的哪个功能?流量控制那没有DROP的类似选项
不晓得以下命令转换为ROS的脚本改如何写
$TC qdisc add dev $INDEV handle ffff: ingress
########################################################
$TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \
police rate 1kbit burst 40 mtu 9k drop flowid :1 (这一条应该是防火墙的)
########################################################
echo "---- qdisc parameters Ingress----------"
$TC qdisc ls dev $INDEV
echo "---- Class parameters Ingress----------"
$TC class ls dev $INDEV
echo "---- filter parameters Ingress ----------"
$TC filter ls dev $INDEV parent ffff:
#deleting the ingress qdisc
#$TC qdisc del $INDEV ingress
[ 本帖最后由 sak2000 于 2006-8-22 23:09 编辑 ] TC我不懂,我用的是
6 ;;; detect and drop port scan connections
chain=input protocol=tcp psd=21,3s,3,1 action=drop
7 ;;; suppress DoS attack
chain=input protocol=tcp connection-limit=3,32
src-address-list=black_list action=tarpit
8 ;;; detect DoS attack
chain=input in-interface=!LAN protocol=tcp connection-limit=10,32
action=add-src-to-address-list address-list=black_list
address-list-timeout=1d
建立一个黑名单地址表,若从外网短时间内有大量连接进来就会记录到黑名单,并屏蔽一天,我上次用SUPERSCAN测试了一下,起了作用,不过高强度的攻击我没有测试 原帖由 混乱系 于 2006-8-22 23:23 发表
TC我不懂,我用的是
6 ;;; detect and drop port scan connections
chain=input protocol=tcp psd=21,3s,3,1 action=drop
7 ;;; suppress DoS attack
chain=input protocol=tcp connection ...
你那是DDOS,我用的是SYN,你那DDOS的规则我有了 不知道你有没有注意到ROS的connection tracking对话框最下面的TCP SYNCOOKIE,勾上不知道效果怎样,不要抱太大希望哦,嘿嘿 原帖由 混乱系 于 2006-8-23 22:49 发表
不知道你有没有注意到ROS的connection tracking对话框最下面的TCP SYNCOOKIE,勾上不知道效果怎样,不要抱太大希望哦,嘿嘿
那个确实没什么用,我看的是关于通用LINUX的防火墙SYN设置 高手们谈的对我这个非专业人士来说有点深了,说的都没接触过
[ 本帖最后由 mingdian100 于 2006-8-24 15:24 编辑 ]
小包转发--LINUX的弱项
小包转发效率低下,这既不是SYN问题,也与QUEUE无关,根源在于:1、 操作系统对大量随机中断(interrpt)的性能低下:PC体系架构的系统中,网卡接收数据(RECV)基于中断机制(IRQ)。以前窄带时代带宽小,每秒产生IRQ次数少,占用CPU处理资源也就少。在宽带环境下,当每秒IRQ数量达到10K以上时,CPU就忙不赢了。
2、操作系统从kernel到user-space的内存复制(copy)效率低下。
为解决IRQ处理瓶颈,现代操作系统改变了网卡的IRQ处理机制,提高了网络处理效率:
提高网络性能的几种技术
1、FreeBSD下的device polling
关闭网卡的中断方式,使用轮循方式收发报文,可以大大提高小包(如syn flood,udp flood)下的路由性能和路由器的稳定性,提升率可以超过100M线速。
2、Linux2.6下的NAPI(New API)
关闭网卡的中断方式,使用轮循方式收发报文,可以大大提高小包(如syn flood,udp flood)下的路由性能和路由器的稳定性,提升率可以超过100M线速,但远低于FreeBSD下的decice_polling。
3、Linux下的Timer_based网卡驱动程序(Tuplit网卡)
关闭网卡的中断方式,使用基于网卡上定时器进行定时查询方式收发报文,可以大大提高小包(如syn flood,udp flood)下的路由性能和路由器的稳定性,提升率可以超过100M线速,但远低于FreeBSD下的decice_polling。
4、Linux下的NAPI和Circular Buffer技术(DMA—user_space技术)
关闭网卡的中断方式,使用轮循方式收发报文,可以大大提高小包(如syn flood,udp flood)下的路由性能和路由器的稳定性,提升率可以超过1000M线速,略高于FreeBSD下的decice_polling。
使用Circular Buffer技术的NAPI由libpcap_MMAP网络库文件包实现,它将网卡上的数据包通过DMA方式直接copy到user-space而无须绕道kernel,大大提高效率。可惜的是,目前linux还未正式采用此技术,也未得到完备测试。
目前做得最好的、最稳定成熟的应该算FreeBSD4.10以后的版本。据测试,未启用device polling前64byte小包的转发速率只能达到20Mbps带宽(CPU100%),启用后则可达到600Mbps(cpu5%);对于大包则可达990Mbps(cpu5%)。
本人经长期测试、使用,证明使用FreeBSD device polling+OpenBSD的IPF的SYN保护,可保证在大量SYN攻击(400K包/秒)下CPU只2%,且系统正常工作。
以下为参考资料:
1、Circular Buffer
http://www.ntop.org/
2、使用Circular Buffer和NAPI的网卡驱动(e1000):
http://sourceforge.net/projects/e1000/
3、DAG
http://dag.cs.waikato.ac.nz/
4、Device Polling Support for FreeBSD
http://info.iet.unipi.it/~luigi/polling/ 设计操作系统时把IRQ说成比POLLING更好的方法,现在设计路由器POLLING却比IRQ好了?不过若是DMA方式还是可行的.
[ 本帖最后由 混乱系 于 2006-8-25 00:36 编辑 ] jihao
页:
[1]