Сервер в кармане, или просто о сложном!

главная - Статьи - Виртуализация

Создаем изолированную сеть для виртуальных машин 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

Удачи!

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?