컴퓨터가 시작될 때 openvpn 터널을 설정하는 스크립트를 작성하려고 합니다. 주요 문제는 pkcs12 비밀번호를 입력하는 것입니다. 나는 암호를 일반 텍스트로 저장하는 것이 매우 나쁜 습관이라는 것을 알고 있지만 그것에 대해 크게 걱정하지는 않습니다. 컴퓨터는 다른 모든 측면에서 매우 안전하므로 나 외에는 누구도 액세스하여 내용을 볼 수 없다고 확신합니다. 비밀번호.
Telnet 세션을 통해 비밀번호를 입력할 수 있도록 --management
및 옵션을 추가했습니다 . --management-query-passwords
이 작업을 수동으로 수행하면 제대로 작동하지만 bash 스크립트를 사용하여 자동화하려고 하면 실패합니다. 내 생각에는 비밀번호 줄 다음에 캐리지 리턴을 제대로 수행하지 않았거나 다른 정크 값이 텔넷 세션에 입력으로 몰래 들어간 것 같습니다. 관련 코드 비트는 다음과 같습니다(xxx는 분류 내용을 나타냄).
$ 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
분명히 이것은 작동하지 않습니다. openvpn 텔넷 관리 인터페이스는 여전히 비밀번호를 기다리고 있습니다.
답변1
그냥 언급하고 싶었습니다 (적어도 Ubuntu 12.04에서는)--askpass /귀하의/파일openvpn의 매개변수는 파일에서 개인 키 비밀번호를 읽습니다.
답변2
작은 수정 사항이 포함된 작업 사례:
nohup openvpn /etc/init.d/ovpn/Userxxx.ovpn &
/etc/init.d/ovpn/telnet_commands.sh
답변3
내가 원하는 것은 개인 키의 비밀번호뿐입니다. echo -e "xxxxxxxxx\r\n"
또는 를 사용해 보십시오 echo "xxxxxxxx"
.
expect
를 사용하여 비밀번호 요청에 응답해 볼 수도 있습니다 . 일부 암호 프로그램은 유형 장치에서 암호를 찾습니다 tty
. 프로그램 예상이 이 문제를 처리합니다.
rc.d
터널을 시작하려면 초기화 스크립트를 찾는 것이 좋습니다 . 이는 부팅 시 시작하는 일반적인 방법입니다.
답변4
좋아, openvpn 터널 비밀번호를 성공적으로 자동 입력했으며 시작 시 터널이 성공적으로 실행되었습니다. 이것이 같은 일을 하려는 다른 사람들에게 도움이 되기를 바랍니다. 지금은 매우 기본적으로 보이는 것을 알아내는 데 20시간 이상이 걸렸기 때문입니다. 암호:
$ 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
실패할 경우 이유를 이해할 수 있도록 모든 출력을 파일로 리디렉션할 수도 있습니다. ZZcreate_ovpn_tun.sh 파일을 호출하여 이 파일이 init.d 디렉토리에 있는 모든 스크립트를 마지막으로 실행했는지 확인했습니다. 이상적으로는 레벨 6에서만 실행되도록 해야 하지만 현재로서는 훌륭하게 작동합니다.