Ponte KVM para IDS da interface promisc

2

Eu tenho um servidor de virtualização KVM que serve uma ponte br0, mapeada para eth0. Eu quero adicionar eth2 como uma ponte para br2 para uma máquina virtual de IDS que estou testando, mas o sistema operacional convidado não vê br2 ou eth2 como uma interface válida. Eu executei o tcpdump na eth2 e posso verificar se ele está vendo pacotes, então sei que tenho uma fonte válida e essa interface tem a opção PROMISC usando ifconfig eth2 promisc up . Aqui está o meu arquivo / etc / network / interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
    address 1.2.3.4
    netmask 255.255.255.0
    gateway 1.2.3.1
    bridge_ports eth0
    bridge_fd 9
    bridge_hello 2
    bridge_maxage 12
    bridge_stp off

auto eth2
iface eth2 inet manual

auto br2
iface br2 inet static
    up ifconfig br2 promisc up
    down ifconfig br2 promisc down
    bridge_ports eth2
    bridge_fd 9
    bridge_hello 2
    bridge_maxage 12
    bridge_stp off

O que estou perdendo?

    
por batflaps 19.08.2016 / 23:47

2 respostas

1

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).

    
por 20.08.2016 / 09:00
1

Obrigado, consegui fazê-lo funcionar usando um método (possivelmente) mais simples com brctl como:

auto eth1
iface eth1 inet manual

#Alienvault OSIM Interface
auto br1
    iface br1 inet manual
    address 0.0.0.0
    bridge_ports eth1
    bridge_stp off 

então

ifup eth1

veja se está capturando pacotes como:

tcpdump -i br1

você deve receber uma tonelada de coisas como:

14:46:53.507328 IP 192.168.20.130.53866 > ipv4_1.cxl0.c154.sea001.ix.nflxvideo.net.https: Flags [.], ack 2897, win 5611, options [nop,nop,TS val 3160018074 ecr 2918482309,nop,nop,sack 1 {28961:46337}], length 0
 14:46:53.507402 IP ipv4_1.cxl0.c154.sea001.ix.nflxvideo.net.https > 192.168.20.130.53866: Flags [.], seq 56473:57921, ack 0, win 2050, options [nop,nop,TS val 2918482612 ecr 3160018052], length 1448

como páginas e páginas que passam muito rapidamente, isso é bom. Agora adicione sua ponte como:

brctl setageing br1 0
brctl setfd br1 0

Agora ligue sua VM e adicione uma segunda NIC de > Especifique o nome do dispositivo compartilhado > br1. Você provavelmente terá que reinicializar a VM, mas, em seguida, faça o login na VM e verá um segundo NIC da eth1, que é vinculado à sua interface de espelhamento e pode começar a examinar os pacotes. Eu ainda não descobri como fazer com que o vswitch copie pacotes espelhados para múltiplas interfaces, no caso de você querer que vários sensores olhem os mesmos dados, então essa é minha próxima edição. Para fazer sua configuração de brctl persistir, reinicie:

cd /etc/network/if-up.d
touch br1-mirror
chmod +x br1-mirror
vi br1-mirror
  #!/bin/bash
  if [ "$IFACE" = br1 ]; then
  brctl setageing br1 0
  brctl setfd br3 0
fi

Mad adereços para a ajuda aqui e também também esse cara, muito útil a todos link espero que tudo isso ajude alguém, difícil descobrir como juntar todas as peças.

    
por 09.09.2016 / 23:58