komeの備忘録

東大理系大学院生の技術ブログ。たまに趣味。

KVM上のVMでVPNサーバ構築ログ

f:id:komee:20180514171644j:plain

環境
ホスト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を押すだけである。非常に楽だった。

f:id:komee:20180514162756p:plain

hoge.example.jpのセットアップとSoftEtherのインストール

初期設定

セットアップが完了してターミナルが使えるようになったら、おもむろにゲストOSの上で以下のコマンドを実行する。

$ sudo apt update
$ sudo apt -y upgrade 
$ sudo apt install ssh git vim wget tmux make gcc

今後はsshで接続するため、sshの公開鍵認証を設定しておく。詳細は省くが以下のサイトらへんが参考になると思う。

qiita.com

SoftEhterのインストール

公式ページ(http://www.softether-download.com/ja.aspx?product=softether)に行き、次のようにプルダウンを選択し、出てきたリンクを用いた。

f:id:komee:20180514163100p:plain

新しいバージョンの方が様々なバグに対応しているが、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となっているの注意。

SoftEther ダウンロード センター

初期の接続では、管理パスワードを求められるので、入力する。

f:id:komee:20180514163934j:plain

次に、ログインに成功すると、簡易セットアッププログラムが走り、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サーバに接続した状態で、下部にあるローカルブリッジ設定をクリックする。 f:id:komee:20180514163725j:plain ローカルブリッジ設定の画面が開く。

中段の、物理的な既存のLANカードとブリッジ接続を選択し、LANカードにてens3を選択し、閉じる。 f:id:komee:20180514163809p:plain

また、接続用のユーザも作成することも忘れてはいけない。初期設定のチュートリアルでユーザ作成の画面もあるが、忘れた人は下記の手順で接続ユーザを作成する。

先程のVPNサーバの管理画面から、仮想HUBの管理をクリックした先に、ユーザの管理ボタンがある。 これをクリックした先で、ユーザを新規作成する。 様々な認証方式があるが、今回は最も簡単なパスワード認証方式を選択した。

VPNサーバへの接続

Windows10からの接続には、SoftEtherVPNクライアント接続マネージャを用いる。 下記のリンクから、ダウンロードしておく。表示名はSoftEther VPN Clientとなる。

SoftEther ダウンロード センター

接続先の新規作成を選択し、新しい接続先のプロパティを表示し、編集する。 f:id:komee:20180514164022p:plain 接続設定名は、任意で自分がわかるものに設定する。 ホスト名には、ドメイン名、もしくはIPアドレスを設定する。
ポート番号には、特に設定していなければ、443のままにする。
仮想HUBの部分には、今回作成した仮想HUBを選択する。今回はHUB1となる。

また、使用する仮想LANカードは、ローカルのWindows上で選択する必要がある。
複数のVPNに同時に接続する可能性がある場合は、適宜仮想LANカードを追加し、同じカードを複数の接続先で同時に使わない配慮をしておく必要がある。

ユーザ認証に関しては、今回は、作成したユーザとそのパスワードを入力する。これでOKを押すと、設定が完了する。

f:id:komee:20180514164040j:plain

接続先一覧画面で表示されているので、エンター、もしくは接続をクリックし、接続して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