Мне нужно виртуализировать pfSense с помощью KVM. В настоящее время pfSense работает на голом металле. Однако я не уверен, как поступить так, чтобы не создавать угрозу безопасности.

Машина, на которой я запускаю pfSense, не поддерживает Vt-d/IOMMU, только Vt-x. Если я правильно понимаю, это означает, что я не могу просто передать управление устройством PCI в pfSense, но мне нужно использовать virtio для назначения интерфейса Ethernet. Он имеет два порта Intel Gigabit Ethernet, один из которых подключен к интернет-провайдеру (WAN), а другой - к моей домашней сети (LAN).

Как мне нужно настроить Linux соотв. KVM, поэтому хост vm не может использовать порт WAN? Я хочу избежать того, чтобы linux, на котором работает KVM, мог напрямую обращаться к порту WAN - он должен использовать только порт LAN, а внешний трафик должен проходить через pfSense.

1 ответ1

1

Вы можете использовать мостовую сеть, оставляя мост (на стороне хоста) без какой-либо конфигурации IP.

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

Как это сделать, зависит от ваших предпочтений и от того, какой сетевой агент / менеджер вы используете. Поэтому я просто представлю концепцию с помощью ip:


Создать мост:

ip link add name br0 type bridge

Подключите сетевой адаптер для виртуальной машины («WAN-порт») к мосту:

ip link set enp3s0 master br0

(замените enp3s0 на имя интерфейса вашего "порта WAN")

Создайте tap для подключения виртуальной машины к мосту:

ip tuntap add name tap0 mode tap

Подключите tap к мосту:

ip link set tap0 master br0

Чтобы избежать какой-либо автоконфигурации IPv6, вы можете использовать sysctl disable_ipv6 :

sysctl net.ipv6.conf.enp3s0.disable_ipv6=1
sysctl net.ipv6.conf.br0.disable_ipv6=1
sysctl net.ipv6.conf.tap0.disable_ipv6=1

Поднимите интерфейсы:

ip link set enp3s0 up
ip link set br0 up
ip link set tap0 up

Затем вы можете использовать -net tap в qemu. Например, -net tap,ifname=tap0,script=no,downscript=no . (Вы также можете добавить ,vhost=on для лучшей производительности.)

На самом деле вы можете использовать ,script=someup.sh,downscript=somedown.sh чтобы сообщить qemu, что сценарии должны запускаться соответственно, когда виртуальная машина / нажатие переключается вверх и вниз. Тем не менее, IMHO, это не очень хороший способ, так как сценарии, вероятно, нужно будет запускать с правами root, поэтому, если вы используете эти параметры, виртуальная машина также должна быть запущена с правами root. Поэтому я бы предпочел обернуть qemu следующим образом, если я хочу подобный подход:

#!/bin/bash
sudo /path/to/someup.sh
qemu-system-x86_64 ...
sudo /path/to/somedown.sh

Если вы предпочитаете, чтобы этот tap динамически создавался и удалялся при загрузке и завершении работы виртуальной машины, вы можете использовать qemu-bridge-helper . Для этого, пропустите шаги , описанные выше , которые связаны с tap Вместо этого вам нужно создать список контроля доступа:

[tom@localhost ~]$ cat /etc/qemu/bridge.conf 
allow br0

Очевидно, это список мостов, которые разрешено использовать qemu-bridge-helper .

Как только это будет сделано, вы можете использовать -net bridge в qemu. Вам может понадобиться или не нужно указывать используемый мост и / или путь к qemu-bridge-helper . Например, -net bridge,br=br0,helper=/usr/lib/qemu/qemu-bridge-helper .


Обратите внимание, что в дополнение к -net tap или -net bridge вам также необходимо добавить -net nic . Речь идет о представлении интерфейса на гостевой стороне. Например, -net nic,model=virtio . Вы можете указать MAC-адрес с помощью ,macaddr=xx:xx:xx:xx:xx:xx . Если вы это сделаете, НЕ используйте MAC-адреса интерфейсов на стороне хоста , которые участвуют (например, enp3s0, br0 и tap0, в этом примере), иначе он не будет работать. Если вы не укажете один, qemu будет использовать значение по умолчанию 52:54:00:12:34:56 . Поэтому, если вы не собираетесь иметь несколько виртуальных машин, которые связаны между собой, это необязательно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .