Chinaunix首页 | 论坛 | 博客
  • 博客访问: 752031
  • 博文数量: 119
  • 博客积分: 137
  • 博客等级: 少校
  • 技术积分: 1582
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-28 16:39
文章分类

全部博文(119)

文章存档

2017年(3)

2016年(7)

2014年(1)

2013年(8)

2012年(20)

2011年(27)

2010年(53)

分类: LINUX

2012-11-12 15:31:46

    下面代码仅用于双网卡PC做Server时(类似于路由器),做上传下载限制,只用于单独限制流量,暂时未对数据流量类型进行分别限制。


点击(此处)折叠或打开

  1. 100:0 -- 100:1 -- 100:10 (作为默认队列)
  2.                -- 100:20 (作为指定的队列) -- MARK 106

  3. 扩展
  4. 100:0 -- 100:1 -- 100:10 (作为默认队列)
  5.                -- 100:20 (针对SKYPY的队列) -- MARK 102
  6.                -- 100:30 (针对FTP的队列)   -- MARK 103
  7.                -- 100:40 (针对HTTP的队列)  -- MARK 104

     流量控制规则说明:
     TC qdisc add dev eth1 root handle 100: htb default 10
     TC class add dev eth1 parent 100: classid 100:1 htb rate 2Mbit burst 15k
     TC class add dev eth1 parent 100:1 classid 100:10 htb rate 512kbit burst 15k
     TC class add dev eth1 parent 100:1 classid 100:20 htb rate 1mbit ceil 1mbit burst 15k
     TC qdisc add dev eth1 parent 100:10 sfq quantum 1514b perturb 15
     TC qdisc add dev eth1 parent 100:20 sfq quantum 1514b perturb 15
     TC filter add dev eth1 protocol ip parent 100:0 prio 1 u32 match ip dst 192.168.1.0/24 flowid 100:20
    
     这里对eth1进行设定, 即限制流向eth1的流量的速度。
     第一句添加句柄为100:0 的QDISC ,限速算法为HTB,并设置未指定数据流的QDISC为100:10(default 10)
     第二句基于100:0添加class,ID为100:1 的总速度为2Mbps
     三四两句是基于100:1添加子类并设置速度
     五六两句是分别给100:10 和100:20设定队列算法为SFQ。

     第七句添加对目的IP地址为192.168.1.0/24范围的封包的过滤器,并使其走100:20这个流队列。即流向eth1且目的IP地址在192.168.1.0/24的范围内的流量的速度为1mbps.若第七句为
TC filter add dev eth1 protocol ip parent 100:0 prio 1 handle 106 fw flowid 100:20
     则是添加流向eth1并被mark上206的数据包走100:20这个队列。
     使用iptables指定要打上206标识的数据。
     iptables -t mangle -I POSTROUTING -o eth1 -d 192.168.1.0/24 -j MARK --set-mark 106
     iptables -t mangle -A POSTROUTING -o eth1 -d 192.168.1.0/24 -j RETURN

说明iptables三个主要table
     1. filter  是过滤的table,允许或禁止符合某些条件的封包
     2. nat 是进行NAT功能试着的table, 如SNAT,DNAT等等
     3. mangle 是给特定的服务打上标记,主要用于QOS.

三个表的查看可以使用命令: iptables -t table_name -L -v. 
============================================================================
扩展:
如果需要对不同类型的数据进行分流并限速,我们可以在100:1下面建立更多的子类(class),类似于100:10, 100:20,分别指定速度。
然后为每一个子类建立一个QDISC.并使用filter对MARK指定的数据进行分流
再由iptables -t mangle来设定对应的MARK流
实例见 http://blog.chinaunix.net/uid-22490342-id-2125670.html
============================================================================

将下列内容保存为文件 do_limit
执行的时候使用命令
"./do_limit LAN_INTERFACE WAN_INTERFACE LAN_NETWORK"
eg: ./do_limit eth1 eth3 192.168.1.0/24

点击(此处)折叠或打开

#!/bin/sh

TC="/bin/tc"
LAN_IFACE=$1
INET_IFACE=$2
INTERNAL_LAN=$3



start(){
  #################### Qos rule on LAN_IFACE for download ########################
  $TC qdisc add dev $LAN_IFACE root handle 100: htb default 10
  $TC class add dev $LAN_IFACE parent 100: classid 100:1 htb rate 2Mbit burst 15k
  $TC class add dev $LAN_IFACE parent 100:1 classid 100:10 htb rate 1mbit burst 15k
  $TC class add dev $LAN_IFACE parent 100:1 classid 100:20 htb rate 1mbit ceil 1mbit burst 15k
  $TC qdisc add dev $LAN_IFACE parent 100:10 sfq quantum 1514b perturb 15
  $TC qdisc add dev $LAN_IFACE parent 100:20 sfq quantum 1514b perturb 15
  $TC filter add dev $LAN_IFACE protocol ip parent 100:0 prio 1 u32 match ip dst $INTERNAL_LAN flowid 100:20
  echo "qos rule on $LAN_IFACE start ...........ok!"

  #################### Qos rule on INET_IFACE for upload ########################
  $TC qdisc add dev $INET_IFACE root handle 200: htb default 10
  $TC class add dev $INET_IFACE parent 200: classid 200:1 htb rate 1mbit burst 15k
  $TC class add dev $INET_IFACE parent 200:1 classid 200:10 htb rate 512kbit burst 15k
  $TC class add dev $INET_IFACE parent 200:1 classid 200:20 htb rate 256kbit ceil 256kbit burst 15k
  $TC qdisc add dev $INET_IFACE parent 200:10  sfq quantum 1514b perturb 15
  $TC qdisc add dev $INET_IFACE parent 200:20  sfq quantum 1514b perturb 15
  $TC filter add dev $INET_IFACE protocol ip parent 200:0 prio 1 handle 206 fw flowid 200:20
  iptables -t mangle -I POSTROUTING -o $INET_IFACE -s $INTERNAL_LAN -j MARK --set-mark 206
  iptables -t mangle -A POSTROUTING -o $INET_IFACE -s $INTERNAL_LAN -j RETURN
  echo "qos rule on atm1 start ...........ok!"
}


stop(){
  $TC qdisc del dev $LAN_IFACE root 2>/dev/null
  $TC qdisc del dev $INET_IFACE root 2>/dev/null
  iptables -t mangle -D POSTROUTING -o ppp1 -s 192.168.182.0/24 -j MARK --set-mark 206  2>/dev/null
  iptables -t mangle -D POSTROUTING -o ppp1 -s 192.168.182.0/24 -j RETURN  2>/dev/null
}


status(){
  echo "show qdisc ............ "
  echo ""
  echo "cmd: tc -d -s qdisc "
  echo ""
  $TC -d -s qdisc
  echo "========================================="
  echo ""
  echo ""   echo "show filter ............ "
  echo ""
  echo "cmd: tc -d -s filter ls dev $LAN_IFACE"
  echo ""
  $TC -d -s filter ls dev $LAN_IFACE
  echo "----------------------------------------"
  echo "cmd: tc -d -s filter ls dev $INET_IFACE"
  echo ""
  $TC -d -s filter ls dev $INET_IFACE
  echo "========================================="
  echo ""
  echo ""   echo "show class ............ "
  echo ""
  echo "cmd: tc -d -s class ls dev $LAN_IFACE"
  echo ""
  $TC -d -s class ls dev $LAN_IFACE
  echo "----------------------------------------"
  echo "cmd: tc -d -s class ls dev $INET_IFACE"
  echo ""
  $TC -d -s class ls dev $INET_IFACE
  echo "========================================="
}


case "$1" in
  start)
    start
  ;;
  stop)
    stop
  ;;
  restart)
    stop
    start
  ;;
  show)
    status
  ;;
*)


echo $"Usage:$0 {start|stop|restart|show}"
exit 1
esac

阅读(2077) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~