главная - Статьи - Виртуализация
Создаем изолированную сеть для виртуальных машин KVM
Теги: Linux Виртуальные машины kvm
Ранее мы создали виртуальную машину, потом склонировали ее. Далеко не всегда нужно, чтобы виртуальная машина имела возможность выходить в интернет. Например, необходим режим повышенной секретности для обработки какой-то информации. Вы хотели бы иметь возможность управлять рабочим столом (через VNC, например), но при этом никакие данные даже теоретически не должны иметь возможность покинуть пределы виртуальной сети. Применений масса, равно как и способов реализации задачи. Мы просто рассмотрим один из вариантов.
Сейчас мы шаг за шагом создадим изолированную от внешнего мира сеть для виртуальных машин KVM. Сеть пусть будет 10.10.24.0/24. Назовем ее "my-isolated-net". Виртуальные машины смогут взаимодействовать между собой и с хостом, но не смогут выйти за пределы хоста.
Я направо и налево делаю ls -al
и прочие проверки, чтобы наблюдать результаты выполнения команд. Постарайтесь относиться к этому спокойнее, ведь нет смысла бездумно копипастить очередной мануал. Лучше понимать, что происходит на каждом шаге. И еще - в моем случае я уже успел насоздавать сетей, поэтому листинги команд у вас могут немного отличаться, но это не имеет значения.
Следующие три команды советую не только выполнить, но и скопировать их вывод куда-либо (в блокнот, например) для будущего сравнения "было - стало".
# ip addr | grep virbr
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
8: virbr2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
inet 192.168.182.1/24 brd 192.168.182.255 scope global virbr2
9: virbr2-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr2 state DOWN qlen 500
10: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr2 state UNKNOWN qlen 500
11: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr2 state UNKNOWN qlen 500
Посмотрим уже созданные сети:
# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes isolated-net active yes yes private active yes yes
Каждой сети соответствует свой файл XML:
# ls -al /etc/libvirt/qemu/networks/
total 24
drwx------. 3 root root 4096 Nov 23 15:44 .
drwx------. 4 root root 4096 Nov 23 16:34 ..
drwx------. 2 root root 4096 Nov 23 15:47 autostart
-rw-------. 1 root root 576 Nov 12 14:11 default.xml
-rw-------. 1 root root 562 Nov 23 15:44 isolated-net.xml
-rw-------. 1 root root 353 Nov 21 11:34 private.xml
Содаем XML файл настроек будущей изолированной сети "my-isolated-net":
# nano /root/my-isolated-net-template.xml <network> <name>my-isolated-net</name> <bridge name="virbr3" /> <ip address="10.10.24.1" netmask="255.255.255.0"> <dhcp> <range start="10.10.24.10" end="10.10.24.20" /> </dhcp> </ip> </network>
Это - шаблон для создания сети. Финальный конфиг будет создан автоматически чуть позже (как и не существующий пока что интерфейс virbr3). Если вы сравните этот шаблон с конфигом уже существующей сети, например, default, вы заметите, что к шаблоне нет параметра UUID и др. Уникальный идентификатор сети будет создан автоматически в дальнейшем. И файл конфига у вас появится в /etc/libvirt/qemu/networks.
Примеры с описанием смыслов можно посмотреть здесь: http://libvirt.org/formatnetwork.html#examplesPrivate
Для создания изолированной сети параметр forward (включает nat для сети) не указан. Виртуальные машины смогут видеть хост по ip 10.10.24.1, но не более. В сеть "за хостом" они выйти не смогут.
Создаем на основе этого файла новую виртуальную сеть:
# virsh net-create /root/my-isolated-net-template.xml
Network my-isolated-net created from /root/my-isolated-net-template.xml
Отлично. Можно посмотреть, появилась ли сеть:
# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes isolated-net active yes yes my-isolated-net active no yes private active yes yes
Так, все ок, но сеть не стартует при перезагрузке хоста, что может вызвать проблемы у гостевых виртуальных машин. Исправляем:
# virsh net-autostart my-isolated-net
Тут может быть подвох:
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 для нашей сети:
# ls -al /etc/libvirt/qemu/networks/ total 28 drwx------. 3 root root 4096 Nov 23 17:11 . drwx------. 4 root root 4096 Nov 23 16:34 .. drwx------. 2 root root 4096 Nov 23 15:47 autostart -rw-------. 1 root root 576 Nov 12 14:11 default.xml -rw-------. 1 root root 562 Nov 23 15:44 isolated-net.xml -rw-------. 1 root root 559 Nov 23 17:11 my-isolated-net.xml -rw-------. 1 root root 353 Nov 21 11:34 private.xml
Итак, мы создали новую виртуальную сеть 10.10.24.0/24 с именем "my-isolated-net".
Кстати! Выдохните, сохраните все важное и попробуйте перезагрузить хост. Для чего? Чтобы понимать, что в случае выключения питания у вас все нормально поднимется и будет готово к работе, а не зависнет что-то. Если вы твердо знаете, что все сделали правильно (или просто не имеете возможности перезагрузить хост сейчас), можете не перезагружаться.
# shutdown -r now
После перезагрузки убедитесь, что сеть запущена, если нет, то запустите ее:
# virsh net-autostart my-isolated-net
Также можно посмотреть вывод ip addr (в листинге приведу только новое добавленное):
# ip addr | grep virbr
...
7: virbr3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
inet 10.10.24.1/24 brd 10.10.24.255 scope global virbr3
8: virbr3-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr3 state DOWN qlen 500
...
Вот теперь вы можете спокойно сравнить начальные листинги команд с полученными сейчас, пошагово посмотреть, какие команды вы вводили и где были опечатки или ошибки:
# history
В общем, считаем, что мы успешно добавили новую приватную сеть, которой на хосте соответствует интерфейс virbr3.
Подключить гостевой машине новый сетевой интерфейс, подключенный к этой сети, можно командой (останавливать виртуальную машину не нужно):
# virsh attach-interface vm3 --type bridge --source virbr3 --model virtio --config --live --persistent
Interface attached successfully
После этого уже внутри виртуальной машины vm3 смотрим имя нового сетевого адаптера (например, с помощью ip addr), создаем конфиг для нового интерфейса (например, для eth1) и получаем ip-адрес:
# ip addr 1: lo:mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:9e:76:2b brd ff:ff:ff:ff:ff:ff inet 192.168.122.237/24 brd 192.168.122.255 scope global dynamic eth0 valid_lft 2397sec preferred_lft 2397sec inet6 fe80::5054:ff:fe9e:762b/64 scope link valid_lft forever preferred_lft forever 3: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:3b:6e:3f brd ff:ff:ff:ff:ff:ff
Считаем, что новый интерфейс - eth1. Создаем для него, например, такой конфиг:
# nano /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE=Ethernet BOOTPROTO=dhcp DEFROUTE=no PEERDNS=no PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eth1 DEVICE=eth1 ONBOOT=yes NOZEROCONF=yes NM_CONTROLLED=no
Рестартуем сеть:
# systemctl stop NetworkManager
# systemctl disable NetworkManager
# chkconfig network on
# service network restart
Если eth1 почему-то не получает ip-адрес, попробуйте это:
# dhclient eth1
В общем-то, это все. Если вам не нравится, что у eth0 есть UUID, а у eth1 пока нет - создайте его и впишите в конфиг:
# uuidgen eth1
884e233c-d946-432d-9426-52ce13fe4a9f
# echo "UUID=884e233c-d946-432d-9426-52ce13fe4a9f" >> /etc/sysconfig/network-scripts/ifcfg-eth1
Отключить сетевой адаптер (бывает и такое надо) от гостя:
virsh detach-interface vm3 --mac '52:54:00:3b:6e:3f' --type bridge --persistent
Удачи!
Сервер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
Авторизуйтесь для добавления комментариев!