Estou tentando simular uma perda de rede em uma interface em ponte.
Eu tenho 4 interfaces de rede no meu servidor eth1, eth2 e eth3 estão em ponte em br0 e eth0 que está desconectado no momento. Na verdade, o eth2 também está desconectado (desligado). Eu conectei ao eth1 um dispositivo de transmissão de vídeo e o eth3 está conectado diretamente ao switch de rede.
Um dispositivo receptor está conectado ao mesmo switch, mas em outra porta. Estou usando netem para simular deficiências de rede no caminho. Este é um exemplo do meu comando netem:
sudo tc qdisc add dev eth1 root netem delay 100ms 50ms loss 20%
.
Se eu fizer ping no transmissor, estou obtendo exatamente o atraso de tempo, jitter e perda de pacote configurados com este comando, mas isso de alguma forma não está afetando o transporte de rede entre o transmissor e o decodificador. Se eu executar o mesmo comando no eth3, o link entre o transmissor e o receptor começa a cair, mas a questão é por que o transporte está funcionando bem se eu definir eth1 como uma interface de rede?
A razão para esse comportamento é descrita na
tc-netem(8)
(mina em negrito):ou
Portanto
tc ... netem
, funciona apenas em pacotes de saída e não tem efeito nos pacotes de entradaeth1
. Aplicando a regra aeth3
permitenetem
ter o efeito pretendido já que agora é uma interface de saída para o tráfego de vídeo.Caso
eth3
não deva ter tais regras aplicadas, pois deve se comportar normalmente com tráfego não relacionado aeth1
, e somente o tráfego de entradaeth1
deve sofrer essas regras, então uma interface intermediária deve ser colocada entreeth1
e a ponte para que sejanetem
aplicada em umoutgoing
lado.Um exemplo fácil de entender, seria adicionar uma outra ponte escravizando
eth1
e também vinculada com umveth
par à primeira ponte: então atc
regra pode ser aplicada naveth
interface desta ponte adicional: desde que os pacotes recebidoseth1
sejam enviados por estaveth
interface , funcionaria como pretendido.Mas, na verdade, o dispositivo Intermediate Functional Block (
ifb0
) foi projetado para ser usado para esse tipo de problema, inserindo uma interface de saída interna artificial no fluxo da rede, logo após a interface de entrada/entrada.ifb0
ainda estará localizado antes da maioria das outras camadas de rede e permanecerá praticamente invisível. Como é de saída/saída (mas apenas internamente),netem
vai funcionar nele.Então, aqui está a solução para
netem
trabalhar para o tráfego de entrada em vez do tráfego de saídaeth1
na interface, usandoifb0
o truque adaptado de um exemplo detc-mirred(8)
.:u32 match u32 0 0 é o filtro QUALQUER mais simples possível a ser usado para que o comando de filtro seja aceito.
Claro que também funciona quando
eth1
está em uma ponte.