TC流量控制

线路:ADSL:2M/512K
  ppp0:外网口
  eth0:192.168.1.254,内网口

  业务需求:保证正常的网页浏览,FTP,SMTP,POP3,对其它的所有应用加以限制,以免影响正常业务的使用。
  1、让交互数据包保持较低的延迟时间,也就是说上载或下载文件不会打扰SSH/telnet等。
  2、上载或下载期间有合理的速率用于网页浏览,即使http属于一种大量数据传输,也不应受其它传输影响太大
  3、对FTP-data限速,不会占用所有带宽
  4、对SMTP,pop3限速
  5、对未分类的进行限制,以免影响
  6、保证上载不会影响下载,上载数据流会影响下载的速率,这是相当普遍的现象。
  7、对每个IP的下载速率进行限制
  8、取得空闲带宽的优先级别如:交互数据,FTP-data,smtp,pop3;网页浏览,其它业务优先级别最低
    9、从内网服务器(192.168.1.254)到局域网不受限制。

#!/bin/bash

/sbin/iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN

/sbin/iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN 

/sbin/iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x5
/sbin/iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN


# tag all incoming SYN packets through ppp0 as mark value
/sbin/iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
/sbin/iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j RETURN
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN

/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN

/sbin/iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN

/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN

/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j MARK --set-mark 0x3
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j RETURN
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 0x3
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN

/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN

/sbin/iptables -t mangle -A PREROUTING -j MARK --set-mark 0x5

/sbin/iptables -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j RETURN

/sbin/iptables -t mangle -A OUTPUT -m tos --tos Minimize-Cost -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A OUTPUT -m tos --tos Minimize-Cost -j RETURN 

/sbin/iptables -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j MARK --set-mark 0x5
/sbin/iptables -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j RETURN

/sbin/iptables -t mangle -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
/sbin/iptables -t mangle -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp -j RETURN
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp -j RETURN

/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 22 -j RETURN

/sbin/iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j MARK --set-mark 0x1
/sbin/iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j RETURN

/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j RETURN
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 80 -j RETURN

/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp-data -j MARK --set-mark 0x3
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp-data -j RETURN
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp-data -j MARK --set-mark 0x3
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp-data -j RETURN

/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j RETURN
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 25 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 25 -j RETURN
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 110 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 110 -j RETURN
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 110 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 110 -j RETURN

/sbin/iptables -t mangle -A OUTPUT -j MARK --set-mark 0x5


DOWNLINK=2000
UPLINK=512

#clean existing down and uplink qdiscs,put the errors to /dev/null

tc qdisc del dev ppp0 root    2> /dev/null > /dev/null
tc qdisc del dev ppp0 ingress 2> /dev/null > /dev/null
tc qdisc del dev eth0 root    2> /dev/null > /dev/null

########################################uplink###########################################
#install root HTB,point default traffic to 1:15:
tc qdisc add dev ppp0 root handle 1: htb default 15

#shape everything at $UPLINK speed -this prevents huge queues in your DSL modem which destroy latency
tc class add dev ppp0 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit

#high prio class 1:11:
tc class add dev ppp0 parent 1:1 classid 1:11 htb rate 256kbit  ceil ${UPLINK}kbit prio 0
tc class add dev ppp0 parent 1:1 classid 1:12 htb rate 256kbit  ceil ${UPLINK}kbit prio 2
tc class add dev ppp0 parent 1:1 classid 1:13 htb rate 128kbit  ceil ${UPLINK}kbit prio 1
tc class add dev ppp0 parent 1:1 classid 1:14 htb rate 128kbit  ceil ${UPLINK}kbit prio 1
tc class add dev ppp0 parent 1:1 classid 1:15 htb rate 128kbit  ceil ${UPLINK}kbit prio 3

#bost get Stochastic Fairness:
tc qdisc add dev ppp0 parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev ppp0 parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev ppp0 parent 1:13 handle 13: sfq perturb 10
tc qdisc add dev ppp0 parent 1:14 handle 14: sfq perturb 10
tc qdisc add dev ppp0 parent 1:15 handle 15: sfq perturb 10


#TOS Mininum Delay (ssh,telnet) in 1:11:
tc filter add dev ppp0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
#80,8080,443 in 1:12
tc filter add dev ppp0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
#ftp-data in 1:13
tc filter add dev ppp0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
#smtp,pop3 in 1:14
tc filter add dev ppp0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:14
tc filter add dev ppp0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:15

########################################DOWNLINK###########################################
# install the ingress qdisc on the ingress
tc qdisc add dev ppp0 handle ffff: ingress

# DROP everything thats coming in too fast:
tc filter add dev ppp0 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

tc qdisc add dev eth0 root handle 2:0 htb default 30
tc class add dev eth0 parent 2:0 classid 2:1 htb rate 2Mbit burst 15k
tc class add dev eth0 parent 2:1 classid 2:10 htb rate 2Mbit burst 15k
tc class add dev eth0 parent 2:1 classid 2:20 htb rate 72000kbit ceil 72000kbit burst 15k
tc class add dev eth0 parent 2:1 classid 2:30 htb rate 500kbit ceil 500kbit burst 15k


tc qdisc add dev eth0 parent 2:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 2:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 2:30 handle 30: sfq perturb 10


U32_1="tc filter add dev eth0 protocol ip parent 2:0 prio 1 u32"
$U32_1 match ip dst 192.168.1.99/32 flowid 2:10

U32_2="tc filter add dev eth0 protocol ip parent 2:0 prio 2 u32"
$U32_2 match ip src 192.168.1.254/32 flowid 2:20

tc filter add dev eth0 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TC(Traffic Control,流量控制)是Linux内核中的一个强大的网络流量管理系统,它的底层实现基于QoS(Quality of Service,服务质量)调度算法。TC利用了内核中的几个关键组件: 1. **netfilter**:作为第一层,TC利用了Netfilter框架来捕获、分类和标记网络流量。它可以设置规则来改变流量的行为,比如限速、优先级标记等。 2. **iptables/iptable-mangle**:iptables是一个命令行界面,通过mangle表来应用流量控制操作,比如丢弃、修改IP头信息等。 3. **Traffic Classifiers**:这些是TC的核心组件,它们定义了流量的不同类别,并可以依据这些类别设置不同的策略。例如,TCP_WRED(Weighted Random Early Detection)算法用于丢弃高优先级流量以避免拥塞。 4. **Queues and Scheduler**:流量进入内核后会被分配到不同的队列,然后由QoS调度器根据预先设定的策略(如权重轮询、令牌桶等)决定每个队列的发送速率。 5. **Kernel Queuing Discipline(KQD)**:这是一种内核层面的机制,可以根据需求选择不同的队列管理算法,如FIFO、CBQ(Completely Fair Queuing)、PQ(Priority Queuing)等。 6. **Shaper(整形器)和Classifier(分类器)**: 深入到内核网络栈,shaper会限制流量发送的速率,而classifier则负责识别出流量应该进入哪条队列。 总之,TC通过对流量进行分类、标记和调度,实现了在网络环境中精细控制流量的目的。其底层原理涉及到了网络分片、优先级管理、流量监管等多个关键技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老帽爬新坡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值