VMへのssh時に自動でOpenVPNサーバへ接続して固定IPを利用できるようにする
VMへのssh時に自動でOpenVPNサーバへ接続して固定IPを利用できるようにする方法を紹介します。
OpenVPNサーバとクライアントの設定方法については前回の記事を参照してください。
動作確認済み条件
- VPNクライアント動作環境
- OS: Ubuntu 22.04
- OpenVPN: 2.5.9 x86_64-pc-linux-gnu
- OS: M1 MacBookPro(2021) Ventura 13.3.1
- OpenVPN Connect: 3.4.8
- OS: Ubuntu 22.04
- VPNサーバ動作環境
- OS: Ubuntu 22.04(GCE/e2-small)
- OpenVPN: 2.4.12 x86_64-pc-linux-gnu
- OpenSSL: 1.1.1f
- OS: Ubuntu 22.04(GCE/e2-small)
前提
- VM内でOpenVPNサーバへ接続して固定IPが使えるようになっている。
解決策
-
~/.bashrc
でopenvpnコマンドを叩く - daemonを作成してVM起動時にopenvpnコマンドを叩く
1. ssh時に自動でvpnを接続するように設定する
前回の記事(OpenVPNで低コストでVPNサーバを構築して、固定IPでアクセス制限する#2. OpenVPNクライアントの設定(Ubuntu22.04編))を参考に、OpenVPNクライアントをVM内に設定する。
設定方法
2-2. 設定
sudo openvpn --config "$CONFIG_FILE"
でvpnをopenできるが、今後sshでshellにログインする際に毎回上記のコマンドを実行するのは大変なので、以下のカスタムshellscriptを作成しておく。
/usr/local/bin/vpn.sh
を作成する。
$ sudo touch /usr/local/bin/vpn.sh
$ sudo chmod +x /usr/local/bin/vpn.sh
$ sudo vi /usr/local/bin/vpn.sh
以下のshellscriptをコピペする。
#!/bin/bash
# setup:
# $ sudo apt update && sudo apt install openvpn -y
# create client.ovpn
# $ sudo vi /etc/openvpn/client.ovpn
CONFIG_FILE="/etc/openvpn/client.ovpn"
LOG_FILE="/tmp/openvpn-status.log"
PID_FILE="/var/run/openvpn-client.pid"
function get_current_ip() {
curl -s https://api.ipify.org
}
function start_vpn() {
if pgrep -F "$PID_FILE" >/dev/null 2>&1; then
echo "VPN is already running."
return
fi
echo "Current IP: $(get_current_ip)"
echo "Starting VPN..."
sudo openvpn --config "$CONFIG_FILE" --log "$LOG_FILE" --daemon --writepid "$PID_FILE"
sleep 5
echo "New IP: $(get_current_ip)"
exit 0
}
function stop_vpn() {
if [ -f "$PID_FILE" ]; then
sudo kill "$(cat $PID_FILE)"
sudo rm -f "$PID_FILE"
echo "VPN closed."
exit 0
else
echo "VPN is not running."
exit 1
fi
}
function check_vpn_status() {
if pgrep -F "$PID_FILE" >/dev/null 2>&1; then
echo "VPN is running."
echo "Current IP: $(get_current_ip)"
exit 0
else
echo "VPN is not running."
exit 1
fi
}
case "$1" in
open)
start_vpn
;;
close)
stop_vpn
;;
status)
check_vpn_status
;;
*)
echo "Usage: $0 {open|close|status}"
exit 1
;;
esac
VM内にOpenVPNクライアントの設定と/usr/local/bin/vpn.sh
の作成を行ったのち、~/.bashrc
にaliasを追加してvpn open
を実行させる。
$ cat << EOF | sudo tee -a ~/.bashrc
alias vpn='/usr/local/bin/vpn.sh'
vpn open
EOF
$ . ~/.bashrc
Current IP: <vm_ip>
Starting VPN...
New IP: <vpn_ip>
以降はterminalを起動するたびに~/.bashrc
が実行されるため、vpn open
が走るようになる。
2. VM起動時に自動でvpnを接続するように設定する
daemonを作成してVM起動時に自動的にvpn open
が走るようにする。
$ sudo touch /etc/systemd/system/openvpn-client.service
$ sudo vi /etc/systemd/system/openvpn-client.service
以下のdaemonをコピペする。
[Unit]
Description=OpenVPN 2 Auto Connect Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c '/usr/local/bin/vpn.sh open; while true; do /usr/local/bin/vpn.sh status;>
ExecStop=/usr/local/bin/vpn.sh close
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
daemonの起動、再起動設定をする。
$ sudo systemctl start openvpn-client.service
$ sudo systemctl enable openvpn-client.service
$ sudo systemctl status openvpn-client.service
正常に起動したことの確認
$ sudo systemctl status openvpn-client.service
● openvpn-client.service - OpenVPN 2 Auto Connect Service
Loaded: loaded (/etc/systemd/system/openvpn-client.service; disabled; vendor preset: enable>
Active: active (running) since Mon 2024-02-12 19:00:37 UTC; 4min 55s ago
Main PID: 4130 (bash)
Tasks: 2 (limit: 9506)
Memory: 576.0K
CPU: 411ms
CGroup: /system.slice/openvpn-client.service
├─4130 /bin/bash -c "/usr/local/bin/vpn.sh open; while true; do /usr/local/bin/vpn.>
└─4347 sleep 10
...
以降はVMを起動するたびにdaemonがstartするため、vpn open
が走るようになる。
おわりに
弊社Acompanyは次世代暗号技術である秘密計算やゼロ知識証明、k匿名化、差分プライバシーなどのプライバシーテックの研究開発と、それらを用いてプライバシー保護した状態でデータ分析が利用可能なデータクリーンルームの開発・提供を行っています。
絶賛採用中なので興味があれば下記採用ページ内のGoogleFormか、XのDMから連絡お願いします。
Discussion