tc:Linux HTTP 传出流量整形(端口 80 流量整形)
[不要打印]
教程详细信息 | |
---|---|
难度等级 | 先进的 |
Root 权限 | 是的 |
要求 | tc+iptables |
预计阅读时间 | 6 分钟 |
- 当流量被整形时,其传输速率就会受到控制,换句话说,您会为每个端口或所谓的 Linux 服务应用某种带宽分配。整形发生在出口处。
- 您只能将流量整形应用于传出或转发流量,即您无法控制进入服务器的流量。但是,tc 可以对到达的流量进行监管控制。因此,监管发生在入口处。本常见问题解答仅涉及流量整形。
令牌桶(TB)
令牌桶只不过是一种常用算法,用于控制注入网络的数据量,允许发送大量数据。它用于网络流量整形或速率限制。使用令牌桶,您可以定义给定时刻接口上允许的最大流量速率。
tokens/sec | | | | Bucket to | | to hold b tokens +======+=====+ | | | \|/ Packets | +============+ stream | ---> | token wait | ---> Remove token ---> eth0 | +============+
- TB过滤器按照一定的速率将令牌放入桶中。
- 每个令牌都允许源向网络发送特定数量的位。
- 根据整形规则,桶可以容纳b个令牌。
- 如果有令牌,内核就可以发送数据包,否则流量需要等待。
如何使用 tc 命令?
tc 命令默认安装在我的 Linux 发行版上。要列出现有规则,请输入:
# 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 工作站向 example.com 发送 ping 请求并记下 ping 时间,输入:
# ping example.com
示例输出:
PING example.com (74.86.48.99) 56(84) bytes of data. 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=1 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=2 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=3 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=4 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=5 ttl=47 time=304 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=6 ttl=47 time=304 ms
键入以下 tc 命令以将流量减慢 200 毫秒:
# tc qdisc add dev eth0 root netem delay 200ms
现在,再次发送 ping 请求:
# ping example.com
示例输出:
PING example.com (74.86.48.99) 56(84) bytes of data. 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=1 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=2 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=3 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=4 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=5 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=6 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=7 ttl=47 time=505 ms 64 bytes from txvip1.simplyguide.org (74.86.48.99): icmp_seq=8 ttl=47 time=505 ms ^C --- example.com 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、缓冲区为 10kilobyte 的 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 千字节,突发带宽为 640 千字节:
# /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
如何监控和测试服务器速度?
使用以下工具
来测试下载速度,使用 lftp 或 wget 命令行工具。
# /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
参考:
- 阅读手册页 –
- Linux 高级路由和流量控制