Eu já implementei algo nesse sentido antes, mas minha configuração foi bastante complicada, talvez em demasia. No momento, estou investigando a implementação de uma solução mais simples ao longo das linhas de / influenciada pelo que é descrito na URL a seguir, mas descreverei o que construí no tempo médio. O URL é o link
Uma opção que funcionou muito bem para mim no passado é construir meus túneis OpenVPN usando dispositivos de toque em vez de dispositivos tun. Isso encapsula a Ethernet através do encapsulamento em vez da camada 3, e permite que você contorne as limitações inerentes do OpenVPN, mantendo sua própria tabela de roteamento separada do kernel. A desvantagem é você incorrer em muita sobrecarga de tunelamento desta forma ... imagine TCP over Ethernet sobre TCP criptografado SSL ... você começa a idéia. De cabeça para baixo é que funcionou e escalou horizontalmente bastante bem.
Supondo que seus servidores e clientes VPN sejam pontos de extremidade do Linux (testei apenas no Linux), você pode criar uma nova interface de ponte virtual e atribuir a interface de acesso à ponte para obter sua camada 3. Na minha topologia, eu dei a cada Servidor VPN sua própria sub-rede 10.x.0.0 / 16 e também implantou um servidor DHCP local para atribuir endereços a clientes de conexão. O servidor DHCP precisa estar lá porque o OpenVPN não está mais ciente dos endereços IP; está tunelando a Ethernet. Os clientes executam o dhclient para obter um IP sobre a interface VPN após a conexão, e tudo isso é gerenciado por scripts de conexão vinculados à configuração do OpenVPN.
Quando você tiver endereços IP em ambos os lados via DHCP, poderá usar um protocolo de roteamento dinâmico para anunciar rotas entre clientes conectados. Eu usei o Quagga no passado e ele funciona de forma bastante confiável.
Exemplo de configuração do servidor usando o toque:
mode server
proto tcp-server
port 1194
dev tap0
Exemplo de comandos para adicionar interface de toque a nova ponte:
sudo brctl addbr vpnbr0 # create new bridge called vpnbr0
sudo brctl setfd vpnbr0 0 # set forwarding delay to 0 secs
sudo brctl addif vpnbr0 tap0 # add openvpn tap interface to vpnbr0
Exemplo de comandos de desmontagem:
sudo brctl delif vpnbr0 tap0
sudo brctl delbr vpnbr0
Depois de ter a interface bridge vpnbr0, você pode executar um servidor DHCP ou atribuir endereços IP manualmente. Você pode então tratá-lo como qualquer outra interface Ethernet. Você provavelmente desejará fazer alterações adicionais para ajustar o tamanho da MTU e tentar diferentes protocolos e opções de criptografia até encontrar o equilíbrio certo entre eficiência e segurança. Eu não tenho nenhuma boa especificação para oferecer sobre o throughput geral, e há muitas partes móveis aqui.
Se eu tivesse que fazer tudo de novo, eu ficaria com dispositivos tun no OpenVPN, e seguiria as instruções no artigo que eu criei no primeiro parágrafo para atualizar a tabela de roteamento do kernel Linux a qualquer momento que a tabela de endereços interna do OpenVPN fosse atualizada. Isso eliminaria o DHCP da pilha, reduziria a sobrecarga de tunelamento e permitiria que meus clientes se conectassem e operassem sem participar do roteamento dinâmico.