📝

VMへのssh時に自動でOpenVPNサーバへ接続して固定IPを利用できるようにする

2024/03/01に公開

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
  • VPNサーバ動作環境
    • OS: Ubuntu 22.04(GCE/e2-small)
      • OpenVPN: 2.4.12 x86_64-pc-linux-gnu
      • OpenSSL: 1.1.1f

前提

  • VM内でOpenVPNサーバへ接続して固定IPが使えるようになっている。

解決策

  1. ~/.bashrcでopenvpnコマンドを叩く
  2. 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から連絡お願いします。
https://recruit.acompany.tech/25fe8241328e4d988ce124faad6e989f

Discussion