Estabelecer o túnel openvpn no script bash

3

Estou tentando escrever um script que estabelecerá um túnel openvpn quando o computador for inicializado. O principal problema está em inserir a senha do pkcs12. Eu percebo que é uma prática muito ruim ter uma senha armazenada em texto simples, mas eu não estou muito preocupado com isso - o computador é muito seguro em todos os outros aspectos, então estou bastante confiante de que ninguém além de mim estará acessando-o para ver a senha.

Eu adicionei as opções --management e --management-query-passwords para que a senha possa ser inserida por meio de uma sessão de telnet. Isso funciona bem quando eu faço isso manualmente, mas quando eu tento fazê-lo automaticamente com um script bash ele falha. Meu palpite é que ou eu não estou fazendo o carridge retornar após a linha de senha corretamente, ou que alguns outros valores de lixo estão entrando na sessão de telnet como entradas. Aqui estão os bits relevantes do código (xxx para coisas que são classificadas):

$ cat user.ovpn
#OpenVPN Server conf
tls-client
client
dev tun
proto udp
tun-mtu 1400
remote xxxxxxxxxxxxxxxxxxx 1194
pkcs12 user.p12
cipher AES-256-CBC
comp-lzo
verb 3
ns-cert-type server
tls-remote xxxxxxxxxxxxxxxxxxxxxxx
management 127.0.0.1 5558
management-query-passwords

$ cat telnet_commands.sh
#!/bin/bash
echo "open 127.0.0.1 5558"
sleep 1
echo -e "password 'Private Key' xxxxxxxxxx\r\n"

$ nohup openvpn user.ovpn &
$ ./telnet_commands.sh | telnet

$ #manually check whether this worked:
$ telnet 127.0.0.1 5558
Escape character is '^]'.
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
>PASSWORD:Need 'Private Key' password

Obviamente, isso não está funcionando - a interface de gerenciamento telnet openvpn ainda está aguardando a senha ser inserida.

    
por mulllhausen 11.03.2011 / 08:07

4 respostas

1

ok, eu consegui inserir a senha do túnel openvpn automaticamente e também consegui que o túnel fosse executado na inicialização. Espero que isso ajude alguém que está tentando fazer a mesma coisa - porque me levou mais de 20 horas para descobrir algo que agora parece bastante básico. código:

$ cat /etc/init.d/ZZcreate_ovpn_tun.sh
#!/bin/bash

# check if the tunnel already exists before trying to create it
proc=$(ps aux | grep openvpn | grep Userxxx)
if [ "$proc" == "" ]; then
  echo "ovpn tunnel does not exist yet - will create it now"
else
  echo "ovpn tunnel already exists ($proc)"
  exit 0
fi

# load the config file into openvpn - has options to request the pkcs12 password through
# telnet
nohup openvpn /etc/init.d/ovpn/Userxxx.ovpn
sleep 1

# enter the password though a telnet session
/etc/init.d/ovpn/telnet_commands.sh

$ cat /etc/init.d/ovpn/telnet_commands.sh
#!/usr/bin/expect
spawn telnet 127.0.0.1 5558
expect ">PASSWORD:Need 'Private Key' password"
send "password 'Private Key' xxxxxxxxxxxxx\r"
expect "SUCCESS: 'Private Key' password entered, but not yet verified"
send "quit\r"
expect eof

$ cat Userxxx.ovpn
#OpenVPN Server conf
tls-client
client
dev tun
proto udp
tun-mtu 1400
remote xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.com.au 1194
pkcs12 /etc/init.d/ovpn/Userxxx.p12
cipher AES-256-CBC
comp-lzo
verb 3
ns-cert-type server
tls-remote xxxxxxxxxxxxxxxxxxxxxxxxxxx.com.au
management 127.0.0.1 5558
management-query-passwords

$ sudo update-rc.d ZZcreate_ovpn_tun.sh defaults
$ sudo shutdown -r 0

$ # wait for system to boot up again
$ ps aux | grep openvpn
root 5279  0.0  0.1  28224  3728 ? S 22:48 0:00 openvpn /etc/init.d/ovpn/Userxxx.ovpn

você também pode querer redirecionar toda a saída para um arquivo para que, se ele falhar, você possa ver o motivo. Eu chamei o arquivo ZZcreate_ovpn_tun.sh para ter certeza que ele foi executado por último de todos os scripts no diretório init.d. Idealmente, eu teria apenas a certeza de que ele só correu no nível 6 ou mais, mas isso funciona bem por enquanto.

    
por 15.03.2011 / 13:44
4

Só queria mencionar que (pelo menos no Ubuntu 12.04) existe o argumento - askpass / your / file para o openvpn, que lê a senha da chave privada de um arquivo.

    
por 23.11.2012 / 13:23
2

Meu caso de trabalho com uma pequena correção:

nohup openvpn /etc/init.d/ovpn/Userxxx.ovpn &
/etc/init.d/ovpn/telnet_commands.sh
    
por 19.03.2012 / 23:09
1

Espero que tudo o que esteja procurando seja a senha da chave privada. Tente usar echo -e "xxxxxxxxx\r\n" ou echo "xxxxxxxx" .

Você pode tentar usar expect para responder à solicitação de senha. Alguns programas de senha procuram a senha em um dispositivo tty type. O programa espera lidar com isso.

Talvez seja melhor procurar um script rc.d init para iniciar seu túnel. Este é o método normal para iniciar as coisas na inicialização.

    
por 11.03.2011 / 16:55