前回は、Rasperry Pi OS上にDockerをインストール、さらにそれを利用してNextcloudを構築しました。容量の小さいノートPCでも気軽に使えるバックアップ先として使えます。さらに、アプリを導入すれば(標準でも入りますが)、中小企業の安価なグループウェアとしても利用できます。
とはいえ、大きな問題が一つあります。それは、外部からはアクセスできないということです。問題は問題ですが、セキュリティの観点からすると(特にセキュリティ対策に予算や人員を割けない個人や中小企業にとっては)好ましいことでもあります。アクセスする手段がなければ、不正アクセスは難しくなりますから。
とはいえ、イントラネットだけでの運用は、テレワークも普及している現代においては不便すぎます。ということで、アクセスの手段を提供しようと思います。
ラズパイのDocker に Softehter VPNを導入する
VPNは非常に便利な仕組みですが、悪用されると自分のネットワークがセキュリティリスクに晒されるだけではなく、他のネットワークへの攻撃の踏み台に使われることもあります。
導入、運用する場合には充分注意してください。セキュリティに充分気をつけて内容を紹介しますが、くれぐれもご自身で対策を徹底してください。当然ですが、当記事の内容を実行し不利益を被ったとしても、筆者は責任を負いかねます。
のっけから警告となってしまいました。ただ、このSoftEther VPN はそれくらい強力で、サーバーをインストールさえしてしまえば NAT トラバーサル機能によりネットワーク管理者でなくても VPN による外部アクセスが可能にします。
つまりどういうことかというと、ルーターによらず自宅に設置した Nextcloud や WordPress, Redmine それから Wekan などに外部からアクセスできるということです。個別のサーバーは外部ネットワークに公開されず、ルーターに穴を開けるわけではないので、そちらの意味では比較的安全です(違う意味では危険です)。
SoftEther VPN も Docker Image が用意されているので、これを利用してインストールします。
Docker のインストール
※まだインストールしていない場合
sudo apt-get install docker.io
sudo usermod docker -aG $USER
sudo apt-get install docker-compose
sudo reboot
SoftEther VPNのインストール
参考
Docker はネットワークを含めて仮想化してしまうので、単に SoftEther VPN を Docker で起動しただけだと、アクセスしても Docker 内の仮想ネットワークになってしまいます。当然、 Docker コンテナごとに独立しているので、他のサーバーにアクセスできません。
これでも、公衆Wi-Fiなどを利用するときに通信内容を保護する役には立ちますが、今回の目的は果たせません。
そういった場合は、 network_mode をhost にするといいらしいです。
設定
mkdir softether
cd softether
touch docker-compose.yml
nano docker-compose.yml
SoftEther VPN 用にディレクトリを切って、設定ファイルを作成します。
version: "3"
services:
app:
image: siomiz/softethervpn
#restart: always
environment:
#- USERS=user1:password1;
- SPW=test
#- PSK=test
#- HPW=test
#volumes:
#- /home/pi/softether/vpn_server.config:/usr/vpnserver/vpn_server.config
cap_add:
- NET_ADMIN
network_mode: "host"
privileged: true
このままコピペで動作させると、セキュリティ的にとんでもないですが、後で対応します。各種設定は以下のようになります。
- USERS=VPNを利用するユーザー名とそのパスワードのペアをコロン : で区切って設定する(; でペアごとを更に区切る) name:passwd;name2:passwd; みたいな感じ
- SPW=VPNサーバーを管理するパスワード。SoftEther VPN のサーバーは管理ツールで設定を行うため、必ず設定する
- PSK=事前共有キー。IPSecの事前共有キー。
- HPW=標準の仮想ハブのパスワード。
ここで指定しているのは、SPWだけです。というのも、SoftEther VPN の管理パスワードを再設定する方法が、(GUIからは)設定ファイルで該当行を削除する以外に見当たらず、docker でSPWを省略した場合、デフォルト値が設定されてしまうようで、セキュリティ上よろしくないから(こういうテキストファイルに書くのもよくないのですが)です。
他のユーザーやハブのパスワードなどは、サーバー管理ツールから行います。
※もしかしたら、GUIで管理するよりコマンドラインツールで管理した方が諸々楽かもしれません。
起動
docker-compose up -d
初回起動時は、 Docker イメージを自動でダウンロードするので、起動まで少し時間がかかるので、待ちます。
謎の警告が出ていますが、これはパスワードに使えない文字列(docker-compose.ymlの区切り文字かなにか)が入っていたパターンだからです。こういう場合、ログインできないので、以下のコマンドでDocker を落としてからやりなおします。
docker-compose down
SoftEther VPN の設定
docker-compose.yml の記述が問題なければ、起動します。ここから、 SoftEther VPN をちゃんと使うために設定を行います。
SoftEther VPN Server Manager のインストール
ダウンロードセンターから、SoftEther VPN Server Manager をインストールします。クライアントにも管理ツールがついてくる的なことが書かれていますが、GUIの管理ツールはついてこないみたいなので、SoftEther VPN Server Manager の、自分のOSとCPUにあったバージョンをダウンロードします。
コンポーネント、プラットフォーム、CPUを選択すれば、自動的にリストアップされるので、一番新しいものをインストールするといいでしょう。β版が不安な方は、betaとついていないものを選んでダウンロードします。
基本的に「次へ」をクリックするだけでインストールはできますが、
インストールするソフトウェアの選択では、「SoftEther VPN サーバー管理マネージャ(管理ツールのみ)」を選びます。SoftEther VPN は Windows でも簡単に動くので、Raspberry Piはちょっと……という方でも安心して使えますね。
インストールが完了したら、続いて管理マネージャーを起動し、 SoftEther VPN Server を管理していきます。
管理するサーバーの登録と接続
SoftEther VPN サーバー管理マネージャが起動したら、「新しい接続設定」ボタンをクリックします。
- 接続設定名:分かりやすい名前を付けるといいと思います。図のようにRaspberryPiでもいいですし、自宅・homeやcompany など。
- ホスト名:raspberrypi.local につなぐので、そのまま入れます。IP アドレスを固定していれば、192.168.1.181 など
- 管理パスワード:SPWで設定したものと同じものを入力します。
入力できたら、OKで終了します。
今設定したサーバーが一覧に追加されているので、ダブルクリックするか、選択して「接続」ボタンで接続します。エラーが出た場合、何かが間違っています。
ありがちなのが、docker-compose.yml で使えない文字をパスワードに入れてしまった場合だと思います。その場合は、少し前を参考にやりなおしてください(1敗)。
IPSecの設定
Windows に SoftEther VPN をインストールした場合、初回接続時には設定ウィザードが起動しますが、 Docker で入れた場合は上図のように IPsec の設定を行えます。基本的にPCから、SoftEther VPN クライアントで接続する予定なので設定は不要なのですが、今回は説明のため、「はい」としました。
ここで設定すべきなのは、「IPsec 事前共有鍵」の部分です。8文字程度とされているのは、以前の Android 端末にバグがあったためで、現在であればおそらく、10文字以上でも大丈夫だと思います。
仮想ハブとユーザーの設定
一覧に標準で、「DEFAULT」という仮想 HUB が作成されているので、これを選択して「仮想 HUB の管理」ボタンで設定用のウィンドウを出します。SoftEther VPN の場合、サーバーの中に更に、 HUB というネットワークを束ねるグループのようなものがある、というイメージです。拠点間 VPN などを実現する場合、これが大事になってきますが、今回は割愛します。
絶対に設定しておきたいのが、「ユーザーの管理(実際にVPN接続をするユーザーなので、セキュリティ上、大事)」と「仮想 HUB のプロパティ」です。
今回は、先に2. 仮想 HUB のプロパティを行います。
SoftEther VPN サーバー管理マネージャで、サーバー全体の管理ではなく仮想 HUB を直接管理するためのパスワードを接続しておきます。ちょっと用途が思いつかないのですが、大規模なネットワークでは、 HUB 単位でネットワークの管理を行うのだと思います。
接続するユーザーはサーバー全体ではなく、仮想 HUB で管理するので、部署や事業部単位で VPN ユーザーを追加したり削除したり、といった運用のときに便利なのだと思います。
なお、ここで設定するパスワードはコピペが使えないので、気合いで手入力しましょう。 RoboForm だと、紛らわしい文字を排除したランダムなパスワードを自動生成できるので、オススメです。
続いて、ユーザーの管理を行います。デフォルトで、user[ランダムな数字]というユーザーが作成されているので、
- 選択して
- 削除
します。
確認ダイアログがでますが、そのまま「はい」で削除します。
続いて、新規作成ボタンで、改めて VPN 接続を行うユーザーを作ります。
ユーザーの新規作成で必要なのは、
- ユーザー名
- パスワード
です。パスワードは変わらずコピペができないので、気合いで入れます。ここで間違っても安易なパスワードを入力しないようにしましょう(何故コピペできないのか本当に謎)。
証明書認証といった魅力的な文言が見えますが、楽介が以前試した限りだと、商用バージョンのサーバー(PacketiX)でないと使えませんでした。SoftEther VPN 自体、商用でも直接収益を得なければ特別許諾なく無償利用可能とされていますが、仕事で使う場合は、PacketiXの方が安心だと思います。
ユーザーの登録が終わったら、仮想 HUB の設定は一旦終了です。
DDNSの設定
個人用途でSoftEther VPN がオススメの理由である、IP アドレスが変わっても接続できる「ダイナミック DNS 」機能と、ルーターに穴を開けなくても
サーバー全体の設定画面に戻り、「ダイナミック DNS 設定」をクリックします。
標準でも、ダイナミック DNS ホスト名は設定されていて利用可能です。ただ、これではあまりにも味気ないので、自分で好きなホスト名(サブドメイン部分)を設定し、「上記の DNS ホスト名に変更する」をクリックして変更します。
DDNS ホスト名を変更すると、 SSL サーバー証明書を生成するか聞かれます。しかし、説明文の通り、 Windows 組み込みクライアントから接続するときに必要なだけなので、SoftEther VPN クライアントを使うつもりの今回は、「いいえ」を選択します。
ここまでで、VPN サーバーの設定は一旦完了です。SoftEther VPN サーバー管理マネージャを終了しても大丈夫です。
SoftEther VPN 設定の永続化
ここまで設定しましたが、実は SoftEther VPN の config ファイルがDocker Image の中にあるので、Docker の再起動や Raspberry Pi の再起動で内容が消えてしまいます。
ということで、ssh で Raspberry pi OSに接続します。
まずは、
docker ps
コマンドで SoftEther VPN が動作している Docker コンテナの名前を確認します。
設定ファイルを特にいじっていなければ、楽介と同じ、 softether_app_1 になると思います。
これが確認できたら、
docker cp softether_app_1:/usr/vpnserver/vpn_server.config /home/pi/softether/vpn_server.config
として、今まで作業した内容が書き込まれた vpn_server.config ファイルをホスト側にコピーします。softether_app_1の部分が確認したコンテナの名前、/home/pi/softether/の部分は、docker-compose.yml を格納しているディレクトリへのパスです。
コピーできたら、
docker-compose down
で、一旦 SoftEther VPN のコンテナを終了させます。終了させたら、
nano docker-compose.yml
で改めて Docker の設定を編集します。
version: "3"
services:
app:
image: siomiz/softethervpn
restart: always
volumes:
- /home/pi/softether/vpn_server.config:/usr/vpnserver/vpn_server.config
cap_add:
- NET_ADMIN
network_mode: "host"
privileged: true
編集後は、上のようになります。
Environment は、全て vpn_server.config に記載されているので削除し、代わりに、restart と volumes のコメントアウトを外しています。volumes: の次の行が、先ほどdocker cp でコピーしたパスと対応しているのを確認してください。これで、 Docker コンテナの中の vpn_server.config がホストのものを読み込むようになるので、永続化します。
編集が終わったら、
docker-compose up -d
で、 SoftEther VPN を再起動。SoftEther VPN サーバー管理マネージャで接続し、先ほど設定した、ダイナミック DNS や、ユーザーなどの設定が残っていれば、永続化も成功です。
SoftEther VPN Client のインストールと設定
同じくダウンロードセンターから、自分の環境にあった SoftEther VPN のクライアントをダウンロード、インストールを行います。当然ですが、 VPN 接続を行うノート PC などで行わないと実用にはなりません(SoftEther のパスワードなどが正しいことは分かりますが)。
インストールは基本的に、「次へ」をクリックするだけで完了します。
インストールが完了したら、 SoftEther VPN クライアント接続マネージャを起動します。
初期状態では当然、接続先がないので、「新しい接続設定の作成」をダブルクリックします。
最初は、 VPN 接続に用いる仮想 LAN カードがないので、作成するようにというメッセージがでます。作成しないと VPN 接続できないので、「はい」をクリックします。
名前を入力するように促されますが、基本的にはデフォルトの「VPN」のままで大丈夫です。
OKをクリックすると、仮想 LAN カードのインストールに少し時間がかかります。画面に、「他の操作をしないように」と出るので、大人しく待ちます。少し時間がかかるといっても、1分もかからないので我慢します。
インストールに成功すると、下段のリストに VPN Client Adapter – VPN といいう仮想 LAN カードが追加されます。改めて、「新しい接続設定の作成」をダブルクリックします。
ここでの設定は、サーバー側で設定した内容を入れていきます。
- 接続設定名は適当に、分かる物で大丈夫です
- ホスト名は、通常は SoftEther の提供するダイナミック DNS を使うと思うので、それを入力します。
- ポート番号は標準の443で大丈夫だと思います。
- 仮想 HUB 名は、変更していなければ DEFAULT です。
- 仮想 HUB で作成したユーザー名です
- 仮想 HUB で設定した、ユーザーのパスワードです。今回はコピペができます。
設定できたら、「OK」ボタンをクリックします。
作成されると、一覧に追加されるのでこれをダブルクリックで接続します。
接続に成功すると、上図のような警告メッセージが出ます。これは、NAT トラバーサル機能(ルーターを設定しなくても VPN が使える機能)を利用しているために、ネットワーク接続が不安定になる場合がある、というメッセージです。
本来は、ルーターでポートフォワードの設定が必要ということみたいです。そちらは、困ったらやるということで、チェックをつけて「OK」で閉じます。
接続の確認
接続確認には、スマホのテザリング(アクセスポイント機能)を使うのが最もお手軽だと思います。スマートフォン経由でネットワークに接続し、更に SoftEther VPN に接続します。
その状態で、
Raspberry Pi OS に ssh したり、Nextcloud の Web GUI などにアクセスしたりして、表示できれば成功です。
お疲れ様でした。
終わりに
これで、 Raspberry Pi にインストールした様々なサーバーに外出先からアクセスする準備が整いました。
VPN という性質上、セキュリティ面で気をつけなければいけないことが多く、 Docker でインストールしているのに結局設定が大変! という状態になっていますが、逆にこれを乗り越えると、後はローカルにインストールしていくだけなので気軽に拡張ができると思います。
PacketiX も基本は SoftEther VPN らしいので、きちんとしたネットワーク構築に自信があれば、中小規模の企業のネットワーク環境を飛躍的に向上させられると思います。
まあ、そもそも大手サービスを利用していても、パスワードなどの運用がダメ……というパターンもありますし、持ち出しちゃいけない USB メモリを持ち出されて紛失されるよりは、(管理者のスキルが多少不安であっても)紛失が分かった段階でアカウントの停止ができる VPN の方がセキュリティ上は安心だとは思います(ローカルにコピーされちゃうとどうしようもないですが)。
次回は、 Redmine とかを入れられたらなぁと思っています。楽介でした。