AWSにSoftEther VPNServerで簡単にVPN接続しよう

75件のシェア(ちょっぴり話題の記事)

まえがき

おはようございます。加藤です。EC2への接続を制限したい場合は、セキュリティグループで送信元IPで規制するのが有名・簡単ですね。
しかし、流行りのDS-LiteやWiMAXなどのグローバルIPを共有するサービスを利用している場合はセキュアでないしグローバルIPが変更される都度セキュリティグループを変更する必要があります。これはやや面倒でオペミスも怖いです。
そこで、SoftEther VPNServerを使ってAWSにリモートアクセスでVPN接続します。接続方式はL2TP/IPSecを選択しました。

対象

  • VPC・EC2について基礎レベルの理解があり構築が行える
  • 公開鍵認証を使ったSSH接続ができる

環境・前提

アプリケーション バージョン
MacOS 10.13.3(17D47)
SoftEther v4.24-9651-beta
  • パブリックからアクセスできるVPC・サブネットが存在する

EC2構築

早速、EC2を作成しましょう。パラメータは以下のように設定しました。
IPv6からのアクセスを許可していないのはSoftEtherがL2TP/IPSecでIPv6をサポートしていない為です。
グローバルIPは以下のコマンドなどで確認してください。一時的に使用するのものなので構築中に変化しなければOKです。
ElasticIPの割り当てを忘れないようにしてください!!

curl ifconfig.me

基本

項目
AMI Amazon Linux 2 LTS Candidate AMI 2017.12.0.20180115 x86_64 HVM GP2
AMI-ID amzn2-ami-hvm-2017.12.0.20180115-x86_64-gp2 (ami-c2680fa4)
インスタンスタイプ t2.micro
ストレージ SSD(GP2) 8GB
ElasticIP 1つ

セキュリティグループ

タイプ プロトコル ポート範囲 ソース 説明
SSH TCP 22 [グローバルIP]/0 一時的に利用
カスタムUDPルール UDP 500 0.0.0.0/0 -
カスタムUDPルール UDP 4500 0.0.0.0/0 -

SoftEther構築

ローカル

  • EC2作成時に指定した鍵を使用してSSH接続
    • 接続先はコンソールからパブリックDNS(IPv4)を確認
ssh -l ec2-user -i ~/.ssh/id_rsa ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com

サーバ

  • タイムゾーン修正
  • パッケージ最新化
  • 必要なパッケージをインストール
sudo timedatectl set-timezone Asia/Tokyo
sudo yum -y update
sudo yum -y install git gcc
  • ソースをダウンロード
  • 解凍
  • ビルド
cd ~/
curl -L -O https://github.com/SoftEtherVPN/SoftEtherVPN/releases/download/v4.24-9651-beta/softether-vpnserver-v4.24-9651-beta-2017.10.23-linux-x64-64bit.tar.gz
tar zxvf softether-vpnserver-v4.24-9651-beta-2017.10.23-linux-x64-64bit.tar.gz
cd vpnserver
yes 1 | make
cd ..

yesコマンドはひたすらyesという入力を繰り返すコマンドです。今回の様にyes 1と入力するとひたすら1を入力します。 ビルド時の対話にすべて1で回答したかった為、このように使用しました。

  • 設置場所を移動
  • systemd用の起動ファイルを作成
    • パーミッション変更
    • 起動ファイルを読み込み
  • SoftEtherを起動
  • SoftEtherの自動起動を設定
sudo mv vpnserver /opt/vpnserver
sudo vi /etc/systemd/system/vpnserver.service
sudo chmod 755 /etc/systemd/system/vpnserver.service
sudo systemctl daemon-reload
sudo systemctl start vpnserver
sudo systemctl enable vpnserver

/etc/systemd/system/vpnserver.service

[Unit]
Description=Softether VPN Server Service
After=network.target

[Service]
Type=forking
User=root
ExecStart=/opt/vpnserver/vpnserver start
ExecStop=/opt/vpnserver/vpnserver stop
Restart=on-abort
WorkingDirectory=/opt/vpnserver/
ExecStartPre=/sbin/ip link set dev eth0 promisc on

[Install]
WantedBy=multi-user.target

これでSoftEtherの構築は完了です! 接続するために設定をしていきましょう。

SoftEther設定

GUIの管理ツールがありますが、今回はCLIで設定していきます。

  • SoftEther VPNServerの管理ツールを起動
sudo /opt/vpnserver/vpncmd

下記が管理ツールの画面です。これからServerの設定を行うので、1を入力してEnterを押下してください。

vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.24 Build 9651   (Japanese)
Compiled 2017/10/23 01:52:32 by yagi at pc33
Copyright (c) SoftEther VPN Project. All Rights Reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択:

サーバは自分自身で、まだ仮想HUBを作成していません。2つとも空のままでEnterを押下してください。 VPN Server>とコンソールが表示されていれば問題なく進行できています。

接続先の VPN Server または VPN Bridge が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
'ホスト名:ポート番号' の形式で指定すると、ポート番号も指定できます。
(ポート番号を指定しない場合は 443 が使用されます。)
何も入力せずに Enter を押すと、localhost (このコンピュータ) のポート 443 に接続します。
接続先のホスト名または IP アドレス:

サーバーに仮想 HUB 管理モードで接続する場合は、仮想 HUB 名を入力してください。
サーバー管理モードで接続する場合は、何も入力せずに Enter を押してください。
接続先の仮想 HUB 名を入力:
VPN Server "localhost" (ポート 443) に接続しました。

VPN Server 全体の管理権限があります。

VPN Server>

ここからは、SoftEtherのコンソール上で作業します。視認性向上の為に大文字小文字を使用していますが、全て小文字でも問題なく入力できます。

  • 仮想HUB作成
  • 仮想HUB(main)に切り替え
  • ユーザ作成
  • ユーザパスワード設定
HubCreate main
# パスワード入力を求められるので入力してください。
HUB main
UserCreate kato.ryo /Group:none /REALNAME:kato.ryo /NOTE:none
# グループ、本名、説明の入力は任意です。設定しない場合は[none]と入力してください。
UserPasswordSet kato.ryo
# パスワード入力を求められるので入力してください。
  • IPSec有効化
  • セキュアNAT機能有効化
  • ルーティングの設定
  • コンソール終了

ルーティングの設定ではDHCPで以下のルーティングを流しています
10.0.0.0/16へのアクセスをVPN経由にする
VPCのネットワーク帯域に応じて変更してください

IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:main
# 事前共有キーの入力を求められるので入力してください。
SecureNatEnable
Dhcpset /Start:192.168.30.10 /End:192.168.30.200 /Mask:255.255.255.0 /Expire:7200 /GW:192.168.30.1 /DNS:192.168.30.1 /DNS2:none /Domain:none /Log:yes /PushRoute:"10.0.0.0/255.255.0.0/192.168.30.1"
exit

後で動作確認に使うので、ホスト名を確認しておきましょう。

  • ホスト名確認
hostname

クライアント設定(MacOSの場合)

  • システム環境設定からネットワークを開く
  • インターフェイスの追加をクリック
  • インターフェイス・VPNタイプを選択し、任意のサービス名を入力
  • サーバアドレス・アカウント名を入力
  • 認証設定を押下
  • パスワード・共有シークレットを入力
  • 接続を押下

アカウント名は ユーザ名@仮想HUB名 形式

動作確認

  • VPNサーバにPingを打つ
  • VPNサーバにSSHアクセスする
ping [SoftEtherのホスト名]
ssh -l ec2-user -i ~/.ssh/id_rsa [SoftEtherのホスト名]

あとがき

みなさま無事にVPN接続できましたでしょうか?検証は行っていませんがAndroid・iOSでも接続できるはずです。
今回はEC2で構築しましたが、ECSで構築してELBを挟んで冗長化できたら、もっとおもしろそうですね!(技術的に可能か未確認です...)
ツッコミどころありましたら是非コメントをお願いします!!

参考