pfSense 是一个基于 FreeBSD 的为路由器设计的操作系统。也许你听说过 DD-WRT、OpenWRT、Tomato、RouterOS,它们都是基于 Linux 内核的。这些路由器上的操作系统各有千秋,使用者可以根据自己的爱好和需求进行选择。需要注意的是,前面提到的这些路由器上的操作系统,不完全是免费的。
其实这些操作系统也不一定是跑在路由器上,即使是普通的 PC 也是可以运行它们的。而我现在使用的 pfSense,运行在 VMware ESXi(VMware vSphere Hypervisor) 虚拟化平台上,虚拟化平台运行在我宿舍的小 PC 上。关于这台小 PC,日后会有文章介绍它。
pfSense 相对于其他的路由器操作系统来说小众的多了,因此文档比较随意、教程也相对较少。写这篇 blog 的目的是总结下折腾 Traffic Shaper 时遇到的问题,以及一点点经验。
如果读者不是从搜索引擎发现这篇文章的,那么很有可能都不知道 Traffic Shaper 是什么。其实,在其他路由器操作系统中肯定都有类似的功能的,叫做 QoS,即 Quality of Service。以下内容不是教程,而是一点点由浅至深的零碎知识,但是希望能对读者使用这个功能带来帮助。
———莫名其妙的分割线,以下才是重点——–
首先,不要用 Hyper-V 跑 pfSense,至少对于现在的 2.1.x。给 pfSense 使用“旧式网络适配器”,你一定会哭的,曾经网速约 600KB/s 然后 CPU 吃满了,系统中断使用 CPU 50% 以上。具体数值跟具体配置有关,举例的目的是让你们知道它的效率是有多低。pfSense 2.1 使用了 FreeBSD 8 的内核,不能支持新式网络适配器;pfSense 2.2 使用 FreeBSD 10 内核,虽然理论上能支持新式网络适配器,但是它尚未正式发布,兼容性不好多说。如果是 VMware ESXi,使用 Intel e1000 网卡也能有很不错的效率。
Traffic Shaper 是针对网卡使用的,要网卡支持 ALTQ 才能用。对于 VMware ESXi 来说,需要使用 Intel e1000 网卡,VMXNET 2 或 3 都是不可以的。不过如果你使用 PPPoE 连接网络的话,这个 ppp 的 WAN 是可以的。
Traffic Shaper 只能控制一个网卡流出的数据,其实很容易理解,出去的数据是能控制的,进来的数据不是自己能控制的(下载工具的限速是怎么回事?抱歉不是很清楚,求告知)。对于路由器,你有 LAN 和 WAN,用 Traffic Shaper 能限制从 LAN 流出的数据(实际上是 WAN 流入的数据)和从 WAN 流出的数据(实际上是 LAN 流入的数据)。限制速度的方式有两种,简单地说是:隐式的和显式的,隐式的就是丢包,显式的请参见Explicit Congestion Notification。两种方式都能实现效果,另外也不用担心一边进行限制然后另一边会塞车,通俗地讲就是,一边堵了,另一边是不会再使劲发的了。所以,对于路由器背后的用户,限制下载要设置 LAN 的 Traffic Shaper,限制上传要设置 WAN 的 Traffic Shaper。
Traffic Shaper 是用队列处理网络流量的,也就是上面说到的 ALTQ。要发送的数据,会根据数据的类型放到不通的队列中,根据队列的优先级来控制发送的次序。每个网卡都要有一个默认队列,可以理解为其他的流量(看了下面一条就能明白了)。
要将流量放入队列,需要搭配 Firewall 使用。Firewall 的规则中可以设定 Ackqueue/Queue 前者是针对 TCP 的 ACK 包(一般用一个专门的队列,如果对方收不到 ACK 就认为是丢包了,会影响速度;当然非 TCP 就不需要了),后者根据所需可以选择高优先级队列和低优先级队列。一般这些规则放在 Firewall -> Rules -> Floating 里。
——–重点完——–
说说我的 Traffic Shaper 是怎么用的。我的所有网卡都是 VMXNET 3,然后 WAN 使用了 PPPoE,因此只在这里使用了 Traffic Shaper。发现其实这样也足够了,HTTP、游戏端口设为高优先级,BT 下载带宽吃满的情况下,HTTP 浏览确实变慢了一些,但是比不使用 Traffic Shaper 的时候好了很多,然后打游戏的时候还是很流畅。
居然连vmxnet2/3都不能用…
下载工具的限速不是靠限制回传确认包来进行的么..
是指 ACK 吗?故意少发一点这样的话就是隐式的