Como executo um script depois que o OpenVPN foi conectado com êxito?

50

Como associar um script ao OpenVPN para que ele seja executado quando a VPN for conectada com êxito?

Oxwivi
fonte
No caso do cliente, eu acho? Qual software você está usando? OpenVPN ou um wrapper (por exemplo, NetworkManager)?
Lekensteyn
@Lekensteyn, wrapper network-manger-openvpn.
Oxwivi 02/03/11

Respostas:

62

network-manager-openvpnnão fornece essa funcionalidade, você deve usar openvpndiretamente.

Passe --script-security 2 --up /path/to/your/scriptpara ele ao conectar. Se você estiver usando um arquivo de configuração localizado em /etc/openvpn/, anexe as próximas linhas ao seu arquivo de configuração:

script-security 2
# run /etc/openvpn/up.sh when the connection is set up
up /etc/openvpn/up.sh

Na página de manual do OpenVPN :

--script-security level [método]
              Esta diretiva oferece controle no nível da política sobre o uso do OpenVPN
              de programas e scripts externos. Valores de nível mais baixo são mais
              valores restritivos e mais altos são mais permissivos. Configurações para
              nível:

              0 - Estritamente nenhuma chamada de programas externos.
              1 - (Padrão) Apenas chama executáveis ​​internos, como ifconfig,
              ip, rota ou netsh.
              2 - Permitir a chamada de executáveis ​​internos e definidos pelo usuário
              scripts.
              3 - Permitir que senhas sejam passadas para scripts via ambiente
              variáveis ​​(potencialmente inseguras).
       --up cmd
              Comando Shell para executar após a abertura bem-sucedida do dispositivo TUN / TAP
              - alteração do UID do usuário). O script up é útil para especificar
              Comandos de rota que direcionam o tráfego IP destinado a
              sub-redes existentes na outra extremidade da conexão VPN em
              o tunel.
Ordem de execução do script
       --up Executado após ligação do soquete TCP / UDP e TUN / TAP aberto.
       --down Executado após o fechamento do TCP / UDP e TUN / TAP.

Existem mais eventos para execução de scripts, esses podem ser encontrados na página de manual .

Crie /etc/openvpn/up.she conceda permissões de execução (por exemplo, 755 ou 700). Exemplo de conteúdo para adicionar um endereço e rota IPv6 (mostrado para fins educacionais, não o copie diretamente):

#!/bin/sh
# add an IPv6 address to device $dev (environment variable)
ip -6 addr add 2001:db8::1:2/112 dev $dev
# and the IPv6 route for this net using gateway 2001:db8::1
ip -6 route add 2001:db8::1:0/112 via 2001:db8::1 dev $dev

Observe que este upscript é executado como raiz. Se você não especificou a Usere Group, o OpenVPN também executará scripts como downroot.

Lekensteyn
fonte
Se você não souber usar o openvpn diretamente, adicione seus detalhes de configuração atuais: Tipo de conexão (por exemplo, certificados X509), porta Gateway, compactação LZO, força do TCP, uso de dispositivo de toque, cifra, HMAC e TLS. Mencione suas configurações de IP também se não forem automáticas. Para sua privacidade, deixe de fora seus endereços reais.
Lekensteyn
Tudo bem, decidi usar o OpenVPN diretamente (e sim, tenho o arquivo .conf), mas será reconectado automaticamente se a conexão for perdida? E como faço para conectar-se automaticamente sempre que houver conexão com a Internet? E, finalmente, não entendi onde devo adicionar as linhas que você mencionou na resposta.
precisa saber é o seguinte
Eu ampliei a resposta para usar openvpndiretamente. Ao configurar um servidor, notei que o OpenVPN tentará se reconectar quando o servidor cair. Não tenho certeza se o OpenVPN continua tentando quando sua interface de rede cai.
precisa saber é o seguinte
Meu problema não é quando a interface de rede fica inoperante - ele tenta se reconectar quando a conexão com a Internet é perdida e recuperada. Eu só quero me conectar à VPN sempre que tiver conexão com a Internet.
Oxwivi 5/03/11
Ah, e o script se aplica a todas as conexões VPN? E por favor, tag @Oxwivi ao responder, não vou ser notificado de outra forma.
Oxwivi
5

Para a pergunta: "Como posso associar um script ao OpenVPN para que seja executado quando a VPN é conectada com êxito?" Quero ressaltar que Lekensteyn forneceu uma excelente resposta . Mas, no momento em que sua resposta foi composta, faltava um pouco de clareza sobre como os argumentos da linha de comando openvpn deveriam ser fornecidos para iniciar o openvpn em uma máquina ubuntu, especialmente para que funcionasse da mesma maneira após as reinicializações.


Argumentos da linha de comando Openvpn no Ubuntu:

Naturalmente, pode-se iniciar o openvpn a partir de uma linha de comando com todas as opções legais disponíveis. Mas, em uma máquina Ubuntu, se alguém deseja iniciar o openvpn com os mesmos argumentos da linha de comando após uma reinicialização, deve considerar a edição do arquivo /etc/default/openvpn. Examine as seguintes linhas:

# Optional arguments to openvpn's command line
OPTARGS="" 

Na página de manual da comunidade openvpn em--script-security

- nível de segurança de script
    Esta diretiva oferece controle no nível da política sobre o uso de recursos externos pelo OpenVPN 
    programas e scripts. Valores de nível mais baixo são mais restritivos, mais altos
    valores são mais permissivos. Configurações para nível:
0 - Estritamente nenhuma chamada de programas externos. 
1 - (Padrão) Apenas chama executáveis ​​internos, como ifconfig, ip, route,
ou netsh. 
2 - Permitir a chamada de executáveis ​​internos e scripts definidos pelo usuário. 
3 - Permitir que senhas sejam passadas para scripts por meio de variáveis ​​ambientais
(potencialmente inseguro).

As versões do OpenVPN anteriores à v2.3 também suportavam um sinalizador de método que indicava como 
O OpenVPN deve chamar comandos e scripts externos. Isso pode ser executado
ou sistema. A partir do OpenVPN v2.3, esse sinalizador não é mais aceito. Na maioria dos * nix
ambientes em que a abordagem execve () foi usada sem problemas.

Algumas diretivas como --up permitem que opções sejam passadas para o script externo.
Nesses casos, verifique se o nome do script não contém espaços ou o 
O analisador de configuração engasgará porque não pode determinar onde o script 
nome termina e as opções de script são iniciadas.

Combinado com uma seção abreviada em --up

--up cmd
    Execute o comando cmd após a abertura bem-sucedida do dispositivo TUN / TAP (alteração do UID pré-usuário).
    O cmd consiste em um caminho para o script (ou programa executável), seguido opcionalmente
    por argumentos. O caminho e os argumentos podem ser de aspas simples ou duplas e / ou
    escapou usando uma barra invertida e deve ser separado por um ou mais espaços.

Exemplo:

Na minha máquina com um openpvn server.conf, tenho as seguintes linhas no meu /etc/default/openvpnarquivo:

OPTARGS="
    --script-security 2
    --up /etc/openvpn/nat.sh
" 

Aliás, o nat.sh configura a conversão de endereços de rede para rotear o tráfego de rede privada dos clientes openvpn para a Internet pública; o que é bom para quem não confia em um ponto de acesso WIFI público.


Além de permitir a reinicialização conforme o esperado após uma reinicialização, quando /etc/openvpn/[client or server].confe os /etc/default/openvpnarquivos estiverem configurados corretamente, o openvpn pode ser iniciado ou interrompido com:

sudo service openvpn start
sudo service openvpn stop

Outras opções úteis disponíveis para service openvpnincluir cond-restart,force-reload,reload, restart,soft-restart, start, status, stop.

Keith Reynolds
fonte
3

Como esse é um tópico bastante antigo, não tenho certeza se ainda interessa. Se você ainda deseja usar o NetworkManager para conectar-se a uma VPN, pode adicionar uma regra simples do udev assim:

KERNEL=="vpn0", RUN+="/PATH_TO_THE_SCRIPT/SCRIPT_NAME"

Isso deve executar qualquer script após a criação da VPN.

Thomas
fonte
1

Eu me deparei com a resposta em minha pesquisa para resolver esse problema e descobri que a melhor solução é (usando o servidor openvpn) da seguinte maneira:

Crie um script para ser executado:

# nano /etc/openvpn/up.sh
<file:contents>
#!/bin/sh

# export >> /var/log/openvpn/openvpn-up.log
D=`date "+%Y-%m-%d %H:%M"`
echo "[$D] ($local_port_1:$proto_1) $X509_0_CN: $trusted_ip => $ifconfig_pool_remote_ip" >> /var/log/openvpn/openvpn-up.log
</file>

Adicione as seguintes linhas à configuração do openvpn (normalmente /etc/openvpn/server.conf). Na resposta acima, foi usado para cima e para baixo, que são usados ​​quando o servidor é iniciado (reinicia). A diretiva cliente-conexão (e cliente-desconexão) são usadas quando o cliente se conecta (desconecta).

# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
CozC
fonte
Como você incluiria o nome da configuração do cliente no arquivo de log?
callisto