KVM: Atribuindo portas Ethernet a uma VM exclusivamente

0

Eu preciso virtualizar o pfSense usando o KVM. Atualmente, o pfSense é executado em bare metal. No entanto, não tenho certeza sobre como proceder, de modo que não crie um risco de segurança.

A máquina em que estou executando o pfSense não suporta Vt-d / IOMMU, apenas Vt-x. Se eu entendi isso corretamente, significa que não posso passar o controle sobre o dispositivo PCI para o pfSense, mas preciso usar o virtio para atribuir a interface ethernet. Ele tem duas portas Intel Gigabit Ethernet, uma conectada ao provedor de internet (WAN) e outra conectada à minha rede doméstica (LAN).

Como eu preciso configurar o linux resp. KVM para que o host vm não possa usar a porta WAN? Eu quero evitar que o Linux que executa o KVM pode acessar a porta WAN diretamente - ele deve usar apenas a porta LAN e o tráfego para o exterior deve ser executado através do pfSense.

    
por Wilbert 31.05.2016 / 10:24

1 resposta

1

Você pode usar uma rede em ponte enquanto deixa a ponte (o lado do host) sem nenhuma configuração IP.

Observe que, com uma rede com ponte, sua VM será exposta a onde quer que a NIC conectada esteja conectada . No seu caso, seria a Internet . A VM obterá um IP diretamente do seu provedor (seja um IP público ou privado depende dele).

Como isso realmente depende da sua preferência e de qual agente / gerente de rede você usa. Então, apresentarei o conceito apenas com ip :

Crie uma ponte:

ip link add name br0 type bridge

Conecte a NIC da VM ("porta WAN") à ponte:

ip link set enp3s0 master br0

(substitua enp3s0 pelo nome da interface da sua "porta WAN")

Crie um tap para a VM se conectar à ponte:

ip tuntap add name tap0 mode tap

Conecte o tap à ponte:

ip link set tap0 master br0

Para evitar qualquer configuração automática de IPv6, você pode usar o disable_ipv6 sysctl:

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

Chame as interfaces:

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

Então você pode usar -net tap no qemu. Por exemplo, -net tap,ifname=tap0,script=no,downscript=no . (Você também pode adicionar ,vhost=on para um melhor desempenho.)

Você pode usar ,script=someup.sh,downscript=somedown.sh para dizer ao qemu que os scripts sejam executados, respectivamente, quando a VM / tap estiver ativada e desativada. No entanto, IMHO não é uma boa maneira, pois os scripts provavelmente precisarão ser executados como root, portanto, se você usar esses parâmetros, a VM também deverá ser iniciada como root. Portanto, prefiro envolver o qemu assim se quiser uma abordagem semelhante:

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

Se você preferir que o tap seja criado e excluído dinamicamente quando a VM inicializar e desligar, convém usar o qemu-bridge-helper . Para fazer isso, pule as etapas acima que envolvem tap . Em vez disso, você precisa criar uma lista de controle de acesso:

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

Obviamente, é uma lista de bridge (s) que podem ser usadas por qemu-bridge-helper .

Uma vez feito isso, você pode usar -net bridge no qemu. Você pode ou não precisar especificar a ponte a ser usada e / ou o caminho para qemu-bridge-helper . Por exemplo, -net bridge,br=br0,helper=/usr/lib/qemu/qemu-bridge-helper .

Observe que, além de -net tap ou -net bridge , você também precisa adicionar -net nic . É sobre a apresentação da interface no lado do convidado. Por exemplo, -net nic,model=virtio . Você também pode especificar um endereço MAC com ,macaddr=xx:xx:xx:xx:xx:xx . Se você fizer isso, NÃO use nenhum endereço MAC das interfaces no lado do host que estão envolvidos (ou seja, enp3s0, br0 e tap0, neste exemplo), caso contrário, ele não funcionará. Se você não especificar um, o qemu usará o padrão 52:54:00:12:34:56 . Portanto, a menos que você tenha várias VMs interconectadas, isso é opcional.

    
por 31.05.2016 / 20:14