A ponte Linux é um switch básico da camada 2. Para que ele envie tráfego para uma interface conectada a ele, o tráfego deve ser apropriado para essa interface (ou seja, o endereço MAC de destino pode ser acessado por essa porta).
Embora os switches de camada 2 geralmente tenham um recurso de espelhamento de porta que encaminha todo o tráfego que atravessa o switch para uma porta designada, a ponte do Linux não tem essa funcionalidade.
No entanto, você pode fingir com o controle de tráfego (tc) do Linux. Eu faço isso para encaminhar o tráfego para uma máquina virtual KVM executando suricata. A limitação desse método é que você pode apenas espelhar o tráfego em uma única porta física.
Nesse script, o MONITOR_PORT
é a porta a ser monitorada, que deve ser uma porta física, e MIRROR_PORT
é a interface para a qual o tráfego será enviado (que pode ser uma porta virtual ou uma ponte) . A porta monitorada não precisa estar no modo promíscuo com esse método. E a porta do espelho não precisa ser conectada à porta monitorada.
No meu caso, o host tem uma ponte br0, ponte para eno1 e para a qual todas as máquinas virtuais possuem uma NIC virtual. Eu criei uma rede virtual somente de host (como virbr2) para essa VM e adicionei uma segunda NIC na VM do Suricata nessa rede, além de sua NIC comum, e direcionei o tráfego para ela.
[error@hypervisor ~]$ cat /etc/rc.d/rc.local
#!/bin/bash
# Mirror all packets from one port to another (for suricata)
MONITOR_PORT=eno1
MIRROR_PORT=virbr2
# Ingress
tc qdisc add dev $MONITOR_PORT ingress
tc filter add dev $MONITOR_PORT parent ffff: protocol all u32 match u8 0 0 action mirred egress mirror dev $MIRROR_PORT
# Egress
tc qdisc add dev $MONITOR_PORT handle 1: root prio
tc filter add dev $MONITOR_PORT parent 1: protocol all u32 match u8 0 0 action mirred egress mirror dev $MIRROR_PORT
Note que eu não criei isso sozinho; Eu descaradamente arrancá-lo de espelhamento de porta com pontes Linux , que tem um explicação detalhada de como funciona e uma alternativa usando o Open vSwitch, que é muito mais flexível (e muito mais complexo).