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

Как потребовать, чтобы вся сетевая активность проходила через гостевой брандмауэр KVM до достижения хоста?

Большая часть информации, с которой я столкнулся, касается настройки брандмауэра KVM с использованием мостового соединения.

Насколько я понимаю, это угроза безопасности, если сетевой трафик может достигать хоста без предварительного прохождения брандмауэра.

Я видел основной сетевой адаптер (например, eth0) быть установленным как сетевая карта виртуальной машины, однако это исключает доступ хоста к eth0?

Другой вариант, который приходит на ум, - это сквозная передача PCI сетевой карты, однако у меня возникли проблемы с этим методом.

Есть ли другие подходы к тому, чтобы трафик хоста сначала проходил через брандмауэр? Какой метод вы рекомендуете использовать?

Поскольку мост Linux создает соответствующий сетевой интерфейс (например, br0) на хосте, я не думаю, что есть способ сделать мост полностью недоступным для ОС хоста. Когда ваш брандмауэр работает, brctl show скажет вам, что интерфейсы eth0 и vnet0 привязаны к нему, но на самом деле он действует как три-портовый переключатель: один порт переходит в eth0, один идет к vnet0 (ВМ), и один идет к br0 интерфейс на хосте.

Возможно, вы могли бы создать ebtables правила для блокировки всех фреймов, идущих к хосту или от него br0 интерфейс. Это может быть лучший подход, но я недостаточно знаю о ebtables, чтобы предоставить какие-либо подробности о том, как это сделать.

Другой вариант - просто не настраивать какие-либо IP-адреса на интерфейсе моста, что должно помешать обычным приложениям обмениваться данными через него. Он по-прежнему будет доступен для таких приложений, как Wireshark, с правами суперпользователя (и это может пригодиться).

В системах на основе Debian (таких как Ubuntu) вы можете поместить следующее в /etc/network/interfaces:

auto br0
iface br0 inet manual
  bridge_ports eth0
  bridge_stp off

«Руководство» означает «не назначать никаких адресов при поднятии интерфейса»; он предназначен для установок, где что-то еще назначит адрес позже, но он также работает, когда вам просто не нужен адрес вообще.

Единственное исключение - это локальный адрес IPv6, который назначается ядром автоматически, а не сценариями сетевой настройки дистрибутива, так что вы получаете его даже при установке «вручную». Вы можете избежать этого, полностью отключив IPv6 в интерфейсе. Создать файл в /etc/sysctl.d и вставьте это:

net.ipv6.conf.br0.disable_ipv6=1

(Было бы неплохо, если бы вы могли полностью отключить IPv4 и в интерфейсе, но для этого нет соответствующей опции.)

Первая идея - разделить, какие интерфейсы используются для добавления сетевого доступа к виртуальным машинам, а какие - для управления хостом. Часто третий набор интерфейсов используется для доступа к изображениям виртуальных машин в каком-то общем сетевом хранилище. Таким образом, в идеале у вас будет 6 интерфейсов: 4 Gigabit Ethernet и 2 Ten Gigiabit Ethernet.

Вторая идея заключается в том, что вы можете использовать разные 802.1q VLAN для хоста и для виртуальных машин. Я построил сеть, в которой у нас были виртуальные машины в трех разных VLAN, и иногда одна виртуальная машина могла участвовать в нескольких VLAN (путем создания нескольких виртуальных сетевых адаптеров и соединения их с несколькими разными VLAN на хосте)

Обратите внимание, что серверное ПО часто имеет BMC, который используется для внеполосного управления хостом. По сути, это небольшой компьютер, у которого есть доступ к датчикам главного компьютера, он может видеть значения (температура, обороты вентилятора), включать / выключать / перезагружать хост, как если бы вы нажимали кнопку, даже имеет функциональность IP KVM и т. Д., И он имеет сетевой адрес сам по себе. Он также обычно реализует протокол IPMI. Он часто используется совместно с LAN1 (т.е.как небольшой коммутатор, а не совсем коммутатор - хост и BMC не могут обмениваться данными, но оба они коммутируются с внешними устройствами) или независимое гнездо Ethernet, которое направлено исключительно на BMC. Блейд-системы могут иметь один или два (дублирующих) BMC на корзину, а не в каждом блейд-сервере.

Безопасная установка выглядит так:

bond0 - это (eth0, eth1), объединенный LACP, он имеет IP-адрес на хосте и используется для управления хостом.

bond1 - это (eth2, eth3), объединенный LACP. Он разделен на vlans, т.е. хост имеет виртуальные подинтерфейсы bond1.10, bond1.552 и т. Д. Созданы мосты: br10 мосты bond1.10 и все интерфейсы на стороне хоста VM для виртуальных машин, которые участвуют в vlan 10, мосты br552 bond1.552 и все ВМ на стороне хоста для vlan 522 и так далее. Ни один из этих интерфейсов не имеет IP-адреса, поэтому виртуальные машины не могут связываться с хостом.

bond2 (eth4, eth5) объединен и используется для доступа к образам дисков виртуальных машин через iSCSI, CEPH, для синхронизации DRBD и так далее. У него есть IP-адрес на хосте, но он подключен к полностью отдельной сети хранения со своими особыми требованиями.

Bond0 и bond1 рекомендуется разделять физически, чтобы виртуальные машины не могли не только связываться с хостом, но даже загружать сеть управления хостом. Эта сеть используется, например, для передачи содержимого памяти виртуальной машины в случае динамической миграции на другой хост, и никакая виртуальная машина не может снизить производительность этого процесса.

Даже если вы создаете небольшую систему с одним физическим интерфейсом для размещения пяти виртуальных машин и вам нужно объединить функциональность bond0 и bond1, у вас может быть IP-адрес только на физическом интерфейсе (доступном как стандартный / собственный vlan) и субинтерфейсах, участвующих в мостах. с адаптерами на стороне хоста ВМ, все помечены. Тем не менее виртуальные машины не могли напрямую обращаться к хосту, а интеллектуальный коммутатор L2 и отдельное устройство межсетевого экрана или коммутатор L3 могли выполнять маршрутизацию между vlan и фильтрацию трафика.