2 votes

Pont KVM pour l'interface promisc IDS

J'ai un serveur de virtualisation KVM qui sert un pont br0, mappé sur eth0. Je veux ajouter eth2 comme pont vers br2 pour une machine virtuelle IDS que je teste, mais le système d'exploitation invité ne voit ni br2 ni eth2 comme une interface valide. J'ai lancé tcpdump sur eth2 et je peux vérifier qu'il voit des paquets, donc je sais que j'ai une source valide et que cette interface a l'option PROMISC en utilisant ifconfig eth2 promisc up . Voici mon fichier /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

Qu'est-ce que je rate ?

2voto

batflaps Points 69

Merci, j'ai réussi à le faire fonctionner en utilisant une méthode (peut-être) plus simple avec brctl comme :

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 

dann

ifup eth1

puis regardez si ça capture des paquets comme :

tcpdump -i br1

tu devrais avoir une tonne de trucs comme :

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

comme des pages et des pages qui défilent très rapidement, c'est bien. Maintenant, ajoutez votre pont comme :

brctl setageing br1 0
brctl setfd br1 0

Maintenant, démarrez votre VM et ajoutez une deuxième NIC de > Specify shared device name > br1. Vous devrez probablement redémarrer la VM, mais connectez-vous ensuite à la VM et vous devriez voir une deuxième NIC de eth1, qui est pontée à votre interface miroir et peut commencer à regarder les paquets. Je n'ai toujours pas trouvé comment faire en sorte que vswitch copie les paquets du miroir sur plusieurs interfaces, au cas où vous voudriez que plusieurs capteurs regardent les mêmes données, c'est donc mon prochain problème. Pour que votre configuration brctl persiste après un redémarrage, faites :

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

Un grand bravo à l'aide ici et aussi à ce type, très utile à tous. http://www.ryanhallman.com/kvm-configure-mirrored-ports-traffic-to-be-visible-in-guest-snort/ J'espère que tout ceci aidera quelqu'un d'autre, c'est difficile de trouver comment assembler toutes les pièces.

1voto

Michael Hampton Points 232226

Le pont Linux est un commutateur de base de niveau 2. Pour qu'il puisse envoyer du trafic à une interface qui lui est connectée, le trafic doit être approprié pour cette interface (c'est-à-dire que l'adresse MAC de destination est accessible via ce port).

Alors que les commutateurs de couche 2 disposent souvent d'une fonction de mise en miroir des ports qui transmet tout le trafic traversant le commutateur à un port désigné, le pont Linux ne dispose pas de cette fonctionnalité.

Cependant, vous pouvez le simuler avec le contrôle du trafic (tc) de Linux. Je le fais pour transférer le trafic vers une machine virtuelle KVM exécutant suricata. La limitation de cette méthode est que vous ne pouvez mettre en miroir le trafic que sur un seul port physique.

Dans ce script, la fonction MONITOR_PORT est le port à surveiller, qui doit être un port physique, et MIRROR_PORT est l'interface vers laquelle le trafic sera envoyé (qui peut être un port virtuel ou un pont). Le port surveillé n'a pas besoin d'être en mode promiscuous avec cette méthode. Et le port miroir n'a pas besoin d'être ponté vers le port surveillé.

Dans mon cas, l'hôte a un pont br0, relié à eno1 et auquel toutes les machines virtuelles ont une NIC virtuelle. J'ai créé un réseau virtuel réservé à l'hôte (en tant que virbr2) pour cette VM et ajouté une deuxième NIC dans la VM suricata sur ce réseau en plus de sa NIC normale, et dirigé le trafic vers celle-ci.

[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

Notez que je ne l'ai pas créé moi-même ; je l'ai repris sans vergogne de Mise en miroir des ports avec les ponts Linux Vous y trouverez une explication détaillée de son fonctionnement et une alternative utilisant Open vSwitch qui est beaucoup plus flexible (et beaucoup plus complexe).

0 votes

Merveilleux, merci ! Est-il possible de mettre en miroir un port unique vers plusieurs interfaces de destination au cas où je voudrais tester plusieurs VM en regardant le trafic passant par le port miroir ?

0 votes

J'ai réussi à le faire fonctionner en utilisant brctl comme suit

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X