我正在使用 Ubuntu 12.10,正在寻找一种基于 IP 地址调整网络流量的方法。我有一个 LAN,假设从 192.168.1.2 - 192.168.1.254。服务器位于 192.168.1.1。所有 IP 都应具有最大可能的网络速度(所有端口,但 Samba 是真正的罪魁祸首)。特定 IP 或 IP 范围(例如:192.168.1.100)连接时,应为该 IP 提供全速,所有其他 IP 的速度应降至最低。一旦 IP 流量结束,其余连接的 IP 的速度应恢复。
我基本上有一个服务器,如果我的 PC 连接到它,我希望全速运行。只有当我不使用服务器时,其余的人才能完全访问。
我在网上找到了一些使用 tc 的解决方案,但它们都以一定的速度限制特定 IP。但我希望所有人都能获得最大速度,除非某个 IP 已连接。所以基本上我的 IP 应该具有最高优先级,其余 IP 具有最低优先级。
有人能帮我提供一份脚本或者一个已经存在的程序吗?
答案1
tc
才是解决之道。诀窍是优先考虑流量,但不限制流量。
http://www.lartc.org/howto/lartc.qdisc.classful.html,第 9.5.3 节“PRIO qdisc”;默认情况下,它会创建 3 个队列,但您可以忽略第 3 个队列。最简单的方法是:
创建队列规则 (qdisc)
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 10: sfq
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
tc qdisc add dev eth0 parent 1:3 handle 30: sfq
它们都具有相同的队列算法;然后分配您的服务器(在本例中为 IP 192.168.1.0-127)来处理 10:并将其余的分配给 20::
tc filter add dev eth0 protocol ip parent 1:1 prio 1 u32 match ip dst 192.168.1.0/25 flowid 10:
tc filter add dev eth0 protocol ip parent 1:2 prio 2 flowid 20:
(免责声明:我已经有一段时间没有接触过这些东西了,你可能需要尝试一下parent
和之后的值flowid
)
使用 2 的幂的范围比使用十进制限制要容易得多。IP 地址后的 /25 会忽略 IP 地址的最后 7 位,因此范围从 0 到 127。如有必要,请使用 /26 将范围限制为 0..63。
在同一页上,讨论了分层令牌桶,这是一种更细粒度的带宽分配方式。诀窍是创建两个带宽比率不均匀的类,例如 1:10(100 mbit vs 1000 mbit)。这将留下一些带宽。