Моя цель состоит в том, чтобы все гостевые виртуальные машины 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
Вопрос / проблема:
Как мне / почему я не могу выполнить маршрутизацию на гостевую виртуальную машину или, скорее, почему моя гостевая виртуальная машина не может выйти в Интернет?
У вас есть два основных варианта:
vnet0
и em2
соединены мостом, поэтому виртуальная машина может подключаться к устройству Netgear без маршрутизации. Вам просто нужно назначить виртуальной машине адрес в 192.168.0.0/24
или используйте DHCP.Если вам нужно проложить маршрут, удалите 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.