AWSとソフトウェアVPN(2) – SoftEther のクライアント接続:準備編

Katoです。

AWSとVPNソフトウェア(1)ではAWS上で実現するVPNについて簡単に説明しました。
今回からはその実例として、SoftEther VPN を用いてクライアント接続でのVPNトンネルを生成してみましょう。

VPN構成図

図1:クライアント接続方式VPN構成図

構成図は上記画像の通りとし、それぞれの環境は次の通りです。
せっかくですので、今年リリースされたばかりの CentOS7 を AWS 側には利用してみます。

SoftEther VPN はサーバソフトウェアもクライアントソフトウェアも複数のOSに対応しているので、VPNサーバでは Linux 、クライアントでは Windows でも問題ありません。

AWSVPNサーバ
EC2インスタンスタイプ:t2.micro
使用するAMI:CentOS 7 x86_64 (2014_09_29) EBS HVM
EBS:8GB General Purpose SSD
NIC:パブリックサブネット内に1つのみとし、グローバルIPを割り当てる

注意点

  • VPC でパブリックサブネットとプライベートサブネットに分割する
  • プライベートサブネットへの接続はENI を用いて後からアタッチする
  • SSHHTTPS の通信をAWS外から受け入れる
  • インスタンス作成後はマネージメントコンソールで Source/Dest. Check を無効にする
  • SoftEther VPN Server をインストールする

AWS側プライベートサーバ
EC2インスタンスタイプ:t2.micro
使用するAMI:CentOS 7 x86_64 (2014_09_29) EBS HVM
EBS:8GB General Purpose SSD
NIC:プライベートサブネット内に1つのみとし、グローバルIPは割り当てない

注意点

  • セキュリティグループはVPCプライベートセグメントをIn方向で許可する
  • SoftEther VPN Clientをインストールする

Amazon VPC でパブリックサブネットとプライベートサブネットを区切りますが、プライベートサブネットのルーティングテーブルはインターネットゲートウェイデフォルトゲートウェイとしないため、インターネットへのアクセスができません。

インターネットへアクセスするには NAT インスタンスを設置する必要がありますが、VPC 作成ウィザードで自動作成できるのでここでの説明は省略します。(後日別な記事として書くかもしれません)

セキュリティグループは、パブリック/プライベートセグメントで次の表のように設定すると良いでしょう。

今回は VPN を構築する実験ですので、All Traffic で許可するのもありです(もちろん My IP を用いて自分以外からはアクセスできないようにすべきです)。
セキュリティグループはファイアウォールと同等の動作をしますので、実際のシステム構築においては必要な通信だけが可能になるよう注意深く設定して下さい。

 

表1:セキュリティグループの例
セキュリティグループ Type Protocol Port Range Source
パブリック SSH TCP 22 (My IP)
パブリック HTTPS TCP 443 (My IP)
パブリック All Traffic All All 10.0.1.0/24
プライベート All Traffic All All 10.0.0.0/24

 

VPN サーバ用インスタンスが起動したら、SSH 接続でログインします。

この時の注意点は AWS が公開鍵認証方式で SSH ログインを制限している点で、接続時は秘密鍵を指定する必要があります。EC2 へ接続する際は管理コンソールから事前にダウンロードしておきましょう。

AWS 上での CentOS7 はデフォルトで一般ユーザ centos が登録されており、このユーザでログインします。ユーザ centos にパスワードは必要ありません。SSH 接続でログインできたら、まずはホスト名の固定や NTP の導入、タイムゾーンロケールの変更、OS のアップデートを行います。

余談ですが、AMI から起動する CentOS7 は sudo コマンドで管理作業を行うよう作られています。root パスワード不定のため、起動時点では su コマンドで root に切り替えることができません。
セキュリティ上の観点からは sudo を都度利用する方が安全ですが、 su で root になる方法を有効にすることも可能です。

$ sudo passwd root

表示されるパスワード変更プロンプトに従って入力し、終了後に su を実行することで root になれます。

話を戻しまして、ホスト名の固定、NTP の導入、ダイムゾーンとロケールの設定、OS のアップデートは次のコマンドで実行します。ホスト名の固定が必要な理由はこちらをご参照ください。

vi /etc/cloud/cloud.cfg
→ファイル末尾に preserve_hostname:true を追記。ホスト名を固定する。
hostnamectl set-hostname hoge.piyo.jp
→ホスト名を設定する
hostnamectl
→ホスト名を確認する</span>
yum install ntp wget gcc
→ntp、wgetgcc</code>をインストール</span>
systemctl enable ntpd
systemctl start ntpd
systemctl status ntpd
→Loadedの行にenabled、Activeの行にactive(running)が表示されることを確認
rm /etc/localtime</code></span>
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
date
→タイムゾーンが正しく設定されていれば日本時間表示になっている
vi /etc/locale.conf
LANG=ja_JP.UTF-8に変更
. /etc/locale.conf
locale
→表示されるロケールが全て<code>ja_JP.UTF-8</code>になっていればOK
getenforce
vi /etc/selinux/config</code>
→SELINUX=enforcingをdisabledに変更
setenforce 0
getenforce
→ここで<code>permissive</code>と表示されればOK。無効化はシステムを再起動すると反映される
yum update
→OSをアップデート

上記コマンド例でわかるかと思いますが、CentOS7 では systemd が採用されているため chkconfig を使いません。

代わりに systemctl というコマンドを用いるわけですが、使い方はほとんど同じです。ただ、 systemctl status を投入したときの出力が chkconfig とだいぶ違うのには慣れが必要かもしれません。

SELinuxは正しく使えばOSのセキュリティ向上に貢献してくれますが、設定の複雑化を避けるため今回は無効化しておきます。

次に EC2 管理コンソールからENIを追加します。
ENIは追加のネットワークインタフェースで、正式名称を Elastic Network Instance と言います。図2のように、EC2 管理コンソールの左側メニューから「Network Interfaces」を選択します。EC2 は複数 NIC の接続をサポートしていますが、何個接続できるかはインスタンスタイプによって上限が異なることに注意して下さい。

ENI
図2:管理コンソールからENIを開く

表示される画面上部にある青い「Create Network Interface」ボタンを押し、次の図3にあるENI作成画面を呼び出します。
プライベートセグメントのIPアドレスを割り当てた ENI をプライベートセグメント用のセキュリティグループで作成します。

ENI2

図3:新規ENIの設定画面

Descriptionには管理しやすい名前、Subnet は ENI が属するサブネット、Private IP は割り当てる VPC プライベート IP アドレス、Security Group は ENI に適用するセキュリティグループを指定します。

Description は ENI の挙動に一切無関係ですので、一目で用途がわかるような名前を入力すると良いでしょう。作成したら、画面上部の「Attach」ボタンを押し、VPN サーバにアタッチしましょう。

ENI3
図4:新規ENIのアタッチ

図4は ENI のアタッチ先インスタンスを指定する画面です。

Instance IDの欄はドロップダウンボックスになっていますので、アタッチしたいインスタンスを選択してAttachボタンを押すだけです。
アタッチした後に注意点があり、このENIアタッチに関連して1つだけ設定すべきことがあります。

以前AWSでハマったことシリーズで書きましたが、ENIを後から追加してすぐ再起動するとデフォルトゲートウェイがプライベートセグメント側に変更される可能性があります。

ここですぐにOSを再起動するとSSH接続できなくなる可能性がありますので、/etc/sysconfig/network-scripts で次のような操作を行いましょう。

cp ifcfg-eth0 ifcfg-eth1
vi ifcfg-eth1
→DEVICE=eth1とし、ファイル末尾にDEFROUTE=noを追記
vi ifcfg-eth0
→ファイル末尾にDEFROUTE=yesを追記

こうすることで OS を再起動してもSSH接続ができるはずです。最後に

ifup eth1
ifconfig

として、追加したENIを起動してIPアドレスが正しく取得できるか確認しましょう。

ここまでで OS の基本的な設定は終了です。次回は SoftEther VPN の導入を行います。