ROS软路由论坛 ROSABC.com 网络方案网络工程交流

 找回密码
 会员注册

QQ登录

只需一步,快速开始

查看: 32253|回复: 49

[Queue流量控制] [Connection Rate 流量控制] Connection Rate 是一个防火墙标记器,

[复制链接]
 楼主| 发表于 2013-4-21 03:09:31 | 显示全部楼层 |阅读模式

马上注册成为ROSABC会员,随时发帖回复。

您需要 登录 才可以下载或查看,没有账号?会员注册

x
Connection Rate 流量控制

Connection Rate 是一个防火墙标记器,允许捕获在当前传输的连接速度

Connection Rate 原理

每个连接项目在 connection tracking 表中是双向通讯。每次得到相关的数据包到特定的项目,数据包的长度值(包括 IP数据包头)被添加到“Connection-bytes”值,换句话说,Connection-bytes 包括两部分上行和下行。

Connection Rate 计算连接的速度基于"connection-bytes"的变化。Connection Rate 每秒会被重新计算,且没有任何平 均值。

两个选项 "connection-bytes" 和"connection-rate" 工作只能在 TCP 和 UDP 传输。(你需要指定协议激活这些选项) 在"connection-rate"您可以指定速度,和你想捕获范围。

例如:这个规则是捕获当连接速度低于 100kbps 通过路由器的 TCP/UDP 传输

/ip firewall filter
add action=accept chain=forward connection-rate=0-100k protocol=tcp add action=accept chain=forward connection-rate=0-100k protocol=udp

注意:Connection Rate 从 3.30 才能获得,这个选项是用于捕获传输密集的连接

传输优先级

Connection-rate 能被使用在各种方式,通常的方式是使用队列树进行 HTB 的优先级控制,检测并设置低优先级给“heavy connections”(连接在一段时间内保持较快速率,例如:P2P、HTTP、FTP 下载)通过这样做,你可以区分所有其它传输 的优先次序,通常包括 VOIP、HTTP 浏览和在线游戏

connection-rate 选项没有任何平均值,我们需要确定识别"heavy connections"的差额。如果我们假设正常的 HTTP 浏 览连接小于 500kB(4Mb,即 connection-bytes 值)长度,VOIP 需要不超过 200kbps 的流量,那么每次连接当超过 500kB 后,仍然有 200kbps 的流量将被认为是"heavy connections"

(对于 HTTP 浏览和 VOIP 可能有不同的"connection-bytes"在你的网络环境中,所以请你在实际操作时,这个实例仅做参 考。)

下面实例让我们假设,我们有 6Mbps 上传和下载

per-connection-classifier=

PerConnectionClassifier ::= [!]ValuesToHashenominator/Remainder

Remainder ::= 0..4294967295 (integer number) Denominator ::= 1..4294967295 (integer number)

ValuesToHash ::= src-address|dst-address|src-port|dst-port[,ValuesToHash*]

实例脚本

/ip firewall mangle

add chain=forward action=mark-connection connection-mark=!heavy_traffic_conn new-connection-mark=all_conn

add chain=forward action=mark-connection connection-bytes=500000-0 \

connection-mark=all_conn connection-rate=200k-100M \

new-connection-mark=heavy_traffic_conn protocol=tcp

add chain=forward action=mark-connection connection-bytes=500000-0 \

connection-mark=all_conn connection-rate=200k-100M \

new-connection-mark=heavy_traffic_conn protocol=udp

add chain=forward action=mark-packet connection-mark=heavy_traffic_conn \

new-packet-mark=heavy_traffic passthrough=no

add chain=forward action=mark-packet connection-mark=all_conn \

new-packet-mark=other_traffic passthrough=no

/queue tree

add name=upload parent=public max-limit=6M

add name=other_upload parent=upload limit-at=4M max-limit=6M \

packet-mark=other_traffic priority=1

add name=heavy_upload parent=upload limit-at=2M max-limit=6M \

packet-mark=heavy_traffic priority=8

add name=download parent=local max-limit=6M

add name=other_download parent=download limit-at=4M max-limit=6M \

packet-mark=other_traffic priority=1

add name=heavy_download parent=download limit-at=2M max-limit=6M \

packet-mark=heavy_traffic priority=8

脚本说明

在 mangle 中,我们需要分离所有连接到 2 个组中,这样数据包标记从 2 个组取得。我们讨论的客户的传输理论上大多标记 在 forward 链表中。

请记住,“heavy”连接将有低的优先级,队列将打压 max-limit—heavy 连接将被限制速度。这样引起改变高优先级连接 获取更多的带宽,当在一次产生 connection-rate 将上升,并导致其改变为较低优先级。为了避免这一点,我们必须确保, 一旦发现“heavy”连接,剩下的标记在所有时间仍然是"heavy"连接

Mangel 规则配置

/ip firewall mangle

add chain=forward action=mark-connection connection-mark=!heavy_traffic_conn new-connection-mark=all_conn

这个规则将确定"heavy"连接,连接将只剩下“heavy”

add chain=forward action=mark-connection connection-bytes=500000-0 \

connection-mark=all_conn connection-rate=200k-100M \

new-connection-mark=heavy_traffic_conn protocol=tcp

add chain=forward action=mark-connection connection-bytes=500000-0 \

connection-mark=all_conn connection-rate=200k-100M \

new-connection-mark=heavy_traffic_conn protocol=udp

这两个规则将根据我们的标准标记所有 heavy 连接,每次连接在第一次超过 500KB 流量后,仍然保持 200kbps 以上速度 被认为“heavy”。

add chain=forward action=mark-packet connection-mark=heavy_traffic_conn \

new-packet-mark=heavy_traffic passthrough=no

add chain=forward action=mark-packet connection-mark=all_conn \

new-packet-mark=other_traffic passthrough=no

最后 2 条规则在 mangle 中将标记数据包传输从相应的连接中。

队列配置

这个是一个简单的队列树被放到接口的 HTBThis is a simple queue tree that is placed on the Interface HTB – 你的 ISP 连接的“wan”接口,“lan“连接你的内网客户。如果你有多个 wan 接口或者多个 lan,你将需要标记上行和下行分 离标记

/queue tree

add name=upload parent=public max-limit=6M

add name=other_upload parent=upload limit-at=4M max-limit=6M \

packet-mark=other_traffic priority=1

add name=heavy_upload parent=upload limit-at=2M max-limit=6M \

packet-mark=heavy_traffic priority=8

add name=download parent=local max-limit=6M

add name=other_download parent=download limit-at=4M max-limit=6M \

packet-mark=other_traffic priority=1

add name=heavy_download parent=download limit-at=2M max-limit=6M \

packet-mark=heavy_traffic priority=8

Connection-rate HTB 事例

通过 Connection-rate 配合 HTB 分离正常的网页浏览和网页视频,方法是标记网页的 tcp/80 端口,并区分他 们连接速率,将高速率的流量认为是网页视频、剩下的则是正常的网页浏览,通 HTB 将正常的网页浏览设置为 优先。

通过 Mangle 标记

我们需要考虑一个网络的优先处理结构,首先是游戏带宽最优先、其次是正常浏览网页带宽、然后是网页视频的 带宽,最后在才是其他的下载数据,根据这一的结构我们在 mangle 标记也是从游戏开始到最后的下载数据。

首先我们需要导入游戏优先的标记,将游戏优先文件 games_v2.rsc 放入 RouterOS 的 files 根目录下,然后 在命令行下使用 import 命令,导入脚本文件,如下图输入以下命令,并回车执行提示:脚本文件载入,并执行 成功:


[RouterOS@ROSABC] > import games_v2.rsc

Opening script file games_v2.rsc

Script file loaded and executed successfully


[RouterOS@ROSABC] >

我们进入 ip firewall mangle 中可以找到导入游戏标记规则,我们选择右上角 dstgames 的自定义链表,可以 看到各种游戏的标记,你也可以在此链表添加自己的游戏标记
游客,如果您要查看本帖隐藏内容请回复



每条规则都标记的是目标端口,因为这里我将使用 forward 链表跳转数据到这个游戏标记,如果使用 prerouting链表注意接口方向。

下面是魔兽世界的端口 tcp/3724,标记服务器的端口
11.9.2.jpg


在每个游戏标记规则里,都使用了 connection-rate 的参数,参数值为 1-59k,即带宽使用在 1-59kps 的数 据认为是该端口的游戏流量,否则认为是其他数据,这样的目的是避免该端口被下载所占用,导致游戏带宽控制 失效,当然这个值可以根据你自己的需要调整和修改
11.9.3.jpg


最后是在 action 里标记为 mark-connection,并填写标记名称 dstgames,passthrough=yes 要传递给后面的数据包标记规则
11.9.4.jpg


Forward 标记

我们进入 forward 链表,添加一条跳转的规则,将 forward 中所有数据首先进入 dstgames 的链表过滤一次, 将游戏分离出来

/ip firewall mangle add chain=forward action=jump jump-target=dstgames
11.9.5.jpg


这条规则在 forward 链表里排在最前面,因为是首先处理的数据。这里我们的内网地址段是 192.168.88.0/24, 我们需要通过地址来区分下载和上传,所以我们需要返回 dstgames 链表里,将数据包标记规则修改下
11.9.6.jpg


在 dstgames 里最后一条规则说 mark-packet,即汇总和标记之前所有游戏连接的数据,并生成可以被 queue流控规则使用的 packet,之前的游戏连接是没有区分上行和下行的,所以我们这里我们通过 dst-address 将到 内网(即下行)的数据标记出来,这样可以得到游戏的下行数据,该规则的 passthrough=no。注意:你的内网地址根据你的设置修改。

网页视频和浏览区分

网页视频和网页浏览的区分,仍然采用 connection-rate 参数,区分网页的规则一共 4 条,如下图:
11.9.7.jpg


4 条规则里关键是在第一条连接标记,用于区分网页视频的速率,

chain=forward action=mark-connection new-connection-mark=web_video passthrough=yes protocol=tcp dst-port=80 connection-bytes=700000-0 connection-rate=70k-10M
11.9.8.jpg
11.9.9.jpg
11.9.10.jpg


标记所有 tcp/80 端口,并设置 connection-bytes 为 700k 范围内,即初次使用了 700K 的字节,之后仍然保 持 70kbps~10Mbps 的速率,就认为是网页视频,并标记名称为 web_video接下来的一条规则就只需要从这个连接里提取数据包,并指明目标地址是 192.168.88.0/24 的下行数据, action=mark-packet,取名标记为 web_video,注意这个 web_video 和连接的 web_video 并不相同,一 个是连接一个是数据,这里的 passthrough=no,因为已经被数据标记处理,不需要交给后面的规则
11.9.11.jpg
11.9.12.jpg


接下来我们标记网络浏览连接,仍然是是 tcp/80,但这里的 connection-mark 设置为非 web_video 的连接

chain=forward action=mark-connection new-connection-mark=low_web passthrough=yes protocol=tcp dst-port=80 connection-mark=!webhighspeed
11.9.13.jpg
11.9.14.jpg


标记连接名称为 web_brows,并传递给后面的数据包标记规则。


同样的方式,提取 web_brows 的数据包标记,选择目标地址并同样取名为 web_brows,passthrough=no
11.9.15.jpg
11.9.16.jpg



其他下载数据标记

这样我们已经将部分游戏、网页视频和网页浏览区分出来,剩下的被认为是其他下载数据,直接做数据包标记

chain=forward action=mark-packet new-packet-mark=download passthrough=no dst-address=192.168.88.0/24
11.9.17.jpg
11.9.18.jpg

最后一个规则则是标记上行数据,我们主要处理数据优先是下行,上行需要的带宽相对较小,我们只需要做一次 性的标记,取名标记为 all_up,通过后面的 HTB 的 PCQ 给一个适合的带宽即可。
11.9.19.jpg
11.9.20.jpg


HTB 和 PCQ 设置

HTB 令牌桶方式控制各个数据的优先级,并通过 PCQ 动态分配带宽,我们进入 queue 的 tree 设置 HTB,但我们首先还是要先设置 PCQ 参数。

进入 queue type 添加 PCQ 规则,我们添加一个 down 的 PCQ,kind=pcq,rate 设置每台主机的带宽,这 里我们选择 0,即动态分配带宽,你也可以设置一个固定值,以 k 或者 m 为单位,选择 dst-address 为下行的 规则
11.9.21.jpg


添加上行带宽控制规则,这里我们将上行的 PCQ 带宽参数,rate=200k,即每台主机的上行为 200k(由于本 人使用的是 2M ADSL,上行只有 512kbps,所以上行设置较小),上行带宽类型为 src-address
11.9.22.jpg


PCQ 设置完成后,我们接下来就需要配置 HTB,HTB 是由父级队列和子队列组成,我们只对下行做 HTB,上 行数据则采用普通的 PCQ 限速(没有子队列的规则不能称为 HTB),如下图
11.9.23.jpg



配置原则说明:

1、 down 是下行父级队列,负责总带宽分配,up 是上行队列,仅控制上行。

2、 down 和 up 都是通过 forward 链表标记的,属于 global-out,所以我们使用的 parent 为 global-out

3、 down 父级队列下有 4 个子队列,分配是从属于 down,从父级获取带宽,子队列自己有各自的优先级 priority,1 为最高,8 最低,游戏优先级最高 1,web 优先级其次 2,web 视频 7,下载数据最低 8.

4、 子队列的优先级与父级队列是不能比较,max-limit 是最大能获取的带宽,limit-at 为保障带宽,所有子队 列 limi-at 之和小于等于父级 max-limit 带宽

5、 这里是 2M 的 ADSL,我们分配父级带宽不能将 2Mbps 分配完,并须预留一部分作为缓冲,这里下行是1900kbps,上行 400kbps(如果你是 10Mbps 的带宽建议,预留 2M 作为缓冲)

根据以上原则,添加 HTB 的规则的思路就明确了,首先添加父级队列,这里我们不设置任何 packet marks 标 记,仅作为父级带宽分配给下面的子队列
11.9.24.jpg


我们添加子队列,首先添加游戏子队列,我们需要设置父级 parent=down,需要 从 down 获取 带 宽 ,packet-mark 为之前标记的 games,选择 queue type 为刚才的 PCQ 规则 down(给每个主机动态分配带宽),

priority 优先级为 1 最高,我们给游戏分配 1M 带宽,最低保证 400kbps 带宽,如果有剩余带宽可以从父级获 取得到最大 1Mbps
11.9.25.jpg


其次我们添加网页浏览的流控,使用同样的方法,priority 为 2,max-limit 为 1200k,保证最低获得 700k
11.9.26.jpg


网页视频的优先级为 7,最大可以获得 1800k,最低保证 500k
11.9.27.jpg


其他下载数据优先级最低 8,最大带宽为 1800k,最低保证 200k
11.9.28.jpg


上行带宽的 PCQ 规则,取名为 up,因为上行是独立的 PCQ 规则,所以父级是 global-out,选择 packet-mark 为 all_up,queue-type 为刚才的 PCQ 规则 up,每台主机 200kbps 带宽,max-limit 为 400k(因为 2M 的 ADSL 上行带宽为 512k,保留一部分带宽)
游客,如果您要查看本帖隐藏内容请回复



发表于 2013-5-1 21:04:03 | 显示全部楼层
感谢感谢。。。。。。。。
发表于 2013-5-4 02:30:51 | 显示全部楼层
小手一抖,金币拿走,谢谢分享
网络兼职 钢铁侠3  正确的减肥方法 致青春  疯狂原始人
发表于 2013-5-5 14:34:36 | 显示全部楼层
xcvdfs ghvbfdsrz vsda
发表于 2013-5-20 09:04:51 | 显示全部楼层
see see what
发表于 2013-5-28 14:12:04 | 显示全部楼层
adfsafdfdsfdsf
发表于 2013-6-14 22:30:04 | 显示全部楼层
下载学习看看
发表于 2013-6-24 12:05:50 | 显示全部楼层
找到自己所需要的资料
发表于 2013-7-31 21:06:07 | 显示全部楼层
好哦,谢谢分享
发表于 2013-8-25 19:00:50 | 显示全部楼层
感谢感谢。。。。。。。。
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

不良信息举报Q:2000617

软路由

不良信息举报Q:2000617|Archiver|ROS软路由论坛 ROSABC.com 网络方案网络工程交流

GMT+8, 2024-4-26 09:25 , Processed in 0.983261 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表