Como usar o Proxmox com VXLAN e Wireguard
Resumo
O VXLAN é um protocolo que permite você configurar uma interface de rede da camada 2 (enlace) do modelo OSI na camada 3 (rede).
O que isso significa?
Significa que você pode ter uma interface de rede que não está fisicamente conectada ao dispositivo, ou seja, você pode criar uma rede lan entre servidores proxmox pela internet sem estarem fisicamente conectados.
Iremos usar o wireguard pois o VXLan sozinho não possui nenhum tipo de autenticação e criptografia. Isso pode abrir brechas para ataques e até interceptação de pacotes.
Para garantir a segurança o wireguard irá fazer a parte da criptografia e autenticação dos pacotes.
Qual a utilidade disso?
Com isso você pode ter uma rede lan centralizada e ao mesmo tempo distribuída, assim você tem mais flexibilidade de configurar, mover os containers/vms, e até de comunicar entre si estando em clusters diferentes.
Preparando o ambiente
Para esse teste estarei instalado o proxmox em duas máquinas virtuais, e nelas estarei conectado em uma rede lan externa.
Porém o objetivo é ter uma rede interna, então vamos simular que o ip 192.168.0.0/24 Faz parte de uma rede wan, e a rede lan vamos configurar dentro do proxmox.
A VPN terá o ip local 10.7.0.0/24 e a VXLan terá 10.30.0.0/24.
Preparando o wireguard
Vamos conectar os hosts proxmox pelo wireguard.
Então vamos iniciar instalado o mesmo no host1.
apt update
apt install wireguard

Agora vamos configurar o servidor, o host1 será o servidor, então ele vai escutar a porta 51280, e o host2 irá se conectar a essa porta. Lembrando que o wireguard é bidirecional, ou seja você pode configurar o host2 também como servidor escutando exatamente a mesma porta.
Primeiro gere a chave privada.
wg genkey
Agora crie o arquivo inicial da interface wireguard na pasta /etc/wireguard/
nano /etc/wireguard/wg0.conf
Adicione a seguinte configuração.
[Interface]
Address = 10.7.0.1/24
PrivateKey = <chave privada gerada>
ListenPort = 51820

Agora vamos repetir o processo no host2
apt update
apt install wireguard
wg genkey
Configuração para o host2 será diferente.
[Interface]
Address = 10.7.0.2/24
PrivateKey = <chave privada gerada>
Agora no host1 e no host2 iremos executar o comando
wg-quick up wg0
wg show
host1

host2

Guarde as chaves públicas que foram exibidas nos comandos.
Vamos configurar os peers.
No host1 iremos editar o arquivo /etc/wireguard/wg0.conf
[Interface]
Address = 10.7.0.1/24
PrivateKey = <chave privada gerada>
ListenPort = 51820
[Peer]
PublicKey = <chave pública do host2>
AllowedIPs = 10.7.0.2/32

No host2 iremos editar também o arquivo /etc/wireguard/wg0.conf
[Interface]
Address = 10.7.0.2/24
PrivateKey = <chave privada gerada>
[Peer]
PublicKey = <chave pública do host1>
AllowedIPs = 10.7.0.1/32
Endpoint = host1.ip.externo:51820

Iremos executar esse comando nas duas hosts
wg-quick down wg0 && wg-quick up wg0


Agora no host1 iremos tentar executar ping no host2
ping 10.7.0.2

Vamos ativar o serviços em ambos os containers para a interface wireguard subir automaticamente na inicialização do sistema.
Para isso basta executar os comandos nos dois nodes.
systemctl enable wg-quick@wg0


Pronto! Temos uma rede privada.
Apenas isso já seria o suficiente para uma comunicação local entre os nodes. Mas não queremos apenas isso. Queremos uma rede lan inteira para os containers.
Então vamos continuar.
Configurando VXLAN
O proxmox tem esse recurso nativo na interface gráfica dele, chamado SDN (Software-Defined Network).
Para isso vamos em Datacenter > SDN.

Vamos criar uma nova Zona.

Preencha os campos

Em Peer Address List adicione os ips das VPNs, 10.7.0.1 10.7.0.2.
O MTU é uma parte bastante importante. Quando estamos trabalhando com túneis ou VPNs, normalmente os pacotes são encapsulados, ou seja é como se o pacote fosse colocado dentro de uma caixa com e essa caixa passa a ter informações adicionais referentes aquele protocolo.
Ex:
Vc está enviando um pacote para o ip 10.7.0.1, é o ip da VPN que criamos, até desse pacote chegar no wg0 do host, ele precisa ser encapsulado, pois o wireguard precisa saber informações de criptografia, para qual peer ele vai enviar, e por aí vai.
O VXLAN também tem seus cabeçalhos, então precisamos fazer um cálculo. O wireguard consome em torno de 60 bytes em ipv4 e 80 em ipv6. O VXLan consome 50 em ipv4 e 74 em ipv6.
Para não deixarmos nenhuma margem para erros vamos considerar o pior cenário, como o wireguard já define por padrão o mtu em 1420 vamos calcular -74 do VXLan, então nosso mtu será de 1346.
Agora vamos adicionar as VNets, aqui vamos escolher a Tag, no meu caso irei usar a tag 80. A tag é equivalente a VID de uma interface VLan comum. Você pode ter mútiplas VXLan numa rede, para diferencia-las na rede vc precisa alterar a tag delas.

Agora voltamos em SDN e aplicamos as configurações.


Criando os containers.
Agora chegou a parte mais interessante. Criar os container e fazer eles se comunicarem entre si.
Vamos criar no host1, e iremos criar a interface de rede referenciando a vxlan.
Nosso ip será 10.30.0.1/24 sem gateway (vamos testar a conexão apenas localmente)

Vamos repetir no host2 mudando o endereço ip para 10.30.0.2/24

Agora vamos iniciar os containers e tentar pingar o C100 do C101.

Conclusão
O VXLan é uma ótima abordagem para criar redes LAN entre servidores fisicamente distantes, mas requer cuidados. Diferente de criar apenas um tunnel Wireguard entre os hosts, com o VXLan você consegue deixar toda essa configuração de rede na camada 2, você não precisa mexer no Wireguard para adicionar um novo ip ou configurar algo na rede, até a mudança de ip fica mais dinâmica.
Porém pode ocorrer o consumo a mais de processamento, por ser um protocolo de encapsulamento ele adiciona mais complexibilidade para a rede. E quando o MTU não é configurando corretamente pode acontecer fragmentação de pacotes, prejudicando ainda mais o desempenho.
Teste bastante antes de implementar e tenha certeza que essa solução ira atender os requisitos.
Referências
https://medium.com/@TelefonicaEng/maximizing-performance-in-vxlan-overlay-networks-ec35ebe29440
https://pve.proxmox.com/pve-docs/chapter-pvesdn.html
https://www.gta.ufrj.br/ensino/eel879/trabalhos_vf_2012_2/nvgre/vxlan.html