2018年12月2日日曜日

VPN(Docker版)

目的


ORCAサーバやOpenDolphinサーバとの通信は暗号化されていないため、キャプチャすると簡単に盗聴される。
たとえば図1に示すようなネットワークを考える。

ルータのInternet側にもともとパソコンAに設定されていたIPアドレスを割り当てて学内LANに接続する。
パソコンAおよびBはIPアドレスおよびDNSサーバのアドレスの自動取得をするよう設定し、ルータRのLAN側のDHCP機能を有効にする。

パソコンAとBはリピータハブで接続され、リピータハブはルータRを介して学内LANに接続し、学内LAN上で稼働しているORCA/OpenDolphinサーバと通信を行う。

図1.盗聴可能なネットワーク
これだと、クライアントAとサーバSの通信は、Bでパケットキャプチャを行えば盗聴されれてしまう。
これを防ぐためにはAとSの間の通信を暗号化しなければならない。

そこで、ベアボーンサーバにVPNサーバソフトであるSoftEtherをインストールして、クライアントAとサーバS間の通信を暗号化する。その際、SoftEtherはDocker版(frosquin/softether)を利用することにした。

Docker版SoftEtherのインストール


Docker版SoftEtherのインストールは「Docker + SoftetherVPNでマイクロサーバーを構築する」を参考にした。

dockerイメージの取得

sudo docker pull frosquin/softether 
リスト1.dockerイメージの取得

コンテナの作成

sudo docker run -d --net host --cap-add NET_ADMIN --privileged --name softether frosquin/softether
リスト2.コンテナの作成
コンテナ名はsoftetherで、管理者権限を拡張する--privilegedオプションを付けてコンテナを作成する。

コンテナの起動


sudo docker start softether
リスト3.コンテナの起動

docker psコマンドで起動したコンテナを確かめることができる。
sudo docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                     NAMES
488fe5249e3b        frosquin/softether    "/usr/local/vpnserve…"   35 minutes ago      Up 35 minutes                                 softether
6f63042e3c9b        dolphindev/wildfly    "/opt/jboss/wildfly/…"   28 hours ago        Up 28 hours         0.0.0.0:8080->8080/tcp    dolphin-server
11612dde7a32        dolphindev/postgres   "/docker-entrypoint.…"   28 hours ago        Up 28 hours         0.0.0.0:32768->5432/tcp   dolphin-db
リスト4.コンテナの表示
なお、コンテナを停止するにはリスト3においてstartをstopにする。

VPNサーバの設定


次にWindows版のSoftEther VPN サーバマネージャを使ってVPNサーバの設定を行う。

図2.SoftEther VPN Server Manager for Windows のダウンロードサイト

ダウンロードしたサーバマネージャを起動して [新しい接続設定]をクリックする。

図3.SoftEther VPN サーバーマネージャ画面
 
[新しい接続設定の作成]画面が開いたら[接続設定名]には「orca**への接続」(orca**は表A2.1に記載した各グループのコンピュータ名)、[ホスト名]にはベアボーンサーバのIPアドレスを入力して[OK]ボタンをクリックする。

図4.新しい接続設定の作成画面

SoftEther VPN サーバー管理マネージャ画面に戻ったら、作成した「orca**への接続」を選択して[接続]ボタンをクリックする。

図5.SoftEther VPN サーバーマネージャ画面

このとき、パスワード入力画面が表示されるので管理モードで接続する際のパスワード(便宜上、サーバのパスワードと同じにしている)を設定して[OK]ボタンをクリックする。
SoftEther VPN サーバをインストールした直後は、このパスワードが設定されていないため、ここで設定を行っている。ここで入力したパスワードはVPNサーバに設定され(図4の[管理パスワード]に設定される)、他のクライアントからサーバー管理マネージャを起動した際も、このパスワードの入力が必要となる。

以降、「SoftEther VPN Server / Bridge 簡易セットアップ」に従ってサーバのセットアップを行う。

図6が出たら[リモートアクセス VPNサーバ]をチェックして[次へ]進む。

図6.リモートアクセス VPN サーバーを選択

「続行すると、このVPN ServerまたはVPN Bridgeの現在の内容は、簡易セットアップで指定した内容に初期化されます。よろしいですか?」との警告メッセージが出るが、そのまま[はい]をクリックする。

図7.警告メッセージ

続いて、仮想HUB名の入力を促すダイアログ画面が表示されたら「VPN」と入力して[OK]ボタンをクリックする。

図8.仮想HUB名の決定画面

ここで、「仮想HUB」とは、スイッチングハブと同等な機能をソフトウェアで実装したものである(図9)。


図9.仮想HUBの機能(SoftEtherの解説サイトより転載)


図8で[OK]ボタンをクリックしたときに表示される[ダイナミック DNS 機能]の設定画面では、[ダイナミック DNS ホスト名の変更]に「●●****●●」(****は各自のグループのコンピュータ名)と入力して[上記の DNS ホスト名に変更する]ボタンをクリックする。

図10.ダイナミック DNS 機能

 ダイナミック DNS 機能というのは、コンピュータに付けたIPアドレスが変わっても、それに追従してホスト名とIPアドレスの対応関係を動的に更新するDNSの機能である。これを使えばIPアドレスではなくここに設定したホスト名でVPNサーバにアクセスして管理できる。

続いて図11に示すVPN Azureの設定画面が表示されるので、[VPN Azure 設定]において[VPN Azure を有効にする]をチェックして[OK]をクリックする。

図11.VPN Azureサービスの設定画面
 VPN Azureはファイアウォールを貫通して、内部にあるSoftEther VPNサーバと外部にあるVPNクライアントとの接続を確立するサービスである。これを有効にすることによって
●●****●●.vpnazure.net
というFQDNを使って外部のVPNクライアントから内部のVPNサーバへ接続することができる。

次にユーザの新規作成を行います。図12の[ユーザ新規作成]画面が表示されるので、[ユーザ名]に各自のユーザ名を、パスワードには各自のパスワードを入力して[OK]ボタンをクリックする。

図12.ユーザの新規作成


これをグループメンバ全員に対して行う。

ユーザ登録が終わると、次はローカルブリッジの設定を行う。図13において、左下にある[ローカルブリッジの設定]ボタンをクリックする。

図13.左下の[ローカルブリッジ設定]ボタンをクリックする

すると、図14に示す画面が現れるので、ここで[仮想HUB]に図8で設定した「VPN」を、[LANカード]には選択ボックスから「enp3s0」を選択して入力する。
なお、「enp3s0」というのはベアボーンサーバの物理NICに付けられたデバイス名である。

図14.ローカルブリッジ設定画面
 
図14において[ローカルブリッジを追加]ボタンをクリックすると、図15に示す確認画面が出るので[OK]をクリックする。

図15.ローカルブリッジ設定の確認画面

その後、[ローカルブリッジ接続の定義を追加しました]というメッセージが出たら[OK]をクリックする。これで、図15に示すように仮想HUB「VPN」とLANカード「enp3s0」のブリッジが追加される。

図16.追加された仮想HUB「VPN」とLANカード「enp3s0」のブリッジ接続

図9に示す仮想HUBとベアボーンサーバの物理NIC「enp3s0」の間がブリッジで接続されたため、VPNクライアントはVPNサーバを介して図1に示す学内LAN上の他のホストと通信ができる。

SoftEther VPN クライアントからの接続


以上でVPNサーバの設定は完了したので、次にVPN クライアント接続マネージャのインストールと設定を行って、実際にVPN接続を行う。

まず、SoftEtherダウンロードセンターからSoftEther VPN クライアントをダウンロードする。[ダウンロードするソフトウェアを選択]から「SoftEther VPN (Freeware)」を、[コンポーネントを選択]から「SoftEther VPN Client」を、[プラットフォームを選択]から「Windows」を、そして[CPUを選択]から「INtel (x86 and x64)」を選んで、下に出た先頭の「SoftEther VPN Client (Ver ●.●, Build ●●●, ●)」をクリックしてダウンロードする(●はバージョン等)。
ダウンロードしたファイルを実行してインストールを行い、インストールが終了したらVPN クライアント接続マネージャを起動する(図17)。

図17.VPN クライアント接続マネージャ

図17の上側にある[新しい接続設定の作成]をダブルクリックすると図18のポップアップウィンドウが表示されるので、[仮想LANカードの名前]に「VPN」と入力する。

図18.新しい仮想LANカード作成画面

しばらくすると仮想LANカードが作成され、図19の画面下側に表示される。

図19.作成された仮想LANカード(下側)

仮想LANカードは実際のLANカード(物理NIC)をソフトウェアで実装したもので、これをVPNサーバ上に作成された仮想HUBに接続して使用する。
仮想LANカードはユーザにとっては物理NICと同じように見える。したがってIPアドレス、サブネットマスク、デフォルトゲートウェイ等の設定を行わなければネットワークの利用ができない。

そこで、コントロールパネルを使って仮想LANカードに対してこれらのネットワーク設定を行う。

図20.コントロールパネル(アダプターの設定変更)

[コントロールパネル]→[ネットワークとインターネット]→[ネットワークの状態とタスクの表示]→[アダプターの設定変更]と選択していくと図20の画面が現れるので、「VPN - VPN Client」を右クリックして[プロパティ]を選択する。
すると、図21のプロパティ画面が出るので、ここに[IPアドレス]、[サブネットマスク]に255.255.0.0、[デフォルトゲートウェイ]に172.16.254.254、そして[優先DNSサーバ]に172.16.254.1を入力して[OK]をクリックする。

図21.仮想LANカードのネットワーク設定

ただし、このとき、「IP」アドレスには、もともとそのPCに付けられていたIPアドレスの第4オクテットから100を引いたものを設定する。例えば、もともとのIPアドレスが172.16.111.136であれば172.16.111.36を設定する。
これは、IPアドレスが重複しないようにするために行うものであって、重複さえしなければ何でもよかった。しかし、各グループが勝手にIPアドレスを設定すると重複する可能性があるのでこのようにした。
では、なぜ、もともとついていたIPアドレスを設定しないのかと疑問に思うかもしれないが、これは既に図1でブロードバンドルータの学内LAN側(インターネット側)に設定するIPアドレスとして使っているからである。

 再びSoftEther VPN クライアント接続マネージャに戻って、画面の上にある[新しい接続設定の作成]をダブルクリックする。

図22.SoftEther VPN クライアント接続マネージャ

すると、図23に示す画面が出るので、[接続設定名]には「***への接続」(***VPNサーバのコンピュータ名)、[ホスト名]にはVPNサーバのIPアドレス、[仮想HUB名]には図8で設定した仮想HUB名(この場合は「VPN」)、そして、[ユーザー認証]の[ユーザー名]と[パスワード]に、図12で設定した情報を入力して[OK]をクリックする。
これで、接続設定の作成は完了である。図23の上側から作成した接続設定をダブルクリックするとVPN接続が行える。

図23.「***への接続」をダブルクリックしてVPN接続する


VPN接続のテスト


図23において、作成した「***への接続」をダブルクリックして状態が「オフライン」から「接続完了」に変わったことを確認する。
図1のパソコンBで、キャプチャフィルタに
host 172.16.254.1
を設定してパケットキャプチャを 開始する。
ここで、172.16.254.1は、大学のDNSサーバのIPアドレスである。
その後、パソコンAから172.16.254.1に向けてpingを送る。pingが終了したら、パソコンBのパケットキャプチャを止めて、パソコンAと172.16.254.1との通信(ICMPパケット)を探す。

次に、VPN接続を切断して(図23の「***への接続」を右ボタンでクリックして「切断」を選択)同じことをやり、両者の相違を確認する。

VPNサーバ上で稼働するサービスへの接続


ところで、ここで一つ問題がある。
ここまでの設定で、図1におけるパソコンAはVPNサーバSを介して学内LAN上の他のホストに接続できるようになったが、肝心のサーバS上で稼働しているサービスに接続できない。これは、サーバSにpingを送ったり、あるいはサーバSにTeraTerm (ssh) で接続を試みると確認できる。
これについてSoftEtherのサイトには次のような記述がある。

「Linux および Solaris オペレーティングシステムでは、仮想 HUB (VPN) の内側からローカルブリッジ先のLANカードから LAN への通信は行うことが出来ますが、ローカルブリッジしている LAN カード自体に対して通信することはできません。これは Linux カーネルの制限事項です。」(11.1.2 ローカルブリッジを使用する際に VPN 内部からローカルブリッジに使用している仮想 LAN カードの IP アドレスと通信できない場合

図24.ローカルブリッジ機能(「3.6.1 ローカルブリッジとは」から転載)

さらに
「Linux オペレーティングシステム内部での制限事項により、VPN 側 (仮想 HUB 側) からローカルブリッジしている LAN カードに割り当てられる IP アドレスに対して通信を行うことはできません。この制限は SoftEther VPN が原因ではなく、Linux の内部構造に原因があります。もし VPN 側 (仮想 HUB 側) から Linux でローカルブリッジに使用しているコンピュータ本体と、何らかの通信を行いたい場合 (たとえば VPN Server / VPN Bridge サービスと HTTP サーバーサービスを両方動作させており、VPN 側からもサーバーサービスにアクセスさせたい場合) は、ローカルブリッジ用の LAN カードを用意して接続し、その LAN カードと既存の LAN カードの両方を物理的に同じセグメントに接続してください 」(3.6.11 Linux, FreeBSD, Solaris, Mac OS X オペレーティングシステムで「ローカルブリッジ機能」を使用する場合の注意事項は、下記のとおりです。

とある。
まさに、今問題となっている「サーバS上で稼働するORCAサーバやOpenDolphinサーバに接続できない」現象である。

この問題を回避するためには、上の記述にあるように「ローカルブリッジ用のLANカード」を用意して、それを既存のLANカードと物理的に接続すればよいということである。しかし、そのためにわざわざLANカードを用意するのではなく、仮想イーサネットアダプタを作成して、それを仮想ブリッジを使って物理LANカードに接続する方法を試してみる。
それを実現するための構成図を図25に示す。

図25.仮想LANカード(NIC)を使った回避策

図25に示すように、SoftEther VPN が稼働しているコンテナ内に仮想LANカード「tap_br0」を作成する。これはコンテナに入ってvpncmdを使って行う。
# コンテナsoftetherへ入る
sudo docker exec -it softether /bin/bash
# vpncmdを実行する
./vpncmd localhost:443 /SERVER
# BridgeCreateコマンドで仮想LANカードtap_br0を作成
VPN Server>BridgeCreate VPN /DEVICE:br0 /TAP:yes
BridgeCreate command - Create Local Bridge Connection
While in the condition that occurs immediately after a new bridge connection is made when bridging to a physical network adapter, depending on the type of network adapter, there are cases where it will not be possible to communicate using TCP/IP to the network adapter using a bridge connection from a computer on the virtual network.
(This phenomenon is known to occur for Intel and Broadcom network adapters.)


If this issue arises, remedy the situation by restarting the computer on which VPN Server / Bridge is running. Normal communication will be possible after the computer has restarted.


Also many wireless network adapters will not respond to the sending of packets in promiscuous mode and when this occurs you will be unable to use the Local Bridge. If this issue arises, try using a regular wired network adapter instead of the wireless network adapter.

Instructions for Local Bridge on VM
It has been detected that the VPN Server might be running on a VM (Virtual Machine) suchlike VMware or Hyper-V. Read the following instructions carefully. If you are not using a VM, please ignore this message.
Some VMs prohibit the "Promiscuous Mode" (MAC Address Spoofing) on the network adapters by default.

If the Promiscuous Mode (MAC Address Spoofing) is administratively disabled, the Local Bridge function between a Virtual Hub on the VPN Server and a physical network adapter on the physical computer does not work well. You should allow the Promiscuous Mode (MAC Address Spoofing) by using the configuration tool of the VM.

For details please refer the documents of your VM. If it is a shared-VM and administrated by other person, please request the administrator to permit the use of the Promiscuous (MAC Address Spoofing) Mode to your VM.

The command completed successfully.
リスト5. VPNサーバが稼働するコンテナ内に仮想LANカードを作成

作成した仮想LANカードはvpncmdのBridgeListで確認できる。
VPN Server>BridgeList
BridgeList command - Get List of Local Bridge Connection
Number|Virtual Hub Name|Network Adapter or Tap Device Name|Status
------+----------------+----------------------------------+---------
1     |VPN             |enp3s0                            |Operating
2     |VPN             |br0                               |Operating
The command completed successfully.
リスト6. 仮想LANカードの確認

exitを2度入力して、ホストに戻ってifconfigコマンドを使ってtap_br0ができているかどうかを確認する。
root@orca17:/home/hinfo# ifconfig
docker0   Link encap:イーサネット  ハードウェアアドレス 02:42:92:6e:d7:02
          inetアドレス:172.17.0.1  ブロードキャスト:172.17.255.255  マスク:255.255.0.0
          inet6アドレス: fe80::42:92ff:fe6e:d702/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:1 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:105 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:28 (28.0 B)  TXバイト:11882 (11.8 KB)

enp3s0    Link encap:イーサネット  ハードウェアアドレス f4:4d:30:6b:ac:0c
          inetアドレス:172.16.111.217  ブロードキャスト:172.16.255.255  マスク:255.255.0.0
          inet6アドレス: fe80::7694:9273:3f8b:36ff/64 範囲:リンク
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1986  メトリック:1
          RXパケット:5842370 エラー:0 損失:3032 オーバラン:0 フレーム:0
          TXパケット:2565088 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:519694022 (519.6 MB)  TXバイト:147060280 (147.0 MB)

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:13354 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:13354 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1
          RXバイト:4066148 (4.0 MB)  TXバイト:4066148 (4.0 MB)

tap_br0   Link encap:イーサネット  ハードウェアアドレス 00:ac:e8:ab:e0:a4
          inet6アドレス: fe80::2ac:e8ff:feab:e0a4/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:138189 エラー:0 損失:60897 オーバラン:0 フレーム:0
          TXパケット:2901 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:15206570 (15.2 MB)  TXバイト:257382 (257.3 KB)

veth1d232e7 Link encap:イーサネット  ハードウェアアドレス f2:e3:46:76:08:5b
          inet6アドレス: fe80::f0e3:46ff:fe76:85b/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2097 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:2423 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:376351 (376.3 KB)  TXバイト:451503 (451.5 KB)

veth944e4d7 Link encap:イーサネット  ハードウェアアドレス d2:c8:42:4f:2d:82
          inet6アドレス: fe80::d0c8:42ff:fe4f:2d82/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2258 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:2239 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:432467 (432.4 KB)  TXバイト:392165 (392.1 KB)
リスト7.ifconfigコマンドでtap_br0ができているか確認


【参考】CuBox-i/HummingBoard(22) SoftEther VPNで外から irMagician を制御してエアコンをつける

ただし、これらの処理はネットワーク越しではなく直接サーバ上で行う必要がある。なぜならばリスト8で物理LANカードのIPアドレスを削除するのでネットワークに繋がらなくなるからである。

0 件のコメント:

コメントを投稿

OpenDolphinとORCAの連携

第3章の章末問題 第2章の章末問題でやったカルテ例1をOpenDolphinに入力してORCAで診療報酬明細書を作成し、模範解答と比較しなさい。 を実際にやってみたのでまとめておく。 OpenDolphinで過去にさかのぼってカルテは作成できるか? その前に標題に...