Как сделать изолированную сеть kvm

Обновлено: 04.07.2024

Настройка сети для виртуальных машин в kvm очень похожа на настройку в qemu, поэтому любая документация к qemu подходит и для kvm. В этой статье описывается как настроить наиболее часто используемые типы подключения виртуальной машины к сети. Эта статья основана на Networking - KVM.

Варианты использования:

  • Вам нужен простой способ дать виртуальной машине доступ в Интернет и в вашу локальную сеть;
  • Вам не нужен доступ к виртуальной машине из сети или из других виртуальных машины;
  • Вы готовы пожертвовать производительностью;
  • Внимание: пользовательская сеть не поддерживает некоторые возможности сетей, например ICMP, поэтому некоторые приложения (такие как ping) могут работать неправильно.
  • Настроенная и запущенная виртуальная машина;
  • Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
  • Если виртуальной машине нужен доступ в Интернет или в локальную сеть, то у хост-системы должен быть доступ в эти сети.
  • Просто запустите виртуальную машину с параметрами "-net nic -net user", например:

Варианты использования:

  1. Организация сети между двумя или более виртуальными машинами. Эта сеть не будет доступна ни другим виртуальным машинам, ни из реальной сети.
  2. Организация сети между виртуальными машинами и хост-системой. От первого варианта отличается только добавлением адреса на мостовой интерфейс хоста. Если возникнет потребность, можно добавить реальный интерфейс в мост, тогда виртуальные машины будут подключены к реальной LAN.
  • Настроенная и запущенная виртуальная машина;
  • Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
  • Вам понадобятся следующие программы:

Если вы не хотите запускать их из под root-a, то вам понадобится настроить sudo для их запуска.

В Седьмой платформе

  • Во-первых, можно стартовать виртуальные машины с помощью libvirtd и управлять ими посредством virsh, при этом всё будет сделано автоматически. Нужно только правильно указать интерфейс (опция --network bridge).
  • Во-вторых, можно использовать мостовой интерфейс virbr0, который появляется в системе после установки пакета kvm. Интерфейсу уже назначен IP 192.168.122.1/24 (см. конфигурация ю файле /etc/libvirt/qemu/networks/default.xml).

Перед запуском виртуальной машины создайте tap-интерфейс, добавьте его мост и потом используйте его при запуске kvm:

Создать tap-интерфейсы и добавить их в мост можно и с помощью скриптов /etc/net (см. man etcnet).

  • В-третьих, можно использовать системный скрипт для запуска мостового интерфейса: /etc/init.d/bridge, достаточно создать нужное количество виртуальных интерфейсов, добавить их в /etc/sysconfig/bridge и запустить "службу" bridge:

Скрипт /etc/init.d/bridge при этом нельзя запускать автоматически при старте системы, но запускайте только вручную от пользователя с помощью sudo:

В дальнейшем виртуальные машины нужно запускать с использованием этих готовых интерфейсов, например:

В старых дистрибутивах

  • Нужно создать и сконфигурировать мост, например:
  • Для связи по сети между виртуальной машиной и хост-системой нужно задать адрес IP мосту, например:

или, чтобы не задавать адрес вручную, создайте файл /etc/net/ifaces/br1/ipv4address, содержащий единственную строку "192.168.100.1/2" (Это не обязательно, если доступ по сети в/из виртуальную машину не нужен.)

Также можно сконфигурировать сервер DHCP, чтобы он выдавал адреса в подсети интерфейса br1 (см. man dhcpd).

- наличие двух сетевых карт на хосте eth0 и eth1 подключенных к локальной сети, - интерфейс eth0 настроен и работает в сети, eth1 включен настройки не обязательны

  • Создать мост br0 (некоторые разработчики считают, что команды tunctl и brctl устарели)
  • Создать скрипт qemu-ifup следующего содержания без sudo и "устаревших" утилит:
  • Создать скрипт qemu-ifup следующего содержания (c использованием sudo, возможно необходимы предварительные настройки):
  • Сгенерировать MAC-адрес вручную или автоматически, используя скрипт:
  • Запустить каждую виртуальную машину, заменяя $macaddress значением, полученным на предыдущем шаге:
  • Внутри каждой виртуальной машины нужно сконфигурировать уникальный адрес IP из одной и той же подсети.

Работа с предварительно созданными иинтерфейсами

Можно заранее (в стартовом скрипте) настроить все интерфейсы и затем использовать их в виртуальных машинах. При этом обязательно нужно указывать опцию script=no:

  • Если вы не хотите запускать машину от root-а, то скрипт qemu-ifup должен корректно работать от вашего пользователя;
  • Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
  • Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.
  • Для включения в мост необходимо использовать интерфейсы tap, но не tun. Дело в том, что у интерфейсов tun нет заголовков ethernet, которые требуются для работы моста.

Предупреждение: Данный метод может не работать с большинством беспроводных устройств.

Варианты использования:

  • Вы хотите назначать IP-адреса виртуальным машинам и сделать их доступными из локальной сети;
  • Вы хотите большой производительности от виртуальной машины.
  • Настроенная и запущенная виртуальная машина;
  • Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
  • Вам понадобятся следующие программы. Если вы не хотите запускать их из под root-a, по вам понадобится настроить sudo для их запуска:
  • Хост-система должна иметь доступ в интернет и в локальную сеть.

Вариант №1: Использование средств дистрибутива

  • Создать файл /etc/net/ifaces/breth0/options следующего содержания:
  • Применить новые настройки сети командой:
  • Интерфейс моста breth0 должен получить IP-адрес, а интерфейс eth0 должен быть без адреса.

Особенности VLANов

Если вы используете VLANы но до виртуальной машины трафик не доходит, выполните команды:


Варинат №2: "Ручной"

  • Создать мост командой:
  • Добавить физический интерфейс в этот мост, например eth0:
  • Создать скрипт qemu-ifup следующего содержания:
  • Сгенерировать MAC-адрес вручную или автоматически, используя скрипт:
  • Запустить каждую виртуальную машину, заменяя $macaddress значением, полученным на предыдущем шаге:
  • Если вы не хотите запускать машину от root-а, то скрипт qemu-ifup должен корректно работать от вашего пользователя;
  • Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
  • Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.

Также вы можете объединить виртуальные машины tap-интерфесом в хост-системе и настроить правила iptables в хост-система, чтобы она была маршутизатором и сетевым экраном для виртуальных машин.

Настройки маршрутизации сводятся к созданию маршрута по умолчанию в виртуальной машине, указывающего на хост-систему, разрешение пересылки пакетов (IP forwarding) и настройки маршрута на tap-интерфейс виртуальной машины в хост-системе.

Заблаговременно проверьте настройки:

  • Хост-система: Разрешить пересылку пакетов и добавить маршрут до виртуальной машины (должно быть помещено в скрипт - маршрут необходимо добавить после запуска виртуальной машины):
  • Виртуальная машина: маршрут по умолчанию указывает на хост-систему (<ip-of-host> должен быть в одной сети с <ip-of-client>):
  • Виртуальная машина v2: если IP-адрес хост-системы не в одной сети с <ip-of-client>, тогда надо вручную добавить маршрут до хост-системы перед добавлением маршрута по умолчанию:

Другой способ настройки сети это VDE (Virtual Distributed Ethernet).

Под большой нагрузкой сетевой интерфейс в гостевой машине с ОС Windows перестаёт принимать и отправлять пакеты в хост-машину. Такое поведение характерно для любой модели виртуального интерфейса и для любой версии Windows в QEMU-KVM как минимум до версии 1.4.

Существует обходное решение: нужно заново проинициализировать сетевой интерфейс гостевой машины. Либо это можно сделать из гостевой ОС, либо из хост-машины парой команд virsh detach-interface и atttach-interface (и это надёжнее). Проверяем работоспособность при этом, очевидно, командой ping. Варианты скриптов для гостевой машины: [1], [2]. В скрипте для хоста перед проверкой пинга требуется проверить, работает ли гостевая ОС.

Создаем изолированную сеть для виртуальных машин KVM


Ранее мы создали виртуальную машину, потом склонировали ее. Далеко не всегда нужно, чтобы виртуальная машина имела возможность выходить в интернет. Например, необходим режим повышенной секретности для обработки какой-то информации. Вы хотели бы иметь возможность управлять рабочим столом (через VNC, например), но при этом никакие данные даже теоретически не должны иметь возможность покинуть пределы виртуальной сети. Применений масса, равно как и способов реализации задачи. Мы просто рассмотрим один из вариантов.

Сейчас мы шаг за шагом создадим изолированную от внешнего мира сеть для виртуальных машин KVM. Сеть пусть будет 10.10.24.0/24. Назовем ее "my-isolated-net". Виртуальные машины смогут взаимодействовать между собой и с хостом, но не смогут выйти за пределы хоста.

Я направо и налево делаю ls -al и прочие проверки, чтобы наблюдать результаты выполнения команд. Постарайтесь относиться к этому спокойнее, ведь нет смысла бездумно копипастить очередной мануал. Лучше понимать, что происходит на каждом шаге. И еще - в моем случае я уже успел насоздавать сетей, поэтому листинги команд у вас могут немного отличаться, но это не имеет значения.

Следующие три команды советую не только выполнить, но и скопировать их вывод куда-либо (в блокнот, например) для будущего сравнения "было - стало".

Посмотрим уже созданные сети:

Каждой сети соответствует свой файл XML:

Содаем XML файл настроек будущей изолированной сети "my-isolated-net":

Это - шаблон для создания сети. Финальный конфиг будет создан автоматически чуть позже (как и не существующий пока что интерфейс virbr3). Если вы сравните этот шаблон с конфигом уже существующей сети, например, default, вы заметите, что к шаблоне нет параметра UUID и др. Уникальный идентификатор сети будет создан автоматически в дальнейшем. И файл конфига у вас появится в /etc/libvirt/qemu/networks.

Для создания изолированной сети параметр forward (включает nat для сети) не указан. Виртуальные машины смогут видеть хост по ip 10.10.24.1, но не более. В сеть "за хостом" они выйти не смогут.

Создаем на основе этого файла новую виртуальную сеть:

Отлично. Можно посмотреть, появилась ли сеть:

Так, все ок, но сеть не стартует при перезагрузке хоста, что может вызвать проблемы у гостевых виртуальных машин. Исправляем:

Тут может быть подвох:

error: failed to mark network my-isolated-net as autostarted
error: Requested operation is not valid: cannot set autostart for transient network

Собственно, конфига сети в папке /etc/libvirt/qemu/networks/ еще не создано, пока все "на честном слове". Решить проблему просто:

virsh net-edit my-isolated-net

и добавляем хотя бы одну пустую строку внизу конфига. Сохраняем изменения и повторно пытаемся включить автостарт сети. Вот теперь мы видим, что появился конфиг my-isolated-net.xml для нашей сети:

Итак, мы создали новую виртуальную сеть 10.10.24.0/24 с именем "my-isolated-net".

Кстати! Выдохните, сохраните все важное и попробуйте перезагрузить хост. Для чего? Чтобы понимать, что в случае выключения питания у вас все нормально поднимется и будет готово к работе, а не зависнет что-то. Если вы твердо знаете, что все сделали правильно (или просто не имеете возможности перезагрузить хост сейчас), можете не перезагружаться.

После перезагрузки убедитесь, что сеть запущена, если нет, то запустите ее:

Также можно посмотреть вывод ip addr (в листинге приведу только новое добавленное):

Вот теперь вы можете спокойно сравнить начальные листинги команд с полученными сейчас, пошагово посмотреть, какие команды вы вводили и где были опечатки или ошибки:

В общем, считаем, что мы успешно добавили новую приватную сеть, которой на хосте соответствует интерфейс virbr3.

Подключить гостевой машине новый сетевой интерфейс, подключенный к этой сети, можно командой (останавливать виртуальную машину не нужно):

После этого уже внутри виртуальной машины vm3 смотрим имя нового сетевого адаптера (например, с помощью ip addr), создаем конфиг для нового интерфейса (например, для eth1) и получаем ip-адрес:

Считаем, что новый интерфейс - eth1. Создаем для него, например, такой конфиг:

Если eth1 почему-то не получает ip-адрес, попробуйте это:

В общем-то, это все. Если вам не нравится, что у eth0 есть UUID, а у eth1 пока нет - создайте его и впишите в конфиг:

Отключить сетевой адаптер (бывает и такое надо) от гостя:

Сервер iperf на сервер1 (виртуалка kvm, сетевой адаптер говорит, что 10 Гбит сеть)
Сервер2 тоже на том же kvm, на том же сетевом адаптере висит.
Ноут обычный, через 1 коммутатор гигабитный подключен к хосту kvm.

Ноут -> сервер1: 895 Mbits/sec
(коммутатор и сетевухи 1 Гбит)

сервер2 -> сервер1:
iperf-3.1.3-win64>iperf3.exe -c 192.168.2.37 -p 5201 -t 10 -P 8
[SUM] 0.00-10.00 sec 1.96 GBytes 1.69 Gbits/sec sender
[SUM] 0.00-10.00 sec 1.96 GBytes 1.68 Gbits/sec receiver

iperf-3.1.3-win64>iperf3.exe -c 192.168.2.37 -p 5201 -t 10 -P 2
[SUM] 0.00-10.00 sec 5.06 GBytes 4.35 Gbits/sec sender
[SUM] 0.00-10.00 sec 5.06 GBytes 4.35 Gbits/sec receiver


Когда вы настраиваете и используете мостовую сеть, гостевые операционные системы получают доступ к внешней сети, подключенной непосредственно к хост-машине. Мост можно создать либо с помощью диспетчера виртуальных машин, либо с помощью инструмента командной строки virsh , либо путем прямого редактирования сетевых сценариев, либо с помощью инструментов управления сетью Linux.

Шаг 1. Создание мостовой сети с помощью диспетчера виртуальных машин.

Выполните следующие действия, чтобы создать мост Linux из диспетчера виртуальных машин (GUI). В вашей системе должен быть установлен KVM.

Откройте диспетчер виртуальных машин и перейдите в меню «Правка»> «Сведения о подключении»> «Виртуальные сети».

Настройте новый сетевой интерфейс, щелкнув + в нижней части окна. Дайте виртуальной сети имя.

Выберите тип сети и политику пересылки.

Завершите настройку и сохраните свои конфигурации. Новая виртуальная сеть должна отображаться на странице обзора.

Для сети автоматически создается мост в хост-системе.

Шаг 2: Создайте мост KVM с помощью команды virsh.

Создайте новый XML-файл моста.

Добавьте в файл детали моста.

Чтобы определить сеть из файла XML без его запуска, используйте:

Чтобы запустить (ранее определенную) неактивную сеть, используйте:

Чтобы настроить автоматический запуск сети при запуске службы:

Подтвердите создание моста и IP-адрес.

Шаг 3: Создайте мост, отредактировав сетевые скрипты (CentOS / RHEL / Fedora):

Ниже скрипт создаст мост под названием br10.

Конфигурация интерфейса eth0, к которому я подключаюсь, будет следующей:

Перезагрузите сетевой демон.

Шаг 4: Создайте мост, отредактировав сетевые сценарии (Debian / Ubuntu):

Настроить интерфейс Bridging:

Отключите все строки в разделе интерфейса eth0, чтобы они выглядели примерно так:

Перезапустите сетевую службу.

Шаг 5: Использование инструмента Nmcli

Используйте nmcli инструмент командной строки управления сетью, чтобы создать мост Linux на желаемом интерфейсе. Давайте сначала перечислим все доступные подключения.

Поскольку мой мост будет создан на втором устройстве enp7s0 , я удалю существующее соединение, а затем создам мост с этим устройством.

1. Сохраните информацию, связанную с мостом, в переменных.

  • BR_NAME: имя создаваемого моста.
  • BR_INT: физическое сетевое устройство, которое будет использоваться в качестве ведомого моста.
  • SUBNET_IP: IP-адрес и подсеть, назначенные созданному мосту.
  • GW: IP-адрес шлюза по умолчанию.
  • DNS1 и DNS2: IP-адреса DNS-серверов, которые будут использоваться.

2. Определите новое мостовое соединение.

3. Измените мост, чтобы добавить IP-адрес, шлюз и DNS

4. Добавьте сетевое устройство как подчиненное устройство моста.

Шаг 6. Подключите сетевой мост

После того, как соединение с сетевым мостом будет создано, активируйте его.

Просмотрите детали моста, запустив его.

Команда ip addr должна выдать результат, аналогичный приведенному ниже.

Поздравляю . Вы успешно создали и настроили мостовую сеть для KVM в системе Linux.

Есть виртуалки. Мостом отлично кидаются в микротик. Вот так я их устанавливаю (пример):

Но одна из них (конкретно гость на windows 7) (а потом может быть и еще парочка) должны быть изолированы от сети микротика, но иметь выход в интернет.

К микротику физически подключены и другие устройства, так вот именно эта виртуалка не должна видеть устройства подключенные/проброшенные к микротику, и наоборот, эти устройства не должны видеть ее. Но сама виртуалка должна иметь доступ в интернет.

Проблема еще в том, что в случае ошибки я могу потерять сервер, и добраться до него физически это несколько дней) Может заодно порекомендуете, как поступать в таких случаях? Какой-то сервис надо написать/запустить на сервере, чтобы он сам перезапускал нормальную сеть/сервер если потерял связь с миром?)


Ну так смаршрутизируй их, а не закидывай в мост, делов-то. libvirt умеет через dnsmasq раздавать DHCP для интерфейсов виртуалок, останется только настроить файрвол соответствующим образом и всё.

Может заодно порекомендуете, как поступать в таких случаях?

Делать все изменения без записи в конфиги и ставить задачу в cron которая проверяет нормальное состояние сервера(активность сетевых интерфейсов, пинг до заданного узла, что-то еще) и при необходимости - восстанавливает старую конфигурацию. Или даже ребутает сервер.

Я бы виртуалки в отдельную сеть посадил, и на хосте рубил доступ. А не бриджем как у вас.


Раздать с помощью dhcp IPшник виртуалке, а уже на роутере резать все соединения с этого IPшника в локалку и обратно. Как то так:

FluffyPillow ★ ( 26.03.18 21:06:28 )
Последнее исправление: FluffyPillow 26.03.18 21:06:42 (всего исправлений: 1)


виртуалки подключать к br0

-A FORWARD -s 192.168.135.0/24 -i enp3s0 -o enp4s0 -m conntrack --ctstate NEW -j ACCEPT

не работает, т.к. пакеты приходят через br0, а работает оно из-за ACCEPT в policy для FORWARDING.

Чтобы изолировать гостевую систему от локалки (enp3s0) в FORWARD нужно будет вставить запрещающие правила (1-2 шт.)

"-A POSTROUTING -j MASQUERADE" в nat - зло! Если интернет приходит через enp3s0, то добавь "-o enp3s0"

Прочитав мое первую вводную статью, вы теперь знаете, что KVM - это не ужасный монстр, а мощное и дружественное к пользователю приложение для виртуализации под linux. Вы сами можете выбрать, что вам подходит больше - работать с графическим интерфейсом, или в командной строке. Сегодня мы продолжим ее изучение и поговорим о настройках сети, уделив также немного времени сетевым мостам, так как им будет посвящена отдельная статья.
Мы узнаем о том, как добавить в систему новые виртуальные адаптеры, настроить сети и диапазон IP-адресов с помощью DHCP, в чем разница между режимами NAT и Routed, как включать и отключать сети и другие полезные вещи.

Управление сетью в KVM

Управление сетью

Откройте Virtual Machine Manager (VMM). Откройте вкладку Edit > Host Details > Virtual Networks.

Вкладка управления носителями в KVM

Откроется раздел Network. По умолчанию здесь имеется одна настроенная сеть, автоматически запускающаяся при загрузке. Имя устройства подскажет вам, как вы можете идентифицировать сетевой адаптер.
В разделе IPv4 Configuration приводится более подробная информация о сети, включающая IP-адрес, маску подсети, диапазон адресов DHCP, а также тип форвардинга. Поговорим об этом более подробно.

Управление сетью

Добавление сети

Вы можете создавать отдельные виртуальные машины, каждая из которых запускается со своими собственными службами и изолирована от других гостевых систем. Но также вы можете создать новую сеть, со своим собственным диапазоном IP-адресов. Для этого необходимо добавить новую сеть. Нажмите зеленую кнопку с плюсом в левом нижнем углу:

кнопка для добавления сети

P.S. Кнопки, отвечающие за различные действия, обозначены интуитивно понятно. Позже, после создания новой сети, мы поговорим о них подробнее. При нажатии на зеленый плюс запустится мастер создания новой сети.

мастер добавления новой сети

Вы задаете имя сети, выбираете диапазон IP-адресов и настраиваете DHCP. Все тривиально.

ввод имени сети

ввод настроек сети

настройка DHCP

А теперь более интересная часть. Вам необходимо выбрать, будет ли это изолированная сеть, или будет разрешен доступ к внешним ресурсам.

настройка доступа к внешним ресурсам

Форвардинг позволит KVM обмениваться сетевыми пакетами с внешними сетями. В выпадающем списке вы можете выбрать устройство, к которому вы хотите пробросить свою виртуальную сеть. Например, на моем ноутбуке HP Pavilion имеется целый набор устройств. Здесь eth0 - это проводная сетевая карта, а eth1 - беспроводный адаптер.

выбор сети

Поле field более интересно. Без настроенного сетевого моста вы не сможете получать IP-адреса от внешнего DHCP-сервера (например, встроенного в маршрутизатор). Это значит, что гостевая система может работать только в режиме NAT. Однако для работы сервисов, которые должны напрямую общаться с внешней сетью, необходим сетевой мост. Теперь все готово и можно создать новую сеть.

добавление сети

Использование новых сетей.

Теперь у вас есть дополнительный сетевой адаптер, который вы можете выбирать при создании виртуальных машин. Это позволит надежно отделить их друг от друга. Кроме того, вы можете запускать, останавливать и удалять сетевые адаптеры с помощью кнопок Add/Stop.

список сетей

На этом можно закругляться. Не очень увлекательное чтиво, но полезное. Естественно, все эти операции можно выполнить из командной строки, но об этом в следующий раз.

Заключение

Управление сетями в KVM ничуть не сложнее, чем у других решений для виртуализации. Если вы чувствуете себя неуютно в командной строке, все необходимое есть в VMM. Графический интерфейс позволяет добавлять, удалять, активировать и деактивировать виртуальные адаптеры, изменять режим их работы и соединения, задавать IP-адреса, маски и диапазоны адресов DHCP. Все очень просто.
Сетевые мосты - это более специфичная и интересная вещь по сравнению с простым NAT, но о них мы поговорим в отдельной статье. В любом случае, вы уже подробно изучили один из аспектов KVM, что делает ее более понятной и дружелюбной.

Читайте также: