VPNでネットワークを繋ぐ
目次
離れた場所のLANを繋ぐには?
「事務所と、倉庫をネットワークで繋げたい」
社内SEとして勤めていた時、離れた場所にある事業所と、LANを繋いだような状態にしたいという要望がありました。
倉庫でも共有フォルダのファイルを閲覧/修正する必要が出たためでした。
ここで整理ですが、事業所や家庭など、ある一定の場所の中のコンピュータを結びつけたのがLAN(Local Area Network
「プライベートネットワーク」 ともいいます)です。
一方、インターネットの事を、WAN(Wide Area Network 「パブリックネットワーク」)と言ったりします。
諸説はありますが、このWANとLANは、ルーターを境に、構内側がLANで、外側がWANと分けられています。
プライベートネットワークの情報は、ルーターを超えてパブリックには流れませんし、パブリックの情報も、許可されたものでない限りは、ルーターを通過できません。

では、データが通過出来ないなら、インターネットとデータが「やりとり」出来るのはなぜでしょうか?
例えばインターネットを閲覧するときは、ローカルネットワーク内で、ルーターに対し「○○のサイトのデータを要求します」という情報が送られます
受け取ったルーターは、パブリックネットワークの○○サイトにデータを要求し、返ってきたデータを要求してきた端末に送るという作業をやっています。
上の図の事務所と倉庫は、それぞれ別のローカルネットワークですから、互いにデータをやりとりする事はできません。
お互いにインターネットに繋がってるルーターが関門になって、データが堰き止められてしまいます。
なので、倉庫から事務所のファイルを閲覧したりする事はできません。
では、どうすれば接続が可能になるのか。
それはVPNの接続環境を用意することで、LAN同士を繋ぐ事が可能になります。
VPNとは、Virtual Private Networkの頭文字を取った用語です。
VPNを導入すると、上の図では倉庫のパソコンが、事務所内の「プライベートネットワーク」に加わったのと同じになります。
本来、「プライベートネットワーク」内でやりとりされるデータを、互いのルータをくぐり抜けて、 「パブリックネットワーク」を経由してやりとりしてしまうのです。
もちろん、事務所の「プライベートネットワーク」のデータをそのまま「パブリックネットワーク」に流したら、誰が見ているか判らないので危険極まりありません。
そこで、概念としてですが、やりとりされるデータを「カプセル」に入れ、更に、「カプセル」を暗号化して、仮に誰かが「カプセル」を見ても意味不明なデータとなるようにします。
そうして、ルーターから、相手のルーター宛にでデータを受け渡しし、プライベートネットワークに入ったら、データを復号してカプセルから出し、今度は「プライベートネットワーク」のデータとしてやりとりするという仕組みです。

これを実現するアプリとして有名なものがSoftEther VPN
https://ja.softether.org/
になります。
なんと無料で使用できるVPNで、有料アプリと同等の能力を持っています。
VPN Serverのインストール
今回の構成では、VPN Server とVPN Client を使用し、事務所内のファイルサーバー機に、VPN Serverをインストールし、倉庫のパソコンにはClientをインストールしました。

ダウンロードは、 SoftEther のページから選択して行います。
今回の場合は、Centos のサーバー機をVPN Server とします。
前提条件として、LANカードを増設し、標準のLANがeth0、追加したLANカードがeth1で、ネットワーク起動ができているものとします。
サーバーがLinuxなので、コンポーネントをVPN Server、プラットフォームはLinux、CPUはx64にしてダウンロードします。
例えば、Windows Server があるならWindows用、そのコンピュータが32bitならx86と、条件により選択します。
betaと付いているのは試作を含むβ版ですので、rtmとついているものを選択しました。

上記のように、ダウンロードのリンク一覧から、ダウンロードするものを選び、そのURLをコピーします。
これを書いた時点では、rtmで最新のものは、リリース日: 2018-01-15のものなので、URLをコピーすると、
となります。
このため、
$ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.25-9656-rtm/softether-vpnserver-v4.25-9656-rtm-2018.01.15-linux-x64-64bit.tar.gz
とタイプすれば、Linux上の現在位置に、softether-vpnserver-v4.25-9656-rtm-2018.01.15-linux-x64-64bit.tar.gz がダウンロードされます。
では、このファイルを解凍しましょう。
$ tar zxvf softether-vpnserver-v4.25-9656-rtm-2018.01.15-linux-x64-64bit.tar.gz
$ ls
softether-vpnserver-v4.25-9656-rtm-2018.01.15-linux-x64-64bit.tar.gz
vpnserver ← 解凍により出来上がったディレクトリ
# cd vpnserver
# make
--------------------------------------------------------------------
SoftEther VPN Server (Ver 4.25, Build 9656, Intel x64 / AMD64) for Linux Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.
--------------------------------------------------------------------
Do you want to read the License Agreement for this software ?
1. Yes
2. No
Please choose one of above number:
1
Did you agree the License Agreement ?
1. Agree
2. Do Not Agree
Please choose one of above number:
1
これで、VPN server のプログラムが作成できました。
出来上がったプログラムの入った vpnserverディレクトリは、丸ごと/usr/local/ へ移動し、cd /usr/local/vpnserver/ で実行する様にします。
実行権を与えれば、
/usr/local/vpnserver/ vpnserver start
で起動できます。
起動したら、細かい設定になるのですが、それには vpncmd という付属のコマンドアプリで設定する必要があります。
しかし、それはかなり大変なので、先ほどのソフトイーサーのページに戻り、Windows 用のサーバーをダウンロードします。

ダウンロードしたWindows用のサーバーインストーラーを起動すると、このように、自身にサーバーを入れるか、Bridgeを入れるか、管理ツールだけインストールするかの選択になりますので、管理ツールのみインストールします。

インストール完了後、起動すると、このような画面になります。
新しい接続設定で、VPN Serverをインストールしたサーバー機への接続を作成します。

VPN Serverの接続先を、ホスト名か、IPアドレスで指定します。
指定が終わると、先ほどの管理画面の接続が使えるようになるので、接続します。
最初はパスワードを聞かれますが、無視して進行すると、新しいパスワードの設定を促されます。
新しいパスワードを設置すると、接続されますが、最初の接続の場合、簡易セットアップが出現します。
私の場合は、簡易を使用した事はないので、キャンセルしています。

簡易設定を閉じると、メインの設定画面が現れます。
まず、5555ポートを除いて、他のポートは止めてしまいましょう。
次に仮想HUBの管理をクリックします。

管理画面が開きます。ここで設定するのは、仮想HUBの管理と、ローカルブリッジの設定です。
まず、仮想HUBの管理から、

設定するのは、ユーザーの管理です。ユーザーIDとパスワードを作成します。

次に、ローカルブリッジを設定します。

VPN Server機は、前提としてLANカードを増設し、2つのネットワークケーブルが繋がっている状態なのを確認してください。
これは、VPN Clientから eth0を使用して仮想HUBに入ってきた「暗号化されたパケット」を VPN Serverが復号した際、そのまま来た道であるeth0へ送り出す事が出来ないためです。
復号し、カプセルから出たLAN用パケットを、実際にローカルネットワークに放流するのは、この場合ではeth1でないとできません。
このため、仮想HUBと増設LANカードの間に、ローカルブリッジを設定して、eth1への経路を作成します。
これでVPN Serverの設定はひとまず完了です。
ルーターのポート開放
使用しているルーターの設定から、5555ポートでの接続は、VPN Serverをインストールしたホストへ飛ばすよう、設定してください。
VPN Client のインストール
今回の例では、倉庫のパソコンで、先ほどの SoftEther のページから VPN Clientをダウンロードし、インストールします。


まず、このプログラムの画面下の「仮想LANカード」を追加します。
イメージとしては、VPN Clientの仮想LANカードから、インターネット越しに仮想のLANケーブルを、VPN Serverの仮想HUBに繋ぐという形になります。



仮想LANカードの追加から、VPNという名前の仮想LANカードを追加しました。
次に、新しい接続設定から、接続情報を作成します。

接続先名は、自分が判りやすいものにします。
ホスト名は、相手先、この例では事務所のルーターのグローバルIPです。
確認くんなどで調べられます。
ユーザー名とパスワードは、先ほど、VPN Serverのユーザー管理で作成した、ユーザーIDとパスワードを設定します。
設定が完了したら、作成した接続名称で接続します。
このとき、画像の部分のMACアドレスを控えておいてください。
後に、セキュリティ強化で用います。

設定が上手くいっていれば、相手先のルーターへ繋がり、開いている5555ポートでVPN Serverに繋がります。
これで、今回の例では倉庫のパソコンは、 擬似的に事務所のパソコンとLANケーブルで繋げたのと同じになり、例えば、事務所のファイルサーバーからデータファイルを閲覧したり、データベースからデータを引き出したりが可能になりました。
セキュリティを強化する
さて、ここまでの設定では、セキュリティに難があります。
例えば、社員の誰かが倉庫用のユーザーIDとパスワードを持ち出し、自分のパソコンにVPN Clientをインストールして、ここまでの設定をすると繋がってしまいます。
このため、先ほど控えた仮想LANカードのMACアドレスで、接続できるパソコンに縛りをかけてしまいましょう。
まず、VPN Serverの、仮想HUBの管理から、アクセスリストの管理へ行き、アクセスリストを4つ作成します。
まず一つ目は、あらゆるVPNのパケットを破棄する設定です。
優先度を大きい数字にし、これ以下にはリストを作らないようにします。

全破棄より少し小さい値で、UDPの接続を通すリストを作成します。

これを設定しておかないと、Client側からPINGなどネットワークを調査するコマンドが通らなくなります。
次にユーザー用のアクセスリストを2つ作成します。

名前はわかりやすいものにします。
優先度は小さめの値にします。
送信元のMACアドレスに、Clientの仮想LANカードのMACアドレスを入力します。
マスクは、FF-FF-FF-FF-FF-FF とします。
宛先は全てとします。

先ほどと似ていますが、今度は宛先のMACアドレスに、控えておいたMACアドレスを入力し、送信は全てとします。
結果、VPN ClientからのパケットのMACアドレスが、送信元と合致していないと、このリストにヒットせず、最終の破棄により捨てられます。
逆にVPN Serverからの返信パケットも、宛先が指定MACのものでないと、 このリストにヒットせず、やはり最終の破棄により捨てられます。
MACアドレスは、ネットワーク機器の固有IDで、世界中でも同じものはありません。
仮想LANカードのMACアドレスも固有値で、例えばパソコンを交換して、VPN Clientをインストールすると、仮想LANカードのMACアドレスが変わります。
前例の、社員の誰かが倉庫用のユーザーIDとパスワードを持ち出し、自分のパソコンにVPN Clientをインストールして、ここまでの設定を行ったとしても、仮想LANカードのMACアドレスが違うため、繋がっても全てのパケットが捨てられてしまい、何も操作ができません。
倉庫からパソコン本体そのものを盗みだされると流石にどうにもできませんが、その場合はServerからClientを無効にすることで対処できます。
この他にも、例えば地方にある支店から、本社のコンピュータと繋ぎたいなどの要望にも使えます。
LANとLANという複数の接続だと、VPN Bridge があるので、それを使用します。
また、今流行の「働き方改革」で、自宅作業を考えているけれど、データの漏洩が心配という方、VPN Server とVPN Client を正しく設定すれば、どこに居ても安全に会社のファイルにアクセスできます。
事務所と別の場所のパソコンを繋ぎたいなど要望がありましたら、きっとお役に立てると思います。