Назад | Перейти на главную страницу

Как направить весь трафик виртуальных машин через определенный физический интерфейс через мост Linux?

Моя цель состоит в том, чтобы все гостевые виртуальные машины KVM отправляли и получали трафик на em2 с адресами на 192.168.2.0/24 подсеть.

У меня есть хост-машина Linux (CentOS 7) с несколькими сетевыми адаптерами, 2 из которых используются в этом сценарии, em1 и em2.

Интерфейс em1 имеет IP-адрес 192.168.0.131. В em2 интерфейс был прикреплен к br0, поэтому у него нет IP-адреса, но br0 был назначен IP-адрес 192.168.2.1.

Я создал маршрут на моем брандмауэре Netgear, чтобы направить 192.168.2.0/24 трафик в 192.168.2.1 но этот адрес не отображается как подключенное устройство 192.168.0.131 возможно, потому что это виртуальный мост Linux.

С хост-виртуальной машины я могу пропинговать как «мост-шлюз», гостевую виртуальную машину, так и шлюз межсетевого экрана в Интернет:

[root@boss ~]# ping -c1 192.168.2.1
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.085 ms

[root@boss ~]# ping -c1 192.168.2.10
64 bytes from 192.168.2.10: icmp_seq=1 ttl=64 time=0.476 ms

[root@boss ~]# ping -c1 192.168.0.254
64 bytes from 192.168.0.254: icmp_seq=1 ttl=64 time=4.17 ms

А с гостевой ВМ я могу пинговать em1, но не интернет-шлюз, 192.168.0.254:

[root@localhost ~]# ping -c1 192.168.0.131
64 bytes from 192.168.0.131: icmp_seq=1 ttl=64 time=0.282 ms

[root@localhost ~]# ping -c1 192.168.0.254
PING 192.168.0.254 (192.168.0.254) 56(84) bytes of data.

--- 192.168.0.254 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Это мой конфиг для em2:

DEVICE=em2
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0

И br0:

DEVICE=br0
BOOTPROTO=none
ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.2.1
PREFIX=24
GATEWAY=192.168.0.254
ZONE=public
STP=no

Моя таблица маршрутизации на хосте ВМ:

[root@boss ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.254   0.0.0.0         UG    0      0        0 em1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 em1
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 br0

Гостевая виртуальная машина была запущена с virt-install:

virt-install \
  --name vm-guest-1 \
  --network bridge=br0 \
  --virt-type kvm \

Гостевая ВМ eth0:

DEVICE="eth0"
BOOTPROTO="none"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR="192.168.2.10"
NETMASK=255.255.255.0

И таблица маршрутизации гостевых ВМ:

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 eth0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

По запросу вывод моего хост-моста:

[root@boss ~]# brctl show
bridge name     bridge id           STP enabled    interfaces
br0             8000.d4ae529de039   no             em2
                                                   vnet0

Вопрос / проблема:

Как мне / почему я не могу выполнить маршрутизацию на гостевую виртуальную машину или, скорее, почему моя гостевая виртуальная машина не может выйти в Интернет?

У вас есть два основных варианта:

  1. В вашей текущей конфигурации vnet0 и em2 соединены мостом, поэтому виртуальная машина может подключаться к устройству Netgear без маршрутизации. Вам просто нужно назначить виртуальной машине адрес в 192.168.0.0/24 или используйте DHCP.
  2. Если вам нужно проложить маршрут, удалите em2 интерфейса от моста и назначьте ему адрес в 192.168.0.0/24. Затем добавьте новую таблицу маршрутизации в /etc/iproute2/rt_tables:

    100 vms
    

    Теперь добавьте правило выбора таблицы маршрутизации и маршрут по умолчанию для ваших виртуальных машин:

    ip route add default dev em2 via 192.168.0.254 table vms
    ip rule add iif br0 table vms
    

    Кроме того, вам необходимо изменить статический маршрут на устройстве Netgear, чтобы он указывал на em2адрес.

редактировать: Во второй конфигурации Ethernet-кадры от виртуальных машин не попадают в физическую сеть. Дополнительная таблица маршрутизации выбирается только тогда, когда нужно что-то маршрутизировать с моста. br0 (т.е. виртуальных гостей) и отправляет трафик через em2 вместо того em1 (маршрут по умолчанию в основной таблице). Вы можете увидеть сразу все таблицы маршрутизации с помощью:

ip route show table all

Вы можете узнать больше о таблицах маршрутизации на Руководство по администрированию сети на уровне IP в Linux.