tc:Linux HTTP传出流量整形(端口80流量整形)

时间:2020-01-09 10:42:01  来源:igfitidea点击:

我有 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命令行工具。