tc:Linux HTTP传出流量整形(端口80流量整形)
我有 10Mbps服务器端口专用于我们的小型企业服务器。该服务器还充当备用DNS服务器,并且Id希望减慢端口80上的出站流量。如何在高峰时段将带宽分配限制为http服务5Mbps(突发至8Mbps),以免DNS和其他服务停止在Linux操作系统下进行大量活动? 您需要使用tc命令,该命令可以降低服务器上给定端口和服务的流量,这称为流量调整:
- 流量经过整形后,其传输速率受到控制,换句话说,您为每个端口或者所谓的Linux服务应用了某种带宽分配。在出口发生整形。
- 您只能将流量整形应用于"传出或者转发"流量,即您无法控制到服务器的传入流量。但是,tc可以对到达的流量进行策略控制。因此,在入口发生警务。此常见问题仅涉及流量调整。
令牌桶(TB)
令牌桶不过是一种常用算法,用于控制注入到网络中的数据量,从而允许突发数据。
它用于网络流量整形或者速率限制。
使用令牌桶,您可以定义给定时间在接口上允许的最大流量。
tokens/sec | | | | Bucket to | | to hold b tokens +======+=====+ | | | \|/ Packets | +============+ stream | ---> | token wait | ---> Remove token ---> eth0 | +============+
- TB过滤器以一定速率将令牌放入存储桶。
- 每个令牌都允许源将特定数量的位发送到网络。
- 根据整形规则,存储桶可以容纳b个令牌。
- 如果您有令牌,内核可以发送数据包,否则流量需要等待。
如何使用tc命令?
警告!这些示例需要对TCP/IP和其他网络概念有很好的理解。
所有新用户都应在测试环境中试用示例。
我的Linux发行版默认安装了tc命令。
要列出现有规则,请执行:
# tc -s qdisc ls dev eth0
输出示例:
qdisc pfifo_fast 0: root bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 2732108 bytes 10732 pkt (dropped 0, overlimits 0 requeues 0) rate 0bit 0pps backlog 0b 0p requeues 0
您的第一个流量调整规则
首先,从您的本地Linux工作站将ping请求发送到theitroad.local并记下ping时间,执行:
# ping theitroad.local
输出示例:
PING theitroad.local (10.16.48.99) 56(84) bytes of data. 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=1 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=2 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=3 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=4 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=5 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=6 ttl=47 time=304 ms
执行以下tc命令以将流量减慢200毫秒:
# tc qdisc add dev eth0 root netem delay 200ms
现在,再次发送ping请求:
# ping theitroad.local
输出示例:
PING theitroad.local (10.16.48.99) 56(84) bytes of data. 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=1 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=2 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=3 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=4 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=5 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=6 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=7 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (10.16.48.99): icmp_seq=8 ttl=47 time=505 ms ^C --- theitroad.local ping statistics -- 8 packets transmitted, 8 received, 0% packet loss, time 7006ms rtt min/avg/max/mdev = 504.464/505.303/506.308/0.949 ms
要列出当前规则,请执行:
# tc -s qdisc ls dev eth0
输出示例:
qdisc netem 8001: root limit 1000 delay 200.0ms Sent 175545 bytes 540 pkt (dropped 0, overlimits 0 requeues 0) rate 0bit 0pps backlog 0b 0p requeues 0
要删除所有规则,请执行:
# tc qdisc del dev eth0 root # tc -s qdisc ls dev eth0
TBF示例
要连接最大持续速率为1mbit/s,峰值速率为2.0mbit/s,10kb缓冲区并计算出预桶队列大小限制的TBF,以便TBF导致最多70ms的延迟,并具有完美的峰值速率行为,执行:
# tc qdisc add dev eth0 root tbf rate 1mbit burst 10kb latency 70ms peakrate 2mbit minburst 1540
HTB层次令牌桶
要控制给定链路上出站带宽的使用,请使用HTB:
- 您可以设置允许的带宽。
ceil
您可以设置存在桶时允许的突发带宽。prio
您可以设置其他带宽的优先级。因此,优先级较低的类将首先获得带宽。例如,您可以为DNS流量提供较低的优先级,为HTTP下载提供较高的优先级。- iptables和tc:您需要按以下方式使用iptables和tc来控制出站HTTP通信。
示例:HTTP出站流量整形
首先,删除eth1的现有规则:
# /sbin/tc qdisc del dev eth1 root
打开排队规则,执行:
# /sbin/tc qdisc add dev eth1 root handle 1:0 htb default 10
定义一个有限制的类,即将端口80的允许带宽设置为512 KB,将突发带宽设置为640 KB:
# /sbin/tc class add dev eth1 parent 1:0 classid 1:10 htb rate 512kbps ceil 640kbps prio 0
请注意,以上类中的任何地方都未定义端口80。
您将使用iptables mangle规则,如下所示:
# /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 10
要保存iptables规则,请输入(RHEL特定命令):
# /sbin/service iptables save
最后,将其分配给适当的qdisc:
# tc filter add dev eth1 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
这是端口80和22的另一个示例:
/sbin/tc qdisc add dev eth0 root handle 1: htb /sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps /sbin/tc class add dev eth0 parent 1:1 classid 1:5 htb rate 512kbps ceil 640kbps prio 1 /sbin/tc class add dev eth0 parent 1:1 classid 1:6 htb rate 100kbps ceil 160kbps prio 0 /sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 5 fw flowid 1:5 /sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 6 fw flowid 1:6 /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 5 /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 22 -j MARK --set-mark 6
如何在服务器上监视和测试速度?
使用以下工具
# /sbin/tc -s -d class show dev eth0 # /sbin/iptables -t mangle -n -v -L # iptraf # watch /sbin/tc -s -d class show dev eth0
要测试下载速度,请使用lftp或者wget命令行工具。