Você pode usar um script up
para gravar as informações no sistema de arquivos e depois lê-las dentro do script.
Adicionando
--script-security 2 --up "/path/to/up.sh /path/to/dir"
para a invocação de openvpn
, o script em /path/to/up.sh
será executado. Ele receberá argumentos de linha de comando e o primeiro deles será /path/to/dir
, que é um lugar explícito para gravar as informações, de modo que o script de shell possa encontrá-las. Os argumentos que seguem são definidos pelo OpenVPN (veja a página man) como:
tun_dev tun_mtu link_mtu ifconfig_local_ip ifconfig_remote_ip [ init | restart ]
Assim, o seguinte script de exemplo grava as informações necessárias para os arquivos no diretório fornecido:
#!/bin/sh
echo $2 > $1/interface
echo $5 > $1/ip
(O argumento --script-security
é necessário para permitir que o script --up
seja definido pelo usuário.)
Uma vez que o endereço IP do cliente é conhecido, o endereço do servidor pode ser deduzido dadas certas suposições:
- é o primeiro endereço utilizável na sub-rede (a documentação do OpenVPN declara isso como fato)
- a máscara de sub-rede usada pelo servidor é conhecida (na notação CIDR)
Assumindo isso, a ferramenta ipcalc pode ser usada para retornar o endereço do servidor:
ipcalc $(</path/to/dir/ip)/$netmask | grep HostMin | awk '{print $2}'
Atualmente, o fato da netmask precisa ser acordado com antecedência, a menos que haja alguma maneira que eu não saiba que possa descobrir isso automaticamente. Seria bom ver qualquer resposta que resolvesse esse problema ou, esperançosamente, uma maneira melhor de responder à pergunta que não exige o uso de um script up
ou o ipcalc
kludge.