Obter endereço e dispositivo atribuídos por openvpn

2

Um cliente OpenVPN pode alocar dinamicamente um dispositivo de interface de rede (por exemplo, tun0 ) para uma conexão com um servidor que pode emitir dinamicamente um endereço IP para o cliente.

Dado um script de shell que inicia o cliente OpenVPN (que estabelece com sucesso uma conexão com o servidor), como posso descobrir a interface de rede, o endereço IP do cliente atribuído e o endereço IP do servidor?

A resposta ideal apresentaria uma maneira de obter esses dados usando ferramentas OpenVPN sem ter que fazer suposições e deduções.

    
por starfry 13.09.2016 / 22:22

1 resposta

4

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.

    
por 13.09.2016 / 22:22

Tags