Embora isso possa não responder à sua pergunta, acho que é o mais próximo que você pode chegar. Ele funciona como esperado, mas por um lado: o cliente não terá o endereço IP "externo", pois ele precisa residir no servidor.
Observe também que não é assim que as VPNs devem funcionar.
Enfim, aqui está o que você precisa fazer. Estou assumindo aqui que o seu servidor VPN tem vários endereços IP, um dos quais é reservado para a própria VPN. O restante deve ser mapeado para clientes, portanto, um cliente conectado será visto como esse endereço IP externo.
- Garanta que todos os clientes tenham um endereço atribuído estaticamente.
- O tráfego SNAT desse endereço IP parece ter se originado da interface "externa".
- Tráfego DNAT apontando para a interface externa para o túnel da VPN
Garanta que todos os clientes tenham um endereço estático
Para isso, adicione as seguintes linhas ao seu arquivo de configuração openvpn do lado do servidor:
client-config-dir clientConfig
ccd-exclusive
Crie o diretório clientConfig
para o diretório /etc/openvpn/
. Isso manterá os arquivos de configuração por cliente. A opção ccd-exclusive
fará com que os clientes falhem se eles não tiverem uma configuração de cliente correspondente no diretório especificado por client-config-dir
. Como sua configuração depende de um mapeamento exato de endereços IP externos e VPN, cada cliente deve ter sua própria configuração.
iNo diretório config do cliente, crie um arquivo denominado como o nome comum do cliente, ou seja, o campo CN do certificado ou o nome de usuário, dependendo do método de autenticação usado. O arquivo deve conter um simples push de endereço IP, assim:
ifconfig-push 192.168.0.5 192.168.0.6
Observe que todo cliente deve ter sua própria rede / 30 da qual os dois endereços IP atribuídos e as redes não devem se sobrepor.
Adicione a diretiva redirect-gateway
ao arquivo de configuração do lado do cliente para substituir o gateway padrão, desta forma:
redirect-gateway def1
Depois disso, o cliente deve ter o mesmo endereço IP, não importa quando se conectar, e terá seu gateway padrão reescrito após a conexão.
Configurando o SNAT
Para cada cliente, uma regra SNAT deve ser configurada assim:
iptables -t nat -I POSTROUTING -o <device> \
-s <client_ip> -j SNAT --to <out_ip>
onde:
-
<device>
é o dispositivo de saída (no seu caso, eth0
)
-
<client_ip>
é o IP que você configurou para o cliente na etapa anterior (no exemplo acima 192.168.0.5
)
-
<out_ip>
é o endereço IP que é visto pelos servidores aos quais os clientes se conectam (por exemplo, 67.248.62.166
é um desses IPs no seu exemplo)
Além disso, certifique-se de definir o encaminhamento de IP como verdadeiro ( echo 1 >/proc/sys/net/ipv4/ip_forward
).
Configurando o DNAT
Para cada cliente, você deve emitir um comando como este:
iptables -t nat -A PREROUTING \
-i <device> -d <out_ip> -j DNAT --to <client_ip>
Os parâmetros <device>
, <out_ip>
e <client_ip>
são iguais aos anteriores.
Os comandos iptables
descritos acima podem ser emitidos se a conexão não estiver ativa (na verdade, o servidor openvpn não precisa ser executado).
O que é deixado de fora
Desta forma, a ligação funciona em ambos os sentidos: a partir da Internet, o endereço IP externo está acessível e todos os tráfegos (TCP e UDP) serão encaminhados cegamente para o cliente. Se o cliente iniciar uma conexão, ela será vista como originada do endereço IP especificado do servidor VPN.
Isso é quase o que você queria.
Uma coisa não vai funcionar: o cliente não será capaz de pegar a interface externa. Na verdade, o cliente nem sequer está ciente do endereço IP externo. Ou seja, você não poderá ligar (por exemplo) 189.180.86.216
. Você poderá, no entanto, usar 0.0.0.0
e, dessa forma, o cliente estará acessível por meio do endereço IP "externo".
Observe também que você precisa atribuir um endereço IP para o servidor VPN. Esse endereço não pode ser usado para encaminhar todo tráfego para qualquer um dos clientes, por razões óbvias.