環境 ホストOS: Ubuntu16.04 ゲストOS: Ubuntu16.04 Hyperviser: kvm 2.5.0 SSHクライアント: Windows10 pro
目次
背景
リモートで非公開ネットワークに接続したいがために、VPNサーバを既存のKVM上に作成することにした。 基本的に自分しか接続しないため、同時接続台数はせいぜい2台くらいだと考えられる。 よって、新たにサーバを購入しセットアップするよりは、既存のKVM上にサクッと最小構成で構築する方が楽だと考えた。また、ソフトウェアで簡単に制御できることを考え、VPNサービスには、SoftEtherを用いることを検討した。
SoftEtherに関しては、以下のリンクを参照すること。
SoftEther VPN プロジェクト - SoftEther VPN プロジェクト
筑波大学の研究チームが研究・開発をしている、ソフトウェアでイーサネットを制御するための、オープンソースのプロジェクトである。ファイアウォールも突破して安全にVPN接続できたりするのがうりらしい。
さて、今回のVPNサーバ構築の簡単な手順をまとめると、以下の通りとなる。
- KVM上にゲストOSをubuntu16.04としてインストール
- ゲストOSにSoftEtherをインストールする
- SoftEtherのセットアップ
なお、KVMは既にセットアップ済みであるとしておく。
KVM上にVMを追加する
ホストOSにsshで接続しておく。sshクライアントはWindowsなので、標準のbash on ubuntuを用いた。最近はWindowsでもbashもどきが使えて、sshをするのに苦労しない。
ディスクの作成
まずはVMのディスク領域を確保する。 最小構成なので、-Lで指定するディスクサイズはとりあえず20GBとした。
$ sudo lvcreate -n hoge.example.jp -L 20G VStorage
作成したディスクへのOSインストール
次に以下のコマンドを実行する。
$ sudo virt-install \ --name hoge.example.jp \ --vcpus 1 \ --ram 1024 \ --os-type 'linux' \ --cdrom /var/isoimages/ubuntu-16.04.1-server-amd64.iso \ --disk path=/var/VStorage/hoge.example.jp \ --network bridge=br100 \ --network bridge=br101 \ --graphics vnc,port=9999,listen=127.0.0.1,keymap=ja \ --virt-type kvm
nameには任意で、ホストOS内でユニークになるような名前をつける。 cdromで指定しているOSのイメージファイルは、予めダウンロードしておき、そのパスを記載する。 diskでは、VMのイメージファイルの格納場所を指定するので、先程確保した論理ディスクのパスを指定した。 リソースの内訳は、vcpuで指定した1コアと、ramで指定した1GBメモリということにした。 ネットワークインタフェースに関しては、networkで指定しているように、ホストOSから2つブリッジで接続させた。 インストール時に、VNCでリモートから画面を開きたかったため、graphicsにはport番号とlisten portを指定した。
ちなみにワンライナーで実行してもいいのだが、長くなってしまうので、私の場合はテキストファイル(hoge.shとする)に同様の内容を書きこんで、$ sh ./hoge.sh
として実行している。
新しくVMを構築するたびにコマンドをど忘れしてしまうので、テキストファイルをして残しておくことで、次回インストールする際の手際を良くすることも可能であるので、おすすめ。
インストール画面への接続
インストールスクリプトを実行したら、ホストOSの9999番ポートでインストーラが立ち上がっている。そこにsshでポートフォワーディングでVNCを接続する。
ローカルのWindows上で、以下のコマンドを実行する。
$ ssh -L 50000:localhost:9999 [kvmサーバのaddr]
やっていることは、ホストOSの9999番ポートの出力を、localhostの50000番ポートと接続しているということである。 従って、ホストOS上の9999番ポートに出力されている画面は、localhostの50000番ポートに接続することで見ることができるようになる。
Windows上で、適当なVNCビューアを立ち上げ、localhostの50000番に指定して接続すると、ゲストOSのインストール画面が立ち上がる。
今回は、無料で使えるultraVNCviewerを用いた。接続先にlocalhost:5000
と指定し、connectを押すだけである。非常に楽だった。
hoge.example.jpのセットアップとSoftEtherのインストール
初期設定
セットアップが完了してターミナルが使えるようになったら、おもむろにゲストOSの上で以下のコマンドを実行する。
$ sudo apt update $ sudo apt -y upgrade $ sudo apt install ssh git vim wget tmux make gcc
今後はsshで接続するため、sshの公開鍵認証を設定しておく。詳細は省くが以下のサイトらへんが参考になると思う。
SoftEhterのインストール
公式ページ(http://www.softether-download.com/ja.aspx?product=softether)に行き、次のようにプルダウンを選択し、出てきたリンクを用いた。
新しいバージョンの方が様々なバグに対応しているが、beta版だとバグを踏む可能性が有るので、rtm版の中で最新のものを用いる。
選ばれたリンクを右クリックし、リンクのアドレスをコピーし、それをサーバ上の適当なところででwgetし、解凍、makeする。 makeすると、許諾書を読んだのかという確認が出てくるので、各々読みながら同意して進んでいく。
$ cd /tmp $ wget http://[download_link]/ $ tar -xvf softether-vpnserver-v4.25-9656-rtm-2018.01.15-linux-x64-64bit.tar.gz $ cd vpnserver $ make
makeしてできたディレクトリを/usr/localに移動し、パーミッションを変更する。
$ cd .. $ sudo mv vpnserver/ /usr/local/ $ cd /usr/local/vpnserver $ sudo chmod 600 * $ sudo chmod 700 vpncmd vpnserver
SoftEtherのセットアップ
systemctlへの登録
systemでvpnserviceの起動をするため、最初にsystemdへ登録する。 対象のディレクトリに、vpnserver用のサービスを記述したテキストの作成から始まる。
$ sudo vim /etc/systemd/system/vpnserver.service
# /etc/systemd/system/vpnserver.service [Unit] Description=SoftEther VPN Server After=network.target network-online.target [Service] ExecStart=/usr/local/vpnserver/vpnserver start ExecStop=/usr/local/vpnserver/vpnserver stop Type=forking RestartSec=3s [Install] WantedBy=multi-user.target
作成したserviceファイルを読み込み、有効化、起動しておく。
$ sudo systemctl daemon-reload $ sudo systemctl enable vpnserver.service $ sudo systemctl start vpnserver.service
vpnserverのセットアップ
ここからはGUIツールを用いる。
以下リンクからダウンロードする。表示名は、SoftEther VPN Server Manager for Windows
となっているの注意。
初期の接続では、管理パスワードを求められるので、入力する。
次に、ログインに成功すると、簡易セットアッププログラムが走り、VPNクライアントが接続する仮想HUBを作成することになる。ここで作成された仮想HUBを、HUB1とする。
今回作成したVPNサーバは、前述したとおり、インタフェースを2つもっている。 br100に接続されたインタフェースには、グローバルIPアドレスが、br101に接続されたインタフェースには、プライベートIPアドレスが付与されている。 今回の想定では、br100ののグローバルIPアドレスに外部から接続し、br101のプライベートIPアドレスを取得することにしたい。従って、内部に構築されたHUB1に、br101に接続された物理インタフェースをブリッジ接続すれば、上記の条件を満たすことができるようになる。
なお、1つのインタフェースのみで行いたい場合は、仮想インタフェースやtapデバイスを作成することで上記のシステムが可能となる。これに関しては、また別の記事で紹介する。
今回、br101が接続されたインタフェースはゲストOS上ではens3として認識されている。 これらを用いて、ens3とHUB1をブリッジ接続していく。
先程のVPNサーバ管理マネージャでVPNサーバに接続した状態で、下部にあるローカルブリッジ設定をクリックする。 ローカルブリッジ設定の画面が開く。
中段の、物理的な既存のLANカードとブリッジ接続
を選択し、LANカードにてens3を選択し、閉じる。
また、接続用のユーザも作成することも忘れてはいけない。初期設定のチュートリアルでユーザ作成の画面もあるが、忘れた人は下記の手順で接続ユーザを作成する。
先程のVPNサーバの管理画面から、仮想HUBの管理をクリックした先に、ユーザの管理ボタンがある。 これをクリックした先で、ユーザを新規作成する。 様々な認証方式があるが、今回は最も簡単なパスワード認証方式を選択した。
VPNサーバへの接続
Windows10からの接続には、SoftEtherVPNクライアント接続マネージャを用いる。 下記のリンクから、ダウンロードしておく。表示名はSoftEther VPN Clientとなる。
接続先の新規作成を選択し、新しい接続先のプロパティを表示し、編集する。 接続設定名は、任意で自分がわかるものに設定する。 ホスト名には、ドメイン名、もしくはIPアドレスを設定する。 ポート番号には、特に設定していなければ、443のままにする。 仮想HUBの部分には、今回作成した仮想HUBを選択する。今回はHUB1となる。
また、使用する仮想LANカードは、ローカルのWindows上で選択する必要がある。 複数のVPNに同時に接続する可能性がある場合は、適宜仮想LANカードを追加し、同じカードを複数の接続先で同時に使わない配慮をしておく必要がある。
ユーザ認証に関しては、今回は、作成したユーザとそのパスワードを入力する。これでOKを押すと、設定が完了する。
接続先一覧画面で表示されているので、エンター、もしくは接続をクリックし、接続してbr101と同じセグメントのプライベートIPアドレスが降ってきたら、接続は成功である。
まとめ
今回、途中まではCLIで行っており、最後までやりたかったが、vpncmdの使い勝手の悪さから妥協してGUIツールを用いてしまった。が、非常にわかりやすくできており、簡単に仮想HUBやブリッジ接続を設定することに成功した。 仮想インタフェースを用いたVPNサーバ構築を次回、また行ってみたいと考える。
参考にしたサイト
http://ja.softether.org/ https://qiita.com/mukoya/items/f20def019e25dc162ca8 http://www.softether-download.com/ja.aspx?product=softether