linux – 使用netem模拟桥接接口上的数据包丢失

我试图模拟桥接接口上的网络丢失.
我的服务器eth1上有4个网络接口,eth2和eth3在br0和eth0中桥接,目前已断开连接.事实上,eth2也是断开的(向下).我已将eth1连接到视频传输设备,eth3直接连接到网络交换机.
接收设备连接到同一个交换机,但在另一个端口上.我正在使用netem来模拟路径上的网络损伤.这是我的netem命令的一个例子:
sudo tc qdisc add dev eth1 root netem delay 100ms 50ms loss 20%.
如果我对发送器执行ping操作,我将获得使用此命令配置的时间延迟,抖动和数据包丢失,但这不会影响发送器和解码器之间的网络传输.如果我在eth3上运行相同的命令,发送器和接收器之间的链接开始下降,但问题是如果我将eth1定义为网络接口,那么传输运行正常?

解决方法:

tc-netem(8)(粗体矿)中描述了这种行为的原因:

delay

adds the chosen delay to the packets outgoing to chosen network
interface
.

要么

loss random

adds an independent loss probability to the packets outgoing from the
chosen network interface
.

所以tc … netem仅适用于传出数据包,对来自eth1的传入数据包没有影响.将规则应用于eth3允许netem具有意图效果,因为它现在是视频流量的传出接口.

如果eth3不应该应用这样的规则,因为它应该正常运行与eth1无关的流量,并且只有来自eth1的传入流量应该受到这些规则的影响,那么应该在eth1和桥接器之间放置一个中间接口以便使用netem适用于外向的一方.

一个易于理解的例子是添加一个其他网桥奴役eth1并且还与一个veth对链接到第一个网桥:然后tc规则可以应用于这个附加网桥的veth接口:因为来自eth1的传入数据包将会通过这个veth接口传出,它将按预期工作.

但实际上,Intermediate Functional Block device (ifb0)设计用于通过在传入/入口接口之后在网络流中插入人工内部出口接口来用于此类问题. ifb0仍将位于大多数其他网络层之前,并且几乎不可见.由于它是传出/出口(但仅在内部),因此netem将对其起作用.

所以这里有一个解决方案,让netem工作在eth1接口上的传入而不是传出流量,使用ifb0的技巧改编自tc-mirred(8)的例子:

ip link add ifb0 type ifb || :
ip link set ifb0 up
tc qdisc add dev ifb0 root netem delay 100ms 50ms loss 20%
tc qdisc add dev eth1 handle ffff: ingress
tc filter add dev eth1 parent ffff: u32 match u32 0 0 action mirred egress redirect dev ifb0

u32匹配u32 0 0是最简单的ANY过滤器,用于接受过滤命令.

当然,当eth1处于桥梁中时,它也可以工作.

上一篇:centos7.4安装高可用(haproxy+keepalived实现)kubernetes1.6.0集群(开启TLS认证)


下一篇:H3C三层交换机之IRF虚拟化技术详解及配置