流量整形(也称为“分组整形”)是计算机网络流量的控制,以通过延迟满足特定标准的分组来优化或保证性能,降低延迟和/或增加可用带宽。更具体地,流量整形是对一组分组的任意动作,通过对这些分组施加额外的延迟,使得它们符合某些预定的约束。
概述
OPNsense的流量整形非常灵活,围绕管道,队列和相应的规则进行组织。管道定义允许的带宽,队列可用于在管道内设置权重,最后使用规则将整形应用于某个数据包流。整形规则独立于防火墙规则和其他设置进行处理。
OPNsense流量整形是限制带宽或确定流量优先级的可靠解决方案,可与其他功能(如强制网络门户或高可用性(CARP))结合使用。
可以基于接口、ip源和目的地、流量方向(输入/输出)和端口号(应用)来定义带宽限制。
可用带宽可以在所有用户上均匀分配,这样可以始终获得最佳性能。
还可以通过添加队列和定义权重来确定流量的优先级。严格来说,流量并不是真正的优先级,但是当总的可用带宽有限时,具有较高权重的应用可能比其他应用消耗更多带宽。
流量整形是使用IPFW和dummynet来提供具有低CPU容量的现代可靠解决方案。
Dummynet & ipfw
Dummynet首先使用防火墙对数据包进行分类,然后使用可在ipfw规则中使用的任意匹配模式将数据分成流。根据本地策略,流可以包含单个TCP连接的数据包,或从(到)给定主机,整个子网或协议类型等的数据包。
然后将属于同一流的数据包传递给两个不同对象中的任意一个,从而实现流量调节:
- 管道
- 管道模拟具有给定带宽,传播延迟,队列大小和丢包率的链路。当数据包从分类器中出来时,数据包在管道前面排队,然后根据管道的参数传输到管道。
- 队列
- 队列是用于实现WF2Q (Worstcase公平加权公平排队)策略的抽象,该策略是WFQ策略的有效变体。队列将权重和引用管道关联到每个流,然后链接到同一管道的所有积压(排队的流量)流共享管道的带宽与其权重成比例。请注意,权重不是优先级; 即使权重较高的流量被永久积压,具有较低权重的流量仍可保证获得其带宽的一部分。
实际上,管道可用于设置流可以使用的带宽的硬限制,而队列可用于确定不同的流如何共享可用带宽。
可以在流量整形的规则部分中定义整形规则。
设置流量整形
如何设置流量整形,我们将分别研究以下不同的场景:
- 为实时流量保留专用带宽,例如(托管)IP语音(VOIP)服务器。
- 在用户之间均匀分享互联网带宽
- 限制用户可以使用的最大Internet带宽
- 使用队列确定应用程序的优先级(加权)
- 用于GuestNet的多接口整形
保留专用带宽
在这种情况下,我们将创建一个专用于进出实时应用程序的流量的管道。下面,我们假设SIP中继或托管的IP语音(VOIP)服务器。
对于这个例子,我们假设需要4个64Kbps的未压缩语音信道,总需求带宽为256Kbps。此示例中的Internet连接有10Mbps下载和1Mbps上载速度。
导航到Firewall->Shaper->Settings。
第1步 – 创建上传和下载管道
在“ 管道”选项卡上,单击右下角的 按钮。将弹出一个空的“ 编辑管道”页面。
创建上传管道(到我们的VOIP服务器)
启用 | 选中 | 设置以便启用管道 |
带宽 | 256 | 所需带宽的数值 |
单位 | Kbit/s | 与数值一起使用的度量标准 |
掩码 | (留空) | 用于自动排队 |
描述 | PipeUp-256Kbps | 输入描述性内容 |
创建上传管道(其他流量= 1024Kbps – 256Kbps = 768Kbps)
启用 | 选中 | 设置以便启用管道 |
带宽 | 768 | 所需带宽的数值 |
单位 | Kbit/s | 与数值一起使用的度量标准 |
掩码 | (留空) | 用于自动排队 |
描述 |
创建下载管道(来自我们的VOIP服务器)
启用 | 选中 | 选中以启用管道 |
带宽 | 256 | 所需带宽的数值 |
单位 | Kbit/s | 与数值一起使用的度量标准 |
掩码 | (留空) | 用于自动排队 |
描述 | PipeDown-256Kbps | 输入描述性内容 |
创建下载管道(其他流量= 10240Kbps – 256Kbps = 9984Kbps)
启用 | 选中 | 选中以启用管道 |
带宽 | 9984 | 所需带宽的数值 |
单位 | Kbit/s | 与数值一起使用的度量标准 |
掩码 | (留空) | 用于自动排队 |
描述 | PipeDown-9984Kbps | 输入描述性内容 |
第2步 – 创建规则
在“ 规则”选项卡上,单击右下角的 按钮。将弹出一个空的编辑规则页面。
为指向VOIP服务器(上传)的流量创建规则。
序列 | 11 | 自动生成的数字,仅在需要时覆盖 |
接口 | WAN | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源ip,选any |
源端口 | any | 源端口,选any |
目标 | 172.10.2.1 | 我们的VOIP服务器的IP地址 |
目标端口 | any | 如果是静态的,请使用任意目标端口 |
管道或队列 | PipeUP-256Kbps | 选择上传256Kbps管道 |
描述 | ShapeVOIPUpload | 输入描述性名称 |
为来自VOIP服务器的流量创建规则(下载)。
序列 | 21 | 自动生成的数字,仅在需要时覆盖 |
接口 | WAN | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
资源 | 172.10.2.1 | 我们的VOIP服务器的IP地址 |
源端口 | any | 源端口,选any |
目标 | any | 选any |
目标端口 | any | 选any |
管道或队列 | PipeDown256Kbps | 选择下载256Kbps管道 |
描述 | ShapeVOIPDown | 输入描述性名称 |
为所有其他互联网上传流量创建规则
序列 | 31 | 自动生成的数字,仅在需要时覆盖 |
接口 | 广域网 | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | 192.168.1.0/24 | 源IP,我们的LAN网络 |
源端口 | any | 源端口,选any |
目标 | any | 目标地址,选any |
目标端口 | any | 如果是静态的,请使用any目标端口 |
管道或队列 | PipeUp-768kbps | 选择上传256Kbps管道 |
描述 | ShapeUpload | 输入描述性名称 |
为所有其他互联网下载流量创建规则
序列 | 41 | 自动生成的数字,仅在需要时覆盖 |
接口 | 广域网 | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源地址,选any |
源端口 | any | 源端口,选any |
目标 | 192.168.1.0/24 | 我们的lan网络 |
目标端口 | any | 目标端口,选any |
管道或队列 | PipeDown-9984Kbps | 选择下载256Kbps管道 |
描述 | ShapeDown | 输入描述性名称 |
注意
注意顺序!确保将正确的流量传递到正确的管道非常重要。
限制每个用户的带宽
我们将在互连用户之间划分互联网下载流量,将每个用户的带宽限制在1Mbps的速率。
导航到Firewall->Shaper->Settings。
第1步 – 创建上传和下载管道
在“ 管道”选项卡上,单击右下角的 按钮。将弹出一个空的“ 编辑管道”页面。
创建下载管道
启用 | 选中 | 选中以启用管道 |
带宽 | 1 | 所需带宽的数值 |
单位 | Mbit / s | 与数值一起使用的度量标准 |
掩码 | 目标 | 选择目标以限制每个客户端的带宽 |
描述 | PipeDown-1Mbps | 输入描述性内容 |
第2步 – 创建规则
在“ 规则”选项卡上,单击右下角的 按钮。将弹出一个空的编辑规则页面。
为来自互联网的流量创建规则(下载)。
序列 | 21 | 自动生成的数字,仅在需要时覆盖 |
接口 | wan | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源地址,选any |
源端口 | any | 选any |
目标 | 192.168.1.0/24 | 选择局域网 |
目标端口 | any | 选any |
管道或队列 | PipeDown-1Mbps | 选择下载1Mbps管道 |
描述 | ShapeDownload | 输入描述性名称 |
优先使用队列
通过利用队列,我们可以影响管道内的带宽,并且基于加权算法为某些应用提供比其他应用更多的带宽。
假设我们有一个10Mbps的管道和2个应用程序,例如smtp(电子邮件)和http(s)。http(s)流量的权重为1,smtp流量的权重为9,当我们管道的所有容量都在使用时,电子邮件流量的带宽将比我们的http流量多9倍,从而达到1Mbps用于http(s),9Mbps用于smtp。
在下面这个示例中,我们仅检查下载流量,但可以对上传流量执行完全相同的操作。
应用 | 权重 | 最小带宽 |
---|---|---|
SMTP(端口25) | 9 | 9Mbps |
HTTP(80) | ||
HTTPS(443) |
导航到Firewall->Shaper->Settings。
第1步 – 创建下载管道
在“ 管道”选项卡上,单击右下角的 按钮。将弹出一个空的“ 编辑管道”页面。
创建下载管道(10Mbps)
启用 | 选中 | 选中以启用管道 |
带宽 | 10 | 所需带宽的数值 |
单位 | Mbit / s | 与数值一起使用的度量标准 |
掩码 | (空) | 留空 |
描述 | PipeDown-10Mbps | 输入描述性内容 |
第2步 – 创建队列
在“ 队列”选项卡上,单击右下角的 按钮。将弹出一个空的编辑队列页面。
为SMTP创建队列
启用 | 选中 | 选中以启用管道 |
管道 | PipeDown-10Mbps | 选择我们的管道 |
权重 | 9 | 与数值一起使用的权重 |
掩码 | (空) | 留空 |
描述 | Queue-SMTP | 输入描述性内容 |
为HTTP创建队列
启用 | 选中 | 选中 以启用管道 |
管道 | PipeDown-10Mbps的 | 选择我们的管道 |
权重 | 1 | 与数值一起使用的权重 |
掩码 | (空) | 留空 |
描述 | Queue-HTTP | 输入描述性内容 |
第3步 – 创建规则
在“ 规则”选项卡上,单击右下角的 按钮。将弹出一个空的编辑规则页面。
为smtp下载流量创建规则(电子邮件)
序列 | 11 | 自动生成的数字,仅在需要时覆盖 |
接口 | wan | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源地址,选any |
源端口 | SMTP | 源端口,smtp或25 |
目标 | any | 选any |
目标端口 | any | 目标端口,请保留为任意 |
管道或队列 | Queue-SMTP | 选择SMTP队列 |
描述 | ShapeSMTPDownload | 输入描述性名称 |
为http下载流量创建规则
序列 | 21 | 自动生成的数字,仅在需要时覆盖 |
接口 | wan | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源地址,选any |
源端口 | HTTP | http或80 |
目标 | any | 目的地ip,选any |
目标端口 | any | 目标端口,请保留为任意 |
管道或队列 | Queue-HTTP | 选择HTTP队列 |
描述 | ShapeHTTPDownload | 输入描述性名称 |
为https流量添加额外规则很简单,因为我们可以使用相同的http队列:
序列 | 31 | 自动生成的数字,仅在需要时覆盖 |
接口 | wan | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源地址,选any |
源端口 | HTTPS | 源端口,https或443 |
目标 | any | 目的地ip,选any |
目标端口 | any | 目标端口,请保留为任意 |
管道或队列 | Queue-HTTP | 选择HTTP队列 |
描述 | ShapeHTTPSDownload | 输入描述性名称 |
这样,http和https流量将被视为相同(总计1Mbps)。
访客网络的多接口整形
OPNsense流量整形器的一个选项是它能够根据两个接口添加整形规则。此选项允许您根据流量在接口之间移动的方向来不同地调整流量。
在下面这个示例中,我们将使用此功能在主LAN网络和访客网络之间共享对称的10Mbps Internet连接。
LAN网络不受限制,来自我们的访客网络上的用户的流量将限制为总共2Mbps的下载和1Mbps的上传。
第1步 – 创建上传和下载管道
在“ 管道”选项卡上,单击右下角的 按钮。将弹出一个空的“ 编辑管道”页面。
创建上传管道(GuestNet – em2)
启用 | 选中 | 选中以启用管道 |
带宽 | 1 | 所需带宽的数值 |
单位 | Mbit / s | 与数值一起使用的度量标准 |
掩码 | (空) | 留空 |
描述 | PipeUp-1Mbps | 输入描述性内容 |
创建下载管道(GuestNet – em2)
启用 | 选中 | 选中以启用管道 |
带宽 | 2 | 所需带宽的数值 |
单位 | Mbit / s | 与数值一起使用的度量标准 |
掩码 | (空) | 留空 |
描述 | PipeDown-2Mbps | 输入描述性内容 |
第2步 – 创建规则
在“ 规则”选项卡上,单击右下角的 按钮。将弹出一个空的编辑规则页面。
- 重要 – 继续之前!
- 首先将模式更改为高级,在对话框左上角的进行切换。单击一下即可将其从红色(禁用)切换为绿色(启用)。
为下载流量创建规则
序列 | 11 | 自动生成的数字,仅在需要时覆盖 |
接口 | wan | 选择连接到互联网的接口 |
接口2 | GuestNet | 选择与您的GuestNet匹配的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源地址,选any |
源端口 | any | 源端口,选any |
目标 | any | 目的地ip,选any |
目标端口 | any | 目标端口,请保留为任意 |
方向 | 进 | 匹配入站的数据包(下载) |
管道或队列 | PipeDown-2Mbps | 选择下载管道 |
描述 | GuestNetDownload | 输入描述性名称 |
为上传流量创建规则
序列 | 21 | 自动生成的数字,仅在需要时覆盖 |
接口 | wan | 选择与您的GuestNet匹配的接口 |
接口2 | GuestNet | 选择连接到互联网的接口 |
协议 | IP | 在我们的示例中选择协议ip |
源 | any | 源地址,选any |
源端口 | any | 源端口,选any |
目标 | any | 目的地ip,选any |
目标端口 | any | 目标端口,请保留为任意 |
方向 | 出 | 匹配出站的数据包(上传) |
管道或队列 | PipeUp-1Mbps | 选择下载管道 |
描述 | GuestNetUpload | 输入描述性名称 |