我有一个 1.5 Mbit/s 的链接,想与 150 个用户共享。
我的设置如下:
带有 3 个 NIC 的 Linux 机箱 eth0 - 公共 ip eth1 - 子网 A - 50 个用户(静态 ips) eth2 - 子网 B - 100 个用户(通过 dhcp)
我在端口 3128 上使用 squid 作为透明代理。dhcp 服务器使用端口 67 和 68。
我正在创建,但我认为数据包没有进入正确的队列
#!/bin/bash
DEV=eth0
RATE_MAIN=2048kbit
CEIL_MAIN=2048kbit
BURST=1b
CBURST=1b
RATE_DEFAULT=1024kbit
CEIL_DEFAULT=$CEIL_MAIN
PRIO_DEFAULT=3
RATE_P2P=1024Kbit
CEIL_P2P=$CEIL_MAIN
PRIO_P2P=4
RATE_IND=32kbit
CEIL_IND=$CEIL_DEFAULT
tc qdisc del dev $DEV root
tc qdisc add dev $DEV root handle 1: htb default 30
tc class add dev $DEV parent 1: classid 1:1 htb rate $RATE_MAIN ceil $CEIL_MAIN
tc class add dev $DEV parent 1:1 classid 1:10 htb rate $RATE_DEFAULT ceil $CEIL_MAIN burst $BURST cburst $CBURST prio $PRIO_WEB
## some other sub class for p2p other traffic
tc class add dev $DEV parent 1:1 classid 1:20 htb rate $RATE_P2P ceil $CEIL_P2P burst $BURST cburst $CBURST prio $PRIO_P2P
$IPS_NET1=50
$IPS_NET2=100
let $IPS=$IPS_NET1+$IPS_NET2
for ((i=1; i<= $IPS; i++))
do
let CLASSID=($i+100)
let HANDLE=($i+100)
tc class add dev $DEV parent 1:10 classid 1:$CLASSID htb rate $RATE_IND ceil $CEIL_IND
tc qdisc add dev $DEV parent 1:$CLASSID handle $HANDLE: sfq perturb 10
done
## Generate IP addresses ##
IP_ADDRESSES=""
# Subnet A
BASE_IP=10.10.10.
for ((i=2; i<=$IPS_NET1+1; i++))
do
TEMP="$BASE_IP$i"
IP=ADDRESSES="$IP_ADDRESSES $TEMP"
done
# Subnet B
BASE_IP=192.168.0.
for ((i=2; i<=$IPS_NET2+1; i++))
do
TEMP="$BASE_IP$i"
IP_ADDRESSES="$IP_ADDRESSES $TEMP"
done
## FILTERS ##
j=1
U32="tc filter add dev $DEV protocol ip parent 1:0 prio $PRIO_DEFAULT u32"
for NET in $IP_ADDRESSES; do
let CLASSID=($j+100)
$U32_DEFAULT match ip src $NET/32 flowid 1:$CLASSID
$U32_DEFAULT match ip dst $NET/32 flowid 1:$CLASSID
let j=j+1
done
你们能帮我找出问题所在吗?
基本上我希望我的课程
1:1 (1.5 Mbit) 1:10 (1024 Kbit) 1:20 (1024 Kbit) (200 ips,每 32 kbit)
答案1
我仍在进行交通管制,并发现HTB Linux队列规则手册-用户指南非常值得一读。它的示例几乎完全描述了您要做的事情。
答案2
看起来您正在尝试为每个 IP 地址创建一个类,通常不会这样做,尤其是当您开始时只有如此少量的带宽时。
我会首先尝试类似 wondershaper 的东西。
但是 1.5 Mbit/s 有 150 个用户吗?这很可能行不通。你还没有说这些用户要做什么,我希望他们已经锁定了只允许运行内联网应用程序的机器。
答案3
如果您的链接只有 1.5 MBit/s,为什么您的 RATE_MAIN 是 2048kbit(超过 2 MBit/s)?如果您在 tc 上谎报您的绝对最大带宽,它将永远无法管理甚至接近您配置的带宽。
还请注意,通常 1.5 MBit/s 是 1500 kbit/s 和 1500000 bit/s。然而,在 tc 中,1 mbit 等于 1024 kbit,即 1048576 bit/s。
如果你的链路是 1.5 MBit/s,那么你的理论最大值是 187500 bps(单位:tc bps 表示每秒的字节数(而不是我们习惯的每秒位数),并且为了进行有效的流量过滤,通常需要将其减少一些实际百分比。如果没有涉及其他协议开销(除 TCP/IP 外,但这已由 tc 自动计算),那么您可能要占用其中的 90%。如果您后面有一条 DSL 线路(可能使用 SNAP+LLC+PPPoE+AAL5+ATM),最好只占用其中的 80%。
最后但同样重要的一点是,您尝试为每个用户提供一个 32 kbit 的类(在 tc 中为 32 * 1024 kbit/s)。
150 * 32 = 4800
你知道这是远远超过你的线速度是吗?
如果你希望 HTB 能够正常工作,并且按照大多数人的期望工作,那么所有子类的速率和上限之和不得超过其父类的速率和上限。而你远远超过了这个上限(1024 是你的父类的值)。