Question Plusieurs liaisons VLAN différentes vers des invités KVM (Linux)


J'ai heurté un barrage routier avec un défi architectural. J'ai un serveur exécutant KVM, qui comportera un certain nombre d'invités, certains exécutant des pare-feu virtualisés et d'autres, de simples serveurs Web.

  • Les serveurs Web nécessitent une seule interface VLAN non balisée
  • Les pare-feu ont besoin d'un tronc VLAN étiqueté

Maintenant, généralement, ce serait simple, il suffit d'ajouter un pont avec eth0 y ajouter quelques VLAN sur le pont (vmbr0.1 etc.) - allouez ensuite une interface avec un VLAN non étiqueté à chaque invité (ou à plusieurs de ceux-ci).

                             firewall1 (vlan 1,2,3,4)
switch ===== eth0  vmbr0     firewall2 (vlan 1,2,5,6)
                   (eth0)    server1 (vlan 7)
                             server2 (vlan 8)
     vlan trunk
 (1,2,3,4,5,6,7,8)     

Maintenant, cela fonctionne bien si vous n'avez que quelques interfaces à passer à un invité. Mais que se passe-t-il lorsque vous devez mettre 500 VLAN dans un pare-feu. C'est peu pratique.

Donc, ce que je ne peux pas comprendre, c'est comment créer des lignes de numéros (avec des VLAN communs et différents VLAN) et les allouer à un invité.

La solution la plus proche que j'ai trouvée jusqu'à présent consiste à créer les VLAN sur le pont principal, puis d'allouer un seul VLAN à partir de ces serveurs.

Ensuite, pour les pare-feu, créez un pont pour chacun, avec juste le client tap interface en elle, puis créer le non marqué vlan interface pour ce pont respectif, et l'ajouter à la liste principale vmbr0 pont.

Le seul problème avec cela est que le trafic sortant de l'interface non balisée est bien sûr non balisé.

Est-il possible de baliser le trafic sortant d'une interface?

-

Sinon, comment est-il possible d'obtenir différentes lignes de réseau pour les invités KVM, qui peuvent avoir des VLAN communs et des VLAN différents (mais jamais ALL vlans) - et être en mesure d'affecter des interfaces vlan non étiquetées


5
2017-10-02 22:31


origine




Réponses:


Une solution longue ...

J'ai donc essayé différents concepts et je pense avoir mis au point une solution viable. Fondamentalement, il y a un tronc de pont principal (bt) cette eth0 appartient à. Ensuite, pour chaque pare-feu, la VM a son propre pont.

bridge name     bridge id               STP enabled     interfaces
bt              8000.002618895a72       no              eth0
bt-fw1          8000.000000000000       no              tap100i0
bt-fw2          8000.000000000000       no              tap101i0

À ce stade, le trafic étiqueté provenant des machines virtuelles de pare-feu entrera dans leur propre pont pour que le trafic entre.

J'ai ensuite créé des VLAN pour chaque interface nécessitant un trafic étiqueté, ainsi que le réseau VLAN correspondant sur le pont principal pour le trafic non étiqueté.

Par exemple. VLAN 1, 4000-4005

bt-fw1.1       | 1  | bt-fw1
bt-fw1.4000    | 4000  | bt-fw1
bt-fw1.4001    | 4001  | bt-fw1
bt-fw1.4002    | 4002  | bt-fw1
bt-fw1.4003    | 4003  | bt-fw1
bt-fw1.4004    | 4004  | bt-fw1
bt-fw1.4005    | 4005  | bt-fw1
bt-fw2.1       | 1  | bt-fw2
bt-fw2.4000    | 4000  | bt-fw2
bt-fw2.4001    | 4001  | bt-fw2
bt-fw2.4002    | 4002  | bt-fw2
bt-fw2.4003    | 4003  | bt-fw2
bt-fw2.4004    | 4004  | bt-fw2
bt-fw2.4005    | 4005  | bt-fw2
bt.1           | 1  | bt
bt.4000        | 4000  | bt
bt.4001        | 4001  | bt
bt.4002        | 4002  | bt
bt.4003        | 4003  | bt
bt.4004        | 4004  | bt
bt.4005        | 4005  | bt

Ensuite, pour chaque VLAN, un pont est créé, qui combine tous les VLAN respectifs de chaque interface pour permettre une communication sans étiquette entre le pont principal et les ponts de machine virtuelle.

bt.v1                   8000.2a8c73ad057d       no      bt-fw1.1
                                                        bt-fw2.1
                                                        bt.1
bt.v4000                8000.2a8c73ad057d       no      bt-fw1.4000
                                                        bt-fw2.4000
                                                        bt.4000
bt.v4001                8000.2a8c73ad057d       no      bt-fw1.4001
                                                        bt-fw2.4001
                                                        bt.4001
bt.v4002                8000.2a8c73ad057d       no      bt-fw1.4002
                                                        bt-fw2.4002
                                                        bt.4002
bt.v4003                8000.2a8c73ad057d       no      bt-fw1.4003
                                                        bt-fw2.4003
                                                        bt.4003
bt.v4004                8000.2a8c73ad057d       no      bt-fw1.4004
                                                        bt-fw2.4004
                                                        bt.4004
bt.v4005                8000.2a8c73ad057d       no      bt-fw1.4005
                                                        bt-fw2.4005
                                                        bt.4005

Cela autorise désormais les interfaces à ressources partagées avec les machines virtuelles de pare-feu, avec uniquement les VLAN que je veux.

Tous les futurs invités qui ont besoin d’un seul VLAN non balisé, peuvent simplement être ajoutés à la liste respective. bt.X pont.

L'ajout d'interfaces IP d'hôte est aussi simple que d'ajouter l'IP au pont de VLAN correspondant.

Par exemple.

ip addr add 192.168.100.1/24 dev bt.v4005

Un script d'aide

Comme mon /etc/network/interfaces Le fichier risquant de devenir rapidement très volumineux, j’ai écrit un petit script qui permet une configuration minimale, mais avec le même résultat final.

dans le /etc/network/interfaces fichier qu'il contient

# bridge bt-c0-fw1 vlan 1 4000-4005 interfaces tap100i0
# bridge bt-c0-fw2 vlan 1 4000-4005 interfaces tap101i0
# bridge bt vlan 1 4000-4005 interfaces eth0
# bridge-vlan bt vlan 1 4000-4005 interfaces bt-fw1 bt-fw2 bt

auto eth0
iface eth0 inet manual
  post-up /scripts/build-bridges.sh || /bin/true

Puis dans le script post-up, /scripts/build-bridges.sh 

#!/bin/bash

CONFIG="/etc/network/interfaces"
DEFINERS="vlan|interfaces"
DEBUG=0

# Tear down all interfaces
modprobe -r 8021q
modprobe 8021q

brctl show | awk 'NR>1{print $1}' | while read BRIDGE; do
  ifconfig "$BRIDGE" down
  brctl delbr "$BRIDGE"
done

function run()
{
  if [ $DEBUG -eq 1 ]; then
    echo "$@"
  else
    eval "$@"
  fi
}

function get_vars()
{
  DATA=( $(echo "$2" | grep -Eoh "$1.+?" | sed -E "s/^$1 //g;s/($DEFINERS).+//g") )
  for VAL in ${DATA[@]}; do
    echo $VAL | grep -qE "[0-9]+-[0-9]+"
    if [ $? -eq 0 ]; then
      LOWER=$(echo $VAL | cut -f1 -d"-")
      UPPER=$(echo $VAL | cut -f2 -d"-")
      for i in $(seq $LOWER $UPPER); do
        echo $i
      done
    else
      echo $VAL
    fi
  done
}

# Build bridges
while read LINE; do
  BRIDGE=$(get_vars bridge "$LINE")
  if [[ ! "$BRIDGE" == "" ]]; then
    run brctl addbr $BRIDGE
    run ifconfig $BRIDGE up
    for INTERFACE in $(get_vars interfaces "$LINE"); do
      ifconfig $INTERFACE >/dev/null 2>&1
      if [ $? -eq 0 ]; then
        run brctl addif $BRIDGE $INTERFACE
      fi
    done
    run ifconfig $BRIDGE up
    for VLAN in $(get_vars vlan "$LINE"); do
      run vconfig add $BRIDGE $VLAN 2>&1 | grep -vE "(VLAN 1 does not work|consider another number)"
      run ifconfig $BRIDGE.$VLAN up
    done
  fi
done < <(grep -E "^# bridge " $CONFIG)

# Build vlan bridges
while read LINE; do
  BRIDGE=$(get_vars "bridge-vlan" "$LINE")
  for VLAN in $(get_vars " vlan" "$LINE"); do
    run brctl addbr $BRIDGE.v$VLAN
    run ifconfig $BRIDGE.v$VLAN up
    for INTERFACE in $(get_vars interfaces "$LINE"); do
      ifconfig $INTERFACE.$VLAN >/dev/null 2>&1
      if [ $? -eq 0 ]; then
        run brctl addif $BRIDGE.v$VLAN $INTERFACE.$VLAN
      fi
    done
  done
done < <(grep -E "^# bridge-vlan " $CONFIG)

exit 0

J'espère que cela aide quelqu'un d'autre. J'ai passé des journées à lire et à tester, ce qui semble être la solution la plus élégante et la plus facile à gérer.

Il y a de la bonne lecture ici aussi http://blog.davidvassallo.me/2012/05/05/kvm-brctl-in-linux-bringing-vlans-to-the-guests/


6
2017-10-03 21:49