世の中リモートワークが増えてきましたが、固定IPからの接続が必要な作業もあります。
そんなときに便利なのがVPNです。
インターリンクさんのマイIPは安くて簡単です。ただ、自分が契約したときは通信速度が遅くて解約しちゃました…(中の人にはすみません!)
同じような低料金のソリューションとして、低価格VPSでSoftEtherを稼働させる方法がよく紹介されています。
マイIPの最速3分でスタートに対抗して、最速3分でVPSにSoftEtherをセットアップするレシピを考えてみました。
こちらのステキなDockerイメージにより実現しました。
siomiz/softethervpn
https://hub.docker.com/r/siomiz/softethervpn
材料
- ConoHaのアカウント
 - 
事前共有鍵例: rRhM*HkHcX9U - VPNに接続する
ユーザー名:パスワードの組み合わせ(;区切りで複数可) 例: user01:pass01;user02:pass02;user03:pass03 
セットアップ
スタートアップスクリプトの準備
任意のエディタなどで次のスタートアップスクリプトを用意します。
PKS='事前共有鍵'と、USERS='ユーザー名:パスワードの組み合わせ'の部分を先ほど用意した材料で置き換えてください。
# !/bin/bash
cat << EOS > /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker run --privileged --name vpnserver \
    -p 500:500/udp -p 4500:4500/udp -p 1701:1701/tcp \
    -e PSK='事前共有鍵' \
    -e USERS='ユーザー名:パスワードの組み合わせ' \
    siomiz/softethervpn:4.27-ubuntu
ExecStop=/usr/bin/docker stop -t 2 vpnserver
ExecStopPost=/usr/bin/docker rm -f vpnserver
[Install]
WantedBy=multi-user.target
EOS
systemctl daemon-reload
systemctl enable vpnserver
systemctl start vpnserver
内容としては、SoftEtherのDockerコンテナを起動するsystemd向けのサービススクリプトを登録して、有効化・起動しているだけです。
ここでは公開ポートをL2TP over IPSecのみとしているので、OpenVPNやSoftEtherのポートも公開したい場合は上記のDockerイメージの説明をご参考ください。
なお、説明では--cap-add NET_ADMINで必要な特権を付与していますが、これだけではdmesgのエラーが出てしまい起動せず、--privilegedに置き換えています。
スタートアップスクリプト付きでVPSを起動
ConoHaでサーバーの追加フォームを開き、Dockerイメージを選択します。
オプションを見るを開き、スタートアップスクリプトに上記のスクリプトを貼り付けます。
2分待つ
セットアップ作業はこれだけです!
あとはじっとサーバーの起動と、スクリプトの完了を待ちます。
初回はDockerイメージのpullがあるので、それなりに時間がかかります。
自分の場合は追加ボタンを押してから実測1分40秒ほどでコンテナが起動しましたが、もちろん前後します。
起動の確認
VPSインスタンスの詳細画面でIPアドレスを確認します。
次のコマンドを実行すると、VPNサーバーが起動されたか確認できます。
(ConoHaのrootログインって大胆だなといつも思いつつ…)
ssh root@IPアドレス docker ps
以下のようにsiomiz/softethervpnイメージのDockerコンテナ表示されたら起動済みです。
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                                                               NAMES
eb437b346cac        siomiz/softethervpn:ubuntu   "/entrypoint.sh /usr…"   5 seconds ago       Up 4 seconds        0.0.0.0:500->500/udp, 443/tcp, 5555/tcp, 0.0.0.0:4500->4500/udp, 1194/udp, 0.0.0.0:1701->1701/tcp   vpnserver
スピードテストの結果
接続方法の前に気になるスピードテストの結果を紹介します。VPNを経由すると下りが半分くらいになりました。
当方、札幌からの接続で物理的な距離もあるのでこれで満足です。
VPNなし
VPNあり
クライアントからの接続
あとは起動したVPNサーバーをおいしくいただきましょう。macOSを例に説明します。
Windowsでも同じプロトコルがサポートされているので多分大丈夫です。
ネットワークインターフェースの追加
環境設定のネットワークでL2TP over IPSecのVPNインターフェースを追加します。
接続先と認証情報
まずはIPアドレスとユーザ名を入力します。
続いて認証設定ボタンを押してパスワードと事前共有鍵を入力します。
OKボタンを押して認証設定を閉じ、右下の適用ボタンを押します。
それから接続ボタンを押すと、VPN接続が開始されます。
ほどなく認証を経て、VPNに接続できます。やったー!
VPNサーバーのIPアドレスで外に通信できてないなーという場合は、詳細ボタンを押して、すべてのトラフィックをVPN接続経由で送信にチェックを付いているか確認しましょう。
ファイヤーウォール
ConoHaのDockerアプリケーションイメージはUbuntuベースなのでufwコマンドでよしなに!
# for cond in 22/tcp 500/udp 1701/tcp 4500/udp; do ufw allow $cond; done
# ufw enable
ConoHa以外のホスティングの場合
Dockerとsystemdが使えるなら、スタートアップスクリプトをroot権限で実行すれば同じことができると思います。