我要模拟以下情况:假设我有4台ubuntu服务器计算机A,B,C和D。我希望将计算机A和计算机C之间的网络带宽减少20%,将计算机A和B之间的网络带宽减少10%。使用网络仿真/限制工具执行此操作吗?
tc
与iptables标记一起使用时会执行。
我要模拟以下情况:假设我有4台ubuntu服务器计算机A,B,C和D。我希望将计算机A和计算机C之间的网络带宽减少20%,将计算机A和B之间的网络带宽减少10%。使用网络仿真/限制工具执行此操作吗?
tc
与iptables标记一起使用时会执行。
Answers:
为此,您可以tc
单独使用u32
过滤器,也可以结合使用iptables标记(如果您不想学习复杂的过滤器语法,可能会更简单)。我将在以下文章中详细介绍前一种解决方案。
例如,让我们考虑运行10 Mbit / s虚拟接口的A,B,C和D。
您基本上想要:
为了模拟这一点,我将创建4个网络名称空间和插入到网桥中的虚拟以太网接口。
当然,根据您的情况,您将使用真实的NIC,而网桥将作为您的网关或交换机,具体取决于您的基础结构。
因此,在我的模拟中,我们将在10.0.0.0/24网络中进行以下设置:
10.0.0.254
+-------+
| |
| br0 |
| |
+---+---+
|
| veth{A..D}.peer
|
+------------+------+-----+------------+
| | | |
vethA | vethB | vethC | vethD |
+---+---+ +---+---+ +---+---+ +---+---+
| | | | | | | |
| A | | B | | C | | D |
| | | | | | | |
+-------+ +-------+ +-------+ +-------+
10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
首先,设置阶段,以便您了解其组成,如果您不熟悉它,则跳过它,没什么大不了的。但是,您必须知道的是,该命令ip netns exec <namespace> <command>
允许在网络名称空间中(即,在上一幅图的其中一个框中)执行命令。下一节也将使用它。
# Create the bridge
ip link add br0 type bridge
# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do
ip link netns add ${host}
ip link add veth${host} type veth peer name veth${host}.peer
ip link set dev veth${host}.peer master br0
ip link set dev veth${host} netns ${host}
ip netns exec ${host} ip link set veth${host} up
done
# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD
因此,在这一点上,我们已经有了前面描述的设置。
现在是时候进入交通控制以获取想要的东西了。该tc
工具允许您添加排队规则:
它带有3个概念:qdisc,类和过滤器。这些概念可用于设置复杂的数据包流管理,并根据您想要的任何标准/标准对流量进行优先级排序。
简而言之 :
所有这些通常都像一棵树一样工作,其中叶子是qdiscs,类是节点。树或子树的根将声明为<id>:
,子节点将声明为<parent_id>:<children_id>
。请牢记此语法。
对于您的情况,让我们以A渲染要设置的树tc
:
1:
|
|
|
1:1
/ | \
/ | \
/ | \
1:10 1:20 1:30
| | |
| | |
:10 :20 :30
说明:
1:
是连接到设备vethA的根qdisc,它将被明确地用作htb
层次结构令牌桶(设备的默认qdisc是pfifo
或pfifo_fast
取决于OS)。特别适合于带宽管理。与在此级别定义的过滤器不匹配的数据包将1:30
归类。1:1
将htb
限制设备的整体流量到10 Mbit / s的类。1:10
将是htb
将输出流量限制为9 Mbit / s(10 Mbit / s的90%)的类。1:20
将是htb
将输出流量限制为8 Mbit / s(10 Mbit / s的80%)的类。1:30
将是htb
将流量限制为10 Mbit / s(备用)的类别。:10, :20, :30
是sfq
随机公平队列的qdisc。换句话说,这些qdiscs将确保基于流的传输调度中的公平性。这整个过程由以下命令设置:
ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10
我们需要做的最后一件事是添加过滤器,以使目标IP等于B的1:10
IP数据包进入类别,而目标IP等于C的IP数据包进入1:20
类别:
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20
现在您已经有了主意,您将需要向tc
B和C 添加类似的规则,以便也可以调整这些钻机向A的传输。
现在让我们对其进行测试。为此,我个人经常使用iperf
它,它仅包含一个二进制文件,可以作为客户端或服务器运行,并且将自动在两台主机之间发送尽可能多的流量。
在A和B之间:
$ ip netns exec B iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 2.0- 4.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 4.0- 6.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 6.0- 8.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 8.0-10.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 0.0-10.1 sec 10.8 MBytes 8.91 Mbits/sec
我们得到了9 Mbit / s的带宽限制。
在A和C之间:
$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 2.0- 4.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 4.0- 6.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 6.0- 8.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 8.0-10.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 0.0-10.1 sec 9.62 MBytes 7.98 Mbits/sec
我们得到了8 Mbit / s的带宽限制。
在A和D之间:
$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.62 MBytes 11.0 Mbits/sec
[ 5] 2.0- 4.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 4.0- 6.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 6.0- 8.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 8.0-10.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 0.0-10.2 sec 12.0 MBytes 9.89 Mbits/sec
在这里,我们达到了10 Mbit / s的虚拟接口全速。
请注意,可以htb
通过调整适当的参数在类中更好地处理每次运行的第一个小节的突发。
去除 :
1:
:tc filter del dev vethA parent 1: prio 1 u32
。1:
:tc filter del dev vethA parent 1:
。1:20
及其子女:tc class del dev vethA parent 1:1 classid
1:20
。tc qdisc del dev vethA
。清理模拟集:
# Remove veth pairs and network namespaces
for host in {A..D} ; do
ip link del dev veth${host}.peer
ip netns del ${host}
done
# Remove the bridge
ip link del dev br0
最好是将tc工具与现在集成的(至少在Ubuntu服务器中)netem模块一起使用。您可以从Stackoverflow的本文中找到更多信息。
细流效果很好。
该讨论显示了一些限制:https : //unix.stackexchange.com/questions/109973/how-to-change-speed-limit-of-running-trickle-instance